diff --git a/PARR.TemplateMatcher/Services/Implemetaions/GroupedTemplateSynchronizer.cs b/PARR.TemplateMatcher/Services/Implemetaions/GroupedTemplateSynchronizer.cs index 2255ebf4..6b26127a 100644 --- a/PARR.TemplateMatcher/Services/Implemetaions/GroupedTemplateSynchronizer.cs +++ b/PARR.TemplateMatcher/Services/Implemetaions/GroupedTemplateSynchronizer.cs @@ -299,6 +299,8 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer .ToDictionary(uv => uv.UnitId, uv => uv.Value.Value); // 7. Основной цикл обработки: итерируемся по potentialUnitIds (UnitId шаблонов) + var expectedTemplateKeys = new HashSet<(Guid JobId, Guid UnitId, int Index)>(); + foreach (var kvpOuter in reverseMapping) { var potentialUnitId = kvpOuter.Key; @@ -309,7 +311,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer // --- ВНУТРЕННЯЯ ГРУППИРОВКА --- // Сгруппируем *юниты из UnitsInTemplate* для *этого* potentialUnitId по значению поля var innerGroupedUnitsInTemplate = unitsInTemplateForThisPotentialUnitId - .GroupBy(unitId => unitInTemplateToInnerGroupingValueMap.GetValueOrDefault(unitId, "Нет данных")) // Используем маппинг + .GroupBy(unitId => unitInTemplateToInnerGroupingValueMap.GetValueOrDefault(unitId, "Нет данных")) .ToList(); logger.LogDebug("Для UnitId {PotentialUnitId}: сформировано {Count} внутренних групп UnitsInTemplate.", potentialUnitId, innerGroupedUnitsInTemplate.Count); @@ -317,7 +319,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer // 8. Цикл по внутренним группам UnitsInTemplate foreach (var innerGroup in innerGroupedUnitsInTemplate) { - var groupingValueName = innerGroup.Key; // Значение поля + var groupingValueName = innerGroup.Key; var unitsInTemplateInInnerGroup = innerGroup.ToList(); // Список юнитов (UnitId), связанных с potentialUnitId и имеющих одно и то же значение поля logger.LogDebug("Обработка внутренней группы '{GroupingValue}' для UnitId {PotentialUnitId} с {Count} юнитами.", groupingValueName, potentialUnitId, unitsInTemplateInInnerGroup.Count); @@ -341,6 +343,9 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer Job? targetJob = SelectTargetJob(jobsInGroup, subGroupSize, maxJob); + // --- Добавляем ключ в список ожидаемых прямо здесь --- + expectedTemplateKeys.Add((targetJob.Id, potentialUnitId, i)); // potentialUnitId - это UnitId шаблона + var existingTemplatesForRelationship = await templateService.Get() .AsNoTracking() .Include(t => t.Unit) @@ -469,42 +474,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer } // === Деактивация === - // Собираем ожидаемые ключи шаблонов на основе внутренне сгруппированных результатов - var expectedTemplateKeys = new HashSet<(Guid JobId, Guid UnitId, int Index)>(); - foreach (var kvpOuter in reverseMapping) - { - var potentialUnitId = kvpOuter.Key; - var unitsInTemplateForThisPotentialUnitId = kvpOuter.Value; - - // Сгруппируем *юниты из UnitsInTemplate* для *этого* potentialUnitId по значению поля - var innerGroupedUnitsInTemplate = unitsInTemplateForThisPotentialUnitId - .GroupBy(unitId => unitInTemplateToInnerGroupingValueMap.GetValueOrDefault(unitId, "Нет данных")) - .ToList(); - - foreach (var innerGroup in innerGroupedUnitsInTemplate) - { - var groupingValueName = innerGroup.Key; - var unitsInTemplateInInnerGroup = innerGroup.ToList(); - - // Разбиваем юниты из *этой* внутренней группы на подгруппы по maxJob.MaxValueRelationships - int maxValueForSplitting = maxJob.MaxValueRelationships!.Value; - var unitsInTemplateSubGroups = unitsInTemplateInInnerGroup - .Select((id, index) => new { id, groupIndex = index / maxValueForSplitting }) - .GroupBy(x => x.groupIndex) - .Select(g => g.Select(x => x.id).ToList()) - .ToList(); - - // Для каждой подгруппы UnitsInTemplate - for (int i = 1; i <= unitsInTemplateSubGroups.Count; i++) // Индекс начинается с 1 - { - var unitsInTemplateSubGroup = unitsInTemplateSubGroups[i - 1]; // корректируем индекс для доступа к коллекции - var subGroupSize = unitsInTemplateSubGroup.Count; - Job? targetJobForExpectedKey = SelectTargetJob(jobsInGroup, subGroupSize, maxJob); - - expectedTemplateKeys.Add((targetJobForExpectedKey.Id, potentialUnitId, i)); // potentialUnitId - это UnitId шаблона - } - } - } + // Теперь expectedTemplateKeys уже собран // Получаем ВСЕ шаблоны для JobGroup (не только для текущих potentialUnitIds) var allJobIdsInGroup = jobsInGroup.Select(j => j.Id).ToHashSet();