feat(templateDistributor): Изменен метод распределения РР по периоду(DistributeTemplateAsync), EsppScheduleTransformService.GetNextDateAsync теперь проверяет метод распределения РР и возвращает нужную дату

This commit is contained in:
Mikhail Kuznetsov
2024-07-11 11:32:14 +10:00
parent aa555944ae
commit 514110dba0
2 changed files with 259 additions and 151 deletions

View File

@@ -3,7 +3,6 @@ using PARR.Constants;
using PARR.DAL.Contracts;
using PARR.DAL.DomainModels;
using PARR.DAL.Extensions;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
namespace PARR.DAL.TransformServices
@@ -135,8 +134,18 @@ namespace PARR.DAL.TransformServices
public async Task<DateTimeOffset> GetNextDateAsync(Guid applicationInWorkId, DateTimeOffset lastRun)
{
var appInWork = await applicationsInWorkService.GetAsync(applicationInWorkId);
var esppSchedule = await GetEsppScheduleAsync(applicationInWorkId);
if (appInWork!.IsAutoDistributionEnabled)
{
var period = esppSchedule!.Values.FirstOrDefault()!.Value!.DistributionPeriod;
var periodType = ParseDistributionPeriodType(period!.Type);
return GetNextDateForDistributionRun(lastRun, periodType, period.Duration);
}
return GetNextDate(esppSchedule, lastRun);
}
@@ -346,23 +355,46 @@ namespace PARR.DAL.TransformServices
return lastRun.AddYears(ParseInt(distributionPeriod));
}
//return startPeriod.AddDays(duration.Days).AddDays(-1);
return lastRun;
}
public async Task<DateOnly> GetStartPeriodForDateAsync(Guid applicationInWorkId, DateTimeOffset date, DateTimeOffset refrenceDate, DistributionPeriodTypeEnum periodType, string distributionPeriod)
private DateTimeOffset GetPrevDateForDistributionRun(DateTimeOffset lastRun, DistributionPeriodTypeEnum periodType, string distributionPeriod)
{
switch (periodType)
{
case (DistributionPeriodTypeEnum.Day):
return lastRun.AddDays(-ParseInt(distributionPeriod));
case (DistributionPeriodTypeEnum.Month):
return lastRun.AddMonths(-ParseInt(distributionPeriod));
case (DistributionPeriodTypeEnum.Year):
return lastRun.AddYears(-ParseInt(distributionPeriod));
}
return lastRun;
}
public async Task<DateOnly> GetStartPeriodForDateAsync(Guid applicationInWorkId, DateTimeOffset date, DateTimeOffset referenceDate, DistributionPeriodTypeEnum periodType, string distributionPeriod)
{
var esppSchedule = await GetEsppScheduleAsync(applicationInWorkId);
var currentStartPeriod = refrenceDate;
var currentEndPeriod = GetNextDateForDistributionRun(currentStartPeriod,periodType,distributionPeriod);
var currentStartPeriod = referenceDate;
var currentEndPeriod = GetNextDateForDistributionRun(currentStartPeriod, periodType, distributionPeriod);
while (!(date>=currentStartPeriod && date< currentEndPeriod))
while (!(date >= currentStartPeriod && date < currentEndPeriod))
{
currentStartPeriod = currentEndPeriod;
currentEndPeriod = GetNextDateForDistributionRun(currentStartPeriod, periodType, distributionPeriod);
if (date > currentEndPeriod)
{
currentStartPeriod = currentEndPeriod;
currentEndPeriod = GetNextDateForDistributionRun(currentStartPeriod, periodType, distributionPeriod);
}
else
{
currentEndPeriod = currentStartPeriod;
currentStartPeriod = GetPrevDateForDistributionRun(currentStartPeriod, periodType, distributionPeriod);
}
}
return DateOnly.FromDateTime(currentStartPeriod.DateTime);
@@ -381,5 +413,12 @@ namespace PARR.DAL.TransformServices
return 0;
}
}
private DistributionPeriodTypeEnum ParseDistributionPeriodType(string value)
{
var result = (DistributionPeriodTypeEnum)Enum.Parse(typeof(DistributionPeriodTypeEnum), value);
return result;
}
}
}