using AutoMapper; 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.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.Constants; using PARR.DAL.Services.Interfaces; namespace PARR.API.Controllers.V1.Statistics { /// /// Статистика загрузки регламентными работами по ЗО /// [Authorize(Roles = ParrRoles.EsppRobot.RoleOrAdmin)] public class StatResponseAreaWorkLoadController : BaseApiController { private readonly ITemplateService templateService; private readonly IResponseAreaService responseAreaService; private readonly IMapper mapper; private readonly IWorkLoadService workLoadService; public StatResponseAreaWorkLoadController( ITemplateService templateService, IResponseAreaService responseAreaService, IMapper mapper, IWorkLoadService workLoadService ) { this.templateService = templateService; this.responseAreaService = responseAreaService; this.mapper = mapper; this.workLoadService = workLoadService; } /// /// Статистика загрузки РР по всем ЗО /// /// [HttpGet(ApiRoutes.StatResponseAreaWorkLoad.GetAll)] public async Task GetAll([FromQuery] WorkloadBaseQuery requestQuery) { var response = await GetStatisticsAsync(requestQuery); return Ok(new Response>(response, true)); } /// /// Статистика загрузки РР по списку ЗО /// /// [HttpPost(ApiRoutes.StatResponseAreaWorkLoad.GetByResponseAreas)] public async Task GetByResponseAreas([FromBody] StatResponseAreaWorkloadRequest request) { var response = await GetStatisticsAsync(request.Filter, request.ResponseAreas); return Ok(new Response>(response, true)); } private async Task> GetStatisticsAsync(WorkloadBaseQuery requestQuery, List? responseAreas = null) { var daysList = workLoadService.GetDatesForPeriod(requestQuery); IQueryable query = templateService.Get() .Include(t => t.Host).ThenInclude(t => t.WorkGroup); query = workLoadService.FilterTemplatesQuery(query, requestQuery); if (responseAreas != null && responseAreas.Count() > 0) query = query.Where(t => responseAreas.Any(x => x == t.Host.WorkGroup.ResponseAreaCode)); var groupedQuery = query.GroupBy(t => new { t.NextRun.DateTime.Date, t.Host!.WorkGroup!.ResponseAreaCode }) .Select(t => new { ResponseAreaCode = t.Key.ResponseAreaCode, Date = t.Key.Date, TemplateCount = t.Count() }); var queryResult = await groupedQuery.ToListAsync(); var responseAreaQuery = responseAreaService.Get(); if (responseAreas != null && responseAreas.Count() > 0) responseAreaQuery = responseAreaQuery.Where(t => responseAreas.Any(x => x == t.Code)); var allResponseArea = await responseAreaQuery.ToListAsync(); //if (!allResponseArea.Any()) // return NoContent(); var response = new List(); allResponseArea.ForEach(respArea => { var workLoads = daysList.Select(t => new StatWorkLoadDataResponse { Date = t, TemplateCount = queryResult.FirstOrDefault(x => x.ResponseAreaCode == respArea.Code && x.Date.Date == t.Date)?.TemplateCount ?? 0 }).OrderBy(t => t.Date).ToList(); response.Add( new StatResponseAreaWorkLoadResponse { ResponseArea = mapper.Map(respArea), WorkLoad = workLoads }); }); response = response.OrderBy(t => t.ResponseArea.Code).ToList(); return response; } } }