2024-09-19 13:51:44 +10:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
using PARR.Common;
|
|
|
|
|
|
using PARR.DAL.Contracts;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces;
|
2024-08-06 10:52:27 +10:00
|
|
|
|
|
|
|
|
|
|
namespace PARR.DAL.TransformServices
|
|
|
|
|
|
{
|
|
|
|
|
|
internal class NextRunModifierService : INextRunModifierService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly SettingsFromDb settingsFromDb;
|
2024-09-19 13:51:44 +10:00
|
|
|
|
private readonly ILogger<NextRunModifierService> logger;
|
|
|
|
|
|
private readonly IWeekendDayService weekendDayService;
|
2024-08-06 10:52:27 +10:00
|
|
|
|
|
2024-09-19 13:51:44 +10:00
|
|
|
|
public NextRunModifierService(
|
|
|
|
|
|
SettingsFromDb settingsFromDb,
|
|
|
|
|
|
ILogger<NextRunModifierService> logger,
|
|
|
|
|
|
IWeekendDayService weekendDayService
|
|
|
|
|
|
)
|
2024-08-06 10:52:27 +10:00
|
|
|
|
{
|
|
|
|
|
|
this.settingsFromDb = settingsFromDb;
|
2024-09-19 13:51:44 +10:00
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
this.weekendDayService = weekendDayService;
|
2024-08-06 10:52:27 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public DateTimeOffset GetNextRunByAccountRobotTimeZone(DateTimeOffset nextRun)
|
|
|
|
|
|
{
|
|
|
|
|
|
return nextRun.AddHours(settingsFromDb.EsppRobotAccountTimeZoneHour);
|
|
|
|
|
|
}
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
|
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
//public async Task<DateTimeOffset> GetWorkDayAsync(DateTimeOffset nextRun)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// // получаем день относительно часового пояса МСК
|
|
|
|
|
|
// var date = DateOnly.FromDateTime(DateResolver.IsCurrentDayRelativeMskTime(nextRun) ? nextRun.Date : nextRun.Date.AddDays(1));
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// if (await weekendDayService.IsWorkDayAsync(date, true))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// //текущий nextRun рабочий день, возвращаем его
|
|
|
|
|
|
// return nextRun;
|
|
|
|
|
|
// }
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// // ищем следующий рабочий день, максимум 20 итераций, если за их кол-во не нашли рабочий, берём последний не рабочий
|
|
|
|
|
|
// int count = 20;
|
|
|
|
|
|
// while (count > 0)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// date = date.AddDays(1);
|
|
|
|
|
|
// var isWorkDay = await weekendDayService.IsWorkDayAsync(date, true);
|
|
|
|
|
|
// if (isWorkDay)
|
|
|
|
|
|
// break; // это рабочий день, выбираем его
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// count--;
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// if (!isWorkDay && count == 0)
|
|
|
|
|
|
// logger.LogWarning($"Не нашли рабочий день за 20 итераций, взяли последний нерабочий {date}");
|
|
|
|
|
|
// }
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// // смотрим, если смещали из-за пояса МСК на день вперед, вычитаем этот день назад
|
|
|
|
|
|
// if (!DateResolver.IsCurrentDayRelativeMskTime(nextRun))
|
|
|
|
|
|
// date = date.AddDays(-1);
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// // считаем новый NextRun
|
|
|
|
|
|
// var dayCount = date.DayNumber - DateOnly.FromDateTime(nextRun.Date).DayNumber;
|
2024-09-19 13:51:44 +10:00
|
|
|
|
|
2026-01-22 11:46:05 +10:00
|
|
|
|
// return nextRun.AddDays(dayCount);
|
|
|
|
|
|
//}
|
2024-08-06 10:52:27 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|