diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index a972f212..f67028af 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -55,14 +55,23 @@ public static class Template { public const string GetAll = Base + "/templates/"; - public const string Get = Base + "/templates/" + getParam; - public const string SetOkStatus = Base + "/templates/" + getParam + "/status/ok"; - public const string GetByStatusCode = Base + "/templates/status/{statusCode}"; + //public const string Get = Base + "/templates/" + getParam; + //public const string SetOkStatus = Base + "/templates/" + getParam + "/status/ok"; + //public const string GetByStatusCode = Base + "/templates/status/{statusCode}"; public const string getParam = "{id}"; } + public static class TemplateScheduleEspp + { + public const string Get = Base + "/templates/" + templateId + "/schedule-esppid"; + + public const string Create = Base + "/templates/" + templateId + "/schedule-esppid"; + + public const string templateId = "{templateId}"; + } + public static class RobotHistory { //public const string GetAll = Base + "/robot-histories/"; diff --git a/PARR.API/Contracts/V1/Requests/TemplateScheduleEsppIdRequest.cs b/PARR.API/Contracts/V1/Requests/TemplateScheduleEsppIdRequest.cs new file mode 100644 index 00000000..58a6dde4 --- /dev/null +++ b/PARR.API/Contracts/V1/Requests/TemplateScheduleEsppIdRequest.cs @@ -0,0 +1,10 @@ +namespace PARR.API.Contracts.V1.Requests +{ + public class TemplateScheduleEsppIdRequest + { + /// + /// Идентификатор расписания ЕСПП + /// + public string ScheduleEsppId { get; set; } = string.Empty; + } +} diff --git a/PARR.API/Contracts/V1/Responses/TemplateScheduleEsppIdResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateScheduleEsppIdResponse.cs new file mode 100644 index 00000000..0b36be14 --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/TemplateScheduleEsppIdResponse.cs @@ -0,0 +1,7 @@ +namespace PARR.API.Contracts.V1.Responses +{ + public class TemplateScheduleEsppIdResponse + { + public string? ScheduleEsppId { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/RobotTaskController.cs b/PARR.API/Controllers/V1/RobotTaskController.cs index bbf5157c..8e16d9d4 100644 --- a/PARR.API/Controllers/V1/RobotTaskController.cs +++ b/PARR.API/Controllers/V1/RobotTaskController.cs @@ -41,12 +41,16 @@ namespace PARR.API.Controllers.V1 //Ищем все задания с превышенным кол-вом попыток и с просроченным временем и ставим им статус ошибки await robotConfigurationService.FindUnfulfilledTaskAndSetRobotErrorStatusAsync(settingsFromDb.RobotAttemptsNumber, settingsFromDb.RobotWaitTime); + var query = robotConfigurationService.Get() .Where(t => t.RobotCode == (int)robotCode && t.TaskStatusCode == (int)taskStatusCode); + //var query = robotConfigurationService.Get(); + switch (robotCode) { case RobotsEnum.TemplateOrder: + // шаблоны query = query.Include(t => t.Template) .ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea) .Include(t => t.Template) @@ -58,6 +62,7 @@ namespace PARR.API.Controllers.V1 .AsSplitQuery(); break; case RobotsEnum.ScheduleOrder: + //расписание // тут не делаем AsSplitQuery, не может подтянуть все таблицы query = query.Include(t => t.Template) .ThenInclude(t => t!.Host).ThenInclude(t => t!.ResponseArea) @@ -65,9 +70,15 @@ namespace PARR.API.Controllers.V1 .ThenInclude(t => t!.ApplicationsInWork) .ThenInclude(t => t!.EsppSchValues) .ThenInclude(t => t!.EsppSchTypeConfig) - .ThenInclude(t => t!.EsppSchTypeSchedule) - ; - //todo: include + .ThenInclude(t => t!.EsppSchTypeSchedule); + + //выбираем только записи с созданными шаблонами (у которых статус 30), а только потом у них ищем расписания + // сначала находим шаблоны со статусом 30 + var createdTemplates = robotConfigurationService.Get() + .Where(t => t.RobotCode == (int)RobotsEnum.TemplateOrder && t.TaskStatusCode == (int)TaskStatusEnum.Ok) + .Select(t => t.TemplateId); + //находим задания с расписанием по списку шаблонов createdTemplates + query = query.Where(t => t.RobotCode == (int)RobotsEnum.ScheduleOrder && createdTemplates.Contains(t.TemplateId)); break; default: break; @@ -75,7 +86,7 @@ namespace PARR.API.Controllers.V1 RobotConfiguration? task = null; - //ищем задание в ожидании, если нашли, выбираем ее + //ищем задание в ожидании, если нашли, выбираем его task = await query.FirstOrDefaultAsync(t => t.RobotStatusCode == (int)RobotStatusEnum.Wait); if (task == null) @@ -104,7 +115,6 @@ namespace PARR.API.Controllers.V1 return Ok(new Response(mapper.Map(task), true)); case RobotsEnum.ScheduleOrder: //RobotTaskScheduleResponse - //TODO: сделать маппинг!!! return Ok(new Response(mapper.Map(task), true)); default: break; diff --git a/PARR.API/Controllers/V1/TemplateScheduleEspp.cs b/PARR.API/Controllers/V1/TemplateScheduleEspp.cs new file mode 100644 index 00000000..081f6be8 --- /dev/null +++ b/PARR.API/Controllers/V1/TemplateScheduleEspp.cs @@ -0,0 +1,82 @@ +using AutoMapper; +using FluentValidation; +using Microsoft.AspNetCore.Mvc; +using PARR.API.Contracts.V1; +using PARR.API.Contracts.V1.Requests; +using PARR.API.Contracts.V1.Responses; +using PARR.API.Contracts.V1.Responses.Base; +using PARR.API.Controllers.V1.Base; +using PARR.API.Services.Interfaces; +using PARR.DAL.Services.Interfaces; + +namespace PARR.API.Controllers.V1 +{ + /// + /// Контроллер по управлению ScheduleEsppId у шаблона + /// + public class TemplateScheduleEspp : BaseApiController + { + private readonly ITemplateService templateService; + private readonly IMapper mapper; + private readonly IValidator validator; + private readonly IUriService uriService; + + public TemplateScheduleEspp( + ITemplateService templateService, + IMapper mapper, + IValidator validator, + IUriService uriService + ) + { + this.templateService = templateService; + this.mapper = mapper; + this.validator = validator; + this.uriService = uriService; + } + + /// + /// Получить ИД расписания ЕСПП по ИД шаблона + /// + /// + /// + [HttpGet(ApiRoutes.TemplateScheduleEspp.Get)] + public async Task Get([FromRoute] Guid templateId) + { + var template = await templateService.GetAsync(templateId); + + if (template == null) + return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не найден шаблон с id: {templateId}" } })); + + return Ok(new Response(mapper.Map(template), true)); + } + + + /// + /// Задать ИД расписания ЕСПП шаблону с ИД + /// + /// + /// + [HttpPost(ApiRoutes.TemplateScheduleEspp.Create)] + public async Task SetEsppId([FromRoute] Guid templateId, [FromBody] TemplateScheduleEsppIdRequest request) + { + var resultValidate = await validator.ValidateAsync(request); + if (!resultValidate.IsValid) + return BadRequest(new Response(resultValidate.Errors)); + + var template = await templateService.GetAsync(templateId); + + if (template == null) + return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не найден шаблон с id: {templateId}" } })); + + template.ScheduleEsppId = request.ScheduleEsppId; + + if (!await templateService.CommitAsync()) + return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при сохранении шаблона." } })); + + var createdUri = uriService.GetUri(ApiRoutes.TemplateScheduleEspp.Get, ApiRoutes.TemplateScheduleEspp.templateId, templateId); + + return Created(createdUri, new Response(mapper.Map(template), true)); + } + + } +} diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index ff57d93d..a617aa97 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -45,6 +45,8 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.SyncStatus, o => o.MapFrom(s => s.RobotConfigurations)); // === Template === + CreateMap(); + CreateMap(); diff --git a/PARR.API/Validators/TemplateScheduleEsppIdRequestValidator.cs b/PARR.API/Validators/TemplateScheduleEsppIdRequestValidator.cs new file mode 100644 index 00000000..686f895e --- /dev/null +++ b/PARR.API/Validators/TemplateScheduleEsppIdRequestValidator.cs @@ -0,0 +1,13 @@ +using FluentValidation; +using PARR.API.Contracts.V1.Requests; + +namespace PARR.API.Validators +{ + public class TemplateScheduleEsppIdRequestValidator : AbstractValidator + { + public TemplateScheduleEsppIdRequestValidator() + { + RuleFor(t => t.ScheduleEsppId).NotNull().NotEmpty(); + } + } +}