using AutoMapper; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using PARR.API.Contracts.V1; using PARR.API.Contracts.V1.Requests; using PARR.API.Contracts.V1.Requests.Queries; using PARR.API.Contracts.V1.Responses; 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.Services.Interfaces; namespace PARR.API.Controllers.V1.Statistics { /// /// Статистика загрузки регламентными работами по Видам работ(ApplicationInWorks) /// public class StatWorkWorkLoadController : BaseApiController { private readonly ITemplateService templateService; private readonly IWorkLoadService workLoadService; private readonly IMapper mapper; private readonly ILogger logger; public StatWorkWorkLoadController( ITemplateService templateService, IWorkLoadService workLoadService, IMapper mapper, ILogger logger ) { this.templateService = templateService; this.workLoadService = workLoadService; this.mapper = mapper; this.logger = logger; } /// /// Статистика загрузки регламентными работами по Видам работ(ApplicationInWorks) /// /// /// /// [HttpGet(ApiRoutes.StatWorkWorkLoad.Get)] public async Task Get([FromRoute] Guid workGroupId, [FromQuery] WorkloadBaseQuery requestQuery) { var response = await GetStatisticsAsync(workGroupId, requestQuery); return Ok(new Response>(response, true)); } /// /// Статистика загрузки РР по списку РР /// /// /// [HttpPost(ApiRoutes.StatWorkWorkLoad.GetByApplicationInWork)] public async Task GetByApplicationInWork([FromBody] StatWorkWorkLoadRequest requestBody) { var response = await GetStatisticsAsync(null, requestBody.Filter, requestBody.Jobs); return Ok(new Response>(response, true)); } private async Task> GetStatisticsAsync(Guid? workGroupId, WorkloadBaseQuery requestQuery, List? applicationInWorks = null) { //защита от дурака, чтоб не выгрузить всю БД if (workGroupId == null && (applicationInWorks == null || applicationInWorks.Count() == 0)) { logger.LogWarning($"Пытались выполнить запрос получения статситики с нулевыми параметрами {nameof(workGroupId)}, {nameof(applicationInWorks)}. Controller {nameof(StatWorkWorkLoadController)}"); return new List(); } var daysList = workLoadService.GetDatesForPeriod(requestQuery); IQueryable query = templateService.Get() .Include(t => t.Host); query = workLoadService.FilterTemplatesQuery(query, requestQuery);//.Where(t => t.Host!.WorkGroupId == workGroupId); 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)); var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.ApplicationInWorkId }) .Select(t => new { ApplicationInWorkId = t.Key.ApplicationInWorkId, Date = t.Key.Date, TemplateCount = t.Count() }); var queryResult = await groupedQuery.ToListAsync(); // получаем только работы по которым есть шаблоны (активированные/деакт) и за любой период IQueryable appInWorksQuery = templateService.Get() .Include(t => t.Host) .Include(t => t.ApplicationsInWork).ThenInclude(t => t.Application).ThenInclude(t => t.ApplicationType); if (workGroupId.HasValue) appInWorksQuery = appInWorksQuery.Where(t => t.Host.WorkGroupId == workGroupId); if (applicationInWorks != null && applicationInWorks.Count() > 0) appInWorksQuery = appInWorksQuery.Where(t => applicationInWorks.Any(x => x == t.ApplicationInWorkId)); var appInWorks = await appInWorksQuery.Select(t => t.ApplicationsInWork) .Distinct() .ToListAsync(); var response = new List(); appInWorks.ForEach(appInWork => { var workLoads = daysList.Select(t => new StatWorkLoadDataResponse { Date = t, TemplateCount = queryResult.FirstOrDefault(x => x.ApplicationInWorkId == appInWork.Id && x.Date.Date == t.Date)?.TemplateCount ?? 0 }).OrderBy(t => t.Date).ToList(); response.Add(new StatWorkWorkLoadResponse { Job = mapper.Map(appInWork), WorkLoad = workLoads }); }); response = response.OrderBy(t => t.Job.ShortDescription).ThenBy(t => t.Job.Application?.Name).ToList(); return response; } } }