feat(api): управление job auto control из api

This commit is contained in:
Mikhail Trubnikov
2025-12-08 14:23:08 +10:00
parent 4815840f64
commit 031ac7126c
10 changed files with 123 additions and 76 deletions

View File

@@ -21,6 +21,16 @@
public required string WorkName { get; set; }
#region AutoControl
public bool IsEnableAutoControl { get; set; }
public bool InitUsedTemplateState { get; set; }
public bool InitUsedScheduleState { get; set; }
#endregion
public required List<UnitFilterRequest> UnitFilters { get; set; }
}

View File

@@ -0,0 +1,13 @@
namespace PARR.API.Contracts.V1.Responses
{
public class JobAutoControlResponse
{
public Guid JobId { get; set; }
public bool IsEnable { get; set; }
public bool InitUsedTemplateState { get; set; }
public bool InitUsedScheduleState { get; set; }
}
}

View File

@@ -31,6 +31,8 @@
public List<UnitFilterResponse>? UnitFilters { get; set; }
public JobAutoControlResponse? AutoControl { get; set; }
#region Статистика
//public TemplateStats? TemplateStatistics { get; set; }

View File

@@ -19,6 +19,7 @@ using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainModels;
using PARR.DAL.DomainServices.Interfaces;
using PARR.DAL.Extensions;
using PARR.DAL.Models.Job;
using PARR.DAL.Services.Interfaces;
using PARR.DAL.Services.Interfaces.Job;
@@ -42,6 +43,7 @@ namespace PARR.API.Controllers.V1
private readonly IMqService mqService;
private readonly MqSettings mqSettings;
private readonly IClientService clientService;
private readonly IJobAutoControlService jobAutoControlService;
public JobController(
ILogger<JobController> logger,
@@ -55,7 +57,8 @@ namespace PARR.API.Controllers.V1
IUnitService unitService,
IMqService mqService,
MqSettings mqSettings,
IClientService clientService
IClientService clientService,
IJobAutoControlService jobAutoControlService
)
{
this.logger = logger;
@@ -67,6 +70,7 @@ namespace PARR.API.Controllers.V1
this.mqService = mqService;
this.mqSettings = mqSettings;
this.clientService = clientService;
this.jobAutoControlService = jobAutoControlService;
}
/// <summary>
@@ -78,7 +82,7 @@ namespace PARR.API.Controllers.V1
{
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
IQueryable<Job> query = jobService.Get();
IQueryable<Job> query = jobService.Get().Include(t => t.AutoControl);
query = query.OrderBy(t => t.Name);
@@ -138,6 +142,7 @@ namespace PARR.API.Controllers.V1
.Include(t => t.UnitFilters)
.ThenInclude(t => t.RelationshipFilters)
.ThenInclude(t => t.UnitField)
.Include(t => t.AutoControl)
.FirstOrDefaultAsync(t => t.Id == id);
if (job == null)
@@ -171,6 +176,7 @@ namespace PARR.API.Controllers.V1
#region Проверка существования работы с такими же параметрами
var isExistTheSameLinks = await jobService.Get()
.Include(t => t.Group).ThenInclude(t => t.GroupType)
.CountAsync(t =>
@@ -183,11 +189,20 @@ namespace PARR.API.Controllers.V1
if (isExistTheSameLinks > 0)
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Работа с указанным диапазоном связей пересекается с уже имеющейся в базе данных({request.MinValueRelationships}-{request.MaxValueRelationships})" } }));
#endregion
var job = mapper.Map<Job>(request);
job.AutoControl = new JobAutoControl
{
JobId = job.Id,
IsEnable = request.IsEnableAutoControl,
InitUsedScheduleState = request.InitUsedScheduleState,
InitUsedTemplateState = request.InitUsedTemplateState
};
if (!await jobService.CreateAsync(job) || !await jobService.CommitAsync())
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
@@ -201,6 +216,7 @@ namespace PARR.API.Controllers.V1
.ThenInclude(t => t.UnitField)
.Include(t => t.UnitFilters)
.ThenInclude(t => t.RelationshipFilters)
.Include(t => t.AutoControl)
.FirstOrDefaultAsync(t => t.Id == job.Id);
var locationUri = uriService.GetUri(ApiRoutes.Job.Get, ApiRoutes.Job.getParam, createdJob!.Id);
@@ -233,6 +249,7 @@ namespace PARR.API.Controllers.V1
.ThenInclude(t => t.FieldFilters)
.Include(t => t.UnitFilters)
.ThenInclude(t => t.RelationshipFilters)
.Include(t => t.AutoControl)
.AsSingleQuery()
.FirstOrDefaultAsync(t => t.Id == id);
@@ -244,66 +261,47 @@ namespace PARR.API.Controllers.V1
#region обновление полей задания на работу
//TODO: ниже if-ы какая то странная история. зачем if-ы, просто приравниваем сразу и все...
orig.Name = request.Name.Trim();
orig.WorkName = request.WorkName.Trim();
orig.MinValueRelationships = request.MinValueRelationships;
orig.MaxValueRelationships = request.MaxValueRelationships;
orig.IsParentRelationships = request.IsParentRelationships;
orig.TemplateNameMask = request.TemplateNameMask.Trim();
orig.WorkGroupMask = request.WorkGroupMask.Trim();
orig.TnkId = request.TnkId;
orig.GroupId = request.GroupId;
var changed = false;
if (orig.Name != request.Name.Trim())
if (orig.AutoControl != null)
{
orig.Name = request.Name.Trim();
changed = true;
orig.AutoControl.IsEnable = request.IsEnableAutoControl;
orig.AutoControl.InitUsedScheduleState = request.InitUsedScheduleState;
orig.AutoControl.InitUsedTemplateState = request.InitUsedTemplateState;
}
else
{
// автоконтрол не загружен, проверяем есть ли он в бд, если нет, то создадим
var existAutoControl = await jobAutoControlService.Get().FirstOrDefaultAsync(t => t.JobId == id);
if (existAutoControl != null)
{
logger.LogError($"При обновлении job {id}, не загрузась связь с JobAutoControl, но она есть. Не стал обновлять Job, вернул ошибку.");
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = $"Ошибка при изменении задания на выполнение работ." } }));
}
else
{
var autoControl = new JobAutoControl
{
JobId = id,
InitUsedScheduleState = request.InitUsedScheduleState,
InitUsedTemplateState = request.InitUsedTemplateState,
IsEnable = request.IsEnableAutoControl
};
orig.AutoControl = autoControl;
logger.LogWarning($"При обновлении job {id}, отсутствовала запись в таблице JobAutoControl, создал ее. {autoControl.ToJson()}");
}
}
if (orig.WorkName != request.WorkName.Trim())
{
orig.WorkName = request.WorkName.Trim();
changed = true;
}
if (orig.MinValueRelationships != request.MinValueRelationships)
{
orig.MinValueRelationships = request.MinValueRelationships;
changed = true;
}
if (orig.MaxValueRelationships != request.MaxValueRelationships)
{
orig.MaxValueRelationships = request.MaxValueRelationships;
changed = true;
}
if (orig.IsParentRelationships != request.IsParentRelationships)
{
orig.IsParentRelationships = request.IsParentRelationships;
changed = true;
}
if (orig.TemplateNameMask != request.TemplateNameMask.Trim())
{
orig.TemplateNameMask = request.TemplateNameMask.Trim();
changed = true;
}
if (orig.WorkGroupMask != request.WorkGroupMask.Trim())
{
orig.WorkGroupMask = request.WorkGroupMask.Trim();
changed = true;
}
if (orig.TnkId != request.TnkId)
{
orig.TnkId = request.TnkId;
changed = true;
}
if (orig.GroupId != request.GroupId)
{
orig.GroupId = request.GroupId;
changed = true;
}
if (changed)
orig.DateModified = DateTimeOffset.UtcNow;
orig.DateModified = DateTimeOffset.UtcNow;
#endregion
var job = mapper.Map<Job>(request);
@@ -334,6 +332,7 @@ namespace PARR.API.Controllers.V1
.ThenInclude(t => t.UnitField)
.Include(t => t.UnitFilters)
.ThenInclude(t => t.RelationshipFilters)
.Include(t => t.AutoControl)
.FirstAsync(t => t.Id == orig.Id);
var response = mapper.Map<JobResponse>(updatedJob);

View File

@@ -320,26 +320,14 @@ namespace PARR.API.MappingProfiles
#endregion
#region ApplicationInWork
//CreateMap<ApplicationsInWork, ApplicationInWorkBaseResponse>()
// .Include<ApplicationsInWork, ApplicationInWorkResponse>()
// .ForMember(d => d.Application, o => o.MapFrom(s => s.Application));
//CreateMap<ApplicationsInWork, ApplicationInWorkBaseResponse>();
//CreateMap<ApplicationsInWork, ApplicationInWorkResponse>()
// .ForMember(d => d.Work, o => o.MapFrom(s => s.Work))
// //.ForMember(d => d.TemplatesCount, o => o.MapFrom(s => s.Templates.Count()))
// .ForMember(d => d.Schedule, o => o.MapFrom<ApplicationInWorkScheduleResolver>())
// .ForMember(d => d.WorkGroups, o => o.MapFrom(s => s.WorkGroups.OrderBy(t => t.WorkGroup!.Name).Select(t => t.WorkGroup)))
// .ForMember(d => d.AutoControl, o => o.MapFrom(s => s.JobAutoControl));
#endregion
#region Job
CreateMap<Job, JobBaseResponse>();
CreateMap<Job, JobResponse>();
CreateMap<Job, JobBaseResponse>()
.Include<Job, JobResponse>();
CreateMap<Job, JobResponse>()
.ForMember(d => d.AutoControl, o => o.MapFrom(s => s.AutoControl));
CreateMap<JobUnitFilter, UnitFilterResponse>()
.ForMember(d => d.UnitFilterMask, o => o.MapFrom(s => s.UnitFilter))
@@ -354,6 +342,8 @@ namespace PARR.API.MappingProfiles
CreateMap<JobRelationshipFilter, RelationshipFilterResponse>()
.ForMember(d => d.Field, o => o.MapFrom(s => s.UnitField));
CreateMap<JobAutoControl, JobAutoControlResponse>();
#endregion
#region JobGroup

View File

@@ -13,6 +13,7 @@ namespace PARR.API.MappingProfiles
CreateMap<PaginationQuery, PaginationFilter>();
#region Job
CreateMap<JobRequest, Job>()
.ForMember(d => d.Id, o => o.MapFrom(s => Guid.NewGuid()))
.ForMember(d => d.DateCreated, o => o.MapFrom(s => DateTimeOffset.UtcNow))
@@ -42,6 +43,7 @@ namespace PARR.API.MappingProfiles
.ForMember(d => d.DateCreated, o => o.MapFrom(s => DateTimeOffset.UtcNow));
CreateMap<RelationshipFilterRequest, JobRelationshipFilter>();
#endregion
}
}

View File

@@ -99,7 +99,7 @@ namespace PARR.DAL.Context
public DbSet<JobRelationshipFilter> JobRelationshipFilters { get; set; }
public DbSet<JobAutoControl> JobAutoControls { get; set; }
#endregion

View File

@@ -110,6 +110,7 @@ namespace PARR.DAL
services.AddTransient<IJobUnitFilterService, JobUnitFilterService>();
services.AddTransient<IFieldFilterService, FieldFilterService>();
services.AddTransient<IJobUnitFilterService, JobUnitFilterService>();
services.AddTransient<IJobAutoControlService, JobAutoControlService>();
#endregion

View File

@@ -0,0 +1,21 @@
using PARR.DAL.Context;
using PARR.DAL.Models.Job;
using PARR.DAL.Services.Interfaces.Job;
namespace PARR.DAL.Services.Implementations.Job
{
internal class JobAutoControlService : IJobAutoControlService
{
private readonly DataContext dataContext;
public JobAutoControlService(DataContext dataContext)
{
this.dataContext = dataContext;
}
public IQueryable<JobAutoControl> Get()
{
return dataContext.JobAutoControls;
}
}
}

View File

@@ -0,0 +1,9 @@
using PARR.DAL.Models.Job;
namespace PARR.DAL.Services.Interfaces.Job
{
public interface IJobAutoControlService
{
IQueryable<JobAutoControl> Get();
}
}