diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index e3b408cd..b08c7295 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -374,8 +374,6 @@ public const string Create = Base + "/jobs/"; public const string Update = Base + "/jobs/" + getParam; - public const string Preview = Base + "/jobs/units/preview"; - public const string getParam = "{id}"; } @@ -401,7 +399,13 @@ public const string appInWorkId = "{applicationInWorkId}"; } - + /// + /// Предпросмотр затрагиваемых ЭК для фильтров создаваемой или обновляемой работы + /// + public static class JobUnitPreview + { + public const string Preview = Base + "/jobs/units/preview"; + } /// /// Активатор/деактиватор шаблонов/расписаний /// @@ -436,7 +440,7 @@ { public const string GetAll = Base + "/unit-fields/"; public const string Get = Base + "/unit-fields/" + getParam; - public const string GetAllValues = Base + "/unit-fields/" + getParam+"/values"; + public const string GetAllValues = Base + "/unit-fields/" + getParam + "/values"; public const string getParam = "{id}"; } diff --git a/PARR.API/Contracts/V1/Requests/JobRequest.cs b/PARR.API/Contracts/V1/Requests/JobRequest.cs index c688e996..981d23d0 100644 --- a/PARR.API/Contracts/V1/Requests/JobRequest.cs +++ b/PARR.API/Contracts/V1/Requests/JobRequest.cs @@ -27,10 +27,10 @@ public class UnitFilterRequest { - /// - /// Id = null в методе Create, в Update обязателен - /// - public Guid? Id { get; set; } + ///// + ///// Id = null в методе Create, в Update обязателен + ///// + //public Guid? Id { get; set; } public required string UnitFilterMask { get; set; } diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs index 2a024dc0..2e74961e 100644 --- a/PARR.API/Controllers/V1/JobController.cs +++ b/PARR.API/Controllers/V1/JobController.cs @@ -125,10 +125,10 @@ namespace PARR.API.Controllers.V1 .Include(t => t.Tnk) .Include(t => t.Group) .Include(t => t.UnitFilters) - .ThenInclude(t => t.FieldFilters.OrderBy(o=>o.UnitField!.AihitName)) + .ThenInclude(t => t.FieldFilters) .ThenInclude(t => t.UnitField) .Include(t => t.UnitFilters) - .ThenInclude(t => t.RelationshipFilters.OrderBy(o => o.UnitField!.AihitName)) + .ThenInclude(t => t.RelationshipFilters) .ThenInclude(t => t.UnitField) .FirstOrDefaultAsync(t => t.Id == id); @@ -354,8 +354,8 @@ namespace PARR.API.Controllers.V1 orig.UnitFilters.Add(newUnitFilter); } - - /*//Сразу удаляем UnitFilter которых нет + /* Писал полноценный апдейт, но Миша сказал что нахрен это - просто все удаляем, а потом создаём заново + //Сразу удаляем UnitFilter которых нет var toDelete = orig.UnitFilters.Where(t => !mappedRequest.UnitFilters.Any(e => e.Id == t.Id)); foreach (var item in toDelete) orig.UnitFilters.Remove(item); @@ -529,38 +529,6 @@ namespace PARR.API.Controllers.V1 return NoContent(); } - /// - /// Получить список ЭК для которых будут созданы шаблоны - /// - /// - /// - [HttpPost(ApiRoutes.Job.Preview)] - public async Task 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(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>(units); - - return Ok(response); - } /// /// Загрузка статистики @@ -599,6 +567,7 @@ namespace PARR.API.Controllers.V1 } + public class JobStatModel { public required TemplateStats TemplateStatistics { get; set; } diff --git a/PARR.API/Controllers/V1/JobUnitPreviewController.cs b/PARR.API/Controllers/V1/JobUnitPreviewController.cs new file mode 100644 index 00000000..bd164fcf --- /dev/null +++ b/PARR.API/Controllers/V1/JobUnitPreviewController.cs @@ -0,0 +1,76 @@ +using AutoMapper; +using FluentValidation; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using PARR.API.Contracts.V1; +using PARR.API.Contracts.V1.Requests; +using PARR.API.Contracts.V1.Responses; +using PARR.API.Contracts.V1.Responses.Base; +using PARR.API.Controllers.V1.Base; +using PARR.Constants; +using PARR.DAL.DomainServices.Interfaces; +using PARR.DAL.Models.Job; +using PARR.DAL.Services.Interfaces.Unit; + +namespace PARR.API.Controllers.V1 +{ + /// + /// Получение предварительной информации о работах + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class JobUnitPreviewController : BaseApiController + { + private readonly ILogger logger; + private readonly IUnitFilterService unitFilterService; + private readonly IValidator jobValidator; + private readonly IUnitService unitService; + private readonly IMapper mapper; + + public JobUnitPreviewController( + ILogger logger, + IUnitFilterService unitFilterService, + IValidator jobValidator, + IUnitService unitService, + IMapper mapper + ) + { + this.logger = logger; + this.unitFilterService = unitFilterService; + this.jobValidator = jobValidator; + this.unitService = unitService; + this.mapper = mapper; + } + + /// + /// Получить список ЭК по предполагаемой работе перед сохранением + /// + /// + /// + [HttpPost(ApiRoutes.JobUnitPreview.Preview)] + public async Task 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(request); + + var unitIds = await unitFilterService.GetUnitsIdByJobFilterAsync(job, 100); + + if (unitIds == null || !unitIds.Any()) + return NoContent(); + + var query = unitService.Get().Where(t => unitIds.Any(x => x == t.Id)).OrderBy(o => o.Name); + + var units = await query.ToListAsync(); + + var unitResponse = mapper.Map>(units); + + return Ok(new Response>(unitResponse, true)); + } + } +} diff --git a/PARR.API/Controllers/V1/TestController.cs b/PARR.API/Controllers/V1/TestController.cs index 769039a6..2d7fc0ab 100644 --- a/PARR.API/Controllers/V1/TestController.cs +++ b/PARR.API/Controllers/V1/TestController.cs @@ -1,10 +1,17 @@ -using Microsoft.AspNetCore.Authorization; +using AutoMapper; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using PARR.API.Contracts.V1; +using PARR.API.Contracts.V1.Requests.Queries; +using PARR.API.Contracts.V1.Responses; using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Controllers.V1.Base; +using PARR.API.Extensions; using PARR.API.Services.Interfaces; using PARR.DAL.CacheServices; +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; @@ -24,6 +31,8 @@ namespace PARR.API.Controllers.V1 private readonly IFieldFilterService fieldFilterService; private readonly IJobService jobService; private readonly IJobUnitFilterService jobUnitFilterService; + private readonly IUnitFilterService unitFilterService; + private readonly IMapper mapper; public TestController( IClientService clientService, @@ -33,7 +42,9 @@ namespace PARR.API.Controllers.V1 IUnitService unitService, IFieldFilterService fieldFilterService, IJobService jobService, - IJobUnitFilterService jobUnitFilterService + IJobUnitFilterService jobUnitFilterService, + IUnitFilterService unitFilterService, + IMapper mapper ) { this.clientService = clientService; @@ -44,6 +55,8 @@ namespace PARR.API.Controllers.V1 this.fieldFilterService = fieldFilterService; this.jobService = jobService; this.jobUnitFilterService = jobUnitFilterService; + this.unitFilterService = unitFilterService; + this.mapper = mapper; } @@ -174,8 +187,6 @@ namespace PARR.API.Controllers.V1 // return Ok(result); //} - - } public class CaheRequestTest diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index b00ce527..45644069 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -105,6 +105,8 @@ namespace PARR.API.MappingProfiles #region Unit + CreateMap(); + CreateMap() .ForMember(d => d.Name, o => o.MapFrom(s => (string.IsNullOrEmpty(s.DisplayName)) ? s.AihitName : s.DisplayName)); @@ -314,7 +316,9 @@ namespace PARR.API.MappingProfiles CreateMap(); CreateMap() - .ForMember(d => d.UnitFilterMask, o => o.MapFrom(d => d.UnitFilter)); + .ForMember(d => d.UnitFilterMask, o => o.MapFrom(s => s.UnitFilter)) + .ForMember(d => d.FieldFilters, o => o.MapFrom(s => s.FieldFilters.OrderBy(o => o.UnitField.AihitName))) + .ForMember(d => d.RelationshipFilters, o => o.MapFrom(s => s.RelationshipFilters.OrderBy(o => o.UnitField.AihitName))); CreateMap(); diff --git a/PARR.API/MappingProfiles/RequestToDomainProfile.cs b/PARR.API/MappingProfiles/RequestToDomainProfile.cs index ffa540de..8d8abe44 100644 --- a/PARR.API/MappingProfiles/RequestToDomainProfile.cs +++ b/PARR.API/MappingProfiles/RequestToDomainProfile.cs @@ -24,7 +24,6 @@ namespace PARR.API.MappingProfiles }); CreateMap() - .ForMember(d => d.Id, o => o.MapFrom(s => (s.Id == null) ? Guid.NewGuid() : s.Id)) .ForMember(d => d.DateCreated, o => o.MapFrom(s => DateTimeOffset.UtcNow)) .ForMember(d => d.UnitFilter, o => o.MapFrom(s => s.UnitFilterMask)) .AfterMap((s, d) => diff --git a/PARR.DAL/DomainServices/Implementations/UnitFilterService.cs b/PARR.DAL/DomainServices/Implementations/UnitFilterService.cs index 91019cb5..5a237d16 100644 --- a/PARR.DAL/DomainServices/Implementations/UnitFilterService.cs +++ b/PARR.DAL/DomainServices/Implementations/UnitFilterService.cs @@ -30,7 +30,7 @@ namespace PARR.DAL.DomainServices.Implementations } - public async Task?> GetUnitsIdByJobFilterAsync(Guid jobId) + public async Task?> GetUnitsIdByJobFilterAsync(Guid jobId, int? takeCount = null) { var job = await jobService @@ -45,11 +45,11 @@ namespace PARR.DAL.DomainServices.Implementations if (job == null) return null; - return await GetUnitsIdByJobFilterAsync(job); + return await GetUnitsIdByJobFilterAsync(job, takeCount); } - public async Task?> GetUnitsIdByJobFilterAsync(Job job) + public async Task?> GetUnitsIdByJobFilterAsync(Job job, int? takeCount = null) { var result = new List(); @@ -112,6 +112,10 @@ namespace PARR.DAL.DomainServices.Implementations else query = query.Where(t => t.ChildUnits.Count() >= job.MinValueRelationships && t.ChildUnits.Count() <= job.MaxValueRelationships); } + + if (takeCount.HasValue) + query = query.Take(takeCount.Value); + var newUnits = await query.Select(t => t.Id).ToListAsync(); result.AddRange(newUnits); } @@ -121,9 +125,9 @@ namespace PARR.DAL.DomainServices.Implementations - public async Task?> GetUnitsIdForExistTemplatesByJobFilterAsync(Guid jobId) + public async Task?> GetUnitsIdForExistTemplatesByJobFilterAsync(Guid jobId, int? takeCount = null) { - var unitIdsMustBeCreated = await GetUnitsIdByJobFilterAsync(jobId); + var unitIdsMustBeCreated = await GetUnitsIdByJobFilterAsync(jobId, takeCount); if (unitIdsMustBeCreated == null || !unitIdsMustBeCreated.Any()) return null; @@ -133,9 +137,9 @@ namespace PARR.DAL.DomainServices.Implementations return unitWithTemplates; } - public async Task?> GetUnitsIdForNotExistTemplatesByJobFilterAsync(Guid jobId) + public async Task?> GetUnitsIdForNotExistTemplatesByJobFilterAsync(Guid jobId, int? takeCount = null) { - var unitIdsMustBeCreated = await GetUnitsIdByJobFilterAsync(jobId); + var unitIdsMustBeCreated = await GetUnitsIdByJobFilterAsync(jobId, takeCount); if (unitIdsMustBeCreated == null || !unitIdsMustBeCreated.Any()) return null; diff --git a/PARR.DAL/DomainServices/Interfaces/IUnitFilterService.cs b/PARR.DAL/DomainServices/Interfaces/IUnitFilterService.cs index 2cb30582..049a23e0 100644 --- a/PARR.DAL/DomainServices/Interfaces/IUnitFilterService.cs +++ b/PARR.DAL/DomainServices/Interfaces/IUnitFilterService.cs @@ -9,23 +9,24 @@ namespace PARR.DAL.DomainServices.Interfaces /// /// Id работы /// - Task?> GetUnitsIdByJobFilterAsync(Guid jobId); + Task?> GetUnitsIdByJobFilterAsync(Guid jobId, int? takeCount = null); - Task?> GetUnitsIdByJobFilterAsync(Job job); + Task?> GetUnitsIdByJobFilterAsync(Job job, int? takeCount = null); /// /// Получить все Unit.Id, для которых не были созданы Template /// /// Id работы /// - Task?> GetUnitsIdForNotExistTemplatesByJobFilterAsync(Guid jobId); + Task?> GetUnitsIdForNotExistTemplatesByJobFilterAsync(Guid jobId, int? takeCount = null); /// /// Получить все Unit.Id, для которых были созданы Template /// /// Id работы /// - Task?> GetUnitsIdForExistTemplatesByJobFilterAsync(Guid jobId); - + Task?> GetUnitsIdForExistTemplatesByJobFilterAsync(Guid jobId, int? takeCount = null); + + } }