feat(bll): CalnedarService при подготовке списка рабочих суток учитывает разницу начала суток между UTC и МСК
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user