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() { //todo:!!! //todo: updateDateMOdified 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)); } } }