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