fix(dal): исправлены методы получения nextRun в сервисе EsppScheduleTransformService
This commit is contained in:
@@ -1,28 +1,34 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="InfluxDB.Client" Version="4.17.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.5">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.12" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="InfluxDB.Client" Version="4.17.0" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.5">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.12" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="7.0.4" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" />
|
||||
<ProjectReference Include="..\PARR.Common\PARR.Common.csproj" />
|
||||
<ProjectReference Include="..\PARR.Constants\PARR.Constants.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" />
|
||||
<ProjectReference Include="..\PARR.Common\PARR.Common.csproj" />
|
||||
<ProjectReference Include="..\PARR.Constants\PARR.Constants.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
|
||||
<_Parameter1>PARR.DAL.Tests</_Parameter1>
|
||||
</AssemblyAttribute>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.Common;
|
||||
using PARR.Constants;
|
||||
using PARR.DAL.Contracts;
|
||||
@@ -14,10 +13,9 @@ namespace PARR.DAL.TransformServices
|
||||
{
|
||||
private readonly IEsppSchTypeConfigService esppSchTypeConfigService;
|
||||
private readonly INextRunModifierService nextRunModifierService;
|
||||
private readonly IJobGroupService jobGroupService;
|
||||
private readonly ILogger<EsppScheduleTransformService> logger;
|
||||
|
||||
private readonly Dictionary<string, int> monthDict = new Dictionary<string, int>()
|
||||
private static readonly Dictionary<string, int> monthDict = new Dictionary<string, int>()
|
||||
{
|
||||
{ "Январь", 1 },
|
||||
{ "Февраль", 2 },
|
||||
@@ -33,7 +31,7 @@ namespace PARR.DAL.TransformServices
|
||||
{ "Декабрь", 12 }
|
||||
};
|
||||
|
||||
private readonly Dictionary<string, int> orderDict = new Dictionary<string, int>()
|
||||
private static readonly Dictionary<string, int> orderDict = new Dictionary<string, int>()
|
||||
{
|
||||
{ "Первый", 1 },
|
||||
{ "Второй", 2 },
|
||||
@@ -42,7 +40,7 @@ namespace PARR.DAL.TransformServices
|
||||
{ "Последний", 5 }
|
||||
};
|
||||
|
||||
private readonly Dictionary<string, int> dwDict = new Dictionary<string, int>()
|
||||
private static readonly Dictionary<string, int> dwDict = new Dictionary<string, int>()
|
||||
{
|
||||
{"Понедельник", 1 },
|
||||
{"Вторник", 2 },
|
||||
@@ -57,56 +55,48 @@ namespace PARR.DAL.TransformServices
|
||||
public EsppScheduleTransformService(
|
||||
ILogger<EsppScheduleTransformService> logger,
|
||||
IEsppSchTypeConfigService esppSchTypeConfigService,
|
||||
IWeekendDayService weekendDayService,
|
||||
INextRunModifierService nextRunModifierService,
|
||||
IJobGroupService jobGroupService
|
||||
INextRunModifierService nextRunModifierService
|
||||
)
|
||||
{
|
||||
this.esppSchTypeConfigService = esppSchTypeConfigService;
|
||||
this.nextRunModifierService = nextRunModifierService;
|
||||
this.jobGroupService = jobGroupService;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
|
||||
public DateTimeOffset GetNextDate(EsppScheduleDto esppSchedule, DateTimeOffset lastRun)
|
||||
public async Task<DateTimeOffset> GetNextDateAsync(Guid jobGroupId, DateTimeOffset referenceDate)
|
||||
{
|
||||
var nextRun = lastRun;
|
||||
var esppSchedule = await GetEsppScheduleAsync(jobGroupId);
|
||||
|
||||
//если больше текущего вернуть lastRun. Это и есть следующая дата
|
||||
if (lastRun > DateTimeOffset.UtcNow)
|
||||
nextRun = lastRun;
|
||||
//return lastRun;
|
||||
return GetNextDate(esppSchedule, referenceDate);
|
||||
}
|
||||
|
||||
public DateTimeOffset GetNextDate(EsppScheduleDto esppSchedule, DateTimeOffset referenceDate)
|
||||
{
|
||||
var nextRun = referenceDate;
|
||||
|
||||
switch (esppSchedule.TypeSchedule.Id)
|
||||
{
|
||||
case (int)EsppSchTypeScheduleEnum.Regularly:
|
||||
//return GetNextDateRegularly(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateRegularly(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateRegularly(esppSchedule.Values, referenceDate);
|
||||
break;
|
||||
case (int)EsppSchTypeScheduleEnum.Weekly:
|
||||
//return GetNextDateWeekly(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateWeekly(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateWeekly(esppSchedule.Values, referenceDate);
|
||||
break;
|
||||
case (int)EsppSchTypeScheduleEnum.Monthly:
|
||||
//return GetNextDateMonthly(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateMonthly(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateMonthly(esppSchedule.Values, referenceDate);
|
||||
break;
|
||||
case (int)EsppSchTypeScheduleEnum.Monthly2:
|
||||
//return GetNextDateMonthly2(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateMonthly2(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateMonthly2(esppSchedule.Values, referenceDate);
|
||||
break;
|
||||
case (int)EsppSchTypeScheduleEnum.Annually:
|
||||
//return GetNextDateAnnually(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateAnnually(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateAnnually(esppSchedule.Values, referenceDate);
|
||||
break;
|
||||
case (int)EsppSchTypeScheduleEnum.Annually2:
|
||||
//return GetNextDateAnnually2(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateAnnually2(esppSchedule.Values, lastRun);
|
||||
nextRun = GetNextDateAnnually2(esppSchedule.Values, referenceDate);
|
||||
break;
|
||||
}
|
||||
|
||||
nextRun = nextRunModifierService.GetWorkDayAsync(nextRun).GetAwaiter().GetResult();
|
||||
//возможно для автораспределения нужно nextRun = nextRunModifierService.GetWorkDayAsync(nextRun).GetAwaiter().GetResult();
|
||||
|
||||
// тут может быть 21 час по МСК, то это предыдущие сутки, нужно отнять 1 день
|
||||
if (!DateResolver.IsCurrentDayRelativeMskTime(nextRun.Hour))
|
||||
@@ -116,17 +106,17 @@ namespace PARR.DAL.TransformServices
|
||||
}
|
||||
|
||||
|
||||
private List<DateTimeOffset> GetNextSchedule(EsppScheduleDto esppSchedule, DateTimeOffset lastRun)
|
||||
private List<DateTimeOffset> GetNextSchedule(EsppScheduleDto esppSchedule, DateTimeOffset referenceDate)
|
||||
{
|
||||
// расписание на оставшееся на сегодня время. его так мало...
|
||||
lastRun = lastRun.UtcDateTime;
|
||||
referenceDate = referenceDate.UtcDateTime;
|
||||
var schedules = new List<DateTimeOffset>();
|
||||
var curTime = lastRun;
|
||||
var curTime = referenceDate;
|
||||
|
||||
//Если ещё не произошло то добавляем расписание, возможно это новое AiW и он ещё ниразу не запускался.
|
||||
//lastRun это будущее
|
||||
if (lastRun >= DateTimeOffset.UtcNow && lastRun <= DateTimeOffset.UtcNow.EndOfDay())
|
||||
schedules.Add(lastRun);
|
||||
if (referenceDate >= DateTimeOffset.UtcNow && referenceDate <= DateTimeOffset.UtcNow.EndOfDay())
|
||||
schedules.Add(referenceDate);
|
||||
|
||||
while (curTime < DateTimeOffset.UtcNow.EndOfDay())
|
||||
{
|
||||
@@ -160,38 +150,15 @@ namespace PARR.DAL.TransformServices
|
||||
}
|
||||
|
||||
|
||||
public async Task<DateTimeOffset> GetNextDateAsync(Guid jobGroupId, DateTimeOffset lastRun)
|
||||
{
|
||||
//если больше текущего вернуть lastRun. Это и есть следующая дата
|
||||
if (lastRun > DateTimeOffset.UtcNow)
|
||||
return await nextRunModifierService.GetWorkDayAsync(lastRun);
|
||||
|
||||
var jobGroup = await jobGroupService.Get().AsTracking()
|
||||
.Include(t => t.EsppSchValues)
|
||||
.ThenInclude(esv => esv.EsppSchTypeValue)
|
||||
.ThenInclude(etv => etv!.DistributionPeriod)
|
||||
.FirstOrDefaultAsync(t => t.Id == jobGroupId);
|
||||
|
||||
var esppSchedule = await GetEsppScheduleAsync(jobGroupId);
|
||||
|
||||
//if (jobGroup!.IsAutoDistributionEnabled)
|
||||
//{
|
||||
// var period = jobGroup.EsppSchValues.FirstOrDefault()?.EsppSchTypeValue?.DistributionPeriod;
|
||||
// var periodType = ParseDistributionPeriodType(period!.Type);
|
||||
|
||||
// return GetNextDateForDistributionRun(lastRun, periodType, period.Duration);
|
||||
//}
|
||||
|
||||
return GetNextDate(esppSchedule, lastRun);
|
||||
}
|
||||
|
||||
|
||||
public async Task<List<DateTimeOffset>> GetNextScheduleAsync(Guid jobGroupId, DateTimeOffset lastRun)
|
||||
|
||||
public async Task<List<DateTimeOffset>> GetNextScheduleAsync(Guid jobGroupId, DateTimeOffset referenceDate)
|
||||
{
|
||||
//TODO: тут не проверен переход через выходные дни!!! Переход не используется, так как тут не рассчитываем NextRun.
|
||||
//В общем проверить, когда будем тестировать агента, что с датами все ок
|
||||
var esppSchedule = await GetEsppScheduleAsync(jobGroupId);
|
||||
var nextSchedule = GetNextSchedule(esppSchedule, lastRun);
|
||||
var nextSchedule = GetNextSchedule(esppSchedule, referenceDate);
|
||||
|
||||
return nextSchedule;
|
||||
}
|
||||
@@ -209,8 +176,7 @@ namespace PARR.DAL.TransformServices
|
||||
return esppSchedule;
|
||||
}
|
||||
|
||||
|
||||
private DateTimeOffset GetNextDateRegularly(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
private DateTimeOffset GetNextDateRegularly(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
|
||||
{
|
||||
var regDict = new Dictionary<string, int>
|
||||
{
|
||||
@@ -233,93 +199,133 @@ namespace PARR.DAL.TransformServices
|
||||
|
||||
};
|
||||
|
||||
var regNum = regDict[values[0].Value.Value];
|
||||
|
||||
var calcDay = lastRun.AddHours(regNum);
|
||||
if (!regDict.TryGetValue(values[0].Value.Value, out int regNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
|
||||
var calcDay = referenceDate.AddHours(regNum);
|
||||
|
||||
//TODO: вот это повторяется от метода к методу
|
||||
//Если итоговая дата указывает на прошлое, то повторяем расчёт и уходим в рекурсию
|
||||
if (calcDay < DateTimeOffset.UtcNow)
|
||||
calcDay = GetNextDateRegularly(values, calcDay);
|
||||
|
||||
calcDay = GetNextDateRegularly(values, calcDay.AddHours(regNum));
|
||||
|
||||
return calcDay;
|
||||
}
|
||||
|
||||
|
||||
private DateTimeOffset GetNextDateWeekly(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
private DateTimeOffset GetNextDateWeekly(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
|
||||
{
|
||||
var dwNum = dwDict[values[0].Value.Value];
|
||||
if (!dwDict.TryGetValue(values[0].Value.Value, out int dwNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение дня недели: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
|
||||
var calcDay = new DateTimeOffset(lastRun.Year, lastRun.Month, lastRun.Day, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
if (lastRun < DateTimeOffset.UtcNow)
|
||||
calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, DateTimeOffset.UtcNow.Day, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
var calcDay = referenceDate;
|
||||
if (calcDay < DateTimeOffset.UtcNow)
|
||||
calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, DateTimeOffset.UtcNow.Day, referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset);
|
||||
|
||||
if (((int)calcDay.DayOfWeek) != dwNum)
|
||||
OffsetToDayOfWeek(dwNum, ref calcDay);
|
||||
calcDay = OffsetToDayOfWeek(dwNum, calcDay);
|
||||
|
||||
//TODO: вот это повторяется от метода к методу
|
||||
//Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию
|
||||
if (calcDay < DateTimeOffset.UtcNow)
|
||||
|
||||
calcDay = GetNextDateWeekly(values, calcDay.AddDays(7));//а вот тут что-то новенькое
|
||||
|
||||
return calcDay;
|
||||
}
|
||||
|
||||
|
||||
private DateTimeOffset GetNextDateMonthly(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
private DateTimeOffset GetNextDateMonthly(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
|
||||
{
|
||||
int.TryParse(values[0].Value.Value, out int dayNum);
|
||||
if (!int.TryParse(values[0].Value.Value, out int dayNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение дня месяца: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
|
||||
|
||||
var calcDay = new DateTimeOffset(lastRun.Year, lastRun.Month, dayNum, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
if (lastRun < DateTimeOffset.UtcNow)
|
||||
calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, dayNum, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
var calcDay = new DateTimeOffset(referenceDate.Year, referenceDate.Month, dayNum, referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset);
|
||||
if (referenceDate < DateTimeOffset.UtcNow)
|
||||
calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, dayNum, referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset);
|
||||
|
||||
//TODO: вот это повторяется от метода к методу
|
||||
//Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию
|
||||
if (calcDay < DateTimeOffset.UtcNow)
|
||||
//todo: fixme
|
||||
calcDay = GetNextDateMonthly(values, calcDay.AddMonths(1));//и вот тут что-то новенькое
|
||||
calcDay = GetNextDateMonthly(values, calcDay.AddMonths(1));
|
||||
|
||||
return calcDay;
|
||||
}
|
||||
|
||||
|
||||
private DateTimeOffset GetNextDateMonthly2(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
private DateTimeOffset GetNextDateMonthly2(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
|
||||
{
|
||||
var orderNum = orderDict[values[0].Value.Value];
|
||||
var dwNum = dwDict[values[1].Value.Value];
|
||||
if (!orderDict.TryGetValue(values[0].Value.Value, out int orderNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение порядка дня: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
|
||||
var calcDay = new DateTimeOffset(lastRun.Year, lastRun.Month, 1, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
if (lastRun < DateTimeOffset.UtcNow)
|
||||
calcDay = new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, 1, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
if (!dwDict.TryGetValue(values[1].Value.Value, out int dwNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение дня недели: {Value}", values[1].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[1].Value.Value}");
|
||||
}
|
||||
|
||||
var startDay = referenceDate < DateTimeOffset.UtcNow
|
||||
? new DateTimeOffset(DateTimeOffset.UtcNow.Year, DateTimeOffset.UtcNow.Month, 1, referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset)
|
||||
: new DateTimeOffset(referenceDate.Year, referenceDate.Month, 1, referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset);
|
||||
|
||||
List<DateTimeOffset> daysList = FindAllDaysInMonth(dwNum, ref calcDay);
|
||||
var daysList = FindAllDaysInMonth(dwNum, startDay);
|
||||
|
||||
if (orderNum == 5)//5-последний
|
||||
DateTimeOffset calcDay;
|
||||
if (orderNum == 5) // Последний
|
||||
{
|
||||
calcDay = daysList.Last();
|
||||
}
|
||||
else
|
||||
calcDay = daysList[orderNum - 1];
|
||||
{
|
||||
if (orderNum > daysList.Count)
|
||||
{
|
||||
logger.LogError("Запрошенный порядковый день недели ({OrderNum}) не существует в месяце {Month}/{Year}. Найдено только {Count} дней.", orderNum, startDay.Month, startDay.Year, daysList.Count);
|
||||
throw new InvalidOperationException($"Запрошенный порядковый день недели ({orderNum}) не существует в месяце {startDay.Month}/{startDay.Year}. Найдено только {daysList.Count} дней.");
|
||||
}
|
||||
else
|
||||
calcDay = daysList[orderNum - 1];
|
||||
}
|
||||
|
||||
//TODO: вот это повторяется от метода к методу
|
||||
//Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию
|
||||
if (calcDay < DateTimeOffset.UtcNow)
|
||||
calcDay = GetNextDateMonthly2(values, calcDay.AddMonths(1));
|
||||
// Если дата <= текущей, переходим на следующий месяц
|
||||
if (calcDay <= DateTimeOffset.UtcNow)
|
||||
return GetNextDateMonthly2(values, startDay.AddMonths(1));
|
||||
|
||||
return calcDay;
|
||||
}
|
||||
|
||||
|
||||
private DateTimeOffset GetNextDateAnnually(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
|
||||
private DateTimeOffset GetNextDateAnnually(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
|
||||
{
|
||||
var monthNum = monthDict[values[0].Value.Value];
|
||||
int.TryParse(values[1].Value.Value, out int dayNum);
|
||||
|
||||
var calcDay = new DateTimeOffset(lastRun.Year + 1, monthNum, dayNum, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
if (!monthDict.TryGetValue(values[0].Value.Value, out int monthNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение номера месяца: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
|
||||
if (!int.TryParse(values[1].Value.Value, out int dayNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение дня месяца: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
|
||||
var year = (referenceDate.Year < DateTimeOffset.UtcNow.Year) ? DateTimeOffset.UtcNow.Year : referenceDate.Year;
|
||||
|
||||
var calcDay = new DateTimeOffset(
|
||||
year, monthNum, dayNum,
|
||||
referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset);
|
||||
|
||||
//TODO: вот это повторяется от метода к методу
|
||||
//Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию
|
||||
@@ -330,7 +336,7 @@ namespace PARR.DAL.TransformServices
|
||||
}
|
||||
|
||||
|
||||
private DateTimeOffset GetNextDateAnnually2(List<EsppScheduleValDto> values, DateTimeOffset lastRun)
|
||||
private DateTimeOffset GetNextDateAnnually2(List<EsppScheduleValDto> values, DateTimeOffset referenceDate)
|
||||
{
|
||||
var monthADict = new Dictionary<string, int>
|
||||
{
|
||||
@@ -348,33 +354,52 @@ namespace PARR.DAL.TransformServices
|
||||
{ "Декабря", 12 }
|
||||
};
|
||||
|
||||
var monthNum = monthADict[values[2].Value.Value];
|
||||
var orderNum = orderDict[values[0].Value.Value];
|
||||
var dwNum = dwDict[values[1].Value.Value];
|
||||
if (!monthADict.TryGetValue(values[2].Value.Value, out int monthNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение номера месяца: {Value}", values[2].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[2].Value.Value}");
|
||||
}
|
||||
if (!orderDict.TryGetValue(values[0].Value.Value, out int orderNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение порядка дня: {Value}", values[0].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[0].Value.Value}");
|
||||
}
|
||||
if (!dwDict.TryGetValue(values[1].Value.Value, out int dwNum))
|
||||
{
|
||||
logger.LogError("Неизвестное значение дня недели: {Value}", values[1].Value.Value);
|
||||
throw new ArgumentException($"Неизвестное значение: {values[1].Value.Value}");
|
||||
}
|
||||
|
||||
var calcDay = new DateTimeOffset(lastRun.Year + 1, monthNum, 1, lastRun.Hour, lastRun.Minute, lastRun.Second, lastRun.Offset);
|
||||
var year = (referenceDate.Year < DateTimeOffset.UtcNow.Year) ? DateTimeOffset.UtcNow.Year : referenceDate.Year;
|
||||
|
||||
List<DateTimeOffset> daysList = FindAllDaysInMonth(dwNum, ref calcDay);
|
||||
if (year == DateTimeOffset.UtcNow.Year && referenceDate.Month < DateTimeOffset.UtcNow.Month)
|
||||
year += 1;
|
||||
|
||||
var calcDay = new DateTimeOffset(
|
||||
year, monthNum, 1,
|
||||
referenceDate.Hour, referenceDate.Minute, referenceDate.Second, referenceDate.Offset);
|
||||
|
||||
List<DateTimeOffset> daysList = FindAllDaysInMonth(dwNum, calcDay);
|
||||
|
||||
if (orderNum == 5)//5-последний
|
||||
calcDay = daysList.Last();
|
||||
else
|
||||
calcDay = daysList[orderNum];
|
||||
calcDay = daysList[orderNum - 1];
|
||||
|
||||
//TODO: вот это повторяется от метода к методу
|
||||
//Если итоговая дата указывает на прошлое, то повторяем расчёт и ухоим в рекурсию
|
||||
if (calcDay < DateTimeOffset.UtcNow)
|
||||
//calcDay = GetNextDateAnnually2(values, calcDay);
|
||||
calcDay = GetNextDateAnnually2(values, calcDay.AddYears(1));
|
||||
|
||||
return calcDay;
|
||||
}
|
||||
|
||||
|
||||
private List<DateTimeOffset> FindAllDaysInMonth(int dwNum, ref DateTimeOffset calcDay)
|
||||
private List<DateTimeOffset> FindAllDaysInMonth(int dwNum, DateTimeOffset startDay)
|
||||
{
|
||||
var calcDay = startDay;
|
||||
if (((int)calcDay.DayOfWeek) != dwNum)
|
||||
OffsetToDayOfWeek(dwNum, ref calcDay);
|
||||
calcDay = OffsetToDayOfWeek(dwNum, calcDay);
|
||||
|
||||
var daysList = new List<DateTimeOffset>();
|
||||
var monthNum = calcDay.Month;
|
||||
@@ -388,14 +413,14 @@ namespace PARR.DAL.TransformServices
|
||||
}
|
||||
|
||||
|
||||
private void OffsetToDayOfWeek(int dwNum, ref DateTimeOffset calcDay)
|
||||
private DateTimeOffset OffsetToDayOfWeek(int dwNum, DateTimeOffset calcDay)
|
||||
{
|
||||
var daysOffset = dwNum - ((int)calcDay.DayOfWeek);
|
||||
|
||||
if (daysOffset < 0)
|
||||
daysOffset = 7 + daysOffset;
|
||||
|
||||
calcDay = calcDay.AddDays(daysOffset);
|
||||
return calcDay.AddDays(daysOffset);
|
||||
}
|
||||
|
||||
|
||||
@@ -406,15 +431,12 @@ namespace PARR.DAL.TransformServices
|
||||
switch (periodType)
|
||||
{
|
||||
case (DistributionPeriodTypeEnum.Day):
|
||||
//return lastRun.AddDays(ParseInt(distributionPeriod));
|
||||
nextRun = lastRun.AddDays(ParseInt(distributionPeriod));
|
||||
break;
|
||||
case (DistributionPeriodTypeEnum.Month):
|
||||
//return lastRun.AddMonths(ParseInt(distributionPeriod));
|
||||
nextRun = lastRun.AddMonths(ParseInt(distributionPeriod));
|
||||
break;
|
||||
case (DistributionPeriodTypeEnum.Year):
|
||||
//return lastRun.AddYears(ParseInt(distributionPeriod));
|
||||
nextRun = lastRun.AddYears(ParseInt(distributionPeriod));
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user