feat(templateDistributor): изменена логика распределения шаблонов в периоде - отдельно распределяем активные и неактивные
This commit is contained in:
@@ -99,8 +99,18 @@ namespace PARR.TemplateDistributor
|
|||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
//Удалим из входных шаблонов уже существующие в БД
|
//Удалим из входных шаблонов уже существующие в БД
|
||||||
//TODO: сделать селект повторяющихся шаблонов, написать их в варнинг и потом удалить
|
var duplicates = templates.Select(t => t.Id).Where(t => existingTemplates.Any(et => et.Id == t)).ToList();
|
||||||
templates.RemoveAll(t => existingTemplates.Any(et => et.Id == t.Id));
|
if (duplicates.Count > 0)
|
||||||
|
{
|
||||||
|
duplicates.ForEach(t =>
|
||||||
|
{
|
||||||
|
logger.LogInformation($"Для распределения AiW({applicationInWorkId}),workGroupId({workGroupId}) передан существующий в базе данных шаблон {t}");
|
||||||
|
});
|
||||||
|
templates.RemoveAll(t => duplicates.Any(dt => dt == t.Id));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
existingTemplates.AddRange(templates);
|
||||||
|
|
||||||
//Если распределенная РР получаем начало
|
//Если распределенная РР получаем начало
|
||||||
var period = appInWork.EsppSchValues.First()!.EsppSchTypeValue!.DistributionPeriod;
|
var period = appInWork.EsppSchValues.First()!.EsppSchTypeValue!.DistributionPeriod;
|
||||||
@@ -108,50 +118,28 @@ namespace PARR.TemplateDistributor
|
|||||||
|
|
||||||
var workDays = await GetWorkDaysAsync(appInWork);
|
var workDays = await GetWorkDaysAsync(appInWork);
|
||||||
|
|
||||||
//Готовим план распределения
|
var result = new List<Template>();
|
||||||
var distrPlan = GetDistributionPlan(workDays, templates.Count + existingTemplates.Count);
|
|
||||||
|
|
||||||
|
//распределяем РР отдельно активированные
|
||||||
var templateToDistrib = new List<Template>();
|
var activatedTemplates = existingTemplates.Where(t => t.IsActiveTemplate && t.IsActiveSchedule).ToList();
|
||||||
|
if (activatedTemplates.Count > 0)
|
||||||
if (existingTemplates.Count > 0)
|
|
||||||
{
|
{
|
||||||
templateToDistrib = GetTemplatesToDistribute(ref distrPlan, existingTemplates);
|
Distribute(ref activatedTemplates, refDate, period, periodType, workDays);
|
||||||
logger.LogInformation($"{GetType().Name}(AppInWId:{applicationInWorkId}, WorkGroup:{existingTemplates.Select(t =>t.Host!.WorkGroup!.Name).First()}) запланировал изменение даты следующего срабатывания у {templateToDistrib.Count()} существующих шаблона(ов), {existingTemplates.Count() - templateToDistrib.Count()} остались без изменений");
|
result.AddRange(activatedTemplates);
|
||||||
}
|
}
|
||||||
|
|
||||||
templateToDistrib.AddRange(templates);
|
//распределяем РР отдельно деактивированные
|
||||||
|
var deactivatedTemplates = existingTemplates.Where(t =>
|
||||||
if (!templateToDistrib.Any())
|
!t.IsActiveTemplate || !t.IsActiveSchedule || (
|
||||||
return new List<Template>();
|
!t.IsActiveTemplate && !t.IsActiveSchedule
|
||||||
|
)).ToList();
|
||||||
var distributedTemplates = 0;
|
if (deactivatedTemplates.Count > 0)
|
||||||
|
|
||||||
foreach (var workDay in distrPlan)
|
|
||||||
{
|
{
|
||||||
var templatesCountForCurDay = workDay.Value;
|
Distribute(ref deactivatedTemplates, refDate, period, periodType, workDays);
|
||||||
if (templatesCountForCurDay < 1)
|
result.AddRange(deactivatedTemplates);
|
||||||
continue;
|
|
||||||
|
|
||||||
templateToDistrib.Skip(distributedTemplates).Take(templatesCountForCurDay).ToList().ForEach(t =>
|
|
||||||
{
|
|
||||||
var nextRun = new DateTimeOffset(
|
|
||||||
workDay.Key.Year, workDay.Key.Month, workDay.Key.Day,
|
|
||||||
refDate.Hour, refDate.Minute, refDate.Second,
|
|
||||||
new TimeSpan(0, 0, 0));
|
|
||||||
if (nextRun < DateTimeOffset.UtcNow)
|
|
||||||
nextRun = esppScheduleTransformService.GetNextDateForDistributionRun(nextRun, periodType, period.Duration);
|
|
||||||
|
|
||||||
t.NextRun = nextRun;
|
|
||||||
});
|
|
||||||
|
|
||||||
distributedTemplates += templatesCountForCurDay;
|
|
||||||
|
|
||||||
distrPlan[workDay.Key] -= templatesCountForCurDay;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return templateToDistrib;
|
return result;
|
||||||
|
|
||||||
#region comments
|
#region comments
|
||||||
|
|
||||||
//var d = new Dictionary<DateOnly, List<Template>>();
|
//var d = new Dictionary<DateOnly, List<Template>>();
|
||||||
@@ -232,6 +220,45 @@ namespace PARR.TemplateDistributor
|
|||||||
return templates;
|
return templates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Distribute(ref List<Template> templates, DateTimeOffset refDate, DistributionPeriod period, DistributionPeriodTypeEnum periodType, List<DateOnly> workDays)
|
||||||
|
{
|
||||||
|
//Готовим план распределения
|
||||||
|
var distrPlan = GetDistributionPlan(workDays, templates.Count);
|
||||||
|
|
||||||
|
//Проверяем шаблоны уже распределённые, чтобы не перемещать лишний раз
|
||||||
|
var templateToDistrib = GetTemplatesToDistribute(ref distrPlan, templates);
|
||||||
|
|
||||||
|
logger.LogInformation($"{GetType().Name}(AppInWId:{templates.Select(t => t.ApplicationInWorkId).First()}, WorkGroup:{templates.Select(t => t.Host!.WorkGroup!.Name).First()}) запланировал изменение даты следующего срабатывания у {templateToDistrib.Count()} существующих шаблона(ов), {templates.Count() - templateToDistrib.Count()} остались без изменений");
|
||||||
|
|
||||||
|
if (!templateToDistrib.Any())
|
||||||
|
return;
|
||||||
|
|
||||||
|
var distributedTemplates = 0;
|
||||||
|
//Распределяем шаблоны в соответствии с планом непосредственно
|
||||||
|
foreach (var workDay in distrPlan)
|
||||||
|
{
|
||||||
|
var templatesCountForCurDay = workDay.Value;
|
||||||
|
if (templatesCountForCurDay < 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
templateToDistrib.Skip(distributedTemplates).Take(templatesCountForCurDay).ToList().ForEach(t =>
|
||||||
|
{
|
||||||
|
var nextRun = new DateTimeOffset(
|
||||||
|
workDay.Key.Year, workDay.Key.Month, workDay.Key.Day,
|
||||||
|
refDate.Hour, refDate.Minute, refDate.Second,
|
||||||
|
new TimeSpan(0, 0, 0));
|
||||||
|
if (nextRun < DateTimeOffset.UtcNow)
|
||||||
|
nextRun = esppScheduleTransformService.GetNextDateForDistributionRun(nextRun, periodType, period.Duration);
|
||||||
|
|
||||||
|
t.NextRun = nextRun;
|
||||||
|
});
|
||||||
|
|
||||||
|
distributedTemplates += templatesCountForCurDay;
|
||||||
|
|
||||||
|
distrPlan[workDay.Key] -= templatesCountForCurDay;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получить список рабочих дней из календаря и перенести прошедшие даты на следующий период по РР
|
/// Получить список рабочих дней из календаря и перенести прошедшие даты на следующий период по РР
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user