From 9964e3388d4d7442db48bc388efffb1b61bbf2f4 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Fri, 23 Jan 2026 09:28:14 +1000 Subject: [PATCH] =?UTF-8?q?feat(nextRunWorker):=20=D1=80=D0=B5=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=81=D1=87=D0=B5=D1=82=D0=B0=20=D0=BF=D1=80=D0=BE=D1=81=D1=80?= =?UTF-8?q?=D0=BE=D1=87=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20nextRun=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=20=D1=81=20=D0=B0?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D0=B0=D1=81=D0=BF=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implementations/IntervalService.cs | 8 +- PARR.DAL/NextRunServices/INextRunService.cs | 14 +-- PARR.DAL/NextRunServices/NextRunService.cs | 22 ++--- PARR.NextRun/NextRunManager.cs | 95 +++++++++++-------- 4 files changed, 80 insertions(+), 59 deletions(-) diff --git a/PARR.BLL/Services/Implementations/IntervalService.cs b/PARR.BLL/Services/Implementations/IntervalService.cs index 3534c131..609b0849 100644 --- a/PARR.BLL/Services/Implementations/IntervalService.cs +++ b/PARR.BLL/Services/Implementations/IntervalService.cs @@ -20,20 +20,20 @@ namespace PARR.BLL.Services.Implementations { nextStart = DateTimeOffset.UtcNow; - logger.LogInformation($"Запуск по расписанию. Интервал: {interval}, дата: {nextStart}"); + logger.LogInformation("Запуск по расписанию. Интервал: {interval}, дата: {nextStart}", interval, nextStart); await intervalHandler.Invoke(); nextStart = nextStart.Add(interval); - logger.LogInformation($"Следующая дата запуска: {nextStart}. Интервал: {interval}."); + logger.LogInformation("Следующая дата запуска: {nextStart}. Интервал: {interval}.", nextStart, interval); var intervalOffset = nextStart - DateTimeOffset.UtcNow; if (intervalOffset < TimeSpan.Zero) { intervalOffset = TimeSpan.Zero; - logger.LogWarning($"Время следующего запуска изменено на сейчас. Так как рассчитанное время запуска меньше чем сейчас, {nextStart}<{DateTimeOffset.UtcNow}. " + - $"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений."); + logger.LogWarning("Время следующего запуска изменено на сейчас. Так как рассчитанное время запуска меньше чем сейчас, {nextStart}<{now}. " + + $"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений.", nextStart, DateTimeOffset.UtcNow); } await Task.Delay(intervalOffset); diff --git a/PARR.DAL/NextRunServices/INextRunService.cs b/PARR.DAL/NextRunServices/INextRunService.cs index a130620e..5b119c2d 100644 --- a/PARR.DAL/NextRunServices/INextRunService.cs +++ b/PARR.DAL/NextRunServices/INextRunService.cs @@ -5,19 +5,19 @@ namespace PARR.DAL.NextRunServices public interface INextRunService { /// - /// Получить список TemplateId, NextRun по jobGroupId с автораспределением + /// Получить список TemplateId, NextRun по jobGroupId с автораспределением (распределить шаблоны в группе работ) /// /// /// Task?> GetNextRunForJobGroupWithAutoDistributionAsync(Guid jobGroupId); - ///// - ///// Получить NextRun по jobGroupId с расписанием ЕСПП - ///// - ///// - ///// - //Task GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId); + /// + /// Получить NextRun по jobGroupId с расписанием ЕСПП + /// + /// + /// + Task GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId); /// diff --git a/PARR.DAL/NextRunServices/NextRunService.cs b/PARR.DAL/NextRunServices/NextRunService.cs index ba484c4e..0d03f249 100644 --- a/PARR.DAL/NextRunServices/NextRunService.cs +++ b/PARR.DAL/NextRunServices/NextRunService.cs @@ -126,19 +126,19 @@ namespace PARR.DAL.NextRunServices } - //public async Task GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId) - //{ - // var jobGroup = await jobGroupService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == jobGroupId); + public async Task GetNextRunForJobGroupWithEsppSchedulleAsync(Guid jobGroupId) + { + var jobGroup = await jobGroupService.Get().AsNoTracking().FirstOrDefaultAsync(t => t.Id == jobGroupId); - // if (jobGroup == null) - // { - // logger.LogError("Не найдена группа работ с Id: {jobGroupId}.", jobGroupId); - // throw new ArgumentNullException(nameof(jobGroupId), $"Не найдена группа работ с Id: {jobGroupId}"); - // } + if (jobGroup == null) + { + logger.LogError("Не найдена группа работ с Id: {jobGroupId}.", jobGroupId); + throw new ArgumentNullException(nameof(jobGroupId), $"Не найдена группа работ с Id: {jobGroupId}"); + } - // // Берем из обычного расписания ЕСПП - // return await esppScheduleTransformService.GetNextDateAsync(jobGroupId, jobGroup.ReferenceDate); - //} + // Берем из обычного расписания ЕСПП + return await esppScheduleTransformService.GetNextDateAsync(jobGroupId, jobGroup.ReferenceDate); + } public async Task GetNextRunForNewTemplateAsync(Guid jobGroupId) diff --git a/PARR.NextRun/NextRunManager.cs b/PARR.NextRun/NextRunManager.cs index cdab5375..a3a1b6d7 100644 --- a/PARR.NextRun/NextRunManager.cs +++ b/PARR.NextRun/NextRunManager.cs @@ -60,11 +60,28 @@ namespace PARR.NextRun /// private async Task HandlerAsync(ITemplateService templateService, INextRunService nextRunService, IJobGroupService jobGroupService) { - #region логика для групп у которых не включено автораспределение + logger.LogInformation("Начинаю обновлять NextRun по расписанию"); + // обновляем для групп у которых не включено автораспределение + await UpdateNextRunWithEsppScheduleAsync(templateService, nextRunService, jobGroupService); + + // для групп у которых включено автораспределение + await UpdateNextRunWithAutodistributeScheduleAsync(templateService, nextRunService, jobGroupService); + + logger.LogInformation($"Завершено обновление полей NextRun."); + } + + + /// + /// Обновить nextRun для ВСЕХ шаблонов, для групп у которых расписание ЕСПП (выключено автораспределение) + /// + /// + private async Task UpdateNextRunWithEsppScheduleAsync(ITemplateService templateService, INextRunService nextRunService, IJobGroupService jobGroupService) + { // выбираем шаблоны которые не учавствуют в автораспределении - // и у которых IsUnuser==false + // и у которых Used // затем группируем по GroupId, так как nextRun и расписание настраивается для группы, то для всех дочерних шаблонов, nextRun будет одинаковым + // обновляем для всех шаблонов, у которых nextRun!=рассчитанному var groups = await jobGroupService.Get() @@ -72,13 +89,13 @@ namespace PARR.NextRun .Select(t => new { t.Id, t.ReferenceDate }) .ToListAsync(); - logger.LogInformation("Найдено {GroupCount} групп для обработки.", groups.Count); + logger.LogInformation("Найдено {GroupCount} групп с выключенным автораспределением для обработки.", groups.Count); foreach (var group in groups) { //получаем по каждой группе следующий nextRun и сравниваем с существующим, если не равны, то обновляем //var nextRun = await esppScheduleTransformService.GetNextDateAsync(group.Id, group.ReferenceDate); - var nextRun = await nextRunService.GetNextRunForTemplateAsync(group.Id, false); + var nextRun = await nextRunService.GetNextRunForJobGroupWithEsppSchedulleAsync(group.Id); // Загружаем только шаблоны текущей группы где nextRun в БД не равен расчетному @@ -86,6 +103,8 @@ namespace PARR.NextRun .Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used && t.Job!.GroupId == group.Id && t.NextRun != nextRun) .ToListAsync(); + logger.LogInformation("Для группы {groupId}, шаблонов для обновления где nextRun!=рассчетному {newNextRun} найдено {count} шт.", group.Id, nextRun, templatesToUpdate.Count); + if (!templatesToUpdate.Any()) continue; @@ -97,52 +116,54 @@ namespace PARR.NextRun } // Коммитим изменения для этой группы - if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = Constants.ParrComponentsEnum.NextRun })) - logger.LogInformation($"Обновлены значения полей NextRun для шаблонов группы: {group.Id}, " + + if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = ParrComponentsEnum.NextRun })) + logger.LogInformation($"Обновлены значения полей NextRun для шаблонов группы: {group.Id} с выключенным автораспределением, " + $"refDate: {group.ReferenceDate}. Обновлен nextRun: {nextRun} для шаблонов {templatesToUpdate.Count} шт."); else { - logger.LogError($"Ошибка при обновлении значений полей NextRun: {nextRun}, для шаблонов {templatesToUpdate.Count} шт., группы {group.Id}, refDate: {group.ReferenceDate} "); + logger.LogError($"Ошибка при обновлении значений полей NextRun: {nextRun}, для шаблонов {templatesToUpdate.Count} шт., группы {group.Id} с выключенным автораспределением, refDate: {group.ReferenceDate} "); } } - - #endregion - - //todo: когда будет автораспределение, для него придумать логику как считать - - //TODO:!!! Написать логику для групп у которых включено автораспределение!!! + } - #region old logic - //var templates = await templateService.Get() - // .Include(t => t.Job) - // .ThenInclude(t => t.Group) - // .Where(t => t.NextRun < DateTimeOffset.UtcNow).ToListAsync(); + /// + /// Обновить ПРОСРОЧЕННЫЕ NextRun для групп у которых включено автораспределение + /// + /// + /// + /// + /// + private async Task UpdateNextRunWithAutodistributeScheduleAsync(ITemplateService templateService, INextRunService nextRunService, IJobGroupService jobGroupService) + { + // получаем список всех шаблонов с включенным автораспределением у которых ПРОСРОЧЕН nextRun и они Used + // обновляем у них NextRun - //logger.LogDebug($"Шаблонов для обновления: {templates.Count()} шт."); + var templatesForUpdate = await templateService.Get() + .Where(t => t.StatusTypeId == TemplateStatusTypeEnum.Used && t.Job.Group.IsAutoDistributionEnabled == true && t.NextRun < DateTimeOffset.UtcNow) + .ToListAsync(); - //int errorsCount = 0; + logger.LogInformation("Найдено шаблонов с автораспределением, с просроченным NextRun {count} шт.", templatesForUpdate.Count); - //foreach (var template in templates) - //{ - // var nextRun = await esppScheduleTransformService.GetNextDateAsync(template.Job!.GroupId, template.NextRun); - // template.LastRun = template.NextRun; - // template.NextRun = nextRun; + if (!templatesForUpdate.Any()) + return; - // if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = Constants.ParrComponentsEnum.NextRun })) - // logger.LogDebug($"Обновлены значения полей NextRun: {template.NextRun}, LastRun: {template.LastRun} для шаблона {template.Name}, {template.Id}"); - // else - // { - // logger.LogError($"Ошибка при обновлении значений полей NextRun: {template.NextRun}, LastRun: {template.LastRun} для шаблона {template.Name}, {template.Id}"); - // errorsCount++; - // } - //} + foreach (var template in templatesForUpdate) + { + var newNextRun = await nextRunService.GetNextRunForTemplateAsync(template.Id, false); - //logger.LogInformation($"Завершено обновление полей NextRun. Полей в задании: {templates.Count()}, обновлено: {templates.Count() - errorsCount}, ошибок: {errorsCount}"); + template.LastRun = template.NextRun; + template.NextRun = newNextRun; + } - #endregion - - logger.LogInformation($"Завершено обновление полей NextRun."); + if (await templateService.CommitAsync(new HistoryInitiator { InitiatorComment = "Обновлён NextRun", InitiatorParrComponentId = ParrComponentsEnum.NextRun })) + { + logger.LogInformation("Обновлены значения ПРОСРОЧЕННЫХ полей NextRun для шаблонов с ВКЛЮЧЕННЫМ автораспределением, {count} шт.", templatesForUpdate.Count); + } + else + { + logger.LogError("Ошибка при обновлении ПРОСРОЧЕННЫХ значений полей NextRun, для шаблонов {count} шт., с ВКЛЮЧЕННЫМ автораспределением", templatesForUpdate.Count); + } } } }