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)); }