feat(api): JobControl переписан метод Create+Валидация

This commit is contained in:
Mikhail Kuznetsov
2025-09-11 16:03:51 +10:00
parent 76c289cef2
commit 39eb8ddc2c
10 changed files with 295 additions and 80 deletions

View File

@@ -14,9 +14,11 @@ using PARR.API.Services.Interfaces;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainModels;
using PARR.DAL.DomainServices.Interfaces;
using PARR.DAL.Models.Job;
using PARR.DAL.Services.Interfaces;
using PARR.DAL.Services.Interfaces.Job;
using PARR.DAL.Services.Interfaces.Unit;
namespace PARR.API.Controllers.V1
{
@@ -31,7 +33,13 @@ namespace PARR.API.Controllers.V1
private readonly IUriService uriService;
private readonly IJobService jobService;
private readonly ITemplateService templateService;
private readonly IValidator<JobRequest> validator;
private readonly IJobGroupService jobGroupService;
private readonly IValidator<JobRequest> jobValidator;
private readonly IValidator<UnitFilterRequest> unitFilterValidator;
private readonly IValidator<FieldFilterRequest> fieldFilterValidator;
private readonly IValidator<RelationshipFilterRequest> relationshipFilterValidator;
private readonly IUnitFilterService unitFilterService;
private readonly IUnitService unitService;
public JobController(
ILogger<JobController> logger,
@@ -39,7 +47,13 @@ namespace PARR.API.Controllers.V1
IUriService uriService,
IJobService jobService,
ITemplateService templateService,
IValidator<JobRequest> validator
IJobGroupService jobGroupService,
IValidator<JobRequest> jobValidator,
IValidator<UnitFilterRequest> unitFilterValidator,
IValidator<FieldFilterRequest> fieldFilterValidator,
IValidator<RelationshipFilterRequest> relationshipFilterValidator,
IUnitFilterService unitFilterService,
IUnitService unitService
)
{
this.logger = logger;
@@ -47,7 +61,13 @@ namespace PARR.API.Controllers.V1
this.uriService = uriService;
this.jobService = jobService;
this.templateService = templateService;
this.validator = validator;
this.jobGroupService = jobGroupService;
this.jobValidator = jobValidator;
this.unitFilterValidator = unitFilterValidator;
this.fieldFilterValidator = fieldFilterValidator;
this.relationshipFilterValidator = relationshipFilterValidator;
this.unitFilterService = unitFilterService;
this.unitService = unitService;
}
/// <summary>
@@ -142,36 +162,31 @@ namespace PARR.API.Controllers.V1
[HttpPost(ApiRoutes.Job.Create)]
public async Task<IActionResult> Create([FromBody] JobRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
#region Валидация
var jobValidateResult = await jobValidator.ValidateAsync(request);//Валидация параметров самого задания
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
var job = new Job
{
Id = Guid.NewGuid(),
Name = request.Name.Trim(),
WorkName = request.WorkName.Trim(),
MinValueRelationships = request.MinValueRelationships,
MaxValueRelationships = request.MaxValueRelationships,
isParentRelationships = request.isParentRelationships,
TemplateNameMask = request.TemplateNameMask.Trim(),
WorkGroupMask = request.WorkGroupMask.Trim(),
TnkId = request.TnkId,
GroupId = request.GroupId
};
if (!jobValidateResult.IsValid)
return BadRequest(new Response(jobValidateResult.Errors));
#endregion
var job = mapper.Map<Job>(request);
if (!await jobService.CreateAsync(job) || !await jobService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
logger.LogInformation($"Пользователь {User.Identity?.Name} добавил задание на выполнение работ: {job.Id}, {job.Name}, {job.WorkName}");
var createdJob = await jobService.Get()
.Include(t => t.Tnk)
.Include(t => t.Group)
.Include(t => t.UnitFilters)
.ThenInclude(t => t.FieldFilters)
.ThenInclude(t => t.Field)
.Include(t => t.UnitFilters)
.ThenInclude(t => t.RelationshipFilters)
.FirstOrDefaultAsync(t => t.Id == job.Id);
var createdJob = await jobService.Get().Include(t => t.Tnk)
.FirstAsync(t => t.Id == job.Id);
var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdJob.Id);
var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdJob!.Id);
var response = mapper.Map<JobResponse>(createdJob);
// так как мы только что создали Job, то у него нет шаблонов, смело ставим = 0 (ускоряем запрос)
@@ -190,7 +205,7 @@ namespace PARR.API.Controllers.V1
[HttpPut(ApiRoutes.Job.Update)]
public async Task<IActionResult> Update([FromRoute] Guid id, [FromBody] JobRequest request)
{
var resultValidate = await validator.ValidateAsync(request);
var resultValidate = await jobValidator.ValidateAsync(request);
if (!resultValidate.IsValid)
return BadRequest(new Response(resultValidate.Errors));
@@ -267,6 +282,38 @@ namespace PARR.API.Controllers.V1
return NoContent();
}
/// <summary>
/// Получить список ЭК для которых будут созданы шаблоны
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost(ApiRoutes.Job.Preview)]
public async Task<IActionResult> Preview([FromBody] JobRequest request)
{
#region Валидация
var jobValidateResult = await jobValidator.ValidateAsync(request);//Валидация параметров самого задания
if (!jobValidateResult.IsValid)
return BadRequest(new Response(jobValidateResult.Errors));
#endregion
var job = mapper.Map<Job>(request);
var group = await jobGroupService.GetAsync(request.GroupId);
job.Group = group;
var unitIds = await unitFilterService.GetUnitsIdByJobFilterAsync(job);
if (unitIds == null)
return NotFound();
var units = await unitService.Get().Where(t => unitIds.Any(a => a == t.Id)).Take(1000).ToListAsync();
var response = mapper.Map<List<UnitResponse>>(units);
return Ok(response);
}
/// <summary>
/// Загрузка статистики
@@ -303,7 +350,6 @@ namespace PARR.API.Controllers.V1
//job.ScheduleStatistics = new ScheduleStats { Activated = statistics.ScheduleStatistics.Activated, Errors = statistics.ScheduleStatistics.Errors, Synchronized = statistics.ScheduleStatistics.Synchronized };
}
}
public class JobStatModel
@@ -312,4 +358,5 @@ namespace PARR.API.Controllers.V1
public required ScheduleStats ScheduleStatistics { get; set; }
}
}

View File

@@ -104,13 +104,13 @@ namespace PARR.API.Controllers.V1
{
var jobGroup = await groupService.Get()
.Include(t => t.Jobs).ThenInclude(t => t.Tnk)
.Include(t => t.EsppSchValues)
.FirstOrDefaultAsync(t => t.Id == id);
if (jobGroup == null)
return NotFound();
var response = mapper.Map<JobGroupResponse>(jobGroup);
await AppendMissingDataAsync(response);
return Ok(new Response<JobGroupResponse>(response, true));
}