feat(dal): TemplateDistributer - добавлен параметр, учитывать или нет выходные и праздничные дни

This commit is contained in:
Mikhail Trubnikov
2026-01-19 16:33:11 +10:00
parent 6a8f90c860
commit 6e8e3c89c2
3 changed files with 18 additions and 10 deletions

View File

@@ -13,13 +13,14 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="duration">Длительность распределения, дней</param> /// <param name="duration">Длительность распределения, дней</param>
/// <param name="referenceDate">ReferenceDate</param> /// <param name="referenceDate">ReferenceDate</param>
/// <param name="allTemplates">Спиоск шаблонов для распределения</param> /// <param name="allTemplates">Спиоск шаблонов для распределения</param>
/// <param name="excludeWeekends">Исключать выходные из распределения</param>
/// <returns></returns> /// <returns></returns>
Task<List<TemplateNextRunResultDto>> DistributeTemplatesAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, List<TemplateNextRunDto> allTemplates); Task<List<TemplateNextRunResultDto>> DistributeTemplatesAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, List<TemplateNextRunDto> allTemplates, bool excludeWeekends);
/// <summary> /// <summary>
/// Возвращает актуальную дату выполнения для одного шаблона, учитывая план нагрузки. /// Возвращает актуальную дату выполнения для одного шаблона, учитывая план нагрузки.
/// Возвращает обновлённый шаблон с новой датой выполнения. /// Возвращает обновлённый шаблон с новой датой выполнения.
/// </summary> /// </summary>
Task<TemplateNextRunResultDto> GetValidNextRunForTemplateAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, TemplateNextRunDto targetTemplate, List<TemplateNextRunDto> allTemplates); Task<TemplateNextRunResultDto> GetValidNextRunForTemplateAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, TemplateNextRunDto targetTemplate, List<TemplateNextRunDto> allTemplates, bool excludeWeekends);
} }
} }

View File

@@ -25,7 +25,7 @@ namespace PARR.DAL.NextRunServices.Subservices
} }
public Task<TemplateNextRunResultDto> GetValidNextRunForTemplateAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, TemplateNextRunDto targetTemplate, List<TemplateNextRunDto> allTemplates) public Task<TemplateNextRunResultDto> GetValidNextRunForTemplateAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, TemplateNextRunDto targetTemplate, List<TemplateNextRunDto> allTemplates, bool excludeWeekends)
{ {
//TODO: //TODO:
throw new NotImplementedException(); throw new NotImplementedException();
@@ -35,7 +35,7 @@ namespace PARR.DAL.NextRunServices.Subservices
public async Task<List<TemplateNextRunResultDto>> DistributeTemplatesAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, List<TemplateNextRunDto> allTemplates) public async Task<List<TemplateNextRunResultDto>> DistributeTemplatesAsync(DateOnly startDate, int duration, DateTimeOffset referenceDate, List<TemplateNextRunDto> allTemplates, bool excludeWeekends)
{ {
var _startDate = GetStartPeriodDate(startDate, referenceDate); var _startDate = GetStartPeriodDate(startDate, referenceDate);
var _endDate = GetEndPeriodDate(_startDate, duration); var _endDate = GetEndPeriodDate(_startDate, duration);
@@ -43,11 +43,15 @@ namespace PARR.DAL.NextRunServices.Subservices
logger.LogInformation("Начинаем распределение {Count} шаблонов на {duration} дней, с {_startDate} по {_endDate}. ReferenceDate: {referenceDate}", allTemplates.Count, duration, _startDate, _endDate, referenceDate); logger.LogInformation("Начинаем распределение {Count} шаблонов на {duration} дней, с {_startDate} по {_endDate}. ReferenceDate: {referenceDate}", allTemplates.Count, duration, _startDate, _endDate, referenceDate);
// Получаем список выходных/праздничных дней // Получаем список выходных/праздничных дней
var weekends = await GetWeekendsAsync(_startDate, _endDate); var weekends = new HashSet<DateOnly>();
logger.LogDebug("Найдено не рабочих дней: {Count}", weekends.Count); if (excludeWeekends)
{
weekends = await GetWeekendsAsync(_startDate, _endDate);
logger.LogDebug("Найдено не рабочих дней: {Count}", weekends.Count);
foreach (var weekend in weekends) foreach (var weekend in weekends)
logger.LogDebug("Не рабочий день: {weekend}", weekend); logger.LogDebug("Не рабочий день: {weekend}", weekend);
}
// Получаем список рабочих дней (исключая выходные и праздники) // Получаем список рабочих дней (исключая выходные и праздники)
var workDays = GetWorkDays(_startDate, _endDate, weekends); var workDays = GetWorkDays(_startDate, _endDate, weekends);

View File

@@ -12,7 +12,7 @@ namespace PARR.Test.NextRun
this.templateDistributor = templateDistributor; this.templateDistributor = templateDistributor;
} }
int periodDays = 5; int periodDays = 10;
DateTimeOffset referenceDate = new DateTimeOffset(2025, 12, 1, 7, 0, 0, TimeSpan.Zero); DateTimeOffset referenceDate = new DateTimeOffset(2025, 12, 1, 7, 0, 0, TimeSpan.Zero);
public async Task Test() public async Task Test()
@@ -25,7 +25,10 @@ namespace PARR.Test.NextRun
/// </summary> /// </summary>
private async Task DistributeTemplatesAsync() private async Task DistributeTemplatesAsync()
{ {
var templates = await templateDistributor.DistributeTemplatesAsync(GetDateStart(), periodDays, referenceDate, GetTemplates()); // исключать выходные и праздники
var excludeWeekends = true;
var templates = await templateDistributor.DistributeTemplatesAsync(GetDateStart(), periodDays, referenceDate, GetTemplates(), excludeWeekends);
//await GetValidNextRunForTemplateAsync(templates); //await GetValidNextRunForTemplateAsync(templates);
} }