feat(templateDistributor): изменена логика распределения шаблонов в периоде - отдельно распределяем активные и неактивные

This commit is contained in:
Mikhail Kuznetsov
2024-08-23 16:18:24 +10:00
parent 7ffc5f10e1
commit 2f46cc4b53

View File

@@ -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>