diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index f3ce86b4..f4989842 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -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}"; diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs index 244ece0f..d594fea7 100644 --- a/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs +++ b/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs @@ -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; } + } } diff --git a/PARR.API/Controllers/V1/Statistics/StatOrderController.cs b/PARR.API/Controllers/V1/Statistics/StatOrderController.cs index ed33b830..a41c0e05 100644 --- a/PARR.API/Controllers/V1/Statistics/StatOrderController.cs +++ b/PARR.API/Controllers/V1/Statistics/StatOrderController.cs @@ -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; } /// @@ -119,5 +124,49 @@ namespace PARR.API.Controllers.V1.Statistics } + /// + /// Получить статистику добавления новых нарядов за период + /// + /// + /// + /// + [HttpGet(ApiRoutes.StatOrder.GetForPeriod)] + public async Task 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(); + + 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>(response, true)); + } + + } }