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):
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;
}
@@ -65,30 +60,44 @@ namespace PARR.BLL.Services.Implementations
//}
//public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan duration, GetWeekendsDelegate getWeekends)
public List<DateOnly> GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends)
/// <summary>
/// Возвращает список рабочих дней с начала периода без выходных
/// </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 weekends = getWeekends.Invoke(startPeriod, endPeriod).ToList(); //.ToListAsync();
//TODO: метод получения рабочих дней, получать актуальные рабочие дни за период
//не стали добавлять праздничные и выходные дни сразу, так как повысится нагрузка на робота
// на следующий месяц будет много изменений
//временно сделаем список руками рабочих дней
//Берем список дат за период
var workDays = GetDatesForPeriod(startPeriod, endPeriod);
//Убираем праздники
if (weekends.Any())
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;
}
/// <summary>
/// Временные данные пока не реализован сервис и логика
/// Возвращает список дней между датами
/// </summary>
/// <param name="startPeriod"></param>
/// <param name="EndPeriod"></param>
@@ -98,12 +107,10 @@ namespace PARR.BLL.Services.Implementations
var workDaysList = new List<DateOnly>();
var currentDay = startPeriod;
while (currentDay <= EndPeriod)
{
//!!!!!!!! 29 дней, потому что в феврале 28, чтоб не париться, сделали так
if (currentDay.Day < 29)
workDaysList.Add(currentDay);
workDaysList.Add(currentDay);
currentDay = currentDay.AddDays(1);
}