feat(api, core): Workload - отчет по одной ЗО - РГ.

This commit is contained in:
Mikhail Trubnikov
2026-06-02 12:31:53 +10:00
parent d27d594e57
commit d1de63e939
5 changed files with 31 additions and 8 deletions

View File

@@ -304,6 +304,8 @@
public const string ResponseArea = BaseStat + "/workload/response-areas"; 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"; public const string ReportInfo = BaseStat + "/workload/report-info";
} }

View File

@@ -14,6 +14,7 @@ using PARR.Core.Services.Workload.Interfaces;
using PARR.Domain.Common.Roles; using PARR.Domain.Common.Roles;
using PARR.Domain.Entities.Base.History; using PARR.Domain.Entities.Base.History;
using PARR.Domain.Enums; using PARR.Domain.Enums;
using PARR.Domain.Exceptions;
namespace PARR.API.Controllers.V1.Statistics namespace PARR.API.Controllers.V1.Statistics
{ {
@@ -70,6 +71,23 @@ namespace PARR.API.Controllers.V1.Statistics
} }
/// <summary>
/// Отчет о загруженности по ЗО - рабочие группы
/// </summary>
/// <param name="responseArea"></param>
/// <param name="offset"></param>
/// <param name="request"></param>
/// <returns></returns>
[HttpGet(ApiRoutes.Workload.ResponseAreaWorkGroups)]
public async Task<IActionResult> 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);
}
/// <summary> /// <summary>
/// Сформировать отчетность /// Сформировать отчетность
/// </summary> /// </summary>
@@ -117,7 +135,7 @@ namespace PARR.API.Controllers.V1.Statistics
var localTime = utcNow.ToOffset(offset); var localTime = utcNow.ToOffset(offset);
var dateStart = DateOnly.FromDateTime(localTime.Date); 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) if (report == null)
return BadRequest(new Response<string?>(null, false, new List<ErrorModel> { new ErrorModel { Message = "Необходимо сформировать отчетность." } }, "empty")); return BadRequest(new Response<string?>(null, false, new List<ErrorModel> { new ErrorModel { Message = "Необходимо сформировать отчетность." } }, "empty"));

View File

@@ -412,7 +412,7 @@ namespace PARR.Core.Services.Workload.Implementations
//keyList.AddRange(cacheWorkloadResponseAreaAllKey); //keyList.AddRange(cacheWorkloadResponseAreaAllKey);
keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaAll()); keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaAll());
break; break;
case WorkloadReportType.ResponseAreaItem: case WorkloadReportType.ResponseAreaWorkGroups:
keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaItem()); keyList.AddRange(CacheKeys.Workload.WorkloadResponseAreaItem());
break; break;
case WorkloadReportType.WorkGroupAll: case WorkloadReportType.WorkGroupAll:

View File

@@ -43,7 +43,7 @@ namespace PARR.Core.Services.Workload.Implementations
logger.LogDebug("Начинаю формировать отчет о загруженности по параметрам: reportType '{ReportType}', dateStart {DateStart}, durationDays {DurationDays}, offset {Offset}", logger.LogDebug("Начинаю формировать отчет о загруженности по параметрам: reportType '{ReportType}', dateStart {DateStart}, durationDays {DurationDays}, offset {Offset}",
reportType.ToString(), dateStart, durationDays, 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()); logger.LogError("Для типа отчета {ReportType} не передан параметр.", reportType.ToString());
throw new ArgumentNullException(nameof(filterParam), $"Для отчета типа {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)) foreach (var group in templates.GroupBy(t => t.ResponseArea))
statistics.Add(BuildStatisticItem(group.Key, group, reportDays, offset)); statistics.Add(BuildStatisticItem(group.Key, group, reportDays, offset));
break; break;
case WorkloadReportType.ResponseAreaItem: case WorkloadReportType.ResponseAreaWorkGroups:
displayName = "По зоне ответственности"; displayName = "По зоне ответственности";
//todo: тут нужно вернуть другой отчет, либо группы работ, либо список работ // Фильтруем по ЗО
var filteredRA = templates.Where(t => t.ResponseArea.Equals(filterParam, StringComparison.OrdinalIgnoreCase)).ToList(); 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; break;
case WorkloadReportType.WorkGroupAll: case WorkloadReportType.WorkGroupAll:
displayName = "По рабочим группам"; displayName = "По рабочим группам";

View File

@@ -14,9 +14,9 @@ namespace PARR.Domain.Enums
ResponseAreaAll = 0, ResponseAreaAll = 0,
/// <summary> /// <summary>
/// Отчет по одной ЗО /// Отчет по одной ЗО - список рабочих групп
/// </summary> /// </summary>
ResponseAreaItem = 1, ResponseAreaWorkGroups = 1,
/// <summary> /// <summary>
/// Отчет по всем РГ /// Отчет по всем РГ