From 930e21508906f5802b162ef1b2157946ebc8663d Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Thu, 5 Feb 2026 15:41:36 +1000 Subject: [PATCH] =?UTF-8?q?fix(api,dal,nextRun):=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D1=80=D0=B0=D1=81=D1=81=D1=87=D0=B5=D1=82?= =?UTF-8?q?=D0=B0=20nextRun=20=D0=B4=D0=BB=D1=8F=20=D1=88=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2=20=D1=81=20=D0=BF=D0=B0=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D1=82=D1=80=D0=BE=D0=BC=20IsResponseAreaTime?= =?UTF-8?q?zone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StatTemplateDistributorResponse.cs | 1 + .../V1/Responses/TemplateResponse.cs | 10 +- .../Controllers/V1/ResponseAreaController.cs | 2 - .../StatTemplateDistributionController.cs | 52 ++++-- PARR.API/Controllers/V1/TemplateController.cs | 46 +++-- PARR.DAL/NextRunServices/INextRunService.cs | 15 +- PARR.DAL/NextRunServices/NextRunService.cs | 145 ++++++++++++---- .../EsppScheduleTransformService.cs | 24 ++- .../IEsppScheduleTransformService.cs | 2 +- PARR.NextRun/NextRunManager.cs | 159 +++++++++++++----- .../appsettings.Development.json | 4 +- .../TemplateGenerator.cs | 3 +- PARR.Test/NextRun/NextRunTest.cs | 32 +++- 13 files changed, 352 insertions(+), 143 deletions(-) diff --git a/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs b/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs index d1e87774..7a090e07 100644 --- a/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs +++ b/PARR.API/Contracts/V1/Responses/Statistics/StatTemplateDistributorResponse.cs @@ -56,5 +56,6 @@ public DateTimeOffset NextRun { get; set; } public bool IsActiveTemplate { get; set; } public bool IsActiveSchedular { get; set; } + public required ScheduleResponseAreaTimeOffsetResponse ResponseAreaOffset { get; set; } } } diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs index f210efc2..f7810309 100644 --- a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs +++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs @@ -16,10 +16,10 @@ public DateTimeOffset NextRun { get; set; } - /// - /// NextRun с учетом ЗО (локальное время по ЗО, не UTC) - /// - public DateTimeOffset? NextRunResponseAreaInLocal { get; set; } + ///// + ///// NextRun с учетом ЗО (локальное время по ЗО, не UTC) + ///// + //public DateTimeOffset? NextRunResponseAreaInLocal { get; set; } public bool IsResponseAreaTimezone { get; set; } @@ -45,7 +45,7 @@ public bool IsAutoDistributionEnabled { get; set; } - public ScheduleResponseAreaTimeOffsetResponse? Timezone { get; set; } + public ScheduleResponseAreaTimeOffsetResponse? ResponseAreaOffset { get; set; } } diff --git a/PARR.API/Controllers/V1/ResponseAreaController.cs b/PARR.API/Controllers/V1/ResponseAreaController.cs index 5d9741bc..163457ea 100644 --- a/PARR.API/Controllers/V1/ResponseAreaController.cs +++ b/PARR.API/Controllers/V1/ResponseAreaController.cs @@ -3,12 +3,10 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using PARR.API.Contracts.V1; -using PARR.API.Contracts.V1.Requests.Queries; using PARR.API.Contracts.V1.Responses; using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Controllers.V1.Base; using PARR.Constants; -using PARR.DAL.DomainModels; using PARR.DAL.Services.Interfaces; namespace PARR.API.Controllers.V1 diff --git a/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs b/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs index d5a224d5..862a196f 100644 --- a/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs +++ b/PARR.API/Controllers/V1/Statistics/StatTemplateDistributionController.cs @@ -15,6 +15,7 @@ using PARR.DAL.Models.Job; using PARR.DAL.NextRunServices; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; +using PARR.DAL.Services.Interfaces.Schedule; namespace PARR.API.Controllers.V1.Statistics { @@ -30,6 +31,7 @@ namespace PARR.API.Controllers.V1.Statistics private readonly IShortcodesService shortcodesService; private readonly INextRunService nextRunService; private readonly ILogger logger; + private readonly IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService; public StatTemplateDistributionController( ITemplateService templateService, @@ -37,7 +39,8 @@ namespace PARR.API.Controllers.V1.Statistics IMapper mapper, IShortcodesService shortcodesService, INextRunService nextRunService, - ILogger logger + ILogger logger, + IScheduleResponseAreaTimeOffsetService scheduleResponseAreaTimeOffsetService ) { this.templateService = templateService; @@ -46,6 +49,7 @@ namespace PARR.API.Controllers.V1.Statistics this.shortcodesService = shortcodesService; this.nextRunService = nextRunService; this.logger = logger; + this.scheduleResponseAreaTimeOffsetService = scheduleResponseAreaTimeOffsetService; } @@ -77,7 +81,8 @@ namespace PARR.API.Controllers.V1.Statistics .Where(t => t.Job!.GroupId == jobGroupId && t.StatusTypeId == TemplateStatusTypeEnum.Used) .Select(t => new { - WorkGroup = t.Job!.WorkGroupMask, + WorkGroupMask = t.Job!.WorkGroupMask, + ResponseAreaMask = t.Job!.ResponseAreaMask, Template = t }) .AsNoTracking() @@ -108,23 +113,24 @@ namespace PARR.API.Controllers.V1.Statistics // тут группируем по рабочим группам // Получаем список пар (WorkGroupName, Template) - var templatesWithWorkGroupNames = new List<(string WorkGroupName, Template Template)>(); + var templatesWithWorkGroupNames = new List<(string WorkGroupName, (Template Template, string ResponseArea))>(); - // получаем названия рабочих групп + // получаем названия рабочих групп и ЗО foreach (var item in items) { - var workGroupName = await shortcodesService.ApplyShortcodesAsync(item.WorkGroup, item.Template); - templatesWithWorkGroupNames.Add((workGroupName, item.Template)); + var workGroupName = await shortcodesService.ApplyShortcodesAsync(item.WorkGroupMask, item.Template); + var responseArea = await shortcodesService.ApplyShortcodesAsync(item.ResponseAreaMask, item.Template); + templatesWithWorkGroupNames.Add((workGroupName, (item.Template, responseArea))); } // Группируем по WorkGroupName var grouped = templatesWithWorkGroupNames .GroupBy(x => x.WorkGroupName) - .ToDictionary(g => g.Key, g => g.Select(x => x.Template).ToList()); + .ToDictionary(g => g.Key, g => g.Select(x => x.Item2).ToList()); foreach (var groupedItem in grouped) { - var statResult = GetResponseByWorkGroup(groupedItem.Key, groupedItem.Value, workDays, weekends, timeZoneQuery.TimeZoneOffsetHours, jobGroup.ReferenceDate); + var statResult = GetResponseByWorkGroup(groupedItem.Key, groupedItem.Value.ToList(), workDays, weekends, timeZoneQuery.TimeZoneOffsetHours, jobGroup.ReferenceDate); responseItemsList.Add(statResult); } } @@ -132,8 +138,16 @@ namespace PARR.API.Controllers.V1.Statistics { // не нужно группировать по рабочим группам + // получаем названия ЗО + var templatesWithResponseArea = new List<(Template Template, string ResponseArea)>(); + foreach (var item in items) + { + var responseArea = await shortcodesService.ApplyShortcodesAsync(item.ResponseAreaMask, item.Template); + templatesWithResponseArea.Add((item.Template, responseArea)); + } + // сразу формируем response - responseItemsList.Add(GetResponseByWorkGroup(null, items.Select(t => t.Template).ToList(), workDays, weekends, timeZoneQuery.TimeZoneOffsetHours, jobGroup.ReferenceDate)); + responseItemsList.Add(GetResponseByWorkGroup(null, templatesWithResponseArea, workDays, weekends, timeZoneQuery.TimeZoneOffsetHours, jobGroup.ReferenceDate)); } var response = new StatTemplateDistributorResponse @@ -180,11 +194,11 @@ namespace PARR.API.Controllers.V1.Statistics /// Заполнить респонс /// /// - /// + /// /// /// /// - private StatDistributorItemResponse GetResponseByWorkGroup(string? workGroupName, List