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