fix(dal): EsppScheduleTransformService на входе делаем смещение в зону МСК, чтобы для шаблонов, у которых расписание считается по дням недели и время старта установлено в промежутке 21-0 гринвича, в которое ещё вчера относительно нормальных часовых поясов, расчёт проходит неверно

This commit is contained in:
Mikhail Kuznetsov
2025-11-28 12:35:18 +10:00
parent 5f84ccf4b8
commit 3ec052a86d
3 changed files with 105 additions and 143 deletions

View File

@@ -1,5 +1,4 @@
using Microsoft.Extensions.Logging;
using PARR.Common;
using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainModels;
@@ -73,33 +72,40 @@ namespace PARR.DAL.TransformServices
{
var nextRun = referenceDate;
//---------
// Для рассчета по МСК времени, потому что в ЮТС может быть еще ВСК, а по МСК это уже ПНД
var offsetReferenceDate = referenceDate.ToOffset(new TimeSpan(3, 0, 0));
//---------
switch (esppSchedule.TypeSchedule.Id)
{
case (int)EsppSchTypeScheduleEnum.Regularly:
nextRun = GetNextDateRegularly(esppSchedule.Values, referenceDate);
nextRun = GetNextDateRegularly(esppSchedule.Values, offsetReferenceDate);
break;
case (int)EsppSchTypeScheduleEnum.Weekly:
nextRun = GetNextDateWeekly(esppSchedule.Values, referenceDate);
nextRun = GetNextDateWeekly(esppSchedule.Values, offsetReferenceDate);
break;
case (int)EsppSchTypeScheduleEnum.Monthly:
nextRun = GetNextDateMonthly(esppSchedule.Values, referenceDate);
nextRun = GetNextDateMonthly(esppSchedule.Values, offsetReferenceDate);
break;
case (int)EsppSchTypeScheduleEnum.Monthly2:
nextRun = GetNextDateMonthly2(esppSchedule.Values, referenceDate);
nextRun = GetNextDateMonthly2(esppSchedule.Values, offsetReferenceDate);
break;
case (int)EsppSchTypeScheduleEnum.Annually:
nextRun = GetNextDateAnnually(esppSchedule.Values, referenceDate);
nextRun = GetNextDateAnnually(esppSchedule.Values, offsetReferenceDate);
break;
case (int)EsppSchTypeScheduleEnum.Annually2:
nextRun = GetNextDateAnnually2(esppSchedule.Values, referenceDate);
nextRun = GetNextDateAnnually2(esppSchedule.Values, offsetReferenceDate);
break;
}
// Возвращаем обратно в ЮТС
nextRun = nextRun.ToOffset(TimeSpan.Zero);
//возможно для автораспределения нужно nextRun = nextRunModifierService.GetWorkDayAsync(nextRun).GetAwaiter().GetResult();
// тут может быть 21 час по МСК, то это предыдущие сутки, нужно отнять 1 день
if (!DateResolver.IsCurrentDayRelativeMskTime(nextRun.Hour))
nextRun = nextRun.AddDays(-1);
//if (!DateResolver.IsCurrentDayRelativeMskTime(nextRun.Hour))
// nextRun = nextRun.AddDays(-1);
return nextRun;
}
@@ -196,7 +202,7 @@ namespace PARR.DAL.TransformServices
{"Каждые 1,5 года", 13140},
{"Каждые 3 года", 26280},
};
};
if (!regDict.TryGetValue(values[0].Value.Value, out int regNum))
@@ -206,8 +212,6 @@ namespace PARR.DAL.TransformServices
}
var calcDay = referenceDate;
if (calcDay < DateTimeOffset.UtcNow)
calcDay = calcDay.AddHours(regNum);
//TODO: вот это повторяется от метода к методу
//Если итоговая дата указывает на прошлое, то повторяем расчёт и уходим в рекурсию