feat(api): StatResponseAreaWorkLoadController Статистика загрузки регламентными работами по ЗО
This commit is contained in:
@@ -248,6 +248,11 @@
|
||||
public const string Get = BaseStat + "/template-distribution/{applicationInWorkId}";
|
||||
}
|
||||
|
||||
public static class StatStatResponseAreaWorkLoad
|
||||
{
|
||||
public const string GetAll = BaseStat + "/response-area-workloads/";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Наряды
|
||||
|
||||
14
PARR.API/Contracts/V1/Requests/Queries/WorkloadBaseQuery.cs
Normal file
14
PARR.API/Contracts/V1/Requests/Queries/WorkloadBaseQuery.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace PARR.API.Contracts.V1.Requests.Queries
|
||||
{
|
||||
/// <summary>
|
||||
/// Базовый запрос по загрузке по ЗО, РГ...
|
||||
/// </summary>
|
||||
public class WorkloadBaseQuery
|
||||
{
|
||||
public bool? IsActiveTemplate { get; set; }
|
||||
|
||||
public bool? IsActiveSchedule { get; set; }
|
||||
|
||||
public bool? IsMonth { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
namespace PARR.API.Contracts.V1.Responses.Statistics
|
||||
{
|
||||
public class StatResponseAreaWorkLoadResponse
|
||||
{
|
||||
public required ResponseAreaResponse ResponseArea { get; set; }
|
||||
|
||||
public List<StatWorkLoadDataResponse> WorkLoad { get; set; }
|
||||
}
|
||||
|
||||
public class StatWorkLoadDataResponse
|
||||
{
|
||||
public DateTimeOffset Date { get; set; }
|
||||
public int TemplateCount { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
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
|
||||
{
|
||||
/// <summary>
|
||||
/// Статистика загрузки регламентными работами по ЗО
|
||||
/// </summary>
|
||||
[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;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Статистика загрузки РР по всем ЗО
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet(ApiRoutes.StatStatResponseAreaWorkLoad.GetAll)]
|
||||
public async Task<IActionResult> 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<DateTimeOffset>();
|
||||
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<StatResponseAreaWorkLoadResponse>();
|
||||
|
||||
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<ResponseAreaResponse>(respArea),
|
||||
WorkLoad = workLoads
|
||||
});
|
||||
});
|
||||
|
||||
response = response.OrderBy(t => t.ResponseArea.Code).ToList();
|
||||
|
||||
return Ok(new Response<List<StatResponseAreaWorkLoadResponse>>(response, true));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user