From a581db5787bd4ccb2629b9d2fff20dc105cf1d78 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Thu, 12 Feb 2026 10:07:53 +1000 Subject: [PATCH] =?UTF-8?q?feat(dal):=20ITemplateDistributorV2=20-=20?= =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20nextRun=20=D0=B5=D1=81=D0=BB=D0=B8=20?= =?UTF-8?q?=D0=BE=D0=BD=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=B8=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=D0=B5,?= =?UTF-8?q?=20=D0=BD=D0=BE=20=D0=B2=20=D0=B2=D1=8B=D1=85=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B4=D0=B5=D0=BD=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Subservices/TemplateDistributorV2.cs | 21 ++++++++++++++++--- PARR.Test/NextRun/NextRunTest.cs | 7 ++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs b/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs index c640b2ad..88efad7f 100644 --- a/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs +++ b/PARR.DAL/NextRunServices/Subservices/TemplateDistributorV2.cs @@ -590,6 +590,10 @@ namespace PARR.DAL.NextRunServices.Subservices // СЦЕНАРИЙ А: В периоде, но нерабочий день logger.LogDebug("Сценарий А: в периоде ({date}), но нерабочий день. Ищем слева...", nextRunDate); + // Вычисляем максимальную нагрузку по всему периоду + var maxLoadInPeriod = expectedDailyLoad.Values.Max(); + logger.LogDebug("Максимальная нагрузка по периоду: {maxLoad}", maxLoadInPeriod); + // Берём все рабочие дни СТРОГО ЛЕВЕЕ исходной даты var leftDays = workDays .Where(d => d < nextRunDate) @@ -600,17 +604,28 @@ namespace PARR.DAL.NextRunServices.Subservices { logger.LogDebug("Слева найдено {count} рабочих дней. Ищем первый не перегруженный...", leftDays.Count); - // Ищем первый не перегруженный + // Ищем первый день где текущая_нагрузка < максимальная_нагрузка_периода foreach (var day in leftDays) { - if (currentDailyLoad[day] < expectedDailyLoad.GetValueOrDefault(day, 0)) + if (currentDailyLoad[day] < maxLoadInPeriod) // ← КЛЮЧЕВОЕ ИЗМЕНЕНИЕ { foundDay = day; - logger.LogDebug("Нашли слева не перегруженный день: {day}", day); + logger.LogDebug("Нашли слева день с допустимой нагрузкой (< {maxLoad}): {day}", maxLoadInPeriod, day); break; } } + //// Ищем первый не перегруженный + //foreach (var day in leftDays) + //{ + // if (currentDailyLoad[day] < expectedDailyLoad.GetValueOrDefault(day, 0)) + // { + // foundDay = day; + // logger.LogDebug("Нашли слева не перегруженный день: {day}", day); + // break; + // } + //} + // Если не нашли — берём ближайший слева if (!foundDay.HasValue) { diff --git a/PARR.Test/NextRun/NextRunTest.cs b/PARR.Test/NextRun/NextRunTest.cs index 7b852db3..344166d8 100644 --- a/PARR.Test/NextRun/NextRunTest.cs +++ b/PARR.Test/NextRun/NextRunTest.cs @@ -40,17 +40,18 @@ namespace PARR.Test.NextRun var offset = TimeSpan.FromHours(10); var startDate = new DateOnly(2026, 2, 10); - var referenceDate = new DateTimeOffset(2026, 2, 10, 6, 0, 0, TimeSpan.Zero); + var referenceDate = new DateTimeOffset(2026, 2, 12, 23, 0, 0, TimeSpan.Zero); var templates = GetTemplates(); var templatesEmpty = new List(); + var templatesToHandeler = templates; // templatesEmpty // распределить шаблоны //var distributedTemplates = await templateDistributorV2.DistributeTemplatesAsync(startDate, duration, referenceDate, offset, templates, true); // получить актуальный nextRun - var targetTemplate = new TemplateNextRunDto(Guid.Parse("DA151719-2742-4260-BFFE-012B61591053"), new DateTimeOffset(2026, 2, 14, 5, 0, 0, TimeSpan.Zero)); - var validNextRun = await templateDistributorV2.GetNextRunForTemplateAsync(startDate, duration, referenceDate, offset, targetTemplate, templatesEmpty, true, isNew: false); + var targetTemplate = new TemplateNextRunDto(Guid.Parse("DA151719-2742-4260-BFFE-012B61591053"), new DateTimeOffset(2026, 2, 14, 23, 30, 0, TimeSpan.Zero)); + var validNextRun = await templateDistributorV2.GetNextRunForTemplateAsync(startDate, duration, referenceDate, offset, targetTemplate, templatesToHandeler, true, isNew: false); //var template = await templateService.Get().Include(t => t.Job).ThenInclude(t => t.Group).FirstAsync(t => t.Name == "ЭИТИ-ПАРР_ЦКИТ-ГВЦ_СХД ТО-1_СХД-AERODISK-432-2-4-U26-EN4SAG022-ГВЦ");