2025-12-26 21:47:53 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2026-02-20 15:57:51 +10:00
|
|
|
|
using Microsoft.Extensions.Options;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
using PARR.Core.Repositories.Interfaces;
|
|
|
|
|
|
using PARR.Core.Repositories.Interfaces.Job;
|
2026-05-14 16:47:27 +10:00
|
|
|
|
using PARR.Domain.Common.Rabbit.Messages.TemplateMatching;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
using PARR.Domain.Entities;
|
2026-04-13 16:58:30 +10:00
|
|
|
|
using PARR.Domain.Entities.Base.History;
|
2026-05-12 16:34:31 +10:00
|
|
|
|
using PARR.Domain.Entities.Job;
|
2026-04-14 12:01:49 +10:00
|
|
|
|
using PARR.Domain.Enums;
|
2026-05-04 11:55:07 +10:00
|
|
|
|
using PARR.Domain.Settings;
|
2025-12-26 21:47:53 +10:00
|
|
|
|
using PARR.TemplateMatcher.Services.Interfaces;
|
2026-02-20 15:57:51 +10:00
|
|
|
|
using PARR.TemplateMatcher.Settings;
|
2025-12-26 21:47:53 +10:00
|
|
|
|
|
|
|
|
|
|
namespace PARR.TemplateMatcher.Services.Implementations;
|
|
|
|
|
|
|
|
|
|
|
|
internal class TemplateDeactivator : ITemplateDeactivator
|
|
|
|
|
|
{
|
|
|
|
|
|
private const bool DefaultUnusedTemplateState = false;
|
|
|
|
|
|
private const bool DefaultUnusedScheduleState = false;
|
|
|
|
|
|
|
|
|
|
|
|
private readonly ILogger<TemplateDeactivator> logger;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
private readonly ITemplateRepository templateService;
|
|
|
|
|
|
private readonly IJobRepository jobService;
|
2025-12-26 21:47:53 +10:00
|
|
|
|
private readonly ITemplateNameNormalizer namenormalizer;
|
|
|
|
|
|
private readonly ITemplateUpdaterMqSender sender;
|
2025-12-30 14:27:59 +10:00
|
|
|
|
private readonly SettingsFromDb settingsFromDb;
|
2026-02-20 15:57:51 +10:00
|
|
|
|
private readonly IOptions<TemplateSettings> templateSettings;
|
2025-12-26 21:47:53 +10:00
|
|
|
|
|
|
|
|
|
|
public TemplateDeactivator(
|
|
|
|
|
|
ILogger<TemplateDeactivator> logger,
|
2026-04-30 10:35:31 +10:00
|
|
|
|
ITemplateRepository templateService,
|
|
|
|
|
|
IJobRepository jobService,
|
2025-12-26 21:47:53 +10:00
|
|
|
|
ITemplateNameNormalizer namenormalizer,
|
2025-12-30 14:27:59 +10:00
|
|
|
|
ITemplateUpdaterMqSender sender,
|
2026-02-20 15:57:51 +10:00
|
|
|
|
SettingsFromDb settingsFromDb,
|
|
|
|
|
|
IOptions<TemplateSettings> templateSettings
|
2025-12-30 14:27:59 +10:00
|
|
|
|
)
|
2025-12-26 21:47:53 +10:00
|
|
|
|
{
|
|
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
this.templateService = templateService;
|
|
|
|
|
|
this.jobService = jobService;
|
|
|
|
|
|
this.namenormalizer = namenormalizer;
|
|
|
|
|
|
this.sender = sender;
|
2025-12-30 14:27:59 +10:00
|
|
|
|
this.settingsFromDb = settingsFromDb;
|
2026-02-20 15:57:51 +10:00
|
|
|
|
this.templateSettings = templateSettings;
|
2025-12-26 21:47:53 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<bool> DeactivateTemplateAsync(Template template, HistoryInitiator initiator)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (template.StatusTypeId == TemplateStatusTypeEnum.Updating)
|
2026-05-06 13:54:41 +10:00
|
|
|
|
return true;
|
2025-12-26 21:47:53 +10:00
|
|
|
|
|
|
|
|
|
|
if (template.StatusTypeId == TemplateStatusTypeEnum.Unused)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogDebug("Шаблон {TemplateId} уже неактивен (Unused), пропускаем деактивацию.", template.Id);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
logger.LogInformation("Шаблон {TemplateId} (UnitId {UnitId}) → деактивация.",
|
|
|
|
|
|
template.Id, template.UnitId);
|
|
|
|
|
|
|
|
|
|
|
|
template.StatusTypeId = TemplateStatusTypeEnum.Updating;
|
|
|
|
|
|
template.DateModified = DateTimeOffset.UtcNow;
|
|
|
|
|
|
|
|
|
|
|
|
if (!await templateService.CommitAsync(initiator))
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError("Не удалось перевести шаблон {TemplateId} в Updating.", template.Id);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var unusedJob = await jobService.Get()
|
|
|
|
|
|
.AsNoTracking()
|
|
|
|
|
|
.Include(j => j.Tnk)
|
|
|
|
|
|
.Include(j => j.Group)
|
|
|
|
|
|
.ThenInclude(g => g!.GroupType)
|
2025-12-30 14:27:59 +10:00
|
|
|
|
.FirstOrDefaultAsync(j => j.Id == settingsFromDb.JobIdForUnusedTemplates);
|
2025-12-26 21:47:53 +10:00
|
|
|
|
|
2026-02-20 15:57:51 +10:00
|
|
|
|
|
2025-12-26 21:47:53 +10:00
|
|
|
|
if (unusedJob == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError("Job для деактивированных шаблонов не найден.");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-20 15:57:51 +10:00
|
|
|
|
unusedJob.TemplateNameMask = templateSettings.Value.UnusedTemplateNameMask;
|
|
|
|
|
|
|
2026-01-16 18:26:06 +10:00
|
|
|
|
// === Создаём временный Template для нормализации имени ===
|
|
|
|
|
|
var tempTemplateForName = new Template
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = template.Id,
|
|
|
|
|
|
Name = template.Name,
|
|
|
|
|
|
JobId = unusedJob.Id,
|
|
|
|
|
|
UnitId = template.UnitId,
|
|
|
|
|
|
Index = template.Index,
|
|
|
|
|
|
Job = unusedJob,
|
|
|
|
|
|
Unit = template.Unit,
|
|
|
|
|
|
UnitsInTemplate = new List<UnitsInTemplate>()
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var expectedName = await namenormalizer.GetNormalizedTemplateNameAsync(tempTemplateForName);
|
2025-12-26 21:47:53 +10:00
|
|
|
|
|
2026-05-14 16:47:27 +10:00
|
|
|
|
var updateRequest = new TemplateUpdaterMessage
|
2025-12-26 21:47:53 +10:00
|
|
|
|
{
|
|
|
|
|
|
TemplateId = template.Id,
|
|
|
|
|
|
JobId = unusedJob.Id,
|
|
|
|
|
|
UnitId = template.UnitId,
|
2026-02-20 15:57:51 +10:00
|
|
|
|
Name = expectedName,
|
2025-12-26 21:47:53 +10:00
|
|
|
|
IsActiveTemplate = DefaultUnusedTemplateState,
|
|
|
|
|
|
IsActiveSchedule = DefaultUnusedScheduleState,
|
2026-02-26 14:42:53 +10:00
|
|
|
|
IsNew = false,
|
2025-12-26 21:47:53 +10:00
|
|
|
|
Index = template.Index,
|
|
|
|
|
|
StatusTypeId = TemplateStatusTypeEnum.Unused,
|
|
|
|
|
|
Initiator = initiator,
|
2026-05-14 16:47:27 +10:00
|
|
|
|
UnitsInTemplate = new List<UnitInTemplateMessage>()
|
2025-12-26 21:47:53 +10:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
await sender.SendTemplateUpdateMessageAsync(updateRequest);
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|