diff --git a/PARR.API/Contracts/V1/Responses/RobotStatusResponse.cs b/PARR.API/Contracts/V1/Responses/RobotStatusResponse.cs new file mode 100644 index 00000000..80811526 --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/RobotStatusResponse.cs @@ -0,0 +1,9 @@ +namespace PARR.API.Contracts.V1.Responses +{ + public class RobotStatusResponse + { + public int Code { get; set; } + public string? Name { get; set; } + public string? Description { get; set; } + } +} diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs index 385ae085..41f2ce29 100644 --- a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs +++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs @@ -17,6 +17,11 @@ public required string Solution { get; set; } public required string TemplateDuration { get; set; } + public int RobotAttemptsNumber { get; set; } + public DateTimeOffset? RobotLastStatusUpdated { get; set; } + public RobotStatusResponse? RobotStatus { get; set; } + + //work //public required string Title { get; set; } //public required string SlaInterval { get; set; } diff --git a/PARR.API/Controllers/V1/TemplateController.cs b/PARR.API/Controllers/V1/TemplateController.cs index f45713f8..bd20a7b0 100644 --- a/PARR.API/Controllers/V1/TemplateController.cs +++ b/PARR.API/Controllers/V1/TemplateController.cs @@ -104,11 +104,34 @@ namespace PARR.API.Controllers.V1 [HttpGet(ApiRoutes.Template.GetByStatusCode)] public async Task GetByStatus([FromRoute] int statusCode, [FromQuery] RobinQuery query) { - //Тут узкое место, так как возвращается первый, елси будет много роботов, то будет возвращаться им один и тот же элемент. - //нужно вводить статус, что эл уже занят - var template = await templateService.GetWithIncludes() + Template? template = null; + + //1.Поиск шаблонов со `StatusCode` 10 или 20 и `RobotStatusCode` = 11.Находим, **выбрали эту запись, конец**. + //2.Поиск шаблонов со `StatusCode` 10 или 20 и `RobotStatusCode` = 22 + //3.Далее проверяется `RobotLastStatusUpdated`, что время последнего смены статуса не превышает допустимого(берется из настроек, поле `RobotWaitTime`) и что текущая попытка не больше разрешенной(берется из настроек, поле `RobotAttemptsNumber`) - если это так, берется эта запись. + //4.Если `RobotStatusCode` = 22 и `RobotLastStatusUpdated` истекло и `RobotAttemptsNumber` >= допустимому, то ставим `RobotStatusCode`= 33 + + //1. + template = await templateService.GetWithIncludes() .AsSplitQuery() - .FirstOrDefaultAsync(t => t.StatusCode == statusCode); + .FirstOrDefaultAsync(t => t.StatusCode == statusCode && t.RobotStatusCode ==(int)RobotStatusEnum.Wait); + + //if (template == null) + //{ + // // переходим к шагам 2,3 + // template = await templateService.GetWithIncludes() + // .AsSplitQuery() + // //todo + // .FirstOrDefaultAsync(t => t.StatusCode == statusCode && t.RobotStatusCode == (int)RobotStatusEnum.InProgress); + //} + + + + ////Тут узкое место, так как возвращается первый, если будет много роботов, то будет возвращаться им один и тот же элемент. + ////нужно вводить статус, что эл уже занят + // template = await templateService.GetWithIncludes() + // .AsSplitQuery() + // .FirstOrDefaultAsync(t => t.StatusCode == statusCode); if (template == null) return NotFound(); diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 25c61432..a94dd9ef 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -78,6 +78,8 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.Status, o => o.MapFrom(s => s.EkStatus!.Name)) .ForMember(d => d.ResponseArea, o => o.MapFrom(s => s.ResponseArea!.Name)); + CreateMap(); + } } } diff --git a/PARR.DAL/Services/Implementations/TemplateService.cs b/PARR.DAL/Services/Implementations/TemplateService.cs index 91ae35fa..95a2e392 100644 --- a/PARR.DAL/Services/Implementations/TemplateService.cs +++ b/PARR.DAL/Services/Implementations/TemplateService.cs @@ -34,6 +34,7 @@ namespace PARR.DAL.Services.Implementations .ThenInclude(t => t!.ResponseArea) .Include(h => h.Host) .ThenInclude(t => t!.EkStatus) + .Include(r=>r.RobotStatus) .Include(a => a.ApplicationsInWork) .ThenInclude(w => w!.Work) .ThenInclude(t => t!.Tnk)