diff --git a/PARR.API/Contracts/V1/Requests/Queries/JobQuery.cs b/PARR.API/Contracts/V1/Requests/Queries/JobQuery.cs index ba867428..a155d6af 100644 --- a/PARR.API/Contracts/V1/Requests/Queries/JobQuery.cs +++ b/PARR.API/Contracts/V1/Requests/Queries/JobQuery.cs @@ -1,6 +1,8 @@ -namespace PARR.API.Contracts.V1.Requests.Queries +using PARR.API.Contracts.V1.Requests.BaseRequests; + +namespace PARR.API.Contracts.V1.Requests.Queries { - public class JobQuery + public class JobQuery : FullQuery { /// /// Поиск по имени diff --git a/PARR.API/Contracts/V1/Responses/FieldBaseResponse.cs b/PARR.API/Contracts/V1/Responses/FieldResponse.cs similarity index 100% rename from PARR.API/Contracts/V1/Responses/FieldBaseResponse.cs rename to PARR.API/Contracts/V1/Responses/FieldResponse.cs diff --git a/PARR.API/Contracts/V1/Responses/JobBaseResponse.cs b/PARR.API/Contracts/V1/Responses/JobResponse.cs similarity index 57% rename from PARR.API/Contracts/V1/Responses/JobBaseResponse.cs rename to PARR.API/Contracts/V1/Responses/JobResponse.cs index ae8bdd17..4785a4f5 100644 --- a/PARR.API/Contracts/V1/Responses/JobBaseResponse.cs +++ b/PARR.API/Contracts/V1/Responses/JobResponse.cs @@ -1,6 +1,4 @@ -using PARR.DAL.Models.Job; - -namespace PARR.API.Contracts.V1.Responses +namespace PARR.API.Contracts.V1.Responses { public class JobBaseResponse { @@ -10,24 +8,65 @@ namespace PARR.API.Contracts.V1.Responses public required string TemplateNameMask { get; set; } - public TnkResponse? Tnk { get; set; } - public JobGroupBaseResponse? Group { get; set; } + public required string WorkName { get; set; } } + public class JobResponse : JobBaseResponse { - public int TemplatesCount { get; set; } + + public TnkResponse? Tnk { get; set; } + + public JobGroupBaseResponse? Group { get; set; } + + public int? TemplatesCount { get; set; } + + public List? UnitFilters { get; set; } #region Статистика - public TemplateStats? TemplateStatistics { get; set; } + //public TemplateStats? TemplateStatistics { get; set; } - public ScheduleStats? ScheduleStatistics { get; set; } + //public ScheduleStats? ScheduleStatistics { get; set; } #endregion } + public class UnitFilterResponse + { + public required string UnitFilterMask { get; set; } + + public List? FieldFilters { get; set; } + + public List? RelationshipFilters { get; set; } + + } + + + public class FieldFilterResponse + { + public required FieldResponse Field { get; set; } + + public string? ValueMask { get; set; } + + } + + + public class RelationshipFilterResponse + { + public required FieldResponse Field { get; set; } + + public bool? IsParent { get; set; } + + public string? ValueMask { get; set; } + + public bool? IsFullMatch { get; set; } + + public bool? IsInverse { get; set; } + } + + public class TemplateStats { /// diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs index d8910576..7a118bfb 100644 --- a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs +++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs @@ -32,9 +32,9 @@ public bool IsAutoDistributionEnabled { get; set; } - public UnitBaseResponse? Unit { get; set; } + public UnitResponse? Unit { get; set; } - public JobBaseResponse? Job { get; set; } + public JobResponse? Job { get; set; } public ProcessResponse? Process { get; set; } diff --git a/PARR.API/Contracts/V1/Responses/UnitBaseResponse.cs b/PARR.API/Contracts/V1/Responses/UnitResponse.cs similarity index 73% rename from PARR.API/Contracts/V1/Responses/UnitBaseResponse.cs rename to PARR.API/Contracts/V1/Responses/UnitResponse.cs index 921852d3..ab8a28ec 100644 --- a/PARR.API/Contracts/V1/Responses/UnitBaseResponse.cs +++ b/PARR.API/Contracts/V1/Responses/UnitResponse.cs @@ -18,15 +18,15 @@ /// /// Response с всеми аттребутами и их значениями /// - public class UnitWithAttributesResponse : UnitBaseResponse + public class UnitWithAttributesResponse : UnitResponse { public DateTimeOffset? LastLogon { get; set; } public List? Attributes { get; set; } - public List? Parents { get; set; } + public List? Parents { get; set; } - public List? Childrens { get; set; } + public List? Childrens { get; set; } } } diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs index 0a38cae0..a19f0a00 100644 --- a/PARR.API/Controllers/V1/JobController.cs +++ b/PARR.API/Controllers/V1/JobController.cs @@ -59,7 +59,7 @@ namespace PARR.API.Controllers.V1 { var paginationFilter = mapper.Map(paginationQuery); - IQueryable query = jobService.Get().Include(t => t.Tnk).Include(t=>t.Group); + IQueryable query = jobService.Get(); query = query.OrderBy(t => t.Name); @@ -69,6 +69,21 @@ namespace PARR.API.Controllers.V1 if (filter.GroupId.HasValue) query = query.Where(t => t.GroupId == filter.GroupId.Value); + if (filter.IsFull) + { + query = query + .Include(t => t.Tnk) + .Include(t => t.Group); + + query = query + .Include(t => t.UnitFilters) + .ThenInclude(t => t.FieldFilters) + .ThenInclude(t => t.Field) + .Include(t => t.UnitFilters) + .ThenInclude(t => t.RelationshipFilters) + .ThenInclude(t => t.UnitField); + } + var jobs = await jobService.GetPage(query, paginationFilter).ToListAsync(); if (!jobs.Any()) @@ -90,12 +105,21 @@ namespace PARR.API.Controllers.V1 [HttpGet(ApiRoutes.Job.Get)] public async Task GetById([FromRoute] Guid id) { - var job = await jobService.Get().Include(t => t.Tnk).FirstOrDefaultAsync(t => t.Id == id); + var job = 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 == id); if (job == null) return NotFound(); var response = mapper.Map(job); + response.TemplatesCount = await templateService.Get().CountAsync(t => t.JobId == id); var statistics = await GetStatisticsAsync(response.Id); @@ -270,8 +294,8 @@ namespace PARR.API.Controllers.V1 private void BindStatistics(JobResponse job, JobStatModel statistics) { - job.TemplateStatistics = new TemplateStats { Activated = statistics.TemplateStatistics.Activated, Errors = statistics.TemplateStatistics.Errors, Synchronized = statistics.TemplateStatistics.Synchronized }; - job.ScheduleStatistics = new ScheduleStats { Activated = statistics.ScheduleStatistics.Activated, Errors = statistics.ScheduleStatistics.Errors, Synchronized = statistics.ScheduleStatistics.Synchronized }; + //job.TemplateStatistics = new TemplateStats { Activated = statistics.TemplateStatistics.Activated, Errors = statistics.TemplateStatistics.Errors, Synchronized = statistics.TemplateStatistics.Synchronized }; + //job.ScheduleStatistics = new ScheduleStats { Activated = statistics.ScheduleStatistics.Activated, Errors = statistics.ScheduleStatistics.Errors, Synchronized = statistics.ScheduleStatistics.Synchronized }; } diff --git a/PARR.API/Controllers/V1/JobGroupController.cs b/PARR.API/Controllers/V1/JobGroupController.cs index 8e96b205..b8dfd0d2 100644 --- a/PARR.API/Controllers/V1/JobGroupController.cs +++ b/PARR.API/Controllers/V1/JobGroupController.cs @@ -12,9 +12,11 @@ using PARR.API.Controllers.V1.Base; using PARR.API.Extensions; using PARR.API.Services.Interfaces; using PARR.Constants; +using PARR.DAL.Contracts; using PARR.DAL.DomainModels; using PARR.DAL.Models; using PARR.DAL.Models.Job; +using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; namespace PARR.API.Controllers.V1 @@ -30,7 +32,9 @@ namespace PARR.API.Controllers.V1 private readonly IUriService uriService; private readonly IJobGroupService groupService; private readonly IJobService jobService; + private readonly IEsppSchTypeConfigService esppConfigService; private readonly IValidator validator; + private readonly SettingsFromDb settingsFromDb; public JobGroupController( ILogger logger, @@ -38,7 +42,9 @@ namespace PARR.API.Controllers.V1 IUriService uriService, IJobGroupService groupService, IJobService jobService, - IValidator validator + IEsppSchTypeConfigService esppConfigService, + IValidator validator, + SettingsFromDb settingsFromDb ) { this.logger = logger; @@ -46,7 +52,9 @@ namespace PARR.API.Controllers.V1 this.uriService = uriService; this.groupService = groupService; this.jobService = jobService; + this.esppConfigService = esppConfigService; this.validator = validator; + this.settingsFromDb = settingsFromDb; } @@ -66,7 +74,7 @@ namespace PARR.API.Controllers.V1 if (!string.IsNullOrEmpty(filter.Name)) query = query.Where(t => t.GroupName.ToLower().Contains(filter.Name.ToLower())); - if (filter.IsFull)//TODO а зачем он тогда вообще??? + if (filter.IsFull) query = query.Include(t => t.Jobs).ThenInclude(t => t.Tnk); var jobGroups = await groupService.GetPage(query, paginationFilter).ToListAsync(); @@ -76,6 +84,10 @@ namespace PARR.API.Controllers.V1 var response = mapper.Map>(jobGroups); + if (filter.IsFull) + foreach (var jobGroupResponse in response) + await AppendMissingDataAsync(jobGroupResponse); + var paginationResponse = new PagedResponse(response, true).GetPaginatedProps(paginationFilter, query); return Ok(paginationResponse); @@ -255,7 +267,7 @@ namespace PARR.API.Controllers.V1 /// - /// Удалить группу заданий на выполнение работ (только если нет связанных шаблонов) + /// Удалить группу заданий на выполнение работ (только если нет связанных заданий) /// /// /// @@ -322,5 +334,29 @@ namespace PARR.API.Controllers.V1 return isScheduleChanged; } + + + private async Task AppendMissingDataAsync(JobGroupResponse jobGroupResponse) + { + var schedule = await esppConfigService.GetEsppScheduleDtoAsync(jobGroupResponse.Id); + + if (schedule == null) + { + logger.LogError($"Не смог замапить расписание, так как оно null. JobGroupId: {jobGroupResponse.Id}"); + return; + } + + var scheduleResponse = new JobGroupScheduleResponse + { + Timezone = settingsFromDb.ScheduleTimezone, + TypeSchedule = mapper.Map(schedule.TypeSchedule), + Values = mapper.Map>(schedule.Values).OrderBy(t => t.Order).ToList() + }; + + jobGroupResponse.Schedule = scheduleResponse; + + jobGroupResponse.JobsCount = await jobService.Get().CountAsync(t => t.GroupId == jobGroupResponse.Id); + + } } } diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 65df1825..cb3a6202 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -114,7 +114,7 @@ namespace PARR.API.MappingProfiles .ForMember(d => d.Field, o => o.MapFrom(s => s.Field)) .ForMember(d => d.Value, o => o.MapFrom(s => s.Value)); - CreateMap() + CreateMap() .Include() .ForMember(d => d.Name, o => o.MapFrom(s => s.Name)); @@ -300,10 +300,15 @@ namespace PARR.API.MappingProfiles #endregion #region Job - CreateMap() - .Include(); - + CreateMap(); CreateMap(); + + CreateMap(); + CreateMap(); + CreateMap(); + CreateMap() + .ForMember(d => d.Field, o => o.MapFrom(s => s.UnitField)); + #endregion #region JobGroup @@ -313,9 +318,9 @@ namespace PARR.API.MappingProfiles CreateMap() .ForMember(d => d.Name, o => o.MapFrom(s => s.GroupName)); - CreateMap() - .ForMember(d => d.Schedule, o => o.MapFrom()) - .ForMember(d => d.JobsCount, o => o.MapFrom(s => s.Jobs.Count())); + CreateMap(); + //.ForMember(d => d.Schedule, o => o.MapFrom()) + //.ForMember(d => d.JobsCount, o => o.MapFrom(s => s.Jobs.Count())); #endregion diff --git a/PARR.API/MappingProfiles/Resolvers/JobGroupScheduleResolver.cs b/PARR.API/MappingProfiles/Resolvers/JobGroupScheduleResolver.cs index 797c4fdb..0ae2c0bb 100644 --- a/PARR.API/MappingProfiles/Resolvers/JobGroupScheduleResolver.cs +++ b/PARR.API/MappingProfiles/Resolvers/JobGroupScheduleResolver.cs @@ -14,7 +14,7 @@ namespace PARR.API.MappingProfiles.Resolvers private readonly SettingsFromDb settingsFromDb; public JobGroupScheduleResolver( - IEsppSchTypeConfigService esppConfigService, + IEsppSchTypeConfigService esppConfigService, ILogger logger, IMapper mapper, SettingsFromDb settingsFromDb diff --git a/PARR.DAL/Models/Job/FieldFilter.cs b/PARR.DAL/Models/Job/FieldFilter.cs index 88f2f4c1..8896a86a 100644 --- a/PARR.DAL/Models/Job/FieldFilter.cs +++ b/PARR.DAL/Models/Job/FieldFilter.cs @@ -9,7 +9,7 @@ namespace PARR.DAL.Models.Job { [Table("FieldFilters", Schema = DataContextSettings.Job)] [Comment("Таблица описания критериев выборки аттрибутов ЭК")] - public class FieldFilter : IBase + public class FieldFilter : IBase//TODO Почему этот не Job тра та та { [Key] public Guid Id { get; set; } @@ -26,7 +26,7 @@ namespace PARR.DAL.Models.Job [ForeignKey(nameof(FieldId))] - public UnitField? Field { get; set; } + public UnitField? Field { get; set; }//TODO как-то определитесь уже просто Field или UnitField [ForeignKey(nameof(UnitFilterId))] public JobUnitFilter? UnitFilter { get; set; } diff --git a/PARR.DAL/Models/Job/JobRelationshipFilter.cs b/PARR.DAL/Models/Job/JobRelationshipFilter.cs index 12e52543..8a48dbf5 100644 --- a/PARR.DAL/Models/Job/JobRelationshipFilter.cs +++ b/PARR.DAL/Models/Job/JobRelationshipFilter.cs @@ -8,7 +8,7 @@ namespace PARR.DAL.Models.Job [Table("RelationshipFilters", Schema = DataContextSettings.Job)] [Comment("Таблица фильтров связей ЭК")] [PrimaryKey(nameof(UnitFilterId), nameof(FieldId))] - public class JobRelationshipFilter //: IBase + public class JobRelationshipFilter //: IBase //TODO Почему этот Job тра та та { //[Key] //public Guid Id { get; set; } @@ -45,7 +45,7 @@ namespace PARR.DAL.Models.Job [ForeignKey(nameof(FieldId))] - public UnitField? UnitField { get; set; } + public UnitField? UnitField { get; set; }//TODO как-то определитесь уже просто Field или UnitField