From cefbdcc8e6695f2576e03f6b7434d7940d2f1d52 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Thu, 1 Aug 2024 14:21:28 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20RobotTaskController=20-=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=20SetInProgressStatus,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=87=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=80=D0=BE=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=83,=20=D1=81=D1=80=D0=B0=D0=B7=D1=83=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B0=D0=B2=D0=BB=D0=B8=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=20"=D0=92=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../V1/Requests/Queries/RobotTaskQuery.cs | 10 ++++ .../Controllers/V1/RobotTaskController.cs | 57 ++++++++++++++++++- .../V1/RobotTaskRobotStatusController.cs | 4 +- 3 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 PARR.API/Contracts/V1/Requests/Queries/RobotTaskQuery.cs diff --git a/PARR.API/Contracts/V1/Requests/Queries/RobotTaskQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/RobotTaskQuery.cs new file mode 100644 index 00000000..c503ff61 --- /dev/null +++ b/PARR.API/Contracts/V1/Requests/Queries/RobotTaskQuery.cs @@ -0,0 +1,10 @@ +namespace PARR.API.Contracts.V1.Requests.Queries +{ + public class RobotTaskQuery + { + /// + /// Установить статус задания - InProgress (Робот взял в работу) + /// + public bool? SetInProgressStatus { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/RobotTaskController.cs b/PARR.API/Controllers/V1/RobotTaskController.cs index 147acdf9..861ba538 100644 --- a/PARR.API/Controllers/V1/RobotTaskController.cs +++ b/PARR.API/Controllers/V1/RobotTaskController.cs @@ -3,9 +3,11 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using PARR.API.Contracts.V1; +using PARR.API.Contracts.V1.Requests.Queries; 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.Constants; using PARR.DAL.Contracts; using PARR.DAL.Models; @@ -22,13 +24,17 @@ namespace PARR.API.Controllers.V1 private readonly IRobotConfigurationService robotConfigurationService; private readonly IEsppScheduleTransformService esppScheduleTransformService; private readonly ILogger logger; + private readonly IClientService clientService; + private readonly IRobotHistoryService robotHistoryService; public RobotTaskController( IMapper mapper, SettingsFromDb settingsFromDb, IRobotConfigurationService robotConfigurationService, IEsppScheduleTransformService esppScheduleTransformService, - ILogger logger + ILogger logger, + IClientService clientService, + IRobotHistoryService robotHistoryService ) { this.mapper = mapper; @@ -36,6 +42,8 @@ namespace PARR.API.Controllers.V1 this.robotConfigurationService = robotConfigurationService; this.esppScheduleTransformService = esppScheduleTransformService; this.logger = logger; + this.clientService = clientService; + this.robotHistoryService = robotHistoryService; } @@ -46,7 +54,7 @@ namespace PARR.API.Controllers.V1 /// /// [HttpGet(ApiRoutes.RobotTask.GetByRobotAndStatusTask)] - public async Task GetByRobotAndStatusTask([FromRoute] RobotsEnum robotCode, [FromRoute] TaskStatusEnum taskStatusCode) + public async Task GetByRobotAndStatusTask([FromRoute] RobotsEnum robotCode, [FromRoute] TaskStatusEnum taskStatusCode, [FromQuery] RobotTaskQuery requestQuery) { //Ищем все задания с превышенным кол-вом попыток и с просроченным временем и ставим им статус ошибки await robotConfigurationService.FindUnfulfilledTaskAndSetRobotErrorStatusAsync(settingsFromDb.RobotAttemptsNumber, settingsFromDb.RobotWaitTime); @@ -70,7 +78,6 @@ namespace PARR.API.Controllers.V1 .ThenInclude(t => t!.Tnk) .ThenInclude(s => s!.Subprocess) .ThenInclude(p => p!.Process); - //.AsSplitQuery(); break; case RobotsEnum.ScheduleOrder: //расписание @@ -120,6 +127,16 @@ namespace PARR.API.Controllers.V1 if (task == null) return NotFound(); + if (requestQuery?.SetInProgressStatus == true) + { + var resultSetStatus = await SetInProgressStatusAsync(task.Id); + if (resultSetStatus == false) + { + logger.LogError($"Ошибка при установке статуса {RobotStatusEnum.InProgress.ToString()} для задания RobotConfigutationId {task.Id} (при выдаче задания роботу)"); + return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при выдаче задания." } })); + } + } + switch (robotCode) { case RobotsEnum.TemplateOrder: @@ -190,5 +207,39 @@ namespace PARR.API.Controllers.V1 #endregion } + + + /// + /// Устанавливаем статус "Робот взял в работу", пишем в историю работы роботов инф о начале работ + /// + /// + /// + private async Task SetInProgressStatusAsync(Guid taskId) + { + var config = await robotConfigurationService.GetAsync(taskId); + + //изменение статуса робота + robotConfigurationService.ChangeRobotStatus(RobotStatusEnum.InProgress, ref config!); + + if (!await robotConfigurationService.CommitAsync()) + return false; + + //записываем в лог робота + var history = new RobotHistory + { + Id = Guid.NewGuid(), + HistoryLevel = (int)RobotHistoryLevelEnum.Start, + TaskStatusCode = config.TaskStatusCode, + RobotConfigurationId = config.Id, + RobotIp = clientService.GetClientIp()?.ToString() + }; + + if (!await robotHistoryService.CreateAsync(history) || !await robotHistoryService.CommitAsync()) + return false; + + + return true; + } + } } diff --git a/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs b/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs index b5d4926d..7876c19d 100644 --- a/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs +++ b/PARR.API/Controllers/V1/RobotTaskRobotStatusController.cs @@ -78,13 +78,13 @@ namespace PARR.API.Controllers.V1 await robotHistoryService.CommitAsync(); } - var configToResonse = await robotConfigurationService.Get() + var configToResponse = await robotConfigurationService.Get() .Include(t => t.Robot) .Include(t => t.TaskStatus) .Include(t => t.RobotStatus) .FirstOrDefaultAsync(t => t.Id == taskId); - var response = mapper.Map(configToResonse); + var response = mapper.Map(configToResponse); return Ok(new Response(response, true)); }