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) public async Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate)
{ {
//return await templateDistributor.GetWorkDaysAsync(start, end, excludeWeekends); //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) 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 namespace PARR.DAL.NextRunServices.Subservices
{ {
//TODO: internal internal interface ITemplateDistributor
public interface ITemplateDistributor
{ {
/// <summary> /// <summary>
/// Распределяет все шаблоны на указанный период, учитывая план нагрузки. /// Распределяет все шаблоны на указанный период, учитывая план нагрузки.
@@ -41,7 +40,17 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="endDate"></param> /// <param name="endDate"></param>
/// <param name="referenceDate"></param> /// <param name="referenceDate"></param>
/// <returns></returns> /// <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> /// <summary>
@@ -50,12 +59,9 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="start"></param> /// <param name="start"></param>
/// <param name="end"></param> /// <param name="end"></param>
/// <param name="excludeWeekends"></param> /// <param name="excludeWeekends"></param>
/// <param name="referenceDate"></param>
/// <returns></returns> /// <returns></returns>
Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends); Task<List<DateOnly>> GetWorkDaysV2Async(DateOnly start, DateOnly end, bool excludeWeekends, DateTimeOffset referenceDate);
Task<List<DateOnly>> GetWorkDaysTESTAsync(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); 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) 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); 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) if (workDays.Count == 0)
{ {
@@ -539,22 +541,22 @@ namespace PARR.DAL.NextRunServices.Subservices
} }
/// <summary> ///// <summary>
/// Получить список выходных дней ///// Получить список выходных дней
/// </summary> ///// </summary>
/// <param name="startDate"></param> ///// <param name="startDate"></param>
/// <param name="endDate"></param> ///// <param name="endDate"></param>
/// <returns></returns> ///// <returns></returns>
private async Task<HashSet<DateOnly>> GetWeekendsAsync(DateOnly startDate, DateOnly endDate) //private async Task<HashSet<DateOnly>> GetWeekendsAsync(DateOnly startDate, DateOnly endDate)
{ //{
var weekends = await weekendDayService.GetWeekends(startDate, endDate).ToListAsync(); // var weekends = await weekendDayService.GetWeekends(startDate, endDate).ToListAsync();
logger.LogDebug("Найдено не рабочих дней: {Count}", weekends.Count); // logger.LogDebug("Найдено не рабочих дней: {Count}", weekends.Count);
foreach (var weekend in weekends) // foreach (var weekend in weekends)
logger.LogDebug("Не рабочий день: {weekend}", weekend); // logger.LogDebug("Не рабочий день: {weekend}", weekend);
return weekends.ToHashSet(); // return weekends.ToHashSet();
} //}
/// <summary> /// <summary>
@@ -563,7 +565,7 @@ namespace PARR.DAL.NextRunServices.Subservices
/// <param name="startDate"></param> /// <param name="startDate"></param>
/// <param name="endDate"></param> /// <param name="endDate"></param>
/// <returns></returns> /// <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 // проверяем это текущие или прошлые сутки относительно refDate, если надо, корректируем dateStart, dateEnd
bool isPreviousDays = IsPreviousDays(referenceDate); bool isPreviousDays = IsPreviousDays(referenceDate);
@@ -607,42 +609,42 @@ namespace PARR.DAL.NextRunServices.Subservices
} }
/// <summary> ///// <summary>
/// Возвращает список рабочих дней в диапазоне, исключая выходные и праздники. ///// Возвращает список рабочих дней в диапазоне, исключая выходные и праздники.
/// </summary> ///// </summary>
/// <param name="start"></param> ///// <param name="start"></param>
/// <param name="end"></param> ///// <param name="end"></param>
/// <param name="excludeWeekends">Исключить выходные и праздники</param> ///// <param name="excludeWeekends">Исключить выходные и праздники</param>
/// <returns></returns> ///// <returns></returns>
public async Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends) //public async Task<List<DateOnly>> GetWorkDaysAsync(DateOnly start, DateOnly end, bool excludeWeekends)
{ //{
// Получаем список выходных/праздничных дней // // Получаем список выходных/праздничных дней
var weekends = new HashSet<DateOnly>(); // var weekends = new HashSet<DateOnly>();
if (excludeWeekends) // if (excludeWeekends)
weekends = await GetWeekendsAsync(start, end); // weekends = await GetWeekendsAsync(start, end);
var result = new List<DateOnly>(); // var result = new List<DateOnly>();
var date = start; // var date = start;
while (date <= end) // while (date <= end)
{ // {
var dayOfWeek = date.DayOfWeek; // var dayOfWeek = date.DayOfWeek;
if (!weekends.Contains(date)) // if (!weekends.Contains(date))
{ // {
result.Add(date); // result.Add(date);
} // }
date = date.AddDays(1); // date = date.AddDays(1);
} // }
logger.LogDebug("Найдено рабочих дней: {Count}", result.Count); // logger.LogDebug("Найдено рабочих дней: {Count}", result.Count);
foreach (var workDay in result) // foreach (var workDay in result)
logger.LogDebug("Рабочий день: {workDay}", workDay); // 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); 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>(); var weekends = new HashSet<DateOnly>();
if (excludeWeekends) if (excludeWeekends)
weekends = await GetWeekendsTESTAsync(start, end, referenceDate); weekends = await GetWeekendsV2Async(start, end, referenceDate);
var result = new List<DateOnly>(); var result = new List<DateOnly>();
var date = start; var date = start;

View File

@@ -6,12 +6,12 @@ namespace PARR.Test.NextRun
{ {
internal class NextRunTest internal class NextRunTest
{ {
private readonly ITemplateDistributor templateDistributor; //private readonly ITemplateDistributor templateDistributor;
private readonly INextRunService nextRunService; private readonly INextRunService nextRunService;
public NextRunTest(ITemplateDistributor templateDistributor, INextRunService nextRunService) public NextRunTest(/*ITemplateDistributor templateDistributor, */INextRunService nextRunService)
{ {
this.templateDistributor = templateDistributor; //this.templateDistributor = templateDistributor;
this.nextRunService = nextRunService; this.nextRunService = nextRunService;
} }
@@ -21,7 +21,7 @@ namespace PARR.Test.NextRun
public async Task Test() public async Task Test()
{ {
// GetWorkDaysTESTAsync // GetWorkDaysTESTAsync
var aaa = await templateDistributor.GetWorkDaysTESTAsync(GetDateStart(), GetDateStart().AddDays(periodDays), true, referenceDate); //var aaa = await templateDistributor.GetWorkDaysTESTAsync(GetDateStart(), GetDateStart().AddDays(periodDays), true, referenceDate);
//await DistributeTemplatesAsync(); //await DistributeTemplatesAsync();
//await GetValidNextRunForTemplateAsync(); //await GetValidNextRunForTemplateAsync();