From 72e2f76b1afba512fe0dcafe29c82a23f08dec39 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Wed, 11 Oct 2023 15:28:37 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20=D0=9A=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=20=D0=BF=D0=BE=20=D1=83=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8E=20ScheduleEspp?= =?UTF-8?q?Id.=20=D0=9F=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=80=D0=B0=D1=81=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 15 +++- .../Requests/TemplateScheduleEsppIdRequest.cs | 10 +++ .../TemplateScheduleEsppIdResponse.cs | 7 ++ .../Controllers/V1/RobotTaskController.cs | 20 +++-- .../Controllers/V1/TemplateScheduleEspp.cs | 82 +++++++++++++++++++ .../DomainToResponseProfile.cs | 2 + .../TemplateScheduleEsppIdRequestValidator.cs | 13 +++ 7 files changed, 141 insertions(+), 8 deletions(-) create mode 100644 PARR.API/Contracts/V1/Requests/TemplateScheduleEsppIdRequest.cs create mode 100644 PARR.API/Contracts/V1/Responses/TemplateScheduleEsppIdResponse.cs create mode 100644 PARR.API/Controllers/V1/TemplateScheduleEspp.cs create mode 100644 PARR.API/Validators/TemplateScheduleEsppIdRequestValidator.cs 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(); + } + } +}