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.Contracts.V1.Responses.Statistics; using PARR.API.Controllers.V1.Base; 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; public StatResponseAreaWorkLoadController( ITemplateService templateService, IResponseAreaService responseAreaService, IMapper mapper ) { this.templateService = templateService; this.responseAreaService = responseAreaService; this.mapper = mapper; } /// /// Статистика загрузки РР по всем ЗО /// /// [HttpGet(ApiRoutes.StatStatResponseAreaWorkLoad.GetAll)] public async Task GetAll([FromQuery] WorkloadBaseQuery requestQuery) { //начинаем не с сегодняшнего дня, а с завтра, так как на сегодня уже некоторые работы были проведены и дата изменилась var queryStartDate = DateTimeOffset.UtcNow.Date.AddDays(1); var queryEndDate = requestQuery.IsMonth == true ? queryStartDate.AddDays(30) : queryStartDate.AddDays(6); //----------- var daysList = new List(); daysList.Add(new DateTimeOffset(queryStartDate, new TimeSpan(0))); while (daysList.Last() < queryEndDate) { daysList.Add(daysList.Last().AddDays(1)); } //----------- var query = templateService.Get() .Include(t => t.Host).ThenInclude(t => t.WorkGroup) .Where(t => t.NextRun.DateTime.Date >= queryStartDate.Date && t.NextRun.DateTime.Date <= queryEndDate.Date ); if (requestQuery.IsActiveTemplate.HasValue) query = query.Where(t => t.IsActiveTemplate == requestQuery.IsActiveTemplate.Value); if (requestQuery.IsActiveSchedule.HasValue) query = query.Where(t => t.IsActiveTemplate == requestQuery.IsActiveSchedule.Value); 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(); if (!queryResult.Any()) return NoContent(); var allResponseArea = await responseAreaService.Get().ToListAsync(); 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 Ok(new Response>(response, true)); } } }