refactor(templateMatcher): Переход на Pipeline-архитектуру для SimpleSync и GroupedSync.
- SimpleTemplateSynchronizer и GroupedTemplateSynchronizer переведены на паттерн Pipeline с разделением на Read/Write этапы - Выделены контракты этапов (ISimpleSyncStage, IGroupedSyncStage) и контексты (SimpleSyncContext, GroupedSyncContext) - Read-этапы безопасны для тестов (не пишут в БД/MQ), Write-этапы изолированы через отдельные интерфейсы - Добавлено [Perf]-логирование каждого этапа с метриками времени выполнения - Логи приведены к человекочитаемому формату 'Имя' (ID) для Job, JobGroup и Unit - Устранено дублирование данных в контекстах (FilteredUnits перезаписывается, TemplateGroups строго типизирован) - Константы неиспользуемых шаблонов вынесены в UnusedTemplateConstants - Структура проекта реорганизована: SimpleSync, GroupedSync, Implementations, Interfaces
This commit is contained in:
@@ -1,18 +0,0 @@
|
||||
using PARR.Domain.Entities.Job;
|
||||
using PARR.TemplateMatcher.Models;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Interfaces;
|
||||
|
||||
public interface IGroupedTemplateBuilder
|
||||
{
|
||||
/// <summary>
|
||||
/// Строит структуру групп для создания групповых шаблонов.
|
||||
/// Трансформирует связи в пары (UnitId, UnitFieldValueId),
|
||||
/// выполняет внутреннюю группировку и разбиение на подгруппы.
|
||||
/// </summary>
|
||||
Task<List<GroupedTemplateGroup>> BuildAsync(
|
||||
Dictionary<Guid, List<Guid>> initialReverseMapping,
|
||||
JobGroup jobGroup,
|
||||
Job maxJob,
|
||||
CancellationToken ct = default);
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
using PARR.Domain.Entities.Base.History;
|
||||
using PARR.Domain.Entities.Job;
|
||||
using PARR.TemplateMatcher.Models;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Interfaces;
|
||||
|
||||
public interface IGroupedTemplateProcessor
|
||||
{
|
||||
/// <summary>
|
||||
/// Обрабатывает построенные группы шаблонов:
|
||||
/// 1. Ищет существующие шаблоны.
|
||||
/// 2. Сравнивает состав юнитов.
|
||||
/// 3. Обновляет, переиспользует или создает новые шаблоны.
|
||||
/// 4. Возвращает набор ключей ожидаемых шаблонов для последующей деактивации лишних.
|
||||
/// </summary>
|
||||
Task<HashSet<(Guid JobId, Guid UnitId, int Index)>> ProcessAsync(
|
||||
List<GroupedTemplateGroup> groups,
|
||||
List<Job> jobsInGroup,
|
||||
Job maxJob,
|
||||
HistoryInitiator initiator,
|
||||
CancellationToken ct = default);
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
using PARR.Core.Services.UnitFilterService.Models;
|
||||
using PARR.Domain.Entities.Job;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Interfaces
|
||||
{
|
||||
public interface IGroupedTemplateUnitFilter
|
||||
{
|
||||
/// <summary>
|
||||
/// Применяет специфичные правила фильтрации для групповых шаблонов.
|
||||
/// 1. Отбирает юниты, имеющие заполненное значение в GroupingUnitFieldId.
|
||||
/// 2. Оставляет только юниты, значение которых в поле РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК разрешено.
|
||||
/// </summary>
|
||||
Task<List<UnitFilterResultDto>> FilterAsync(
|
||||
IEnumerable<UnitFilterResultDto> initialUnits,
|
||||
JobGroup jobGroup,
|
||||
CancellationToken ct = default);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace PARR.TemplateMatcher.Services.Interfaces
|
||||
{
|
||||
public interface IMqTemplateMatcher
|
||||
{
|
||||
Task StartAsync();
|
||||
Task StopAsync();
|
||||
}
|
||||
}
|
||||
12
PARR.TemplateMatcher/Services/Interfaces/ITemplateMatcher.cs
Normal file
12
PARR.TemplateMatcher/Services/Interfaces/ITemplateMatcher.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using PARR.Domain.Entities.Base.History;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Interfaces
|
||||
{
|
||||
public interface ITemplateMatcher
|
||||
{
|
||||
Task SyncTemplatesForJob(Guid jobId, HistoryInitiator initiator);
|
||||
Task UpdateTemplatesForJob(Guid jobId, HistoryInitiator initiator);
|
||||
Task SyncTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator);
|
||||
Task UpdateTemplatesForJobGroup(Guid jobGroupId, HistoryInitiator initiator);
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
using PARR.Core.Services.UnitFilterService.Models;
|
||||
using PARR.Domain.Entities.Job;
|
||||
|
||||
namespace PARR.TemplateMatcher.Services.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// Разрешает конфликты при сопоставлении юнитов к шаблонам и строит итоговую карту связей.
|
||||
/// </summary>
|
||||
public interface IUnitInTemplateConflictMapper
|
||||
{
|
||||
/// <summary>
|
||||
/// Строит маппинг: UnitId шаблона -> [Список юнитов в UnitsInTemplate].
|
||||
/// При наличии нескольких кандидатов для одного юнита выбирается лучший по приоритету:
|
||||
/// 1. Наличие в таблице UnitKiiUnit
|
||||
/// 2. Наибольшее количество связей
|
||||
/// 3. Алфавитный порядок имени юнита
|
||||
/// </summary>
|
||||
Task<Dictionary<Guid, List<Guid>>> BuildMappingAsync(
|
||||
IEnumerable<UnitFilterResultDto> unitFilterResults,
|
||||
Job maxJob,
|
||||
CancellationToken ct = default);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user