feat(dal): templateDistributor теперь распределяет с учетом московского времени

This commit is contained in:
Mikhail Trubnikov
2026-01-28 16:19:19 +10:00
parent 76bd6aa111
commit 3b7213182c
4 changed files with 70 additions and 62 deletions

View File

@@ -309,13 +309,13 @@ namespace PARR.DAL.NextRunServices
public async Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate)
{
//return await templateDistributor.GetWorkDaysAsync(start, end, excludeWeekends);
return await templateDistributor.GetWorkDaysTESTAsync(start, end, excludeWeekends, referenceDate);
return await templateDistributor.GetWorkDaysV2Async(start, end, excludeWeekends, referenceDate);
}
public async Task<HashSet<DateOnly>> GetWeekendsAsync(DateOnly startDate, DateOnly endDate, DateTimeOffset referenceDate)
{
return await templateDistributor.GetWeekendsTESTAsync(startDate, endDate, referenceDate);
return await templateDistributor.GetWeekendsV2Async(startDate, endDate, referenceDate);
}
}
}

View File

@@ -2,8 +2,7 @@
namespace PARR.DAL.NextRunServices.Subservices
{
//TODO: internal
public interface ITemplateDistributor
internal interface ITemplateDistributor
{
/// <summary>
/// Распределяет все шаблоны на указанный период, учитывая план нагрузки.
@@ -41,7 +40,17 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="endDate"></param>
/// <param name="referenceDate"></param>
/// <returns></returns>
Task<HashSet<DateOnly>> GetWeekendsTESTAsync(DateOnly startDate, DateOnly endDate, DateTimeOffset referenceDate);
Task<HashSet<DateOnly>> GetWeekendsV2Async(DateOnly startDate, DateOnly endDate, DateTimeOffset referenceDate);
///// <summary>
///// Получить список рабочих дней
///// </summary>
///// <param name="start"></param>
///// <param name="end"></param>
///// <param name="excludeWeekends"></param>
///// <returns></returns>
//Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends);
/// <summary>
@@ -50,12 +59,9 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="excludeWeekends"></param>
/// <param name="referenceDate"></param>
/// <returns></returns>
Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends);
Task<List<DateOnly>> GetWorkDaysTESTAsync(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate);
Task<List<DateOnly>> GetWorkDaysV2Async(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate);
}
}

View File

@@ -39,7 +39,8 @@ namespace PARR.DAL.NextRunServices.Subservices
logger.LogDebug("Получаю актуальный nextRun для шаблона {templateId}. Текущий nextRun: {nextRun}. Период {duration} дней, с {_startDate} по {_endDate}. Исключить выходные и праздники: {excludeWeekends}. Для нового шаблона: {isNew}", targetTemplate.Id, targetTemplate.NextRun, duration, _startDate, _endDate, excludeWeekends, isNew);
// Получаем список рабочих дней (исключая выходные и праздники)
var workDays = await GetWorkDaysAsync(_startDate, _endDate, excludeWeekends);
//var workDays = await GetWorkDaysAsync(_startDate, _endDate, excludeWeekends);
var workDays = await GetWorkDaysV2Async(_startDate, _endDate, excludeWeekends, referenceDate);
if (workDays.Count == 0)
{
@@ -109,7 +110,8 @@ namespace PARR.DAL.NextRunServices.Subservices
logger.LogInformation("Начинаем распределение {Count} шаблонов на {duration} дней, с {_startDate} по {_endDate}. ReferenceDate: {referenceDate}. Исключить выходные и праздники: {excludeWeekends}.", allTemplates.Count, duration, _startDate, _endDate, referenceDate, excludeWeekends);
// Получаем список рабочих дней (исключая выходные и праздники)
var workDays = await GetWorkDaysAsync(_startDate, _endDate, excludeWeekends);
//var workDays = await GetWorkDaysAsync(_startDate, _endDate, excludeWeekends);
var workDays = await GetWorkDaysV2Async(_startDate, _endDate, excludeWeekends, referenceDate);
if (workDays.Count == 0)
{
@@ -539,22 +541,22 @@ namespace PARR.DAL.NextRunServices.Subservices
}
/// <summary>
/// Получить список выходных дней
/// </summary>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
private async Task<HashSet<DateOnly>> GetWeekendsAsync(DateOnly startDate, DateOnly endDate)
{
var weekends = await weekendDayService.GetWeekends(startDate, endDate).ToListAsync();
///// <summary>
///// Получить список выходных дней
///// </summary>
///// <param name="startDate"></param>
///// <param name="endDate"></param>
///// <returns></returns>
//private async Task<HashSet<DateOnly>> GetWeekendsAsync(DateOnly startDate, DateOnly endDate)
//{
// var weekends = await weekendDayService.GetWeekends(startDate, endDate).ToListAsync();
logger.LogDebug("Найдено не рабочих дней: {Count}", weekends.Count);
foreach (var weekend in weekends)
logger.LogDebug("Не рабочий день: {weekend}", weekend);
// logger.LogDebug("Найдено не рабочих дней: {Count}", weekends.Count);
// foreach (var weekend in weekends)
// logger.LogDebug("Не рабочий день: {weekend}", weekend);
return weekends.ToHashSet();
}
// return weekends.ToHashSet();
//}
/// <summary>
@@ -563,7 +565,7 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <returns></returns>
public async Task<HashSet<DateOnly>> GetWeekendsTESTAsync(DateOnly startDate, DateOnly endDate, DateTimeOffset referenceDate)
public async Task<HashSet<DateOnly>> GetWeekendsV2Async(DateOnly startDate, DateOnly endDate, DateTimeOffset referenceDate)
{
// проверяем это текущие или прошлые сутки относительно refDate, если надо, корректируем dateStart, dateEnd
bool isPreviousDays = IsPreviousDays(referenceDate);
@@ -607,42 +609,42 @@ namespace PARR.DAL.NextRunServices.Subservices
}
/// <summary>
/// Возвращает список рабочих дней в диапазоне, исключая выходные и праздники.
/// </summary>
/// <param name="start"></param>
/// <param name="end"></param>
/// <param name="excludeWeekends">Исключить выходные и праздники</param>
/// <returns></returns>
public async Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends)
{
// Получаем список выходных/праздничных дней
var weekends = new HashSet<DateOnly>();
if (excludeWeekends)
weekends = await GetWeekendsAsync(start, end);
///// <summary>
///// Возвращает список рабочих дней в диапазоне, исключая выходные и праздники.
///// </summary>
///// <param name="start"></param>
///// <param name="end"></param>
///// <param name="excludeWeekends">Исключить выходные и праздники</param>
///// <returns></returns>
//public async Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends)
//{
// // Получаем список выходных/праздничных дней
// var weekends = new HashSet<DateOnly>();
// if (excludeWeekends)
// weekends = await GetWeekendsAsync(start, end);
var result = new List<DateOnly>();
var date = start;
// var result = new List<DateOnly>();
// var date = start;
while (date <= end)
{
var dayOfWeek = date.DayOfWeek;
if (!weekends.Contains(date))
{
result.Add(date);
}
date = date.AddDays(1);
}
// while (date <= end)
// {
// var dayOfWeek = date.DayOfWeek;
// if (!weekends.Contains(date))
// {
// result.Add(date);
// }
// date = date.AddDays(1);
// }
logger.LogDebug("Найдено рабочих дней: {Count}", result.Count);
foreach (var workDay in result)
logger.LogDebug("Рабочий день: {workDay}", workDay);
// logger.LogDebug("Найдено рабочих дней: {Count}", result.Count);
// foreach (var workDay in result)
// logger.LogDebug("Рабочий день: {workDay}", workDay);
return result;
}
// return result;
//}
public async Task<List<DateOnly>> GetWorkDaysTESTAsync(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate)
public async Task<List<DateOnly>> GetWorkDaysV2Async(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate)
{
logger.LogDebug("Формирование списка рабочих дней, start: {start}, end: {end}, excludeWeekends: {excludeWeekends}, referenceDate: {referenceDate}", start, end, excludeWeekends, referenceDate);
@@ -659,7 +661,7 @@ namespace PARR.DAL.NextRunServices.Subservices
// Получаем список выходных/праздничных дней
var weekends = new HashSet<DateOnly>();
if (excludeWeekends)
weekends = await GetWeekendsTESTAsync(start, end, referenceDate);
weekends = await GetWeekendsV2Async(start, end, referenceDate);
var result = new List<DateOnly>();
var date = start;