From d1de63e939b9f8897bc2ddadadfaae6a0d3835b9 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Tue, 2 Jun 2026 12:31:53 +1000 Subject: [PATCH] =?UTF-8?q?feat(api,=20core):=20Workload=20-=20=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B5=D1=82=20=D0=BF=D0=BE=20=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=97=D0=9E=20-=20=D0=A0=D0=93.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 2 ++ .../V1/Statistics/StatWorkloadController.cs | 20 ++++++++++++++++++- .../Implementations/WorkloadCacheService.cs | 2 +- .../Implementations/WorkloadService.cs | 11 ++++++---- PARR.Domain/Enums/WorkloadReportType.cs | 4 ++-- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 2743bcc0..f5aeaa65 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -304,6 +304,8 @@ public const string ResponseArea = BaseStat + "/workload/response-areas"; + public const string ResponseAreaWorkGroups = BaseStat + "/workload/response-areas/{responseArea}/work-groups"; + public const string ReportInfo = BaseStat + "/workload/report-info"; } diff --git a/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs b/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs index f7d4082f..9332551c 100644 --- a/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs +++ b/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs @@ -14,6 +14,7 @@ using PARR.Core.Services.Workload.Interfaces; using PARR.Domain.Common.Roles; using PARR.Domain.Entities.Base.History; using PARR.Domain.Enums; +using PARR.Domain.Exceptions; namespace PARR.API.Controllers.V1.Statistics { @@ -70,6 +71,23 @@ namespace PARR.API.Controllers.V1.Statistics } + /// + /// Отчет о загруженности по ЗО - рабочие группы + /// + /// + /// + /// + /// + [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); + } + + /// /// Сформировать отчетность /// @@ -117,7 +135,7 @@ namespace PARR.API.Controllers.V1.Statistics var localTime = utcNow.ToOffset(offset); var dateStart = DateOnly.FromDateTime(localTime.Date); - var report = await workloadService.GetWorkloadReport(reportType, dateStart, durationDays, offset, filter); + var report = await workloadService.GetWorkloadReport(reportType, dateStart, durationDays, offset, filter?.Trim()); if (report == null) return BadRequest(new Response(null, false, new List { new ErrorModel { Message = "Необходимо сформировать отчетность." } }, "empty")); diff --git a/PARR.Core/Services/Workload/Implementations/WorkloadCacheService.cs b/PARR.Core/Services/Workload/Implementations/WorkloadCacheService.cs index 483dcecb..3f491e8a 100644 --- a/PARR.Core/Services/Workload/Implementations/WorkloadCacheService.cs +++ b/PARR.Core/Services/Workload/Implementations/WorkloadCacheService.cs @@ -412,7 +412,7 @@ namespace PARR.Core.Services.Workload.Implementations //keyList.AddRange(cacheWorkloadResponseAreaAllKey); keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaAll()); break; - case WorkloadReportType.ResponseAreaItem: + case WorkloadReportType.ResponseAreaWorkGroups: keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaItem()); break; case WorkloadReportType.WorkGroupAll: diff --git a/PARR.Core/Services/Workload/Implementations/WorkloadService.cs b/PARR.Core/Services/Workload/Implementations/WorkloadService.cs index c2c46308..6bb693a7 100644 --- a/PARR.Core/Services/Workload/Implementations/WorkloadService.cs +++ b/PARR.Core/Services/Workload/Implementations/WorkloadService.cs @@ -43,7 +43,7 @@ namespace PARR.Core.Services.Workload.Implementations logger.LogDebug("Начинаю формировать отчет о загруженности по параметрам: reportType '{ReportType}', dateStart {DateStart}, durationDays {DurationDays}, offset {Offset}", reportType.ToString(), dateStart, durationDays, offset); - if ((reportType == WorkloadReportType.WorkGroupItem || reportType == WorkloadReportType.ResponseAreaItem) && string.IsNullOrEmpty(filterParam)) + if ((reportType == WorkloadReportType.WorkGroupItem || reportType == WorkloadReportType.ResponseAreaWorkGroups) && string.IsNullOrEmpty(filterParam)) { logger.LogError("Для типа отчета {ReportType} не передан параметр.", reportType.ToString()); throw new ArgumentNullException(nameof(filterParam), $"Для отчета типа {reportType.ToString()} параметр является обязательным."); @@ -83,11 +83,14 @@ namespace PARR.Core.Services.Workload.Implementations foreach (var group in templates.GroupBy(t => t.ResponseArea)) statistics.Add(BuildStatisticItem(group.Key, group, reportDays, offset)); break; - case WorkloadReportType.ResponseAreaItem: + case WorkloadReportType.ResponseAreaWorkGroups: displayName = "По зоне ответственности"; - //todo: тут нужно вернуть другой отчет, либо группы работ, либо список работ + // Фильтруем по ЗО var filteredRA = templates.Where(t => t.ResponseArea.Equals(filterParam, StringComparison.OrdinalIgnoreCase)).ToList(); - statistics.Add(BuildStatisticItem(filterParam!, filteredRA, reportDays, offset)); + // Группируем работы по РГ + foreach (var group in filteredRA.GroupBy(t => t.WorkGroup)) + statistics.Add(BuildStatisticItem(group.Key, group, reportDays, offset)); + //statistics.Add(BuildStatisticItem(filterParam!, filteredRA, reportDays, offset)); break; case WorkloadReportType.WorkGroupAll: displayName = "По рабочим группам"; diff --git a/PARR.Domain/Enums/WorkloadReportType.cs b/PARR.Domain/Enums/WorkloadReportType.cs index 88666121..c3126ae3 100644 --- a/PARR.Domain/Enums/WorkloadReportType.cs +++ b/PARR.Domain/Enums/WorkloadReportType.cs @@ -14,9 +14,9 @@ namespace PARR.Domain.Enums ResponseAreaAll = 0, /// - /// Отчет по одной ЗО + /// Отчет по одной ЗО - список рабочих групп /// - ResponseAreaItem = 1, + ResponseAreaWorkGroups = 1, /// /// Отчет по всем РГ