using AutoMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; 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.DAL.Contracts; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; namespace PARR.API.Controllers.V1 { public class RobotTaskRobotStatusController : BaseApiController { private readonly IRobotConfigurationService robotConfigurationService; private readonly IRobotHistoryService robotHistoryService; private readonly IMapper mapper; public RobotTaskRobotStatusController( IRobotConfigurationService robotConfigurationService, IRobotHistoryService robotHistoryService, IMapper mapper ) { this.robotConfigurationService = robotConfigurationService; this.robotHistoryService = robotHistoryService; this.mapper = mapper; } /// /// Изменить статус выполнения задания роботом по ИД задания /// /// /// [HttpPut(ApiRoutes.RobotTaskRobotStatus.ChangeRobotStatus)] public async Task ChangeStatus([FromRoute] Guid taskId, [FromBody] RobotTaskChangeRobotStatusRequest request) { var config = await robotConfigurationService.Get() .FirstOrDefaultAsync(t => t.Id == taskId); if (config == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не найдено задание с id: {taskId}" } })); //изменение статуса робота robotConfigurationService.ChangeRobotStatus(request.RobotStatusCode, ref config); //если успех, изменяем статус задания на успех if (request.RobotStatusCode == RobotStatusEnum.Complete) robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Ok, ref config); if (!await robotConfigurationService.CommitAsync()) return BadRequest("Ошибка при изменении статуса работы робота."); //записываем в лог робота if (request.RobotStatusCode == RobotStatusEnum.InProgress || request.RobotStatusCode == RobotStatusEnum.Complete) { var historyLevel = request.RobotStatusCode == RobotStatusEnum.InProgress ? RobotHistoryLevelEnum.Start : RobotHistoryLevelEnum.Complete; var history = new RobotHistory { Id = Guid.NewGuid(), HistoryLevel = (int)historyLevel, TaskStatusCode = config.TaskStatusCode, RobotConfigurationId = config.Id }; await robotHistoryService.CreateAsync(history); await robotHistoryService.CommitAsync(); } var configToResonse = 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); return Ok(new Response(response, true)); } } }