diff --git a/PARR.API/Contracts/V1/Requests/StatWorkWorkLoadRequest.cs b/PARR.API/Contracts/V1/Requests/StatWorkWorkLoadRequest.cs index 851729aa..9d76de77 100644 --- a/PARR.API/Contracts/V1/Requests/StatWorkWorkLoadRequest.cs +++ b/PARR.API/Contracts/V1/Requests/StatWorkWorkLoadRequest.cs @@ -4,8 +4,14 @@ namespace PARR.API.Contracts.V1.Requests { public class StatWorkWorkLoadRequest { - public List Jobs { get; set; } = new List(); + public List JobsRequests { get; set; } = new List(); public required WorkloadBaseQuery Filter { get; set; } } + + public class StatWorkWorkLoadJobRequest + { + public Guid JobId { get; set; } + public Guid WorkGroupId { get; set; } + } } diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatWorkWorkLoadResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatWorkWorkLoadResponse.cs index 5129925e..02676a3d 100644 --- a/PARR.API/Contracts/V1/Responses/Statistics/StatWorkWorkLoadResponse.cs +++ b/PARR.API/Contracts/V1/Responses/Statistics/StatWorkWorkLoadResponse.cs @@ -3,5 +3,7 @@ public class StatWorkWorkLoadResponse : StatWorkLoadDataBaseResponse { public required ApplicationInWorkBaseResponse Job { get; set; } + + public required WorkGroupResponse WorkGroup { get; set; } } } diff --git a/PARR.API/Controllers/V1/Statistics/StatWorkWorkLoadController.cs b/PARR.API/Controllers/V1/Statistics/StatWorkWorkLoadController.cs index 62f1db4d..62a01b5d 100644 --- a/PARR.API/Controllers/V1/Statistics/StatWorkWorkLoadController.cs +++ b/PARR.API/Controllers/V1/Statistics/StatWorkWorkLoadController.cs @@ -9,6 +9,7 @@ using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Contracts.V1.Responses.Statistics; using PARR.API.Controllers.V1.Base; using PARR.API.Services.Interfaces; +using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; namespace PARR.API.Controllers.V1.Statistics @@ -22,18 +23,21 @@ namespace PARR.API.Controllers.V1.Statistics private readonly IWorkLoadService workLoadService; private readonly IMapper mapper; private readonly ILogger logger; + private readonly IWorkGroupService workGroupService; public StatWorkWorkLoadController( ITemplateService templateService, IWorkLoadService workLoadService, IMapper mapper, - ILogger logger + ILogger logger, + IWorkGroupService workGroupService ) { this.templateService = templateService; this.workLoadService = workLoadService; this.mapper = mapper; this.logger = logger; + this.workGroupService = workGroupService; } @@ -60,18 +64,18 @@ namespace PARR.API.Controllers.V1.Statistics [HttpPost(ApiRoutes.StatWorkWorkLoad.GetByApplicationInWork)] public async Task GetByApplicationInWork([FromBody] StatWorkWorkLoadRequest requestBody) { - var response = await GetStatisticsAsync(null, requestBody.Filter, requestBody.Jobs); + var response = await GetStatisticsAsync(null, requestBody.Filter, requestBody.JobsRequests); return Ok(new Response>(response, true)); } - private async Task> GetStatisticsAsync(Guid? workGroupId, WorkloadBaseQuery requestQuery, List? applicationInWorks = null) + private async Task> GetStatisticsAsync(Guid? workGroupId, WorkloadBaseQuery requestQuery, List? jobsRequests = null) { //защита от дурака, чтоб не выгрузить всю БД - if (workGroupId == null && (applicationInWorks == null || applicationInWorks.Count() == 0)) + if (workGroupId == null && (jobsRequests == null || jobsRequests.Count() == 0)) { - logger.LogWarning($"Пытались выполнить запрос получения статситики с нулевыми параметрами {nameof(workGroupId)}, {nameof(applicationInWorks)}. Controller {nameof(StatWorkWorkLoadController)}"); + logger.LogWarning($"Пытались выполнить запрос получения статситики с нулевыми параметрами {nameof(workGroupId)}, {nameof(jobsRequests)}. Controller {nameof(StatWorkWorkLoadController)}"); return new List(); } @@ -81,18 +85,20 @@ namespace PARR.API.Controllers.V1.Statistics IQueryable query = templateService.Get() .Include(t => t.Host); - query = workLoadService.FilterTemplatesQuery(query, requestQuery);//.Where(t => t.Host!.WorkGroupId == workGroupId); + query = workLoadService.FilterTemplatesQuery(query, requestQuery); if (workGroupId.HasValue) query = query.Where(t => t.Host!.WorkGroupId == workGroupId.Value); - if (applicationInWorks != null && applicationInWorks.Count() > 0) - query = query.Where(t => applicationInWorks.Any(x => x == t.ApplicationInWorkId)); + if (jobsRequests != null && jobsRequests.Count() > 0) + //query = query.Where(t => jobsRequests.Any(x => x.JobId == t.ApplicationInWorkId && x.WorkGroupId == t.Host!.WorkGroupId.Value)); /*&& x.WorkGroupId == t.Host!.WorkGroupId.Value*/ + query = query.Where(t => jobsRequests.Select(t => t.JobId).Any(x => x == t.ApplicationInWorkId) && jobsRequests.Select(t => t.WorkGroupId).Any(x => x == t.Host!.WorkGroupId.Value)); - var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.ApplicationInWorkId }) + var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.ApplicationInWorkId, t.Host.WorkGroupId }) .Select(t => new { ApplicationInWorkId = t.Key.ApplicationInWorkId, + WorkGroupId = t.Key.WorkGroupId, Date = t.Key.Date, TemplateCount = t.Count() }); @@ -105,37 +111,53 @@ namespace PARR.API.Controllers.V1.Statistics .Include(t => t.Host) .Include(t => t.ApplicationsInWork).ThenInclude(t => t.Application).ThenInclude(t => t.ApplicationType); + IQueryable workGroupsQuery = workGroupService.Get() + .Include(t => t.ResponseArea); + if (workGroupId.HasValue) + { appInWorksQuery = appInWorksQuery.Where(t => t.Host.WorkGroupId == workGroupId); + workGroupsQuery = workGroupsQuery.Where(t => t.Id == workGroupId.Value); + } - if (applicationInWorks != null && applicationInWorks.Count() > 0) - appInWorksQuery = appInWorksQuery.Where(t => applicationInWorks.Any(x => x == t.ApplicationInWorkId)); + if (jobsRequests != null && jobsRequests.Count() > 0) + { + //appInWorksQuery = appInWorksQuery.Where(t => jobsRequests.Any(x => x.JobId == t.ApplicationInWorkId)); + appInWorksQuery = appInWorksQuery.Where(t => jobsRequests.Select(j=>j.JobId).Any(x => x == t.ApplicationInWorkId)); + workGroupsQuery = workGroupsQuery.Where(t => jobsRequests.Select(w=>w.WorkGroupId).Any(x => x == t.Id)); + } var appInWorks = await appInWorksQuery.Select(t => t.ApplicationsInWork) .Distinct() .ToListAsync(); + var workGroups = await workGroupsQuery.Distinct().ToListAsync(); + + var response = new List(); appInWorks.ForEach(appInWork => { - var workLoads = daysList.Select(t => new StatWorkLoadDataResponse + workGroups.ForEach(workGroup => { - Date = t, - TemplateCount = queryResult.FirstOrDefault(x => x.ApplicationInWorkId == appInWork.Id && x.Date.Date == t.Date)?.TemplateCount ?? 0 - }).OrderBy(t => t.Date).ToList(); + var workLoads = daysList.Select(t => new StatWorkLoadDataResponse + { + Date = t, + TemplateCount = queryResult.FirstOrDefault(x => x.ApplicationInWorkId == appInWork.Id && x.Date.Date == t.Date && x.WorkGroupId == workGroup.Id)?.TemplateCount ?? 0 + }).OrderBy(t => t.Date).ToList(); - response.Add(new StatWorkWorkLoadResponse - { - Job = mapper.Map(appInWork), - WorkLoad = workLoads + response.Add(new StatWorkWorkLoadResponse + { + Job = mapper.Map(appInWork), + WorkGroup = mapper.Map(workGroup), + WorkLoad = workLoads + }); }); }); - response = response.OrderBy(t => t.Job.ShortDescription).ThenBy(t => t.Job.Application?.Name).ToList(); - + response = response.OrderBy(t => t.Job.ShortDescription).ThenBy(t => t.Job.Application?.Name).ThenBy(t => t.WorkGroup.Name).ToList(); return response; }