feat(api): StatOrderController - статистика загрузки нарядов за период

This commit is contained in:
Mikhail Trubnikov
2024-09-04 10:14:47 +10:00
parent 86af90f560
commit 62d84b0a18
3 changed files with 57 additions and 1 deletions

View File

@@ -226,6 +226,7 @@
public static class StatOrder
{
public const string Get = BaseStat + "/orders/";
public const string GetForPeriod = BaseStat + "/orders/period";
public const string TaskToEspp = BaseStat + "/orders/tasks";
public const string Statuses = BaseStat + "/orders/statuses";
public const string GetStatusesLastDay = BaseStat + "/orders/statuses/last-day/{statusCode}";

View File

@@ -25,4 +25,10 @@
public int AllCount { get; set; }
public int TaskCount { get; set; }
}
public class StatOrderGetForPeriodResponse
{
public DateOnly Date { get; set; }
public int OrderCount { get; set; }
}
}

View File

@@ -3,10 +3,12 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests.BaseRequests;
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.BLL.Services.Interfaces;
using PARR.Constants;
using PARR.DAL.Services.Interfaces;
@@ -21,16 +23,19 @@ namespace PARR.API.Controllers.V1.Statistics
private readonly IOrderService orderService;
private readonly IOrderStatusService orderStatusService;
private readonly IMapper mapper;
private readonly ICalendarService calendarService;
public StatOrderController(
IOrderService orderService,
IOrderStatusService orderStatusService,
IMapper mapper
IMapper mapper,
ICalendarService calendarService
)
{
this.orderService = orderService;
this.orderStatusService = orderStatusService;
this.mapper = mapper;
this.calendarService = calendarService;
}
/// <summary>
@@ -119,5 +124,49 @@ namespace PARR.API.Controllers.V1.Statistics
}
/// <summary>
/// Получить статистику добавления новых нарядов за период
/// </summary>
/// <param name="timeZoneQuery"></param>
/// <param name="startPeriodDays"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.StatOrder.GetForPeriod)]
public async Task<IActionResult> GetForPeriod([FromQuery] TimeZoneOffsetClient timeZoneQuery, [FromQuery] int startPeriodDays = 3)
{
var endPeriod = calendarService.GetDateWithTimeZoneOffset(DateTimeOffset.UtcNow, timeZoneQuery.TimeZoneOffsetHours);
var startPeriod = endPeriod.AddDays(-startPeriodDays);
var query = orderService.Get()
.Where(t =>
t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date >= startPeriod.Date
&& t.DateCreated.DateTime.AddHours(timeZoneQuery.TimeZoneOffsetHours) <= endPeriod.Date
).GroupBy(t => t.DateCreated.AddHours(timeZoneQuery.TimeZoneOffsetHours).Date)
.Select(t => new
{
Date = t.Key,
OrderCount = t.Count()
});
var result = await query.ToListAsync();
var daysList = calendarService.GetDatesForPeriod(startPeriod, endPeriod);
var response = new List<StatOrderGetForPeriodResponse>();
daysList.ForEach(date =>
{
response.Add(new StatOrderGetForPeriodResponse
{
Date = date,
OrderCount = result.FirstOrDefault(t => DateOnly.FromDateTime(t.Date) == date)?.OrderCount ?? 0
});
});
response = response.OrderBy(t => t.Date).ToList();
return Ok(new Response<List<StatOrderGetForPeriodResponse>>(response, true));
}
}
}