From 9df27140e29cc1f7d014a13cb662a72f5fd4df11 Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Tue, 20 Aug 2024 14:10:13 +1000 Subject: [PATCH] =?UTF-8?q?feat(bll):=20CalnedarService=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=87=D0=B8=D1=85=20=D1=81=D1=83=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=20=20=D1=83=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BD=D0=B8=D1=86=D1=83=20=D0=BD=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=D0=BB=D0=B0=20=D1=81=D1=83=D1=82=D0=BE=D0=BA=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=B6=D0=B4=D1=83=20UTC=20=D0=B8=20=D0=9C=D0=A1=D0=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Implementations/CalendarService.cs | 41 +++++++++++-------- .../Services/Interfaces/ICalendarService.cs | 3 +- .../TemplateDistributor.cs | 3 +- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/PARR.BLL/Services/Implementations/CalendarService.cs b/PARR.BLL/Services/Implementations/CalendarService.cs index d454c201..0a57c121 100644 --- a/PARR.BLL/Services/Implementations/CalendarService.cs +++ b/PARR.BLL/Services/Implementations/CalendarService.cs @@ -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 GetWorkDatesForPeriod(DateOnly startPeriod, TimeSpan duration, GetWeekendsDelegate getWeekends) - public List GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends) + /// + /// Возвращает список рабочих дней с начала периода без выходных + /// + /// + /// + /// + /// + /// + /// + public List 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; } /// - /// Временные данные пока не реализован сервис и логика + /// Возвращает список дней между датами /// /// /// @@ -98,12 +107,10 @@ namespace PARR.BLL.Services.Implementations var workDaysList = new List(); var currentDay = startPeriod; + while (currentDay <= EndPeriod) { - //!!!!!!!! 29 дней, потому что в феврале 28, чтоб не париться, сделали так - if (currentDay.Day < 29) - workDaysList.Add(currentDay); - + workDaysList.Add(currentDay); currentDay = currentDay.AddDays(1); } diff --git a/PARR.BLL/Services/Interfaces/ICalendarService.cs b/PARR.BLL/Services/Interfaces/ICalendarService.cs index 7b51ece1..7a4fff38 100644 --- a/PARR.BLL/Services/Interfaces/ICalendarService.cs +++ b/PARR.BLL/Services/Interfaces/ICalendarService.cs @@ -10,10 +10,11 @@ namespace PARR.BLL.Services.Interfaces /// Получить только рабочие дни за период /// /// + /// /// /// /// /// - List GetWorkDatesForPeriod(DateOnly startPeriod, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends); + List GetWorkDatesForPeriod(DateOnly startPeriod, TimeOnly refTime, DistributionPeriodTypeEnum periodType, string distributionPeriod, GetWeekendsDelegate getWeekends); } } diff --git a/PARR.TemplateDistributor/TemplateDistributor.cs b/PARR.TemplateDistributor/TemplateDistributor.cs index 8f6298cf..1d8cb30b 100644 --- a/PARR.TemplateDistributor/TemplateDistributor.cs +++ b/PARR.TemplateDistributor/TemplateDistributor.cs @@ -111,6 +111,7 @@ namespace PARR.TemplateDistributor //Готовим план распределения var distrPlan = GetDistributionPlan(workDays, templates.Count + existingTemplates.Count); + var templateToDistrib = new List