using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.Common.Domain; using PARR.Constants; using PARR.DAL.Services.Interfaces; using PARR.JobAutoControl.Settings; using System.Text.Json; namespace PARR.JobAutoControl { internal class JobAutoControlManager : IJobAutoControlManager { private readonly WorkerSettings workerSettings; private readonly ILogger logger; private readonly IIntervalService intervalService; private readonly IServiceProvider serviceProvider; private readonly MqSettings mqSettings; public JobAutoControlManager( WorkerSettings workerSettings, ILogger logger, IIntervalService intervalService, IServiceProvider serviceProvider, MqSettings mqSettings ) { this.workerSettings = workerSettings; this.logger = logger; this.intervalService = intervalService; this.serviceProvider = serviceProvider; this.mqSettings = mqSettings; } public async Task StartAsync() { logger.LogInformation("Запуск сервиса управления авто-контролем РР (JobAutoControl)"); await intervalService.IntervalInitAsync(async () => { using (var scope = serviceProvider.CreateScope()) { var jobAutoControlService = scope.ServiceProvider.GetService(); var mqService = scope.ServiceProvider.GetService(); if (jobAutoControlService == null || mqService == null) throw new Exception($"Не смог получить серивс {nameof(IJobAutoControlService)} или {nameof(IMqService)}"); await HandlerAsync(jobAutoControlService, mqService); } }, workerSettings.RepeatEvery); } private async Task HandlerAsync(IJobAutoControlService jobAutoControlService, IMqService mqService) { await GenerateAsync(jobAutoControlService, mqService); await DeactivateAsync(jobAutoControlService, mqService); await ActivateAsync(jobAutoControlService, mqService); } /// /// Генерировать новые РР /// /// /// /// private async Task GenerateAsync(IJobAutoControlService jobAutoControlService, IMqService mqService) { var jobsToGenerate = await jobAutoControlService.Get() .Include(t => t.JobEkMasks) .Include(t => t.JobAutoControlInEkStatuses) .Include(t => t.ApplicationsInWork) .Where(t => t.CreateNew && t.JobEkMasks.Any() && t.JobAutoControlInEkStatuses.Any()) .ToListAsync(); logger.LogInformation($"Найдено РР с включенным авто-контролем для генерации шаблонов и расписаний: {jobsToGenerate.Count()} шт."); if (!jobsToGenerate.Any()) return; jobsToGenerate.ForEach(job => { job.JobEkMasks.ToList().ForEach(ek => { job.JobAutoControlInEkStatuses.ToList().ForEach(ekStatus => { var request = new GeneratorTemplateMq { Action = "create", ApplicationId = job.ApplicationsInWork!.ApplicationId, Ek = ek.Name, WorkId = job.ApplicationsInWork!.WorkId, StatusEk = ekStatus.EkStatusCode, IsActiveTemplate = job.OnTemplateIsActive, IsActiveSchedule = job.OnScheduleIsActive, HistoryInitiator = new HistoryInitiator { InitiatorComment = "Запрос на генерацию с авто-контроля", InitiatorParrComponentId = ParrComponentsEnum.JobAutoControl } }; var msg = JsonSerializer.Serialize(request); var result = mqService.Send(mqSettings.Generator, new[] { msg }); if (result.IsSuccess) logger.LogInformation($"Отправлен запрос на генерацию: {msg}"); else logger.LogError($"Ошибка при отправке запроса на генерацию: {msg}"); }); }); }); } /// /// Деактивировать РР /// /// /// /// private async Task DeactivateAsync(IJobAutoControlService jobAutoControlService, IMqService mqService) { var jobsToDeactivate = await jobAutoControlService.Get() .Include(t => t.JobEkMasks) .Include(t => t.JobAutoControlInEkStatuses) .Where(t => t.Deactivate && t.JobEkMasks.Any() && t.JobAutoControlInEkStatuses.Any()) .Select(t => t.ApplicationInWorkId) .ToListAsync(); logger.LogInformation($"Найдено РР с включенным авто-контролем для деактивации шаблонов и расписаний: {jobsToDeactivate.Count()} шт."); if (!jobsToDeactivate.Any()) return; jobsToDeactivate.ForEach(applicationInWorkId => { var request = new TemplateActivatorMq { Action = TemplateActivatorActionsEnum.DeactivateAllForAutoControl, ApplicationInWorkId = applicationInWorkId, HistoryInitiator = new HistoryInitiator { InitiatorComment = "Запрос на деактивацию с авто-контроля", InitiatorParrComponentId = ParrComponentsEnum.JobAutoControl } }; var msg = JsonSerializer.Serialize(request); var result = mqService.Send(mqSettings.Activator, new[] { msg }); if (result.IsSuccess) logger.LogInformation($"Отправлен запрос на деактивацию: {msg}"); else logger.LogError($"Ошибка при отправке запроса на деактивацию: {msg}"); }); } /// /// Активировать РР /// /// /// /// private async Task ActivateAsync(IJobAutoControlService jobAutoControlService, IMqService mqService) { var jobsToActivate = await jobAutoControlService.Get() .Include(t => t.JobEkMasks) .Include(t => t.JobAutoControlInEkStatuses) .Where(t => t.Activate && t.JobEkMasks.Any() && t.JobAutoControlInEkStatuses.Any()) .Select(t => t.ApplicationInWorkId) .ToListAsync(); if (!jobsToActivate.Any()) return; jobsToActivate.ForEach(applicationInWorkId => { var request = new TemplateActivatorMq { Action = TemplateActivatorActionsEnum.ActivateAllForAutoControl, ApplicationInWorkId = applicationInWorkId, HistoryInitiator = new HistoryInitiator { InitiatorComment = "Запрос на активацию с авто-контроля", InitiatorParrComponentId = ParrComponentsEnum.JobAutoControl } }; var msg = JsonSerializer.Serialize(request); var result = mqService.Send(mqSettings.Activator, new[] { msg }); if (result.IsSuccess) logger.LogInformation($"Отправлен запрос на активацию: {msg}"); else logger.LogError($"Ошибка при отправке запроса на активацию: {msg}"); }); } } }