feat(templateDistributor): оптимизация логики равномерного распределения при изменении периода

This commit is contained in:
Mikhail Kuznetsov
2024-07-11 17:23:52 +10:00
parent 96d0c999ab
commit 6e7d4e1fd4

View File

@@ -46,7 +46,7 @@ namespace PARR.TemplateDistributor
// сохранить в БД // сохранить в БД
//applicationInWorkId = Guid.Parse("bdfefd77-bce3-4f62-a484-5042c06f4467"); //applicationInWorkId = Guid.Parse("bdfefd77-bce3-4f62-a484-5042c06f4467");
var appInWork = await applicationsInWorkService.GetAsync(applicationInWorkId ); var appInWork = await applicationsInWorkService.GetAsync(applicationInWorkId);
// .Include(aiw => aiw.EsppSchValues) // .Include(aiw => aiw.EsppSchValues)
// .ThenInclude(esv => esv.EsppSchTypeValue) // .ThenInclude(esv => esv.EsppSchTypeValue)
// .ThenInclude(etv => etv!.DistributionPeriod) // .ThenInclude(etv => etv!.DistributionPeriod)
@@ -70,19 +70,29 @@ namespace PARR.TemplateDistributor
continue; continue;
//Обновляем сразу время при необходимости //Обновляем сразу время при необходимости
values.ForEach(t=>{ values.ForEach(t =>
{
if (t.NextRun.TimeOfDay != appInWork!.ReferenceDate.TimeOfDay) if (t.NextRun.TimeOfDay != appInWork!.ReferenceDate.TimeOfDay)
t.NextRun = new DateTimeOffset(t.NextRun.DateTime, new TimeSpan(appInWork!.ReferenceDate.Hour, appInWork!.ReferenceDate.Minute, appInWork!.ReferenceDate.Second)); //t.NextRun = new DateTimeOffset(t.NextRun.DateTime, new TimeSpan(//(appInWork!.ReferenceDate.Hour, appInWork!.ReferenceDate.Minute, appInWork!.ReferenceDate.Second));
t.NextRun = new DateTimeOffset(t.NextRun.Year, t.NextRun.Month, t.NextRun.Day,
appInWork!.ReferenceDate.Hour, appInWork!.ReferenceDate.Minute, appInWork!.ReferenceDate.Second,
new TimeSpan(0, 0, 0));
}); });
if (!await applicationsInWorkService.CommitAsync())
{
logger.LogError($"Ошибка записи изменений в БД при актуализации времени NextRun шаблонов");
return;
}
var distrTemplates = await DistributeTemplateAsync(values, applicationInWorkId, wgId); var distrTemplates = await DistributeTemplateAsync(values, applicationInWorkId, wgId);
}
// saveChanges if (distrTemplates.Any())
if (!await applicationsInWorkService.CommitAsync()) if (!await applicationsInWorkService.CommitAsync())
logger.LogError($"Ошибка записи изменений в БД при перераспределении NextRun шаблонов"); logger.LogError($"Ошибка записи изменений в БД при перераспределении NextRun шаблонов");
} }
}
public async Task<List<Template>> DistributeTemplateAsync(List<Template> templates, Guid applicationInWorkId, Guid workGroupId) public async Task<List<Template>> DistributeTemplateAsync(List<Template> templates, Guid applicationInWorkId, Guid workGroupId)
@@ -92,6 +102,7 @@ namespace PARR.TemplateDistributor
.ThenInclude(esv => esv.EsppSchTypeValue) .ThenInclude(esv => esv.EsppSchTypeValue)
.ThenInclude(etv => etv!.DistributionPeriod) .ThenInclude(etv => etv!.DistributionPeriod)
.FirstOrDefaultAsync(t => t.Id == applicationInWorkId); .FirstOrDefaultAsync(t => t.Id == applicationInWorkId);
var refDate = appInWork!.ReferenceDate; var refDate = appInWork!.ReferenceDate;
//Проверяем наличие распределения РР на период //Проверяем наличие распределения РР на период
@@ -101,6 +112,10 @@ namespace PARR.TemplateDistributor
.Include(t => t.Host) .Include(t => t.Host)
.Where(t => t.ApplicationInWorkId == applicationInWorkId && t.Host!.WorkGroupId == workGroupId) .Where(t => t.ApplicationInWorkId == applicationInWorkId && t.Host!.WorkGroupId == workGroupId)
.ToListAsync(); .ToListAsync();
//Удалим из входных шаблонов уже существующие в БД
templates.RemoveAll(t => existingTemplates.Any(et => et.Id == t.Id));
//Если распределенная РР получаем начало //Если распределенная РР получаем начало
var period = appInWork.EsppSchValues.FirstOrDefault()?.EsppSchTypeValue?.DistributionPeriod; var period = appInWork.EsppSchValues.FirstOrDefault()?.EsppSchTypeValue?.DistributionPeriod;
var periodType = ParseDistributionPeriodType(period!.Type); var periodType = ParseDistributionPeriodType(period!.Type);
@@ -115,7 +130,7 @@ namespace PARR.TemplateDistributor
if (existingTemplates.Count > 0) if (existingTemplates.Count > 0)
templateToDistrib = GetTemplatesToDistribute(ref distrPlan, existingTemplates); templateToDistrib = GetTemplatesToDistribute(ref distrPlan, existingTemplates);
templateToDistrib.AddRange(templates.Where(t=>existingTemplates.Any(et=>et.Id==t.Id)==false)); templateToDistrib.AddRange(templates);
if (!templateToDistrib.Any()) if (!templateToDistrib.Any())
return new List<Template>(); return new List<Template>();
@@ -125,6 +140,8 @@ namespace PARR.TemplateDistributor
foreach (var workDay in distrPlan) foreach (var workDay in distrPlan)
{ {
var templatesCountForCurDay = workDay.Value; var templatesCountForCurDay = workDay.Value;
if (templatesCountForCurDay < 1)
continue;
templateToDistrib.Skip(distributedTemplates).Take(templatesCountForCurDay).ToList().ForEach(t => templateToDistrib.Skip(distributedTemplates).Take(templatesCountForCurDay).ToList().ForEach(t =>
{ {
@@ -139,6 +156,8 @@ namespace PARR.TemplateDistributor
}); });
distributedTemplates += templatesCountForCurDay; distributedTemplates += templatesCountForCurDay;
distrPlan[workDay.Key] -= templatesCountForCurDay;
} }
return templateToDistrib; return templateToDistrib;
@@ -253,8 +272,10 @@ namespace PARR.TemplateDistributor
foreach (var wd in distributionPlan) foreach (var wd in distributionPlan)
{ {
var templatesInWd = templates.Where(t => DateOnly.FromDateTime(t.NextRun.DateTime) == wd.Key).ToList(); //if (wd.Value < 1)
// continue;
var templatesInWd = templates.Where(t => DateOnly.FromDateTime(t.NextRun.DateTime) == wd.Key).ToList();
var templatesToDistribute = templatesInWd.Skip(wd.Value).Take(templatesInWd.Count - wd.Value).ToList(); var templatesToDistribute = templatesInWd.Skip(wd.Value).Take(templatesInWd.Count - wd.Value).ToList();
distributionPlan[wd.Key] -= templatesInWd.Count; distributionPlan[wd.Key] -= templatesInWd.Count;
@@ -262,8 +283,12 @@ namespace PARR.TemplateDistributor
result.AddRange(templatesToDistribute); result.AddRange(templatesToDistribute);
} }
var workDays = distributionPlan.Keys.ToList();
var templateWithNextRunOut = templates.Where(t => !workDays.Contains(DateOnly.FromDateTime(t.NextRun.DateTime)));
result.AddRange(templateWithNextRunOut);
//Обнулим nextRun
result.ForEach(t => t.NextRun = DateTimeOffset.MinValue);
return result; return result;
} }