using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.BLL.Helpers; using PARR.Common.Domain; using PARR.Constants; using PARR.DAL.Contracts; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; using System.Threading.Channels; using System.Threading.Tasks; namespace PARR.TemplateActivator; internal class TemplateActivator : ITemplateActivator { private readonly ILogger logger; private readonly ITemplateService templateService; private readonly IRobotConfigurationService robotConfigurationService; private readonly IJobAutoControlService jobAutoControlService; private readonly IApplicationsInWorkService applicationsInWorkService; public TemplateActivator( ILogger logger, ITemplateService templateService, IRobotConfigurationService robotConfigurationService, IJobAutoControlService jobAutoControlService, IApplicationsInWorkService applicationsInWorkService ) { this.logger = logger; this.templateService = templateService; this.robotConfigurationService = robotConfigurationService; this.jobAutoControlService = jobAutoControlService; this.applicationsInWorkService = applicationsInWorkService; } public async Task ChangeStateAsync(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