using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.Common.Domain; using PARR.Constants; using PARR.DAL.Models; using PARR.DAL.Models.Job; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.TemplateMatcher.Services.Interfaces; using PARR.TemplateMatcher.Settings; using System.Text.Json; namespace PARR.TemplateMatcher.Services.Implementations; internal class TemplateDeactivator : ITemplateDeactivator { private const bool DefaultUnusedTemplateState = false; private const bool DefaultUnusedScheduleState = false; private readonly ILogger logger; private readonly ITemplateService templateService; private readonly IJobService jobService; private readonly ITemplateNameNormalizer namenormalizer; private readonly ITemplateUpdaterMqSender sender; private readonly Guid unusedJobId = Guid.Parse("8f85a91c-a223-4686-bb69-1f0ee73624f2"); public TemplateDeactivator( ILogger logger, ITemplateService templateService, IJobService jobService, ITemplateNameNormalizer namenormalizer, ITemplateUpdaterMqSender sender) { this.logger = logger; this.templateService = templateService; this.jobService = jobService; this.namenormalizer = namenormalizer; this.sender = sender; } public async Task DeactivateTemplateAsync(Template template, HistoryInitiator initiator) { if (template.StatusTypeId == TemplateStatusTypeEnum.Updating) return true; // уже в обработке 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) .FirstOrDefaultAsync(j => j.Id == unusedJobId); if (unusedJob == null) { logger.LogError("Job для деактивированных шаблонов не найден."); return false; } // Вычисляем имя шаблона с новым Job var expectedName = await namenormalizer.GetNormalizedTemplateNameAsync(unusedJob, template.UnitId); var updateRequest = new TemplateUpdaterMq { TemplateId = template.Id, JobId = unusedJob.Id, UnitId = template.UnitId, Name = expectedName, IsActiveTemplate = DefaultUnusedTemplateState, IsActiveSchedule = DefaultUnusedScheduleState, LastRun = template.LastRun, NextRun = template.NextRun, Index = template.Index, StatusTypeId = TemplateStatusTypeEnum.Unused, Initiator = initiator, UnitsInTemplate = new List() }; await sender.SendTemplateUpdateMessageAsync(updateRequest); return true; } }