fix(templateMatcher): при синхронизация добавлена логика актуализации имени шаблона.

This commit is contained in:
Mikhail Kuznetsov
2026-01-14 10:59:17 +10:00
parent c1ae107c1f
commit d89347787e
3 changed files with 47 additions and 11 deletions

View File

@@ -7,13 +7,13 @@ namespace PARR.Constants
{
/// <summary>
/// Только сгенерировать недостающие шаблоны(можно использовать IsUnused).
/// Создать недостающие шаблоны, перепривязать к нужному Job в маках одного JobGroup.
/// Создать недостающие шаблоны, перепривязать к нужному Job в рамках одного JobGroup.
/// Выключить+включить в соответствии с настройками фильтров.
/// Полное соответвие Template к Job.
/// </summary>
Sync = 0,
/// <summary>
/// Только меняет имя шаблона и деактивирует шаблон и расписание, в случае когда ЭК не соответсвует Job+ставит статус Unused
/// Только меняет имя шаблона
/// </summary>
Update = 1
}

View File

@@ -4,7 +4,6 @@ using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces;
using PARR.Common.Domain;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainServices.Interfaces;
using PARR.DAL.Models;
using PARR.DAL.Models.Job;
@@ -61,8 +60,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
IUnitFieldService unitFieldService,
ITemplateDeactivator templateDeactivator,
ITemplateNameNormalizer templateNameNormalizer,
ITemplateUpdaterMqSender templateUpdaterMqSender,
SettingsFromDb settingsFromDb
ITemplateUpdaterMqSender templateUpdaterMqSender
)
{
this.logger = logger;
@@ -113,7 +111,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
var jobsInGroup = jobGroup.Jobs.ToList();
// --- НОВАЯ ЛОГИКА: Получение FieldId и разрешённых значений для "РАБОЧАЯ_ГР_ОТВ_ЗАК" ---
// --- Получение FieldId и разрешённых значений для "РАБОЧАЯ_ГР_ОТВ_ЗАК" ---
var workGroupField = await unitFieldService.GetByAihitNameAsync("РАБОЧАЯ_ГР_ОТВ_ЗАК");
if (workGroupField == null)
{
@@ -479,7 +477,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
else
{
logger.LogDebug("Юнит {TargetUnitId} НЕ найден в groupedRelationships.Values после разрешения конфликтов.", targetUnitId);
// юнит отсеялся на этапе разрешения конфликтов
// юнит отсеялся на этапе разрешения конфликтов
}
#endif
@@ -705,7 +703,7 @@ internal class GroupedTemplateSynchronizer : ITemplateSynchronizer
var key = (existingTemplate.JobId, existingTemplate.UnitId, existingTemplate.Index ?? -1);
if (!expectedTemplateKeys.Contains(key))
{
logger.LogInformation("Деактивация лишнего шаблона {TemplateId} (Job {JobId}, Regional {UnitId}, Index {Index}).", existingTemplate.Id, existingTemplate.JobId, existingTemplate.UnitId, existingTemplate.Index);
logger.LogInformation("Деактивация лишнего шаблона {TemplateId} (Job {JobId}, Relationship {UnitId}, Index {Index}).", existingTemplate.Id, existingTemplate.JobId, existingTemplate.UnitId, existingTemplate.Index);
await templateDeactivator.DeactivateTemplateAsync(existingTemplate, initiator);
}
}

View File

@@ -130,16 +130,20 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer
.Where(t => t.JobId == jobId)
.ToListAsync();
var existingUnitIds = existingTemplates
var existingUsedTemplates = existingTemplates
.Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used)
.ToList();
var existingUnitIds = existingUsedTemplates
.Select(t => t.UnitId)
.ToHashSet();
var newUnitIds = unitIds.Except(existingUnitIds).ToList();
var unusedTemplates = existingTemplates
.Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used && !unitIds.Contains(t.UnitId))
var unusedTemplates = existingUsedTemplates
.Where(t => !unitIds.Contains(t.UnitId))
.ToList();
// Обработка новых юнитов
foreach (var unitId in newUnitIds)
{
var reusableTemplate = await templateReuser.TryReuseOneUnusedTemplateAsync(jobId, unitId, initiator);
@@ -174,6 +178,40 @@ internal class SimpleTemplateSynchronizer : ITemplateSynchronizer
}
}
// Обработка существующих шаблонов (проверка имени)
foreach (var template in existingUsedTemplates)
{
if (unitIds.Contains(template.UnitId))
{
var expectedName = await templateNameNormalizer.GetNormalizedTemplateNameAsync(job, template.UnitId);
if (!string.Equals(template.Name, expectedName, StringComparison.OrdinalIgnoreCase))
{
logger.LogDebug("Шаблон {TemplateId} требует обновления имени: старое = '{OldName}', новое = '{NewName}'", template.Id, template.Name, expectedName);
var nextRun = await GetNextRunAsync(job, template.NextRun);
var updateRequest = new TemplateUpdaterMq
{
TemplateId = template.Id,
JobId = jobId,
UnitId = template.UnitId,
Name = expectedName,
IsActiveTemplate = template.IsActiveTemplate,
IsActiveSchedule = template.IsActiveSchedule,
LastRun = template.LastRun,
NextRun = nextRun,
Index = template.Index,
StatusTypeId = TemplateStatusTypeEnum.Used,
Initiator = initiator,
UnitsInTemplate = new List<Guid>() // для простого шаблона
};
await templateUpdaterMqSender.SendTemplateUpdateMessageAsync(updateRequest);
}
}
}
// Деактивация лишних шаблонов
foreach (var unusedTemplate in unusedTemplates)
{
logger.LogInformation("Деактивация лишнего шаблона {TemplateId} (Job {JobId}, UnitId {UnitId}).", unusedTemplate.Id, jobId, unusedTemplate.UnitId);