feat(bll): CalnedarService при подготовке списка рабочих суток учитывает разницу начала суток между UTC и МСК

This commit is contained in:
Mikhail Kuznetsov
2024-08-20 14:10:13 +10:00
parent 5f409706cb
commit 9df27140e2
3 changed files with 28 additions and 19 deletions

View File

@@ -27,13 +27,8 @@ namespace PARR.BLL.Services.Implementations
case (DistributionPeriodTypeEnum.Year): case (DistributionPeriodTypeEnum.Year):
return startPeriod.AddYears(ParseInt(distributionPeriod)).AddDays(-1); return startPeriod.AddYears(ParseInt(distributionPeriod)).AddDays(-1);
//case (DistributionPeriodTypeEnum.TimeSpan):
// var timeSpan = ParseTimeSpan(distributionPeriod);
// return timeSpan.Days > 0 ? startPeriod.AddDays();
} }
//return startPeriod.AddDays(duration.Days).AddDays(-1);
return startPeriod; return startPeriod;
} }
@@ -65,30 +60,44 @@ namespace PARR.BLL.Services.Implementations
//} //}
//public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan duration, GetWeekendsDelegate getWeekends) /// <summary>
public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends) /// Возвращает список рабочих дней с начала периода без выходных
/// </summary>
/// <param name="startPeriod"></param>
/// <param name="refTime"></param>
/// <param name="periodType"></param>
/// <param name="distributionPeriod"></param>
/// <param name="getWeekends"></param>
/// <returns></returns>
public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeOnly refTime, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends)
{ {
var endPeriod = GetEndPeriodDate(startPeriod, periodType, distributionPeriod); var endPeriod = GetEndPeriodDate(startPeriod, periodType, distributionPeriod);
//не получилось сделать асинхронным //не получилось сделать асинхронным
var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync(); var weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync();
//Берем список дат за период
//TODO: метод получения рабочих дней, получать актуальные рабочие дни за период
//не стали добавлять праздничные и выходные дни сразу, так как повысится нагрузка на робота
// на следующий месяц будет много изменений
//временно сделаем список руками рабочих дней
var workDays = GetDatesForPeriod(startPeriod, endPeriod); var workDays = GetDatesForPeriod(startPeriod, endPeriod);
//Убираем праздники
if (weekends.Any()) if (weekends.Any())
workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList(); workDays = workDays.Where(t => weekends.Any(x => x != t)).ToList();
//Убираем числа старше 28, чтобы сравнять продолжительность с февралем
workDays.RemoveAll(t => t.Day > 28);
//Так как в базе всё храним в UTC то время с 21 часа уже соответствует следующими суткам в календаре Москвы
//просто сдвигаем на день весь список
if (refTime.Hour > 21)
return workDays.Select(wd => wd.AddDays(-1)).ToList();
//иначе просто отдаём как есть
return workDays; return workDays;
} }
/// <summary> /// <summary>
/// Временные данные пока не реализован сервис и логика /// Возвращает список дней между датами
/// </summary> /// </summary>
/// <param name="startPeriod"></param> /// <param name="startPeriod"></param>
/// <param name="EndPeriod"></param> /// <param name="EndPeriod"></param>
@@ -98,12 +107,10 @@ namespace PARR.BLL.Services.Implementations
var workDaysList = new List<DateOnly>(); var workDaysList = new List<DateOnly>();
var currentDay = startPeriod; var currentDay = startPeriod;
while (currentDay <= EndPeriod) while (currentDay <= EndPeriod)
{ {
//!!!!!!!! 29 дней, потому что в феврале 28, чтоб не париться, сделали так
if (currentDay.Day < 29)
workDaysList.Add(currentDay); workDaysList.Add(currentDay);
currentDay = currentDay.AddDays(1); currentDay = currentDay.AddDays(1);
} }

View File

@@ -10,10 +10,11 @@ namespace PARR.BLL.Services.Interfaces
/// Получить только рабочие дни за период /// Получить только рабочие дни за период
/// </summary> /// </summary>
/// <param name="startPeriod"></param> /// <param name="startPeriod"></param>
/// <param name="refTime"></param>
/// <param name="typePeriod"></param> /// <param name="typePeriod"></param>
/// <param name="distributionPeriod"></param> /// <param name="distributionPeriod"></param>
/// <param name="getWeekends"></param> /// <param name="getWeekends"></param>
/// <returns></returns> /// <returns></returns>
List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends); List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeOnly refTime, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends);
} }
} }

View File

@@ -111,6 +111,7 @@ namespace PARR.TemplateDistributor
//Готовим план распределения //Готовим план распределения
var distrPlan = GetDistributionPlan(workDays, templates.Count + existingTemplates.Count); var distrPlan = GetDistributionPlan(workDays, templates.Count + existingTemplates.Count);
var templateToDistrib = new List<Template>(); var templateToDistrib = new List<Template>();
if (existingTemplates.Count > 0) if (existingTemplates.Count > 0)
@@ -243,7 +244,7 @@ namespace PARR.TemplateDistributor
var periodType = ParseDistributionPeriodType(period!.Type); var periodType = ParseDistributionPeriodType(period!.Type);
var startPeriod = await esppScheduleTransformService.GetStartPeriodForDateAsync(appInWork.Id, appInWork.ReferenceDate, appInWork.ReferenceDate, periodType, period.Duration); var startPeriod = await esppScheduleTransformService.GetStartPeriodForDateAsync(appInWork.Id, appInWork.ReferenceDate, appInWork.ReferenceDate, periodType, period.Duration);
var result = calendarService.GetWorkDatesForPeriod(startPeriod, periodType, period.Duration, weekendDayService.GetWeekends); var result = calendarService.GetWorkDatesForPeriod(startPeriod, TimeOnly.FromDateTime(appInWork.ReferenceDate.DateTime), periodType, period.Duration, weekendDayService.GetWeekends);
result.ForEach(wd => result.ForEach(wd =>
{ {