diff --git a/PARR.API/Contracts/V1/Requests/JobRequest.cs b/PARR.API/Contracts/V1/Requests/JobRequest.cs index 6608eb1a..09a44a28 100644 --- a/PARR.API/Contracts/V1/Requests/JobRequest.cs +++ b/PARR.API/Contracts/V1/Requests/JobRequest.cs @@ -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 UnitFilters { get; set; } } diff --git a/PARR.API/Contracts/V1/Responses/JobAutoControlResponse.cs b/PARR.API/Contracts/V1/Responses/JobAutoControlResponse.cs new file mode 100644 index 00000000..eb8a75be --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/JobAutoControlResponse.cs @@ -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; } + } +} diff --git a/PARR.API/Contracts/V1/Responses/JobResponse.cs b/PARR.API/Contracts/V1/Responses/JobResponse.cs index 272df40d..147c86bc 100644 --- a/PARR.API/Contracts/V1/Responses/JobResponse.cs +++ b/PARR.API/Contracts/V1/Responses/JobResponse.cs @@ -31,6 +31,8 @@ public List? UnitFilters { get; set; } + public JobAutoControlResponse? AutoControl { get; set; } + #region Статистика //public TemplateStats? TemplateStatistics { get; set; } diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs index 58eea03a..38c498f9 100644 --- a/PARR.API/Controllers/V1/JobController.cs +++ b/PARR.API/Controllers/V1/JobController.cs @@ -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 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; } /// @@ -78,7 +82,7 @@ namespace PARR.API.Controllers.V1 { var paginationFilter = mapper.Map(paginationQuery); - IQueryable query = jobService.Get(); + IQueryable 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 { new ErrorModel { FieldName = nameof(request.Name), Message = $"Работа с указанным диапазоном связей пересекается с уже имеющейся в базе данных({request.MinValueRelationships}-{request.MaxValueRelationships})" } })); + #endregion var job = mapper.Map(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 { 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 { 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(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(updatedJob); diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 6da293ca..d1099de7 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -320,26 +320,14 @@ namespace PARR.API.MappingProfiles #endregion - #region ApplicationInWork - - //CreateMap() - // .Include() - // .ForMember(d => d.Application, o => o.MapFrom(s => s.Application)); - - //CreateMap(); - - //CreateMap() - // .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()) - // .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(); - CreateMap(); + + CreateMap() + .Include(); + + CreateMap() + .ForMember(d => d.AutoControl, o => o.MapFrom(s => s.AutoControl)); CreateMap() .ForMember(d => d.UnitFilterMask, o => o.MapFrom(s => s.UnitFilter)) @@ -354,6 +342,8 @@ namespace PARR.API.MappingProfiles CreateMap() .ForMember(d => d.Field, o => o.MapFrom(s => s.UnitField)); + CreateMap(); + #endregion #region JobGroup diff --git a/PARR.API/MappingProfiles/RequestToDomainProfile.cs b/PARR.API/MappingProfiles/RequestToDomainProfile.cs index 8d8abe44..3041bd9e 100644 --- a/PARR.API/MappingProfiles/RequestToDomainProfile.cs +++ b/PARR.API/MappingProfiles/RequestToDomainProfile.cs @@ -13,6 +13,7 @@ namespace PARR.API.MappingProfiles CreateMap(); #region Job + CreateMap() .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(); + #endregion } } diff --git a/PARR.DAL/Context/DataContext.cs b/PARR.DAL/Context/DataContext.cs index b751fd31..bbb43c98 100644 --- a/PARR.DAL/Context/DataContext.cs +++ b/PARR.DAL/Context/DataContext.cs @@ -99,7 +99,7 @@ namespace PARR.DAL.Context public DbSet JobRelationshipFilters { get; set; } - + public DbSet JobAutoControls { get; set; } #endregion diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs index 2a7383bc..4d0ba65e 100644 --- a/PARR.DAL/ParrDalInstaller.cs +++ b/PARR.DAL/ParrDalInstaller.cs @@ -110,6 +110,7 @@ namespace PARR.DAL services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion diff --git a/PARR.DAL/Services/Implementations/Job/JobAutoControlService.cs b/PARR.DAL/Services/Implementations/Job/JobAutoControlService.cs new file mode 100644 index 00000000..7a34735d --- /dev/null +++ b/PARR.DAL/Services/Implementations/Job/JobAutoControlService.cs @@ -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 Get() + { + return dataContext.JobAutoControls; + } + } +} diff --git a/PARR.DAL/Services/Interfaces/Job/IJobAutoControlService.cs b/PARR.DAL/Services/Interfaces/Job/IJobAutoControlService.cs new file mode 100644 index 00000000..4e80a80c --- /dev/null +++ b/PARR.DAL/Services/Interfaces/Job/IJobAutoControlService.cs @@ -0,0 +1,9 @@ +using PARR.DAL.Models.Job; + +namespace PARR.DAL.Services.Interfaces.Job +{ + public interface IJobAutoControlService + { + IQueryable Get(); + } +}