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

- Устранена ошибка, когда при переиспользовании шаблона для шорткодов передавался ЭК "КОМПЛЕКСЫ-[ЗО]" вместо целевого ЭК шаблона.
- Проведен небольшой рефакторинг общих процессов синхронизации различных типов групп работ.
This commit is contained in:
Mikhail Kuznetsov
2026-05-20 17:59:06 +10:00
parent c0148088c1
commit 513e5f869a
26 changed files with 995 additions and 638 deletions

View File

@@ -0,0 +1,12 @@
using PARR.TemplateMatcher.Models;
namespace PARR.TemplateMatcher.Services.Interfaces
{
/// <summary>
/// Оркестрирует выделение шаблона: попытка переиспользования или создание нового.
/// </summary>
public interface ITemplateAllocationService
{
Task AllocateAsync(TemplateAllocationRequest request, CancellationToken ct = default);
}
}

View File

@@ -0,0 +1,13 @@
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
namespace PARR.TemplateMatcher.Services.Interfaces
{
/// <summary>
/// Публикует команды создания и обновления шаблонов в RabbitMQ.
/// </summary>
public interface ITemplateMqPublisher
{
Task PublishUpdateAsync(TemplateUpdaterMessage message, CancellationToken ct = default);
Task PublishCreateAsync(TemplateGeneratorMessage message, CancellationToken ct = default);
}
}

View File

@@ -1,27 +1,31 @@
using PARR.Domain.Entities;
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Entities.Job;
using PARR.Domain.Entities.Unit;
namespace PARR.TemplateMatcher.Services.Interfaces
{
/// <summary>
/// Отвечает за полный цикл переиспользования Unused-шаблона:
/// 1. Атомарный захват в БД (с retry).
/// 2. Нормализация имени.
/// 3. Отправка команды на обновление (активацию) в MQ.
/// </summary>
public interface ITemplateReuser
{
/// <summary>
/// Пытается переиспользовать неиспользуемый шаблон для указанной работы и ЭК.
/// При резервировании шаблона для правильного расчета NextRun Id работы
/// и ЭК устанавливается при захвате.
/// Пытается переиспользовать шаблон. Возвращает true, если успешно захвачен и отправлена команда.
/// </summary>
/// <param name="jobId">Id работы.</param>
/// <param name="unitId">Id ЭК.</param>
/// <param name="initiator">Данные инициатора операции.</param>
/// <param name="maxAttempts">Максимальное количество попыток (по умолчанию 3).</param>
/// <returns>
/// Зарезервированный шаблон или <see langword="null"/>,
/// если не удалось получить шаблон после всех попыток.
/// </returns>
Task<Template?> TryReuseOneUnusedTemplateAsync(
Guid jobId,
Guid unitId,
Task<bool> TryReuseAsync(
Job targetJob,
Guid targetUnitId,
Unit? targetUnit,
int? index,
List<UnitInTemplateMessage> unitsInTemplate,
bool isActiveTemplate,
bool isActiveSchedule,
HistoryInitiator initiator,
int maxAttempts = 3);
CancellationToken ct = default);
}
}

View File

@@ -1,9 +0,0 @@
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
namespace PARR.TemplateMatcher.Services.Interfaces
{
public interface ITemplateUpdaterMqSender
{
Task SendTemplateUpdateMessageAsync(TemplateUpdaterMessage updateRequest);
}
}