feat(templateMatcher):
- добавлен режим DryRun - изменен подход к фильтрации шаблонов по рабочей группе - перенесено из этапа основной фильтрации в этап посторение подргупп/шаблонов - при использовании тегов альтернативных рабочих групп фильтрация по списку пропускается
This commit is contained in:
@@ -30,9 +30,9 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task SyncTemplatesForJobGroupAsync(Guid jobGroupId, HistoryInitiator initiator)
|
||||
public async Task SyncTemplatesForJobGroupAsync(Guid jobGroupId, HistoryInitiator initiator, bool dryRun = false)
|
||||
{
|
||||
_logger.LogInformation("Начало синхронизации шаблонов для JobGroup {JobGroupId}", jobGroupId);
|
||||
_logger.LogInformation("Начало синхронизации шаблонов для JobGroup {JobGroupId} (DryRun={DryRun})", jobGroupId, dryRun);
|
||||
|
||||
var existingStatus = await _matchingStatusService.GetStatusAsync(jobGroupId, SyncTaskEntityTypeEnum.JobGroup);
|
||||
if (existingStatus.DetailsJobGroups?.Count > 0)
|
||||
@@ -41,14 +41,20 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
return;
|
||||
}
|
||||
|
||||
await SetStatusAsync(jobGroupId, "Начало синхронизации");
|
||||
await SetStatusAsync(jobGroupId, dryRun ? "DryRun: Начало анализа" : "Начало синхронизации");
|
||||
|
||||
var totalSw = Stopwatch.StartNew();
|
||||
|
||||
try
|
||||
{
|
||||
var context = new GroupedSyncContext { JobGroupId = jobGroupId, Initiator = initiator };
|
||||
var context = new GroupedSyncContext
|
||||
{
|
||||
JobGroupId = jobGroupId,
|
||||
Initiator = initiator,
|
||||
DryRun = dryRun
|
||||
};
|
||||
|
||||
// Read-этапы выполняются всегда
|
||||
foreach (var stage in _readStages)
|
||||
{
|
||||
var stageSw = Stopwatch.StartNew();
|
||||
@@ -58,23 +64,34 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
context.JobGroupName, jobGroupId, stage.StageName, stageSw.ElapsedMilliseconds);
|
||||
}
|
||||
|
||||
foreach (var stage in _writeStages)
|
||||
// Подробный отчёт по результатам read-этапов
|
||||
PrintDryRunReport(context);
|
||||
|
||||
// Write-этапы пропускаем при DryRun
|
||||
if (!dryRun)
|
||||
{
|
||||
var stageSw = Stopwatch.StartNew();
|
||||
await stage.ExecuteAsync(context);
|
||||
stageSw.Stop();
|
||||
_logger.LogDebug("[Perf] JobGroup '{JobGroupName}' ({JobGroupId}) | Этап: {Stage} | Время: {Ms} мс",
|
||||
context.JobGroupName, jobGroupId, stage.StageName, stageSw.ElapsedMilliseconds);
|
||||
foreach (var stage in _writeStages)
|
||||
{
|
||||
var stageSw = Stopwatch.StartNew();
|
||||
await stage.ExecuteAsync(context);
|
||||
stageSw.Stop();
|
||||
_logger.LogDebug("[Perf] JobGroup '{JobGroupName}' ({JobGroupId}) | Этап: {Stage} | Время: {Ms} мс",
|
||||
context.JobGroupName, jobGroupId, stage.StageName, stageSw.ElapsedMilliseconds);
|
||||
}
|
||||
|
||||
await SetStatusAsync(jobGroupId, "Синхронизация завершена успешно");
|
||||
await _matchingStatusService.DeleteMatchingStatusAsync(jobGroupId, SyncTaskEntityTypeEnum.JobGroup);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogInformation("[DryRun] Write-этапы пропущены. Изменения в БД и MQ не выполнены.");
|
||||
await SetStatusAsync(jobGroupId, "DryRun: Анализ завершён без изменений");
|
||||
await _matchingStatusService.DeleteMatchingStatusAsync(jobGroupId, SyncTaskEntityTypeEnum.JobGroup);
|
||||
}
|
||||
|
||||
totalSw.Stop();
|
||||
_logger.LogInformation("[Perf] JobGroup '{JobGroupName}' ({JobGroupId}) | ИТОГО: {TotalMs} мс",
|
||||
context.JobGroupName, jobGroupId, totalSw.ElapsedMilliseconds);
|
||||
|
||||
await SetStatusAsync(jobGroupId, "Синхронизация завершена успешно");
|
||||
await _matchingStatusService.DeleteMatchingStatusAsync(jobGroupId, SyncTaskEntityTypeEnum.JobGroup);
|
||||
_logger.LogInformation("Синхронизация шаблонов завершена для JobGroup '{JobGroupName}' ({JobGroupId})",
|
||||
context.JobGroupName, jobGroupId);
|
||||
}
|
||||
catch (GroupedSyncEarlyExitException ex)
|
||||
{
|
||||
@@ -94,6 +111,52 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
|
||||
}
|
||||
}
|
||||
|
||||
private void PrintDryRunReport(GroupedSyncContext context)
|
||||
{
|
||||
_logger.LogInformation("========== [DryRun] ОТЧЁТ по JobGroup '{JobGroupName}' ({JobGroupId}) ==========",
|
||||
context.JobGroupName, context.JobGroupId);
|
||||
|
||||
_logger.LogInformation("[DryRun] Отфильтровано юнитов: {Count}", context.FilteredUnits.Count);
|
||||
_logger.LogInformation("[DryRun] Разрешено конфликтов (potentialUnits): {Count}", context.ReverseMapping.Count);
|
||||
_logger.LogInformation("[DryRun] Сформировано групп: {Count}", context.TemplateGroups.Count);
|
||||
|
||||
int totalSubGroups = 0;
|
||||
int totalUnitsInTemplates = 0;
|
||||
|
||||
foreach (var group in context.TemplateGroups.OrderBy(g => g.PotentialUnitId))
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"[DryRun] PotentialUnit {Unit}: {SubGroupCount} подгрупп",
|
||||
context.FormatUnit(group.PotentialUnitId),
|
||||
group.SubGroups.Count);
|
||||
|
||||
foreach (var subGroup in group.SubGroups.OrderBy(s => s.GlobalIndex))
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"[DryRun] Index={Index}, группа='{Group}', экземпляров: {Count}",
|
||||
subGroup.GlobalIndex,
|
||||
subGroup.InnerGroupName,
|
||||
subGroup.Entries.Count);
|
||||
|
||||
foreach (var entry in subGroup.Entries)
|
||||
{
|
||||
_logger.LogInformation(
|
||||
"[DryRun] - {Unit} (ValueId: {ValueId})",
|
||||
context.FormatUnit(entry.UnitId),
|
||||
entry.UnitFieldValueId);
|
||||
}
|
||||
|
||||
totalSubGroups++;
|
||||
totalUnitsInTemplates += subGroup.Entries.Count;
|
||||
}
|
||||
}
|
||||
|
||||
_logger.LogInformation("[DryRun] ИТОГО: {GroupCount} групп, {SubGroupCount} подгрупп (=шаблонов), {UnitCount} экземпляров в шаблонах",
|
||||
context.TemplateGroups.Count, totalSubGroups, totalUnitsInTemplates);
|
||||
|
||||
_logger.LogInformation("========== [DryRun] КОНЕЦ ОТЧЁТА ==========");
|
||||
}
|
||||
|
||||
public Task SyncTemplatesForJobAsync(Guid jobId, HistoryInitiator initiator)
|
||||
{
|
||||
_logger.LogWarning("GroupedTemplateSynchronizer: SyncTemplatesForJob вызван для JobId {JobId}. Это не поддерживаемая операция.", jobId);
|
||||
|
||||
Reference in New Issue
Block a user