feat(core,api): Детали по заданиями роботов

This commit is contained in:
Mikhail Trubnikov
2026-07-29 09:50:21 +10:00
parent 56cdca0502
commit 7d5fb23daf
18 changed files with 4435 additions and 36 deletions

View File

@@ -6,6 +6,7 @@ using PARR.Core.Services.RobotTaskDetailsServices.Interfaces;
using PARR.Domain.DTOs.RobotTaskDetails;
using PARR.Domain.DTOs.Shared;
using PARR.Domain.Enums;
using PARR.Domain.Exceptions;
namespace PARR.Core.Services.RobotTaskDetailsServices.Implementations
{
@@ -32,34 +33,55 @@ namespace PARR.Core.Services.RobotTaskDetailsServices.Implementations
_taskStatusRepository = taskStatusRepository;
}
public async Task<RobotTaskDetailsResult> GetDetailsAsync(RobotsEnum robot, TaskStatusEnum task)
public async Task<RobotTaskDetailsResult> GetDetailsAsync(RobotsEnum robot, TaskStatusEnum task, CancellationToken cancellationToken = default)
{
var details = await _robotConfigurationRepository.Get()
.Where(t => t.RobotCode == (int)robot && t.TaskStatusCode == (int)task)
.GroupBy(t => t.Template!.Job!.Group)
.Select(t => new
{
JobGroup = t.Key,
TemplatesCount = t.Count()
}).ToListAsync();
// 1. Получаем группировку конфигураций
var groupedDetails = await _robotConfigurationRepository.Get()
.AsNoTracking()
.Where(config => config.RobotCode == (int)robot && config.TaskStatusCode == (int)task)
.GroupBy(config => config.Template!.Job!.Group)
.Select(t => new
{
JobGroup = t.Key,
TemplatesCount = t.Count()
})
.ToListAsync(cancellationToken);
var robotObj = await _robotRepository.Get()
// 2. Получаем сущности робота и статуса задачи)
var robotEntity = await _robotRepository.Get()
.AsNoTracking()
.FirstOrDefaultAsync(t => t.Code == (int)robot);
.FirstOrDefaultAsync(r => r.Code == (int)robot, cancellationToken);
var taskObj = await _taskStatusRepository.Get()
var taskStatusEntity = await _taskStatusRepository.Get()
.AsNoTracking()
.FirstOrDefaultAsync(t => t.Code == (int)task);
.FirstOrDefaultAsync(t => t.Code == (int)task, cancellationToken);
if (robotEntity == null)
{
_logger.LogWarning("Робот с кодом {RobotCode} не найден в БД", robot);
throw new AppValidationException($"Робот с кодом {(int)robot} не найден");
}
if (taskStatusEntity == null)
{
_logger.LogWarning("Статус задачи с кодом {TaskCode} не найден в БД", task);
throw new AppValidationException($"Статус задачи с кодом {(int)task} не найден");
}
// 3. Маппинг и сборка результирующего DTO
var result = new RobotTaskDetailsResult
{
Robot = _mapper.Map<RobotResult>(robotObj),
Task = _mapper.Map<RobotTaskStatusResult>(taskObj),
Details = details.Select(t => new RobotTaskGroupDetailsResult
{
JobGroup = _mapper.Map<JobGroupShortResult>(t.JobGroup),
TemplatesCount = t.TemplatesCount
}).OrderBy(t => t.JobGroup.GroupName).ToList()
Robot = _mapper.Map<RobotResult>(robotEntity),
Task = _mapper.Map<RobotTaskStatusResult>(taskStatusEntity),
Details = groupedDetails
.Select(t => new RobotTaskGroupDetailsResult
{
JobGroup = _mapper.Map<JobGroupShortResult>(t.JobGroup),
TemplatesCount = t.TemplatesCount
})
.OrderBy(d => d.JobGroup.GroupName)
.ToList()
};
return result;