feat(templateDistributor): оптимизация логики равномерного распределения при изменении периода
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user