feat(bll): CalnedarService при подготовке списка рабочих суток учитывает разницу начала суток между UTC и МСК
This commit is contained in:
@@ -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, чтоб не париться, сделали так
|
workDaysList.Add(currentDay);
|
||||||
if (currentDay.Day < 29)
|
|
||||||
workDaysList.Add(currentDay);
|
|
||||||
|
|
||||||
currentDay = currentDay.AddDays(1);
|
currentDay = currentDay.AddDays(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 =>
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user