feat(api): управление job auto control из api
This commit is contained in:
@@ -21,6 +21,16 @@
|
|||||||
|
|
||||||
public required string WorkName { get; set; }
|
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; }
|
public required List<UnitFilterRequest> UnitFilters { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
13
PARR.API/Contracts/V1/Responses/JobAutoControlResponse.cs
Normal file
13
PARR.API/Contracts/V1/Responses/JobAutoControlResponse.cs
Normal 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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
public List<UnitFilterResponse>? UnitFilters { get; set; }
|
public List<UnitFilterResponse>? UnitFilters { get; set; }
|
||||||
|
|
||||||
|
public JobAutoControlResponse? AutoControl { get; set; }
|
||||||
|
|
||||||
#region Статистика
|
#region Статистика
|
||||||
|
|
||||||
//public TemplateStats? TemplateStatistics { get; set; }
|
//public TemplateStats? TemplateStatistics { get; set; }
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ using PARR.Constants;
|
|||||||
using PARR.DAL.Contracts;
|
using PARR.DAL.Contracts;
|
||||||
using PARR.DAL.DomainModels;
|
using PARR.DAL.DomainModels;
|
||||||
using PARR.DAL.DomainServices.Interfaces;
|
using PARR.DAL.DomainServices.Interfaces;
|
||||||
|
using PARR.DAL.Extensions;
|
||||||
using PARR.DAL.Models.Job;
|
using PARR.DAL.Models.Job;
|
||||||
using PARR.DAL.Services.Interfaces;
|
using PARR.DAL.Services.Interfaces;
|
||||||
using PARR.DAL.Services.Interfaces.Job;
|
using PARR.DAL.Services.Interfaces.Job;
|
||||||
@@ -42,6 +43,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
private readonly IMqService mqService;
|
private readonly IMqService mqService;
|
||||||
private readonly MqSettings mqSettings;
|
private readonly MqSettings mqSettings;
|
||||||
private readonly IClientService clientService;
|
private readonly IClientService clientService;
|
||||||
|
private readonly IJobAutoControlService jobAutoControlService;
|
||||||
|
|
||||||
public JobController(
|
public JobController(
|
||||||
ILogger<JobController> logger,
|
ILogger<JobController> logger,
|
||||||
@@ -55,7 +57,8 @@ namespace PARR.API.Controllers.V1
|
|||||||
IUnitService unitService,
|
IUnitService unitService,
|
||||||
IMqService mqService,
|
IMqService mqService,
|
||||||
MqSettings mqSettings,
|
MqSettings mqSettings,
|
||||||
IClientService clientService
|
IClientService clientService,
|
||||||
|
IJobAutoControlService jobAutoControlService
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
@@ -67,6 +70,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
this.mqService = mqService;
|
this.mqService = mqService;
|
||||||
this.mqSettings = mqSettings;
|
this.mqSettings = mqSettings;
|
||||||
this.clientService = clientService;
|
this.clientService = clientService;
|
||||||
|
this.jobAutoControlService = jobAutoControlService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -78,7 +82,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
{
|
{
|
||||||
var paginationFilter = mapper.Map<PaginationFilter>(paginationQuery);
|
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);
|
query = query.OrderBy(t => t.Name);
|
||||||
|
|
||||||
@@ -138,6 +142,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
.Include(t => t.UnitFilters)
|
.Include(t => t.UnitFilters)
|
||||||
.ThenInclude(t => t.RelationshipFilters)
|
.ThenInclude(t => t.RelationshipFilters)
|
||||||
.ThenInclude(t => t.UnitField)
|
.ThenInclude(t => t.UnitField)
|
||||||
|
.Include(t => t.AutoControl)
|
||||||
.FirstOrDefaultAsync(t => t.Id == id);
|
.FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
if (job == null)
|
if (job == null)
|
||||||
@@ -171,6 +176,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
|
|
||||||
#region Проверка существования работы с такими же параметрами
|
#region Проверка существования работы с такими же параметрами
|
||||||
|
|
||||||
var isExistTheSameLinks = await jobService.Get()
|
var isExistTheSameLinks = await jobService.Get()
|
||||||
.Include(t => t.Group).ThenInclude(t => t.GroupType)
|
.Include(t => t.Group).ThenInclude(t => t.GroupType)
|
||||||
.CountAsync(t =>
|
.CountAsync(t =>
|
||||||
@@ -183,11 +189,20 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
if (isExistTheSameLinks > 0)
|
if (isExistTheSameLinks > 0)
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Работа с указанным диапазоном связей пересекается с уже имеющейся в базе данных({request.MinValueRelationships}-{request.MaxValueRelationships})" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { FieldName = nameof(request.Name), Message = $"Работа с указанным диапазоном связей пересекается с уже имеющейся в базе данных({request.MinValueRelationships}-{request.MaxValueRelationships})" } }));
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
var job = mapper.Map<Job>(request);
|
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())
|
if (!await jobService.CreateAsync(job) || !await jobService.CommitAsync())
|
||||||
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
|
return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Ошибка при созании задания на выполнение работ" } }));
|
||||||
|
|
||||||
@@ -201,6 +216,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
.ThenInclude(t => t.UnitField)
|
.ThenInclude(t => t.UnitField)
|
||||||
.Include(t => t.UnitFilters)
|
.Include(t => t.UnitFilters)
|
||||||
.ThenInclude(t => t.RelationshipFilters)
|
.ThenInclude(t => t.RelationshipFilters)
|
||||||
|
.Include(t => t.AutoControl)
|
||||||
.FirstOrDefaultAsync(t => t.Id == job.Id);
|
.FirstOrDefaultAsync(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);
|
||||||
@@ -233,6 +249,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
.ThenInclude(t => t.FieldFilters)
|
.ThenInclude(t => t.FieldFilters)
|
||||||
.Include(t => t.UnitFilters)
|
.Include(t => t.UnitFilters)
|
||||||
.ThenInclude(t => t.RelationshipFilters)
|
.ThenInclude(t => t.RelationshipFilters)
|
||||||
|
.Include(t => t.AutoControl)
|
||||||
.AsSingleQuery()
|
.AsSingleQuery()
|
||||||
.FirstOrDefaultAsync(t => t.Id == id);
|
.FirstOrDefaultAsync(t => t.Id == id);
|
||||||
|
|
||||||
@@ -244,66 +261,47 @@ namespace PARR.API.Controllers.V1
|
|||||||
|
|
||||||
#region обновление полей задания на работу
|
#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.AutoControl != null)
|
||||||
|
|
||||||
if (orig.Name != request.Name.Trim())
|
|
||||||
{
|
{
|
||||||
orig.Name = request.Name.Trim();
|
orig.AutoControl.IsEnable = request.IsEnableAutoControl;
|
||||||
changed = true;
|
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.DateModified = DateTimeOffset.UtcNow;
|
||||||
{
|
|
||||||
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;
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
var job = mapper.Map<Job>(request);
|
var job = mapper.Map<Job>(request);
|
||||||
@@ -334,6 +332,7 @@ namespace PARR.API.Controllers.V1
|
|||||||
.ThenInclude(t => t.UnitField)
|
.ThenInclude(t => t.UnitField)
|
||||||
.Include(t => t.UnitFilters)
|
.Include(t => t.UnitFilters)
|
||||||
.ThenInclude(t => t.RelationshipFilters)
|
.ThenInclude(t => t.RelationshipFilters)
|
||||||
|
.Include(t => t.AutoControl)
|
||||||
.FirstAsync(t => t.Id == orig.Id);
|
.FirstAsync(t => t.Id == orig.Id);
|
||||||
|
|
||||||
var response = mapper.Map<JobResponse>(updatedJob);
|
var response = mapper.Map<JobResponse>(updatedJob);
|
||||||
|
|||||||
@@ -320,26 +320,14 @@ namespace PARR.API.MappingProfiles
|
|||||||
|
|
||||||
#endregion
|
#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
|
#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>()
|
CreateMap<JobUnitFilter, UnitFilterResponse>()
|
||||||
.ForMember(d => d.UnitFilterMask, o => o.MapFrom(s => s.UnitFilter))
|
.ForMember(d => d.UnitFilterMask, o => o.MapFrom(s => s.UnitFilter))
|
||||||
@@ -354,6 +342,8 @@ namespace PARR.API.MappingProfiles
|
|||||||
CreateMap<JobRelationshipFilter, RelationshipFilterResponse>()
|
CreateMap<JobRelationshipFilter, RelationshipFilterResponse>()
|
||||||
.ForMember(d => d.Field, o => o.MapFrom(s => s.UnitField));
|
.ForMember(d => d.Field, o => o.MapFrom(s => s.UnitField));
|
||||||
|
|
||||||
|
CreateMap<JobAutoControl, JobAutoControlResponse>();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region JobGroup
|
#region JobGroup
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ namespace PARR.API.MappingProfiles
|
|||||||
CreateMap<PaginationQuery, PaginationFilter>();
|
CreateMap<PaginationQuery, PaginationFilter>();
|
||||||
|
|
||||||
#region Job
|
#region Job
|
||||||
|
|
||||||
CreateMap<JobRequest, Job>()
|
CreateMap<JobRequest, Job>()
|
||||||
.ForMember(d => d.Id, o => o.MapFrom(s => Guid.NewGuid()))
|
.ForMember(d => d.Id, o => o.MapFrom(s => Guid.NewGuid()))
|
||||||
.ForMember(d => d.DateCreated, o => o.MapFrom(s => DateTimeOffset.UtcNow))
|
.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));
|
.ForMember(d => d.DateCreated, o => o.MapFrom(s => DateTimeOffset.UtcNow));
|
||||||
|
|
||||||
CreateMap<RelationshipFilterRequest, JobRelationshipFilter>();
|
CreateMap<RelationshipFilterRequest, JobRelationshipFilter>();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ namespace PARR.DAL.Context
|
|||||||
|
|
||||||
public DbSet<JobRelationshipFilter> JobRelationshipFilters { get; set; }
|
public DbSet<JobRelationshipFilter> JobRelationshipFilters { get; set; }
|
||||||
|
|
||||||
|
public DbSet<JobAutoControl> JobAutoControls { get; set; }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ namespace PARR.DAL
|
|||||||
services.AddTransient<IJobUnitFilterService, JobUnitFilterService>();
|
services.AddTransient<IJobUnitFilterService, JobUnitFilterService>();
|
||||||
services.AddTransient<IFieldFilterService, FieldFilterService>();
|
services.AddTransient<IFieldFilterService, FieldFilterService>();
|
||||||
services.AddTransient<IJobUnitFilterService, JobUnitFilterService>();
|
services.AddTransient<IJobUnitFilterService, JobUnitFilterService>();
|
||||||
|
services.AddTransient<IJobAutoControlService, JobAutoControlService>();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
using PARR.DAL.Models.Job;
|
||||||
|
|
||||||
|
namespace PARR.DAL.Services.Interfaces.Job
|
||||||
|
{
|
||||||
|
public interface IJobAutoControlService
|
||||||
|
{
|
||||||
|
IQueryable<JobAutoControl> Get();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user