feat(api): StatResponseAreaWorkLoadController Статистика загрузки регламентными работами по ЗО
This commit is contained in:
@@ -248,6 +248,11 @@
|
|||||||
public const string Get = BaseStat + "/template-distribution/{applicationInWorkId}";
|
public const string Get = BaseStat + "/template-distribution/{applicationInWorkId}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class StatStatResponseAreaWorkLoad
|
||||||
|
{
|
||||||
|
public const string GetAll = BaseStat + "/response-area-workloads/";
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Наряды
|
#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