using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.Core.Repositories.Interfaces; using PARR.Domain.Common.Rabbit.Messages; using PARR.Domain.Entities; using PARR.Domain.Enums; namespace PARR.TemplateActivator; internal class TemplateActivator : ITemplateActivator { private readonly ILogger logger; private readonly ITemplateRepository templateService; private readonly IRobotConfigurationRepository robotConfigurationService; //private readonly IJobAutoControlService jobAutoControlService; //private readonly IApplicationsInWorkService applicationsInWorkService; public TemplateActivator( ILogger logger, ITemplateRepository templateService, IRobotConfigurationRepository robotConfigurationService //IJobAutoControlService jobAutoControlService, //IApplicationsInWorkService applicationsInWorkService ) { this.logger = logger; this.templateService = templateService; this.robotConfigurationService = robotConfigurationService; //this.jobAutoControlService = jobAutoControlService; //this.applicationsInWorkService = applicationsInWorkService; } public async Task ChangeStateAsync(TemplateActivatorMq query) { var templates = await GetTemplatesAsync(query); logger.LogInformation($"Объектов для изменения: {templates.Count} шт."); if (templates.Count == 0) return; switch (query.EsppObject) { case TemplateActivatorEsppObjectTypesEnum.Template: foreach (var template in templates) { if (template.IsActiveTemplate != query.NewState) { template.IsActiveTemplate = query.NewState; UpdateRobotConfiguration(RobotsEnum.TemplateOrder, template); } } break; case TemplateActivatorEsppObjectTypesEnum.Schedule: foreach (var template in templates) { if (template.IsActiveSchedule != query.NewState) { template.IsActiveSchedule = query.NewState; UpdateRobotConfiguration(RobotsEnum.ScheduleOrder, template); } } break; } if (!await templateService.CommitAsync(query.HistoryInitiator)) logger.LogError($"Не удалось записать измения в БД о новых состояниях шаблонов и расписаний."); logger.LogInformation($"Изменено состояние объектов: {templates.Count}"); } private async Task> GetTemplatesAsync(TemplateActivatorMq query) { // ищем все шаблоны попадающие под условие var templatesQuery = templateService.Get(); switch (query.EsppObject) { case TemplateActivatorEsppObjectTypesEnum.Template: //нужно изменить шаблоны templatesQuery = templatesQuery.Where(t => t.IsActiveTemplate != query.NewState); break; case TemplateActivatorEsppObjectTypesEnum.Schedule: //нужно изменить расписания templatesQuery = templatesQuery.Where(t => t.IsActiveSchedule != query.NewState); break; } switch (query.EntityType) { case SyncTaskEntityTypeEnum.JobGroup: templatesQuery = templatesQuery.Where(t => t.Job!.GroupId == query.Id); break; case SyncTaskEntityTypeEnum.Job: templatesQuery = templatesQuery.Where(t => t.JobId == query.Id); break; case SyncTaskEntityTypeEnum.Template: templatesQuery = templatesQuery.Where(t => t.Id == query.Id); break; default: // прекращаем, чтоб слуяайно не обновить все шаблоны throw new InvalidOperationException($"Неверный тип объекта. {nameof(query.EntityType)}: {query.EntityType}"); } if (query.AllowUnused == false) // учитываем только шаблоны которые не помеченные как IsUnused = true (неиспользуемые) // т е берем только используемые шаблоны templatesQuery = templatesQuery.Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used); return await templatesQuery.Include(t => t.RobotConfigurations).ToListAsync(); } /// /// принудительно обновить состояние задачи, связанной с шаблоном/расписанием, на обновление /// /// /// private void UpdateRobotConfiguration(RobotsEnum robotsEnum, Template t) { var config = robotConfigurationService.GetFromTemplateByRobotCode(robotsEnum, t); // robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config); robotConfigurationService.SetUpdateTaskStatusIfAllow(config); } #region old //public async Task ChangeStateAsyncOld(Guid applicationInWorkId, TemplateActivatorActionsEnum action, IHistoryInitiator? historyInitiator)//TODO Migratin to Job //{ // var query = templateService.Get() // .Include(t => t.RobotConfigurations).ThenInclude(t => t.Robot) // .Where(t => t.JobId == applicationInWorkId);//TODO Migratin to Job // var changes = 0; // switch (action) // { // case TemplateActivatorActionsEnum.ActivateAllTemplates: // logger.LogInformation($"Получен запрос на активацию всех шаблонов"); // query = query.Where(t => !t.IsActiveTemplate); // changes = await UpdateTemplateStateAsync(query, true); // break; // case TemplateActivatorActionsEnum.ActivateTemplatesWithActiveSchedules: // logger.LogInformation($"Получен запрос на активацию всех шаблонов, у которых активировано расписание"); // query = query.Where(t => !t.IsActiveTemplate && t.IsActiveSchedule); // changes = await UpdateTemplateStateAsync(query, true); // break; // case TemplateActivatorActionsEnum.DeactivateAllTemplates: // logger.LogInformation($"Получен запрос на деактивацию всех шаблонов"); // query = query.Where(t => t.IsActiveTemplate); // changes = await UpdateTemplateStateAsync(query, false); // break; // case TemplateActivatorActionsEnum.DeactivateTemplatesWithDeactivationSchedules: // logger.LogInformation($"Получен запрос на деактивацию всех шаблонов, у которых неактивированы расписания"); // query = query.Where(t => t.IsActiveTemplate && !t.IsActiveSchedule); // changes = await UpdateTemplateStateAsync(query, false); // break; // case TemplateActivatorActionsEnum.ActivateAllSchedules: // logger.LogInformation($"Получен запрос на активацию всех расписаний"); // query = query.Where(t => !t.IsActiveSchedule); // changes = await UpdateScheduleStateAsync(query, true); // break; // case TemplateActivatorActionsEnum.DeactivateAllSchedules: // logger.LogInformation($"Получен запрос на деактивацию всех расписаний"); // query = query.Where(t => t.IsActiveSchedule); // changes = await UpdateScheduleStateAsync(query, false); // break; // case TemplateActivatorActionsEnum.ActivateSchedulesWithActiveTemplates: // logger.LogInformation($"Получен запрос на активацию всех расписаний, у которых активированы шаблоны"); // query = query.Where(t => t.IsActiveTemplate && !t.IsActiveSchedule); // changes = await UpdateScheduleStateAsync(query, true); // break; // case TemplateActivatorActionsEnum.DeactivateSchedulesWithDeactivationTemplates: // logger.LogInformation($"Получен запрос на деактивацию всех расписаний, у которых неактивированы шаблоны"); // query = query.Where(t => !t.IsActiveTemplate && t.IsActiveSchedule); // changes = await UpdateScheduleStateAsync(query, false); // break; // case TemplateActivatorActionsEnum.DeactivateSchedulesWithTemplateSyncErrors: // logger.LogInformation($"Получен запрос на деактивацию всех расписаний, у которых шаблоны синхронизированы с ошибкой"); // query = query.Where(t => t.IsActiveTemplate && // t.RobotConfigurations.Any(t => // t.RobotCode == (int)RobotsEnum.TemplateOrder && // t.RobotStatusCode == (int)RobotStatusEnum.Error) // ); // changes = await UpdateScheduleStateAsync(query, false); // break; // case TemplateActivatorActionsEnum.DeactivateAllForAutoControl: // logger.LogInformation($"Получен запрос на деактивацию шаблонов и расписаний, для ЭК неудовлетворяющим условиям автоконтроля"); // changes = await CoordinateJobsWithAutoControlAsync(applicationInWorkId, query, false); // break; // case TemplateActivatorActionsEnum.ActivateAllForAutoControl: // logger.LogInformation($"Получен запрос на активацию шаблонов и расписаний, для ЭК удовлетворяющим условиям автоконтроля"); // changes = await CoordinateJobsWithAutoControlAsync(applicationInWorkId, query, true); // break; // default: // break; // } // if (historyInitiator != null) // { // historyInitiator.InitiatorComment += $" Action: {action.ToString()}"; // historyInitiator.InitiatorComment = historyInitiator.InitiatorComment.Trim(); // } // if (changes > 0 && !await templateService.CommitAsync(historyInitiator)) // logger.LogError($"{GetType().Name} не удалось записать измения в БД о новых состояниях шаблонов и расписаний регламентной работы Id {applicationInWorkId}"); // logger.LogDebug($"{GetType().Name} изменил состояние шаблонов/расписаний({changes}) регламентной работы Id {applicationInWorkId}"); //} //private async Task CoordinateJobsWithAutoControlAsync(Guid applicationInWorkId, IQueryable