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; using PARR.Domain.Enums.Workload; using PARR.Domain.Exceptions; 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.WorkGroupJob)] public async Task GetWorkGroupJobReport([FromRoute] string workGroup, [FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request) { if (string.IsNullOrWhiteSpace(workGroup)) throw new AppValidationException("Не указано значение рабочей группы"); return await GetReportAsync(WorkloadReportType.WorkGroupJob, request.DurationDays, offset.TimeZoneOffset, workGroup); } /// /// Отчет о загруженности по всем ЗО /// /// [HttpGet(ApiRoutes.Workload.ResponseArea)] public async Task GetResponseAreaReport([FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request) { return await GetReportAsync(WorkloadReportType.ResponseAreaAll, request.DurationDays, offset.TimeZoneOffset, null); } /// /// Отчет о загруженности по ЗО - рабочие группы /// /// /// /// /// [HttpGet(ApiRoutes.Workload.ResponseAreaWorkGroups)] public async Task GetResponseAreaWorkGroupsReport([FromRoute] string responseArea, [FromQuery] TimeZoneOffsetClient offset, [FromQuery] WorkloadBaseQuery request) { if (string.IsNullOrWhiteSpace(responseArea)) throw new AppValidationException("Не указано значение зоны ответственности"); return await GetReportAsync(WorkloadReportType.ResponseAreaWorkGroups, request.DurationDays, offset.TimeZoneOffset, responseArea); } /// /// Сформировать отчетность /// /// [HttpPost(ApiRoutes.Workload.Build)] public async Task Build() { var initiator = new HistoryInitiator { InitiatorIp = clientService.GetClientIp()?.ToString(), InitiatorParrComponentId = ParrComponentsEnum.Api, InitiatorComment = "Отправлен запрос из API на формирование отчета о загруженности" }; var queueSettings = taskMqSettingsProvider.GetSettings(TaskTypeEnum.Workload); var taskId = await taskManagementService.CreateTaskAsync(TaskTypeEnum.Workload, default, initiator, queueSettings); return Ok(new Response(null, true, null!, $"Создана задача {taskId} на формирование отчета")); } /// /// Получить информацию о формировании КЭШ /// /// [HttpGet(ApiRoutes.Workload.ReportInfo)] public async Task GetReportInfo() { var report = await workloadService.GetReportInfoAsync(); var response = mapper.Map(report); return Ok(new Response(response, true)); } /// /// Универсальный метод получения отчетности /// /// 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.GetWorkloadReportAsync(reportType, dateStart, durationDays, offset, filter?.Trim()); if (report == null) return BadRequest(new Response(null, false, new List { new ErrorModel { Message = "Необходимо сформировать отчетность." } }, "empty")); var resonse = mapper.Map(report); return Ok(new Response(resonse, true)); } } }