feat(templateMatcher): Рефакторинг

This commit is contained in:
Mikhail Kuznetsov
2026-03-27 17:36:16 +10:00
parent 01cb312ea5
commit 7c7c56eb93

View File

@@ -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();