using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.Constants; using PARR.DAL.Contracts; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; namespace PARR.TemplateActivator; internal class TemplateActivator : ITemplateActivator { private readonly ILogger logger; private readonly ITemplateService templateService; private readonly IRobotConfigurationService robotConfigurationService; public TemplateActivator( ILogger logger, ITemplateService templateService, IRobotConfigurationService robotConfigurationService ) { this.logger = logger; this.templateService = templateService; this.robotConfigurationService = robotConfigurationService; } public async Task ChangeStateAsync(Guid applicationInWorkId, TemplateActivatorActionsEnum action) { var query = templateService.Get() .Include(t => t.RobotConfigurations).ThenInclude(t => t.Robot) .Where(t => t.ApplicationInWorkId == applicationInWorkId); 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; default: break; } if (changes > 0 && !await templateService.CommitAsync()) logger.LogError($"{this.GetType} не удалось записать измения в БД о новых состояниях шаблонов и расписаний регламентной работы Id {applicationInWorkId}"); } /// /// Обновить состояние расписаний по запросу query на newState, без записи в БД. Возвращает количество шаблонов требующих фиксации в БД /// /// /// /// private async Task UpdateScheduleStateAsync(IQueryable