diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 902e57b3..7bf956f9 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -198,6 +198,14 @@ namespace PARR.API.Contracts.V1 public const string Get = BaseStat + "/applications/"; } + public static class StatOrder + { + public const string Get = BaseStat + "/orders/"; + public const string TaskToEspp = BaseStat + "/orders/tasks"; + public const string Statuses = BaseStat + "/orders/statuses"; + public const string GetStatusesLastDay = BaseStat + "/orders/statuses/last-day/{statusCode}"; + } + #endregion } diff --git a/PARR.API/Contracts/V1/Responses/OrderStatusResponse.cs b/PARR.API/Contracts/V1/Responses/OrderStatusResponse.cs new file mode 100644 index 00000000..86b23ede --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/OrderStatusResponse.cs @@ -0,0 +1,9 @@ +namespace PARR.API.Contracts.V1.Responses +{ + public class OrderStatusResponse + { + public int Code { get; set; } + public required string Name { get; set; } + public required string Description { get; set; } + } +} diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs new file mode 100644 index 00000000..61163b31 --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/Statistics/StatOrderResponse.cs @@ -0,0 +1,22 @@ +namespace PARR.API.Contracts.V1.Responses.Statistics +{ + public class StatOrderResponse + { + public int AllCount { get; set; } + + public int DownloadedLastDayCount { get; set; } + } + + + public class StatOrderStatusesResponse + { + public int Count { get; set; } + public OrderStatusResponse? Status { get; set; } + } + + public class GetStatusesLastDayResponse + { + public int Count { get; set; } + public OrderStatusResponse? Status { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/Statistics/StatOrderController.cs b/PARR.API/Controllers/V1/Statistics/StatOrderController.cs new file mode 100644 index 00000000..88d21ba3 --- /dev/null +++ b/PARR.API/Controllers/V1/Statistics/StatOrderController.cs @@ -0,0 +1,116 @@ +using AutoMapper; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; +using PARR.API.Contracts.V1; +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 +{ + /// + /// Статистика по нарядам + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class StatOrderController : BaseApiController + { + private readonly IOrderService orderService; + private readonly IOrderStatusService orderStatusService; + private readonly IMapper mapper; + + public StatOrderController( + IOrderService orderService, + IOrderStatusService orderStatusService, + IMapper mapper + ) + { + this.orderService = orderService; + this.orderStatusService = orderStatusService; + this.mapper = mapper; + } + + /// + /// Статистика по нарядам - всего в ПАРР / загружено за последние сутки + /// + /// + [HttpGet(ApiRoutes.StatOrder.Get)] + public async Task Get() + { + var queryDate = DateTimeOffset.UtcNow.AddDays(-1); + + var response = new StatOrderResponse + { + AllCount = await orderService.Get().CountAsync(), + DownloadedLastDayCount = await orderService.Get().CountAsync(t => t.DateCreated >= queryDate) + }; + + return Ok(new Response(response, true)); + } + + + /// + /// Статистика по нарядам - кол-во заданий на изменение нарядов в ЕСПП + /// + /// + [HttpGet(ApiRoutes.StatOrder.TaskToEspp)] + public async Task TaskToEspp() + { + return Ok(); + } + + + /// + /// Статистика по нарядам - по статусам в ПАРР + /// + /// + [HttpGet(ApiRoutes.StatOrder.Statuses)] + public async Task Statuses() + { + var statuses = await orderStatusService.Get().OrderBy(t => t.Code).ToListAsync(); + + + var response = new List(); + foreach (var stat in statuses) + { + response.Add(new StatOrderStatusesResponse + { + Status = mapper.Map(stat), + Count = await orderService.Get().CountAsync(t => t.StatusCode == stat.Code) + }); + } + + return Ok(new Response>(response, true)); + } + + + /// + /// Статистика по нарядам - по статусу за последние сутки + /// + /// 1,2,3,4,5 + /// + [HttpGet(ApiRoutes.StatOrder.GetStatusesLastDay)] + public async Task GetStatusesLastDay([FromRoute] int statusCode) + { + var status = await orderStatusService.Get().FirstOrDefaultAsync(t => t.Code == statusCode); + + if (status == null) + return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Не найден статус с кодом: {statusCode}" } })); + + var queryDate = DateTimeOffset.UtcNow.AddDays(-1); + + var response = new GetStatusesLastDayResponse + { + Count = await orderService.Get().CountAsync(t => t.DateModified >= queryDate && t.StatusCode == statusCode), + Status = mapper.Map(status) + }; + + return Ok(new Response(response, true)); + } + + + } +} diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 14755c8f..da12a4d8 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -163,6 +163,7 @@ namespace PARR.API.MappingProfiles .ForMember(t => t.Level, o => o.MapFrom(s => s.AgentHistoryLevel)); + #region User CreateMap() @@ -174,6 +175,10 @@ namespace PARR.API.MappingProfiles #endregion + #region Order + CreateMap(); + #endregion + } } }