using AutoMapper; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using PARR.API.Contracts.V1; using PARR.API.Contracts.V1.Requests.BaseRequests; using PARR.API.Contracts.V1.Requests.Queries; using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Contracts.V1.Responses.Statistics; using PARR.API.Controllers.V1.Base; using PARR.API.Services.Interfaces; using PARR.Core.Services.TaskServices.Interfaces; using PARR.Core.Services.TaskServices.Providers; using PARR.Core.Services.Workload.Interfaces; using PARR.Domain.Common.Roles; using PARR.Domain.Entities.Base.History; using PARR.Domain.Enums; namespace PARR.API.Controllers.V1.Statistics { /// /// Статистика загруженности по ЗО, РГ /// [Authorize(Roles = ParrRoles.EsppRobot.RoleOrAdmin)] public class StatWorkloadController : BaseApiController { private readonly ITaskManagementService taskManagementService; private readonly IClientService clientService; private readonly ILogger logger; private readonly ITaskMqSettingsProvider taskMqSettingsProvider; private readonly IWorkloadService workloadService; private readonly IMapper mapper; public StatWorkloadController( ITaskManagementService taskManagementService, IClientService clientService, ILogger logger, ITaskMqSettingsProvider taskMqSettingsProvider, IWorkloadService workloadService, IMapper mapper ) { this.taskManagementService = taskManagementService; this.clientService = clientService; this.logger = logger; this.taskMqSettingsProvider = taskMqSettingsProvider; this.workloadService = workloadService; this.mapper = mapper; } /// /// Отчет о загруженности по всем РГ /// /// [HttpGet(ApiRoutes.Workload.WorkGroup)] public async Task GetWorkGroupReport([FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request) { return await GetReportAsync(WorkloadReportType.WorkGroupAll, request.DurationDays, offset.TimeZoneOffset, null); } /// /// Отчет о загруженности по всем ЗО /// /// [HttpGet(ApiRoutes.Workload.ResponseArea)] public async Task GetResponseAreaReport([FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request) { return await GetReportAsync(WorkloadReportType.ResponseAreaAll, request.DurationDays, offset.TimeZoneOffset, null); } /// /// Сформировать отчетность /// /// [HttpPost(ApiRoutes.Workload.Build)] public async Task Build() { var initiator = new HistoryInitiator { InitiatorIp = clientService.GetClientIp()?.ToString(), InitiatorParrComponentId = ParrComponentsEnum.Api, InitiatorComment = "Отправлен запрос из API на формирование отчета о загруженности" }; //todo: избавиться от try/catch try { //mqSettings.Tasks.TryGetValue(TaskTypeEnum.Workload, out var queueSettings); //if (queueSettings == null) //{ // logger.LogError("Не удалось получить настройки очереди для TaskType: {TaskType}", TaskTypeEnum.Workload); // throw new InvalidOperationException($"Не удалось получить настройки очереди для TaskTypeEnum.Workload"); //} var queueSettings = taskMqSettingsProvider.GetSettings(TaskTypeEnum.Workload); var taskId = await taskManagementService.CreateTaskAsync(TaskTypeEnum.Workload, default, initiator, queueSettings); return Ok(new Response(null, true, null!, $"Создана задача {taskId} на формирование отчета")); } catch (Exception ex) { return BadRequest(new Response(false, new List { new ErrorModel { Message = ex.Message } })); } } /// /// Универсальный метод получения отчетности /// /// private async Task GetReportAsync(WorkloadReportType reportType, int durationDays, TimeSpan offset, string? filter) { var utcNow = DateTimeOffset.UtcNow; var localTime = utcNow.ToOffset(offset); var dateStart = DateOnly.FromDateTime(localTime.Date); var report = await workloadService.GetWorkloadReport(reportType, dateStart, durationDays, offset, filter); if (report == null) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Необходимо сформировать отчетность." } })); var resonse = mapper.Map(report); return Ok(new Response(resonse, true)); } } }