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");
var appInWork = await applicationsInWorkService.GetAsync(applicationInWorkId );
var appInWork = await applicationsInWorkService.GetAsync(applicationInWorkId);
// .Include(aiw => aiw.EsppSchValues)
// .ThenInclude(esv => esv.EsppSchTypeValue)
// .ThenInclude(etv => etv!.DistributionPeriod)
@@ -70,18 +70,28 @@ namespace PARR.TemplateDistributor
continue;
//Обновляем сразу время при необходимости
values.ForEach(t=>{
values.ForEach(t =>
{
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);
}
// saveChanges
if (!await applicationsInWorkService.CommitAsync())
logger.LogError($"Ошибка записи изменений в БД при перераспределении NextRun шаблонов");
if (distrTemplates.Any())
if (!await applicationsInWorkService.CommitAsync())
logger.LogError($"Ошибка записи изменений в БД при перераспределении NextRun шаблонов");
}
}
@@ -92,6 +102,7 @@ namespace PARR.TemplateDistributor
.ThenInclude(esv => esv.EsppSchTypeValue)
.ThenInclude(etv => etv!.DistributionPeriod)
.FirstOrDefaultAsync(t => t.Id == applicationInWorkId);
var refDate = appInWork!.ReferenceDate;
//Проверяем наличие распределения РР на период
@@ -101,6 +112,10 @@ namespace PARR.TemplateDistributor
.Include(t => t.Host)
.Where(t => t.ApplicationInWorkId == applicationInWorkId && t.Host!.WorkGroupId == workGroupId)
.ToListAsync();
//Удалим из входных шаблонов уже существующие в БД
templates.RemoveAll(t => existingTemplates.Any(et => et.Id == t.Id));
//Если распределенная РР получаем начало
var period = appInWork.EsppSchValues.FirstOrDefault()?.EsppSchTypeValue?.DistributionPeriod;
var periodType = ParseDistributionPeriodType(period!.Type);
@@ -115,7 +130,7 @@ namespace PARR.TemplateDistributor
if (existingTemplates.Count > 0)
templateToDistrib = GetTemplatesToDistribute(ref distrPlan, existingTemplates);
templateToDistrib.AddRange(templates.Where(t=>existingTemplates.Any(et=>et.Id==t.Id)==false));
templateToDistrib.AddRange(templates);
if (!templateToDistrib.Any())
return new List<Template>();
@@ -125,6 +140,8 @@ namespace PARR.TemplateDistributor
foreach (var workDay in distrPlan)
{
var templatesCountForCurDay = workDay.Value;
if (templatesCountForCurDay < 1)
continue;
templateToDistrib.Skip(distributedTemplates).Take(templatesCountForCurDay).ToList().ForEach(t =>
{
@@ -139,6 +156,8 @@ namespace PARR.TemplateDistributor
});
distributedTemplates += templatesCountForCurDay;
distrPlan[workDay.Key] -= templatesCountForCurDay;
}
return templateToDistrib;
@@ -253,8 +272,10 @@ namespace PARR.TemplateDistributor
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();
distributionPlan[wd.Key] -= templatesInWd.Count;
@@ -262,8 +283,12 @@ namespace PARR.TemplateDistributor
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;
}