From 89b6cdf73171de4ddaf2f9a94d8982420c85a455 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Fri, 13 Feb 2026 15:39:21 +1000 Subject: [PATCH] =?UTF-8?q?feat(dal,=20TemplateDistributorWorker):=20NextR?= =?UTF-8?q?unServiceV2=20-=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D1=80?= =?UTF-8?q?=D0=B0=D1=81=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?.=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=20Template?= =?UTF-8?q?DistributorWorker=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.DAL/NextRunServices/INextRunServiceV2.cs | 8 +- PARR.DAL/NextRunServices/NextRunServiceV2.cs | 237 +++++++++++++++--- .../Subservices/ITemplateDistributorV2.cs | 4 +- .../Subservices/TemplateDistributorV2.cs | 2 +- PARR.DAL/ParrDalInstaller.cs | 4 +- .../TemplateDistributor.cs | 14 +- PARR.Test/NextRun/NextRunTest.cs | 11 +- 7 files changed, 234 insertions(+), 46 deletions(-) diff --git a/PARR.DAL/NextRunServices/INextRunServiceV2.cs b/PARR.DAL/NextRunServices/INextRunServiceV2.cs index b8bdbb86..f101651e 100644 --- a/PARR.DAL/NextRunServices/INextRunServiceV2.cs +++ b/PARR.DAL/NextRunServices/INextRunServiceV2.cs @@ -1,4 +1,5 @@ -using PARR.DAL.NextRunServices.Models; +using PARR.Constants; +using PARR.DAL.NextRunServices.Models; namespace PARR.DAL.NextRunServices { @@ -7,8 +8,9 @@ namespace PARR.DAL.NextRunServices /// /// Распределить шаблоны в группе работ (получить список распределенных шаблонов с актуальными nextRun) /// - /// + /// ИД группы работ + /// Статус шаблона, если не передать, берутся все шаблоны группы /// Список TemplateId с NextRun и NextRunOld - Task?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId); + Task?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId, TemplateStatusTypeEnum? templateStatusType); } } diff --git a/PARR.DAL/NextRunServices/NextRunServiceV2.cs b/PARR.DAL/NextRunServices/NextRunServiceV2.cs index 515102e2..97d0638c 100644 --- a/PARR.DAL/NextRunServices/NextRunServiceV2.cs +++ b/PARR.DAL/NextRunServices/NextRunServiceV2.cs @@ -1,7 +1,5 @@ using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; -using NodaTime; using PARR.Constants; using PARR.DAL.Contracts; using PARR.DAL.DomainServices.Shortcodes; @@ -47,14 +45,15 @@ namespace PARR.DAL.NextRunServices this.settingsFromDb = settingsFromDb; } - public async Task?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId) + + public async Task?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId, TemplateStatusTypeEnum? templateStatusType) { - logger.LogInformation("Начинаю распределять шаблоны для группы работ {gobGroupId}", jobGroupId); + logger.LogInformation("Начинаю распределять шаблоны для группы работ {gobGroupId}, templateStatusType: {templateStatusType}", jobGroupId, templateStatusType); var jobGroup = await jobGroupService.Get() + .AsNoTracking() .Include(t => t.DistributionConfig) .ThenInclude(t => t.DistributionPeriod) - .AsNoTracking() .FirstOrDefaultAsync(t => t.Id == jobGroupId); if (jobGroup == null) @@ -76,13 +75,20 @@ namespace PARR.DAL.NextRunServices jobGroup.DistributionConfig.IsExcludeWeekends, jobGroup.DistributionConfig.IsGroupingByWorkGroup, jobGroup.IsResponseAreaTimezone); //получаем шаблоны только в статусе Used - var allTemplates = await templateService.Get() - .AsNoTracking() - .Include(t => t.Job) - .Where(t => - t.Job!.GroupId == jobGroupId - && t.StatusTypeId == TemplateStatusTypeEnum.Used - ).ToListAsync(); + var templateQuery = templateService.Get() + .AsNoTracking() + .Include(t => t.Job) + .Where(t => + t.Job!.GroupId == jobGroupId + //&& t.StatusTypeId == TemplateStatusTypeEnum.Used + ); + + if (templateStatusType.HasValue) + templateQuery = templateQuery.Where(t => t.StatusTypeId == templateStatusType); + + + var allTemplates = await templateQuery.ToListAsync(); + if (!allTemplates.Any()) { logger.LogInformation("В группе c ИД {jobGroupId} отсутствуют шаблоны в статусе Used", jobGroupId); @@ -106,39 +112,150 @@ namespace PARR.DAL.NextRunServices if (isGroupingByWorkGroup) { // группировать по РГ + logger.LogDebug("Нужно группировать по РГ"); - if (isResponseAreaTimeZone) + // получаем для каждого шаблона РГ и сразу группируем по РГ + var templatesByWorkGroup = new Dictionary>(); + foreach (var template in allTemplates) { - // использовать часовой пояс РГ + var workGroupName = await shortcodesService.ApplyShortcodesAsync(template.Job!.WorkGroupMask, template); + // Если даже workGroupName == null, ну и ладно, сгруппируем по null, и распределим шаблоны в рамках этого null + if (workGroupName == null) + logger.LogWarning("Для шаблона {id}, с маской РГ '{workGroupMask}', не смог с помощью шорткода определить рабочую группу, шорткод сервис вернул РГ: '{workGroupName}'", + template.Id, template.Job!.WorkGroupMask, workGroupName); + + // Добавляем шаблон в группу + if (!templatesByWorkGroup.TryGetValue(workGroupName, out var templatesList)) + { + templatesList = new List