diff --git a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs index d33890ef..dcbf24d2 100644 --- a/PARR.DAL/TransformServices/EsppScheduleTransformService.cs +++ b/PARR.DAL/TransformServices/EsppScheduleTransformService.cs @@ -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 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 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 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; + } } } diff --git a/PARR.TemplateDistributor/TemplateDistributor.cs b/PARR.TemplateDistributor/TemplateDistributor.cs index 55b1d5f2..536a8d99 100644 --- a/PARR.TemplateDistributor/TemplateDistributor.cs +++ b/PARR.TemplateDistributor/TemplateDistributor.cs @@ -46,11 +46,11 @@ namespace PARR.TemplateDistributor // сохранить в БД //applicationInWorkId = Guid.Parse("bdfefd77-bce3-4f62-a484-5042c06f4467"); - var appInWork = await applicationsInWorkService.Get() - .Include(aiw => aiw.EsppSchValues) - .ThenInclude(esv => esv.EsppSchTypeValue) - .ThenInclude(etv => etv!.DistributionPeriod) - .FirstOrDefaultAsync(t => t.Id == applicationInWorkId); + //var appInWork = await applicationsInWorkService.Get() + // .Include(aiw => aiw.EsppSchValues) + // .ThenInclude(esv => esv.EsppSchTypeValue) + // .ThenInclude(etv => etv!.DistributionPeriod) + // .FirstOrDefaultAsync(t => t.Id == applicationInWorkId); var templates = await templateService.Get() .Include(t => t.Host) @@ -59,23 +59,15 @@ namespace PARR.TemplateDistributor .ToListAsync(); - //var refDate = appInWork!.ReferenceDate; - //var period = appInWork.EsppSchValues.FirstOrDefault()?.EsppSchTypeValue?.DistributionPeriod; - - //DistributionPeriodTypeEnum periodType = (DistributionPeriodTypeEnum)Enum.Parse(typeof(DistributionPeriodTypeEnum), period!.Type); - - //var workGroupsWithTemplates = templates.GroupBy(t => new { t.Host!.WorkGroupId, t.NextRun}); var workGroupsWithTemplates = templates.GroupBy(t => t.Host!.WorkGroupId); - //var startPeriod = await esppScheduleTransformService.GetStartPeriodForDateAsync(applicationInWorkId, DateTimeOffset.UtcNow/*.AddDays(45)*/, refDate, periodType, period.Duration); - //var workdays = calendarService.GetWorkDatesForPeriod(startPeriod, periodType, period.Duration, weekendDayService.GetWeekends); - //var templatePerWorkDay = (int)Math.Ceiling((double)templates.Count() / workdays.Count());// - - - foreach (var item in workGroupsWithTemplates) + foreach (var workGroupWithTemplates in workGroupsWithTemplates) { - var wgId = item.Key ?? Guid.NewGuid();//TODO сделать правильно - var values = item.ToList(); + var wgId = workGroupWithTemplates.Key ?? Guid.NewGuid();//TODO сделать правильно + var values = workGroupWithTemplates.ToList(); + + if (!values.Any()) + continue; var distrTemplates = await DistributeTemplateAsync(values, applicationInWorkId, wgId); } @@ -86,153 +78,132 @@ namespace PARR.TemplateDistributor } - public async Task> DistributeTemplateAsync(List