feat(dal): ITemplateDistributorV2 - изменена логика получения nextRun если он находится в периоде, но в выходной день

This commit is contained in:
Mikhail Trubnikov
2026-02-12 10:07:53 +10:00
parent e857248142
commit a581db5787
2 changed files with 22 additions and 6 deletions

View File

@@ -590,6 +590,10 @@ namespace PARR.DAL.NextRunServices.Subservices
// СЦЕНАРИЙ А: В периоде, но нерабочий день // СЦЕНАРИЙ А: В периоде, но нерабочий день
logger.LogDebug("Сценарий А: в периоде ({date}), но нерабочий день. Ищем слева...", nextRunDate); logger.LogDebug("Сценарий А: в периоде ({date}), но нерабочий день. Ищем слева...", nextRunDate);
// Вычисляем максимальную нагрузку по всему периоду
var maxLoadInPeriod = expectedDailyLoad.Values.Max();
logger.LogDebug("Максимальная нагрузка по периоду: {maxLoad}", maxLoadInPeriod);
// Берём все рабочие дни СТРОГО ЛЕВЕЕ исходной даты // Берём все рабочие дни СТРОГО ЛЕВЕЕ исходной даты
var leftDays = workDays var leftDays = workDays
.Where(d => d < nextRunDate) .Where(d => d < nextRunDate)
@@ -600,17 +604,28 @@ namespace PARR.DAL.NextRunServices.Subservices
{ {
logger.LogDebug("Слева найдено {count} рабочих дней. Ищем первый не перегруженный...", leftDays.Count); logger.LogDebug("Слева найдено {count} рабочих дней. Ищем первый не перегруженный...", leftDays.Count);
// Ищем первый не перегруженный // Ищем первый день где текущая_нагрузка < максимальная_нагрузка_периода
foreach (var day in leftDays) foreach (var day in leftDays)
{ {
if (currentDailyLoad[day] < expectedDailyLoad.GetValueOrDefault(day, 0)) if (currentDailyLoad[day] < maxLoadInPeriod) // ← КЛЮЧЕВОЕ ИЗМЕНЕНИЕ
{ {
foundDay = day; foundDay = day;
logger.LogDebug("Нашли слева не перегруженный день: {day}", day); logger.LogDebug("Нашли слева день с допустимой нагрузкой (< {maxLoad}): {day}", maxLoadInPeriod, day);
break; break;
} }
} }
//// Ищем первый не перегруженный
//foreach (var day in leftDays)
//{
// if (currentDailyLoad[day] < expectedDailyLoad.GetValueOrDefault(day, 0))
// {
// foundDay = day;
// logger.LogDebug("Нашли слева не перегруженный день: {day}", day);
// break;
// }
//}
// Если не нашли — берём ближайший слева // Если не нашли — берём ближайший слева
if (!foundDay.HasValue) if (!foundDay.HasValue)
{ {

View File

@@ -40,17 +40,18 @@ namespace PARR.Test.NextRun
var offset = TimeSpan.FromHours(10); var offset = TimeSpan.FromHours(10);
var startDate = new DateOnly(2026, 2, 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 templates = GetTemplates();
var templatesEmpty = new List<TemplateNextRunDto>(); var templatesEmpty = new List<TemplateNextRunDto>();
var templatesToHandeler = templates; // templatesEmpty
// распределить шаблоны // распределить шаблоны
//var distributedTemplates = await templateDistributorV2.DistributeTemplatesAsync(startDate, duration, referenceDate, offset, templates, true); //var distributedTemplates = await templateDistributorV2.DistributeTemplatesAsync(startDate, duration, referenceDate, offset, templates, true);
// получить актуальный nextRun // получить актуальный nextRun
var targetTemplate = new TemplateNextRunDto(Guid.Parse("DA151719-2742-4260-BFFE-012B61591053"), new DateTimeOffset(2026, 2, 14, 5, 0, 0, TimeSpan.Zero)); 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, templatesEmpty, true, isNew: false); 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-ГВЦ"); //var template = await templateService.Get().Include(t => t.Job).ThenInclude(t => t.Group).FirstAsync(t => t.Name == "ЭИТИ-ПАРРКИТВЦ_СХД ТО-1_СХД-AERODISK-432-2-4-U26-EN4SAG022-ГВЦ");