From 62d84b0a186cb72bea41cd6a2e1f69184653da67 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Wed, 4 Sep 2024 10:14:47 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20StatOrderController=20-=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D1=82=D0=B8=D1=81=D1=82=D0=B8=D0=BA=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D1=8F=D0=B4=D0=BE=D0=B2=20=D0=B7=D0=B0=20=D0=BF=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 1 + .../Responses/Statistics/StatOrderResponse.cs | 6 +++ .../V1/Statistics/StatOrderController.cs | 51 ++++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) 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)); + } + + } }