diff --git a/PARR.DAL/NextRunServices/INextRunServiceV2.cs b/PARR.DAL/NextRunServices/INextRunServiceV2.cs index f101651e..f59081b9 100644 --- a/PARR.DAL/NextRunServices/INextRunServiceV2.cs +++ b/PARR.DAL/NextRunServices/INextRunServiceV2.cs @@ -12,5 +12,27 @@ namespace PARR.DAL.NextRunServices /// Статус шаблона, если не передать, берутся все шаблоны группы /// Список TemplateId с NextRun и NextRunOld Task?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId, TemplateStatusTypeEnum? templateStatusType); + + + /// + /// Получить nextRun для вновь создаваемого шаблона, которого еще нет в БД + /// + /// ИД группы работ + /// Рабочая группа, не маска + /// Зона ответственности, не маска + /// + Task GetNextRunForNewTemplateAsync(Guid jobGroupId, string workGroupName, string responseAreaName); + + + /// + /// Получить nextRun по id существующего в БД шаблона + /// + /// ИД шаблона + /// При перемещении шаблона в новую для него работу, ставить isNew=true + /// + Task GetNextRunForTemplateAsync(Guid templateId, bool isNew); + + + } } diff --git a/PARR.DAL/NextRunServices/NextRunService.cs b/PARR.DAL/NextRunServices/NextRunService.cs index eb7f0ee5..b6751d2f 100644 --- a/PARR.DAL/NextRunServices/NextRunService.cs +++ b/PARR.DAL/NextRunServices/NextRunService.cs @@ -153,7 +153,7 @@ namespace PARR.DAL.NextRunServices public async Task GetNextRunForNewTemplateAsync(Guid jobGroupId, string responseArea) { - // определяю это автораспределение или нет, вызываю соответствующий рассчет + // определяю это автораспределение или нет, вызываю соответствующий расчет var jobGroup = await jobGroupService.Get() .Include(t => t.DistributionConfig) diff --git a/PARR.DAL/NextRunServices/NextRunServiceV2.cs b/PARR.DAL/NextRunServices/NextRunServiceV2.cs index 97d0638c..9c74bfce 100644 --- a/PARR.DAL/NextRunServices/NextRunServiceV2.cs +++ b/PARR.DAL/NextRunServices/NextRunServiceV2.cs @@ -115,7 +115,7 @@ namespace PARR.DAL.NextRunServices logger.LogDebug("Нужно группировать по РГ"); // получаем для каждого шаблона РГ и сразу группируем по РГ - var templatesByWorkGroup = new Dictionary>(); + var templatesByWorkGroup = new Dictionary>(StringComparer.OrdinalIgnoreCase); foreach (var template in allTemplates) { var workGroupName = await shortcodesService.ApplyShortcodesAsync(template.Job!.WorkGroupMask, template); @@ -199,7 +199,7 @@ namespace PARR.DAL.NextRunServices logger.LogDebug("Использовать ЧАСОВОЙ ПОЯС ЗО (нужно сгруппировать шаблоны по часовым поясам, затем отдельно распределить каждую группу)"); // получаем для каждого шаблона ЗО и сразу группируем по ЗО - var templatesByResponseArea = new Dictionary>(); + var templatesByResponseArea = new Dictionary>(StringComparer.OrdinalIgnoreCase); foreach (var template in allTemplates) { var responseArea = await shortcodesService.ApplyShortcodesAsync(template.Job!.ResponseAreaMask, template); @@ -260,6 +260,214 @@ namespace PARR.DAL.NextRunServices } + public async Task GetNextRunForNewTemplateAsync(Guid jobGroupId, string workGroupName, string responseAreaName) + { + logger.LogDebug("Получить nextRun для вновь создаваемого шаблона. jobGroupId: {jobGroupId}, workGroupName: {workGroupName}, responseAreaName: {responseAreaName}", + jobGroupId, workGroupName, responseAreaName); + + var jobGroup = await jobGroupService.Get() + .AsNoTracking() + .Include(t => t.DistributionConfig) + .ThenInclude(t => t.DistributionPeriod) + .FirstOrDefaultAsync(t => t.Id == jobGroupId); + + if (jobGroup == null) + { + logger.LogError("Не найдена группа работ с Id: {jobGroupId}.", jobGroupId); + throw new ArgumentNullException(nameof(jobGroupId), $"Не найдена группа работ с Id: {jobGroupId}"); + } + + if (jobGroup.IsAutoDistributionEnabled) + { + // автораспределение + logger.LogDebug("Расчет используя метод распределения работ"); + + if (jobGroup.DistributionConfig == null) + { + logger.LogError("Для группы работ {jobGroupId}, указано автораспределение, но отсутствует конфиг в таблице {GroupDistributionConfigs}", jobGroupId, nameof(JobGroupDistributionConfig)); + throw new ArgumentNullException(nameof(JobGroupDistributionConfig), $"Для jobGroupId: {jobGroupId} отсутствует конфигурация автораспределения в таблице {nameof(JobGroupDistributionConfig)}"); + } + + var startDate = GetDateStart(); + var duration = GetDurationDays(jobGroup.DistributionConfig); + var excludeWeekends = jobGroup.DistributionConfig.IsExcludeWeekends; + var targetTemplate = new TemplateNextRunDto(Guid.Empty, null); + var templateStatusType = TemplateStatusTypeEnum.Used; + var allTemplatesQuery = templateService.Get() + .AsNoTracking() + .Include(t => t.Job) + .Where(t => t.StatusTypeId == templateStatusType && t.Job!.GroupId == jobGroupId); + + // группировать по РГ + var isGroupingByWorkGroup = jobGroup.DistributionConfig.IsGroupingByWorkGroup; + + // использовать часовой пояс РГ + var isResponseAreaTimeZone = jobGroup.IsResponseAreaTimezone; + + if (isGroupingByWorkGroup) + { + // группировать по РГ + logger.LogDebug("Нужно группировать по РГ"); + + // получаем для всех шаблонов РГ и группируем их по РГ + var templatesByWorkGroup = new Dictionary>(StringComparer.OrdinalIgnoreCase); + var allTemplates = await allTemplatesQuery.ToListAsync(); + foreach (var template in allTemplates) + { + var templateWorkGroupName = await shortcodesService.ApplyShortcodesAsync(template.Job!.WorkGroupMask, template); + + // Если даже workGroupName == null, ну и ладно, сгруппируем по null + if (templateWorkGroupName == null) + logger.LogWarning("Для шаблона {id}, с маской РГ '{workGroupMask}', не смог с помощью шорткода определить рабочую группу, шорткод сервис вернул РГ: '{workGroupName}'", + template.Id, template.Job!.WorkGroupMask, templateWorkGroupName); + + // Добавляем шаблон в группу + if (!templatesByWorkGroup.TryGetValue(templateWorkGroupName, out var templatesList)) + { + templatesList = new List