feat(templateMatcher): Рефакторинг, основной метод синхронизации GroupedTemplateSynchronizer разбит на отдельные классы; Неиспользуемые шаблоны теперь привязываются к ЭК КОСМПЛЕКСЫ-[ЗО].

This commit is contained in:
Mikhail Kuznetsov
2026-05-14 16:47:27 +10:00
parent f7a74d315a
commit 90e6352117
30 changed files with 1150 additions and 864 deletions

View File

@@ -1,9 +1,9 @@
using PARR.Domain.Common.Rabbit.Messages;
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
namespace PARR.TemplateUpdater.Services
{
internal interface ITemplateUpdaterService
{
Task UpdateTemplateAsync(TemplateUpdaterMq query);
Task UpdateTemplateAsync(TemplateUpdaterMessage query);
}
}

View File

@@ -5,8 +5,7 @@ using PARR.Core.Repositories.Interfaces;
using PARR.Core.Repositories.Interfaces.Job;
using PARR.Core.Repositories.Interfaces.Unit;
using PARR.Core.Services.NextRunServices;
using PARR.Domain.Common.Rabbit.Messages;
using PARR.Domain.Entities;
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
using PARR.Domain.Entities.Job;
using PARR.Domain.Enums;
@@ -39,7 +38,7 @@ namespace PARR.TemplateUpdater.Services
}
public async Task UpdateTemplateAsync(TemplateUpdaterMq query)
public async Task UpdateTemplateAsync(TemplateUpdaterMessage query)
{
var isValid = await IsValidAsync(query);
if (!isValid)
@@ -95,52 +94,55 @@ namespace PARR.TemplateUpdater.Services
scheduleIsChanged = true;
}
//просто обнволяем. не влияет ни на шаблон, ни на расписание
//template.LastRun = query.LastRun;
template.Index = query.Index;
template.StatusTypeId = query.StatusTypeId;
// === Обработка изменения состава UnitsInTemplate ===
var currentUnitIds = template.UnitsInTemplate.Select(u => u.UnitId).ToHashSet();
var newUnitIds = query.UnitsInTemplate.ToHashSet();
// Формируем HashSet пар (UnitId, UnitFieldValueId) для быстрого сравнения
var currentEntries = template.UnitsInTemplate
.Select(u => new UnitInTemplateMessage { UnitId = u.UnitId, UnitFieldValueId = u.UnitFieldValueId })
.ToHashSet();
if (!currentUnitIds.SetEquals(newUnitIds))
var newEntries = query.UnitsInTemplate.ToHashSet();
if (!currentEntries.SetEquals(newEntries))
{
// Удаляем старые связи
// Удаляем связи, которых нет в новом наборе
var toRemove = template.UnitsInTemplate
.Where(u => !newUnitIds.Contains(u.UnitId))
.Where(u => !newEntries.Contains(new UnitInTemplateMessage { UnitId = u.UnitId, UnitFieldValueId = u.UnitFieldValueId }))
.ToList();
foreach (var item in toRemove)
template.UnitsInTemplate.Remove(item);
// Добавляем новые связи
var toAdd = newUnitIds.Except(currentUnitIds);
foreach (var unitId in toAdd)
var toAdd = newEntries.Except(currentEntries);
foreach (var entry in toAdd)
{
template.UnitsInTemplate.Add(new UnitsInTemplate
{
TemplateId = template.Id,
UnitId = unitId,
UnitId = entry.UnitId,
UnitFieldValueId = entry.UnitFieldValueId,
DateCreated = DateTimeOffset.UtcNow
});
}
// Поскольку коллекция изменилась — шаблон считается изменённым
templateIsChanged = true;
}
// === Конец обработки UnitsInTemplate ===
//Для правильного расчета shortcod'ов в БД должны быть сохранены данные UnitInTemplates, JobId, UnitId и т.д.
// Для правильного расчета shortcod'ов в БД должны быть сохранены данные UnitsInTemplate, JobId, UnitId и т.д.
if (templateIsChanged && !await templateService.CommitAsync(query.Initiator))
{
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMq), query.ToJson());
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMessage), query.ToJson());
return;
}
var nextRun = await nextRunService.GetNextRunForTemplateAsync(template.Id, query.IsNew);
if (!nextRun.HasValue)
{
logger.LogError("Ошибка при расчете нового nextRun (вернулся null) для шаблона {templateId}, {templateName}", template.Id, template.Name);
logger.LogError("Ошибка при расчете нового nextRun (вернулся null) для шаблона {TemplateId}, {TemplateName}", template.Id, template.Name);
return;
}
@@ -151,32 +153,23 @@ namespace PARR.TemplateUpdater.Services
scheduleIsChanged = true;
}
// === конец обработки UnitsInTemplate ===
if (templateIsChanged)
{
// ставим задачу на обновление шаблона
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, template);
//robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
robotConfigurationService.SetUpdateTaskStatusIfAllow(config);
logger.LogDebug("Для шаблона {TemplateId} устанавливаю статус {Status}", template.Id, RobotStatusEnum.Wait.ToString());
}
if (scheduleIsChanged)
{
// ставим задачу на обновление расписания
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template);
//robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
robotConfigurationService.SetUpdateTaskStatusIfAllow(config);
logger.LogDebug("Для расписания {TemplateId} устанавливаю статус {Status}", template.Id, RobotStatusEnum.Wait.ToString());
}
if (!await templateService.CommitAsync(query.Initiator))
{
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMq), query.ToJson());
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMessage), query.ToJson());
return;
}
@@ -189,7 +182,7 @@ namespace PARR.TemplateUpdater.Services
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
private async Task<bool> IsValidAsync(TemplateUpdaterMq query)
private async Task<bool> IsValidAsync(TemplateUpdaterMessage query)
{
var template = await templateService.Get().AsNoTracking()
.Include(t => t.RobotConfigurations)

View File

@@ -2,7 +2,7 @@
using Microsoft.Extensions.Logging;
using PARR.Core.Common.Interfaces;
using PARR.Core.Common.Interfaces.RabbitServices;
using PARR.Domain.Common.Rabbit.Messages;
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
using PARR.TemplateUpdater.Services;
using PARR.TemplateUpdater.Settings;
@@ -51,7 +51,7 @@ namespace PARR.TemplateUpdater
{
logger.LogInformation("Получили запрос: {msg}", msg);
var query = transformService.GetModelFromJson<TemplateUpdaterMq>(msg);
var query = transformService.GetModelFromJson<TemplateUpdaterMessage>(msg);
if (query == null)
return;