diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 18adeb96..1d87ec35 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -416,9 +416,12 @@ /// public static class TemplateActivator { - public const string SendRequest = Base + "/jobs/" + jobId + "/template-activator"; + public const string SendRequest = Base + "/templates/change-state"; - public const string jobId = "{jobId}"; + + //public const string SendRequest = Base + "/jobs/" + jobId + "/template-activator"; + + //public const string jobId = "{jobId}"; } #endregion diff --git a/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs b/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs index f2e5ad87..4210a9e9 100644 --- a/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs +++ b/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs @@ -4,9 +4,34 @@ namespace PARR.API.Contracts.V1.Requests { public class TemplateActivatorRequest { + ///// + ///// Действие по активации/деактивации + ///// + //public TemplateActivatorActionsEnum Action { get; set; } + /// - /// Действие по активации/деактивации + /// ИД объекта, JobGroupId, JobId, TemplateId /// - public TemplateActivatorActionsEnum Action { get; set; } + public Guid Id { get; set; } + + /// + /// Тип объекта + /// + public SyncTaskEntityTypeEnum EntityType { get; set; } + + ///// + ///// Учитывать неиспользованные шаблоны + ///// + //public bool AllowUnused { get; set; } = false; + + /// + /// Объект воздейстивя (шаблон, расписание) + /// + public TemplateActivatorEsppObjectTypesEnum EsppObject { get; set; } + + /// + /// Новое состояние объекта + /// + public bool NewState { get; set; } } } diff --git a/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs b/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs index 7876c19d..7b4a7114 100644 --- a/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs +++ b/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs @@ -56,7 +56,7 @@ namespace PARR.API.Controllers.V1 //если успех, изменяем статус задания на успех if (request.RobotStatusCode == RobotStatusEnum.Complete) - robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Ok, ref config); + robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Ok, config); if (!await robotConfigurationService.CommitAsync()) return BadRequest("Ошибка при изменении статуса работы робота."); diff --git a/PARR.API/Controllers/V1/TemplateActivatorController.cs b/PARR.API/Controllers/V1/TemplateActivatorController.cs index 79ebacf6..24a2af7c 100644 --- a/PARR.API/Controllers/V1/TemplateActivatorController.cs +++ b/PARR.API/Controllers/V1/TemplateActivatorController.cs @@ -50,25 +50,20 @@ namespace PARR.API.Controllers.V1 /// /// Отправить запрос на активацию/деактивацию шаблонов/расписаний /// - /// /// [HttpPost(ApiRoutes.TemplateActivator.SendRequest)] - public async Task SendRequest([FromRoute] Guid jobId, [FromBody] TemplateActivatorRequest request) + public async Task SendRequest([FromBody] TemplateActivatorRequest request) { var resultValidate = await validator.ValidateAsync(request); if (!resultValidate.IsValid) return BadRequest(new Response(resultValidate.Errors)); - var job = await jobService.GetAsync(jobId); - - if (job == null) - return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(jobId), Message = "Некорректное значение" } })); - - var mqRequest = new TemplateActivatorMq { - JobId = jobId, - Action = request.Action, + Id = request.Id, + EntityType = request.EntityType, + EsppObject = request.EsppObject, + NewState = request.NewState, HistoryInitiator = new HistoryInitiator { InitiatorIp = clientService.GetClientIp()?.ToString(), InitiatorParrComponentId = ParrComponentsEnum.Api } }; diff --git a/PARR.API/Controllers/V1/TemplateController.cs b/PARR.API/Controllers/V1/TemplateController.cs index 683ce3dd..78e56fdf 100644 --- a/PARR.API/Controllers/V1/TemplateController.cs +++ b/PARR.API/Controllers/V1/TemplateController.cs @@ -118,6 +118,9 @@ namespace PARR.API.Controllers.V1 [HttpPut(ApiRoutes.Template.ChangeState)] public async Task ChangeState([FromRoute] Guid id, [FromBody] TemplateChangeStateRequest request) { + //TODO:!!! Возможно тут не надо сразу менять, а отправить запрос в TemplateActivator и пусть он сам занимается своей работой!!! + + var template = await templateService.GetWithIncludes() .Include(t => t.Unit).ThenInclude(t => t!.UnitValues).ThenInclude(t => t.Field) .Include(t => t.Unit).ThenInclude(t => t!.UnitValues).ThenInclude(t => t.Value) @@ -135,16 +138,16 @@ namespace PARR.API.Controllers.V1 { template.IsActiveTemplate = request.IsActiveTemplate; //необходимо обновить шаблон - var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, ref template); - robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, ref config); + var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, template); + robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config); } if (template.IsActiveSchedule != request.IsActiveSchedule) { template.IsActiveSchedule = request.IsActiveSchedule; //необходимо обновить расписание - var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, ref template); - robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, ref config); + var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template); + robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config); } if (!await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Изменён статус шаблона/расписания", InitiatorIp = clientService.GetClientIp()?.ToString(), InitiatorParrComponentId = ParrComponentsEnum.Api })) diff --git a/PARR.API/Validators/TemplateActivatorRequestValidator.cs b/PARR.API/Validators/TemplateActivatorRequestValidator.cs index 539e10d8..399222ea 100644 --- a/PARR.API/Validators/TemplateActivatorRequestValidator.cs +++ b/PARR.API/Validators/TemplateActivatorRequestValidator.cs @@ -1,16 +1,43 @@ using FluentValidation; using PARR.API.Contracts.V1.Requests; using PARR.Constants; +using PARR.DAL.Services.Interfaces; +using PARR.DAL.Services.Interfaces.Job; namespace PARR.API.Validators { public class TemplateActivatorRequestValidator : AbstractValidator { - public TemplateActivatorRequestValidator() + public TemplateActivatorRequestValidator( + ITemplateService templateService, + IJobService jobService, + IJobGroupService jobGroupService + ) { - RuleFor(t => t.Action).Must(action => - Enum.IsDefined(typeof(TemplateActivatorActionsEnum), action) - ).WithMessage("Некорректное значение action"); + RuleFor(t => t.EntityType).Must(type => + Enum.IsDefined(typeof(SyncTaskEntityTypeEnum), type) + ).WithMessage("Некорректное значение EntityType"); + + RuleFor(t => t.EsppObject).Must(obj => + Enum.IsDefined(typeof(TemplateActivatorEsppObjectTypesEnum), obj) + ).WithMessage("Некорректное значение EsppObject"); + + RuleFor(t => t.Id) + .MustAsync(async (entity, value, c) => + { + switch (entity.EntityType) + { + case SyncTaskEntityTypeEnum.JobGroup: + return await jobGroupService.GetAsync(value) != null; + case SyncTaskEntityTypeEnum.Job: + return await jobService.GetAsync(value) != null; + case SyncTaskEntityTypeEnum.Template: + return await templateService.GetAsync(value) != null; + } + + return false; + }) + .WithMessage("Некорректное значение Id"); } } } diff --git a/PARR.API/appsettings.json b/PARR.API/appsettings.json index 84ecdb2d..c303035b 100644 --- a/PARR.API/appsettings.json +++ b/PARR.API/appsettings.json @@ -55,7 +55,7 @@ "HostName": "parr-rabbitmq", "QueueName": "parr-template-activator", "User": "template_activator_writer", - "Password": "Gfkjhsdg*%fsdf" + "Password": "Gfkjhsdg\\*%fsdf" }, "TemplatesMatcher": { "HostName": "parr-rabbitmq", diff --git a/PARR.BLL/Domain/Mq/TemplateActivatorMq.cs b/PARR.BLL/Domain/Mq/TemplateActivatorMq.cs index b9d124a5..ec2c1d4f 100644 --- a/PARR.BLL/Domain/Mq/TemplateActivatorMq.cs +++ b/PARR.BLL/Domain/Mq/TemplateActivatorMq.cs @@ -9,18 +9,35 @@ namespace PARR.BLL.Domain.Mq public class TemplateActivatorMq { /// - /// Id регламентной работы + /// ИД объекта, JobGroupId, JobId, TemplateId /// - public Guid JobId { get; set; } + public Guid Id { get; set; } /// - /// Действие по активации/деактивации + /// Тип объекта /// - public TemplateActivatorActionsEnum Action { get; set; } + public SyncTaskEntityTypeEnum EntityType { get; set; } + + /// + /// Учитывать неиспользованные шаблоны + /// + public bool AllowUnused { get; set; } = false; + + /// + /// Объект воздейстивя (шаблон, расписание) + /// + public TemplateActivatorEsppObjectTypesEnum EsppObject { get; set; } + + /// + /// Новое состояние объекта + /// + public bool NewState { get; set; } /// /// Инициатор изменений /// - public HistoryInitiator? HistoryInitiator { get; set; } + public required HistoryInitiator HistoryInitiator { get; set; } } + + } diff --git a/PARR.Constants/ParrComponentsEnum.cs b/PARR.Constants/ParrComponentsEnum.cs index 64f47846..db744444 100644 --- a/PARR.Constants/ParrComponentsEnum.cs +++ b/PARR.Constants/ParrComponentsEnum.cs @@ -1,8 +1,11 @@ -namespace PARR.Constants +using System.Text.Json.Serialization; + +namespace PARR.Constants { /// /// Компоненты ПАРР /// + [JsonConverter(typeof(JsonStringEnumConverter))] public enum ParrComponentsEnum { // Тут указываем только Worker`ы diff --git a/PARR.Constants/TemplateActivatorActionsEnum.cs b/PARR.Constants/TemplateActivatorActionsEnum.cs index 40434e10..dbda9418 100644 --- a/PARR.Constants/TemplateActivatorActionsEnum.cs +++ b/PARR.Constants/TemplateActivatorActionsEnum.cs @@ -1,5 +1,7 @@ namespace PARR.Constants { + //todo: удалить!!! + /// /// Действия с шаблонами/расписаниями для TemplateActivator /// diff --git a/PARR.Constants/TemplateActivatorEsppObjectTypesEnum.cs b/PARR.Constants/TemplateActivatorEsppObjectTypesEnum.cs new file mode 100644 index 00000000..ef86f2bb --- /dev/null +++ b/PARR.Constants/TemplateActivatorEsppObjectTypesEnum.cs @@ -0,0 +1,21 @@ +using System.Text.Json.Serialization; + +namespace PARR.Constants +{ + /// + /// Объект воздействия активатора + /// + [JsonConverter(typeof(JsonStringEnumConverter))] + public enum TemplateActivatorEsppObjectTypesEnum + { + /// + /// Шаблон + /// + Template=0, + + /// + /// Расписание + /// + Schedule =1, + } +} diff --git a/PARR.DAL/Services/Implementations/RobotConfigurationService.cs b/PARR.DAL/Services/Implementations/RobotConfigurationService.cs index 016f241d..6188d32b 100644 --- a/PARR.DAL/Services/Implementations/RobotConfigurationService.cs +++ b/PARR.DAL/Services/Implementations/RobotConfigurationService.cs @@ -25,7 +25,7 @@ namespace PARR.DAL.Services.Implementations protected override DataContext EntitiContext => dataContext; - public void ChangeTaskStatus(TaskStatusEnum taskStatus, ref RobotConfiguration configuration) + public void ChangeTaskStatus(TaskStatusEnum taskStatus, RobotConfiguration configuration) { configuration.TaskStatusCode = (int)taskStatus; @@ -70,7 +70,7 @@ namespace PARR.DAL.Services.Implementations } } - public RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, ref Template template) + public RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, Template template) { var config = template.RobotConfigurations.FirstOrDefault(t => t.RobotCode == (int)robotsEnum); diff --git a/PARR.DAL/Services/Interfaces/IRobotConfigurationService.cs b/PARR.DAL/Services/Interfaces/IRobotConfigurationService.cs index f5540a9d..627b9138 100644 --- a/PARR.DAL/Services/Interfaces/IRobotConfigurationService.cs +++ b/PARR.DAL/Services/Interfaces/IRobotConfigurationService.cs @@ -19,7 +19,7 @@ namespace PARR.DAL.Services.Interfaces /// /// /// - void ChangeTaskStatus(TaskStatusEnum taskStatus, ref RobotConfiguration configuration); + void ChangeTaskStatus(TaskStatusEnum taskStatus, RobotConfiguration configuration); /// /// Поиск невыполненных заданий и установка им статуса ошибки робота @@ -35,6 +35,6 @@ namespace PARR.DAL.Services.Interfaces /// /// /// - RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, ref Template template); + RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, Template template); } } diff --git a/PARR.TemplateActivator/ITemplateActivator.cs b/PARR.TemplateActivator/ITemplateActivator.cs index 40f24ad7..aa262e9a 100644 --- a/PARR.TemplateActivator/ITemplateActivator.cs +++ b/PARR.TemplateActivator/ITemplateActivator.cs @@ -1,15 +1,22 @@ -using PARR.Common.Domain; -using PARR.Constants; +using PARR.BLL.Domain.Mq; namespace PARR.TemplateActivator; public interface ITemplateActivator { + ///// + ///// Обновить состояние шаблонов или расписаний в соответствии со значением параметра action по applicationInWorkId + ///// + ///// + ///// + ///// + ////Task ChangeStateAsync(Guid applicationInWorkId, TemplateActivatorActionsEnum action, IHistoryInitiator? historyInitiator); + + /// - /// Обновить состояние шаблонов или расписаний в соответствии со значением параметра action по applicationInWorkId + /// Обновить состояние шаблонов и расписаний /// - /// - /// + /// /// - Task ChangeStateAsync(Guid applicationInWorkId, TemplateActivatorActionsEnum action, IHistoryInitiator? historyInitiator); + Task ChangeStateAsync(TemplateActivatorMq query); } diff --git a/PARR.TemplateActivator/MqTemplateActivator.cs b/PARR.TemplateActivator/MqTemplateActivator.cs index aa83e92c..da35a79a 100644 --- a/PARR.TemplateActivator/MqTemplateActivator.cs +++ b/PARR.TemplateActivator/MqTemplateActivator.cs @@ -40,15 +40,15 @@ internal class MqTemplateActivator : IMqTemplateActivator private async Task UpdateTemplateStatusAsync(string msg) { - logger.LogInformation($"{this.GetType().Name}. Получили запрос: {msg}"); + logger.LogInformation($"Получили запрос: {msg}"); var query = transformService.GetModelFromJson(msg); if (query == null) return; - if (!await validatorService.IsValidApplicationInWorkAsync(query.JobId)) + if (!await validatorService.IsValidObjectIdAsync(query.Id, query.EntityType)) { - logger.LogError($"{this.GetType().Name}. Некорректные параметры регламентной работы {nameof(query.JobId)}: {query.JobId}"); + logger.LogError($"Не найдет объект {nameof(query.Id)}: {query.Id}, типа {nameof(query.EntityType)}: {query.EntityType}."); return; } @@ -56,10 +56,9 @@ internal class MqTemplateActivator : IMqTemplateActivator { var service = scope.ServiceProvider.GetService(); if (service == null) - throw new Exception($"{this.GetType().Name}. Не найден сервис: {nameof(service.GetType)}"); - - await service.ChangeStateAsync(query.JobId, query.Action, query.HistoryInitiator); + throw new Exception($"Не найден сервис: {nameof(service.GetType)}"); + await service.ChangeStateAsync(query); } } diff --git a/PARR.TemplateActivator/Services/IValidatorService.cs b/PARR.TemplateActivator/Services/IValidatorService.cs index 86c6de70..ef165142 100644 --- a/PARR.TemplateActivator/Services/IValidatorService.cs +++ b/PARR.TemplateActivator/Services/IValidatorService.cs @@ -4,5 +4,6 @@ namespace PARR.TemplateActivator; internal interface IValidatorService { - Task IsValidApplicationInWorkAsync(Guid applicationInWorkId); + //Task IsValidApplicationInWorkAsync(Guid applicationInWorkId); + Task IsValidObjectIdAsync(Guid id, SyncTaskEntityTypeEnum entityType); } diff --git a/PARR.TemplateActivator/Services/ValidatorService.cs b/PARR.TemplateActivator/Services/ValidatorService.cs index ba03976f..6b0838a7 100644 --- a/PARR.TemplateActivator/Services/ValidatorService.cs +++ b/PARR.TemplateActivator/Services/ValidatorService.cs @@ -1,9 +1,15 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using PARR.Constants; +using PARR.DAL.Models; +using PARR.DAL.Models.Base; +using PARR.DAL.Models.Job; using PARR.DAL.Services.Interfaces; +using PARR.DAL.Services.Interfaces.Base; +using PARR.DAL.Services.Interfaces.Job; namespace PARR.TemplateActivator; + internal class ValidatorService : IValidatorService { private readonly IServiceProvider serviceProvider; @@ -18,25 +24,44 @@ internal class ValidatorService : IValidatorService } - public async Task IsValidApplicationInWorkAsync(Guid applicationInWorkId) + public async Task IsValidObjectIdAsync(Guid id, SyncTaskEntityTypeEnum entityType) + { + switch (entityType) + { + case (SyncTaskEntityTypeEnum.JobGroup): + return await IsValidAync(id); + + case (SyncTaskEntityTypeEnum.Job): + return await IsValidAync(id); + + case (SyncTaskEntityTypeEnum.Template): + return await IsValidAync(id); + } + + return false; + } + + + private async Task IsValidAync(Guid id) + where TService : class, IBaseService + where TEntity : class, IBase { using (var scope = serviceProvider.CreateScope()) { - var service = scope.ServiceProvider.GetService(); - + var service = scope.ServiceProvider.GetService(); if (service == null) - throw new Exception($"Не найден сервис: {nameof(IApplicationsInWorkService)}"); + throw new Exception($"Не найден сервис: {typeof(TService).Name}"); - var appInWork = await service.Get() - .FirstOrDefaultAsync(t => t.Id == applicationInWorkId); + var obj = await service.GetAsync(id); - if (appInWork == null) + if (obj == null) { - logger.LogError($"Не найдена регалментная работа {nameof(applicationInWorkId)}: {applicationInWorkId}"); + logger.LogError($"Не объект {nameof(id)}: {id} в {typeof(TService).Name}"); return false; } return true; } } + } \ No newline at end of file diff --git a/PARR.TemplateActivator/TemplateActivator.cs b/PARR.TemplateActivator/TemplateActivator.cs index dc6369f9..b3f973c9 100644 --- a/PARR.TemplateActivator/TemplateActivator.cs +++ b/PARR.TemplateActivator/TemplateActivator.cs @@ -1,13 +1,10 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; -using PARR.BLL.Helpers; -using PARR.Common.Domain; +using PARR.BLL.Domain.Mq; 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; @@ -16,275 +13,100 @@ internal class TemplateActivator : ITemplateActivator private readonly ILogger logger; private readonly ITemplateService templateService; private readonly IRobotConfigurationService robotConfigurationService; - private readonly IJobAutoControlService jobAutoControlService; - private readonly IApplicationsInWorkService applicationsInWorkService; + //private readonly IJobAutoControlService jobAutoControlService; + //private readonly IApplicationsInWorkService applicationsInWorkService; public TemplateActivator( ILogger logger, ITemplateService templateService, - IRobotConfigurationService robotConfigurationService, - IJobAutoControlService jobAutoControlService, - IApplicationsInWorkService applicationsInWorkService + IRobotConfigurationService robotConfigurationService + //IJobAutoControlService jobAutoControlService, + //IApplicationsInWorkService applicationsInWorkService ) { this.logger = logger; this.templateService = templateService; this.robotConfigurationService = robotConfigurationService; - this.jobAutoControlService = jobAutoControlService; - this.applicationsInWorkService = applicationsInWorkService; + //this.jobAutoControlService = jobAutoControlService; + //this.applicationsInWorkService = applicationsInWorkService; } - - public async Task ChangeStateAsync(Guid applicationInWorkId, TemplateActivatorActionsEnum action, IHistoryInitiator? historyInitiator)//TODO Migratin to Job + public async Task ChangeStateAsync(TemplateActivatorMq query) { - 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) + var templates = await GetTemplatesAsync(query); + + logger.LogInformation($"Объектов для изменения: {templates.Count} шт."); + + if (templates.Count == 0) + return; + + switch (query.EsppObject) { - case TemplateActivatorActionsEnum.ActivateAllTemplates: - logger.LogInformation($"Получен запрос на активацию всех шаблонов"); - query = query.Where(t => !t.IsActiveTemplate); - changes = await UpdateTemplateStateAsync(query, true); + case TemplateActivatorEsppObjectTypesEnum.Template: + foreach (var template in templates) + { + template.IsActiveTemplate = query.NewState; + UpdateRobotConfiguration(RobotsEnum.TemplateOrder, template); + } break; - case TemplateActivatorActionsEnum.ActivateTemplatesWithActiveSchedules: - logger.LogInformation($"Получен запрос на активацию всех шаблонов, у которых активировано расписание"); - query = query.Where(t => !t.IsActiveTemplate && t.IsActiveSchedule); - changes = await UpdateTemplateStateAsync(query, true); + + case TemplateActivatorEsppObjectTypesEnum.Schedule: + foreach (var template in templates) + { + template.IsActiveSchedule = query.NewState; + UpdateRobotConfiguration(RobotsEnum.ScheduleOrder, template); + } break; - case TemplateActivatorActionsEnum.DeactivateAllTemplates: - logger.LogInformation($"Получен запрос на деактивацию всех шаблонов"); - query = query.Where(t => t.IsActiveTemplate); - changes = await UpdateTemplateStateAsync(query, false); + } + + 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 TemplateActivatorActionsEnum.DeactivateTemplatesWithDeactivationSchedules: - logger.LogInformation($"Получен запрос на деактивацию всех шаблонов, у которых неактивированы расписания"); - query = query.Where(t => t.IsActiveTemplate && !t.IsActiveSchedule); - changes = await UpdateTemplateStateAsync(query, false); + + case TemplateActivatorEsppObjectTypesEnum.Schedule: + //нужно изменить расписания + templatesQuery = templatesQuery.Where(t => t.IsActiveSchedule != query.NewState); break; - case TemplateActivatorActionsEnum.ActivateAllSchedules: - logger.LogInformation($"Получен запрос на активацию всех расписаний"); - query = query.Where(t => !t.IsActiveSchedule); - changes = await UpdateScheduleStateAsync(query, true); + } + + + switch (query.EntityType) + { + case SyncTaskEntityTypeEnum.JobGroup: + templatesQuery = templatesQuery.Where(t => t.Job!.GroupId == query.Id); break; - case TemplateActivatorActionsEnum.DeactivateAllSchedules: - logger.LogInformation($"Получен запрос на деактивацию всех расписаний"); - query = query.Where(t => t.IsActiveSchedule); - changes = await UpdateScheduleStateAsync(query, false); + case SyncTaskEntityTypeEnum.Job: + templatesQuery = templatesQuery.Where(t => t.JobId == query.Id); 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); + case SyncTaskEntityTypeEnum.Template: + templatesQuery = templatesQuery.Where(t => t.Id == query.Id); break; default: - break; + // прекращаем, чтоб слуяайно не обновить все шаблоны + throw new InvalidOperationException($"Неверный тип объекта. {nameof(query.EntityType)}: {query.EntityType}"); } - if (historyInitiator != null) - { - historyInitiator.InitiatorComment += $" Action: {action.ToString()}"; - historyInitiator.InitiatorComment = historyInitiator.InitiatorComment.Trim(); - } + if (query.AllowUnused == false) + // учитываем только шаблоны которые не помеченные как IsUnused = true (неиспользуемые) + // т е берем только используемые шаблоны + templatesQuery = templatesQuery.Where(t => t.IsUnused == false); - 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