feat(generatorTemplates): переделал логику генерации. Группировка по РГ. Рассчет nextRun через ITemplateDistributor

This commit is contained in:
Mikhail Trubnikov
2024-07-03 12:01:46 +10:00
parent ff58a21cc5
commit f8bd15cd6f
2 changed files with 99 additions and 19 deletions

View File

@@ -7,6 +7,7 @@ using PARR.DAL.Contracts;
using PARR.DAL.Extensions;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces;
using PARR.TemplateDistributor;
using System.Text.Json;
namespace PARR.GeneratorTemplates.Services
@@ -19,6 +20,7 @@ namespace PARR.GeneratorTemplates.Services
private readonly SettingsFromDb settingsFromDb;
private readonly IRobotConfigurationService robotConfigurationService;
private readonly IApplicationsInWorkService applicationsInWorkService;
private readonly ITemplateDistributor templateDistributor;
public TemplateManager(
ITemplateService templateService,
@@ -26,7 +28,8 @@ namespace PARR.GeneratorTemplates.Services
ILogger<TemplateManager> logger,
SettingsFromDb settingsFromDb,
IRobotConfigurationService robotConfigurationService,
IApplicationsInWorkService applicationsInWorkService
IApplicationsInWorkService applicationsInWorkService,
ITemplateDistributor templateDistributor
)
{
this.templateService = templateService;
@@ -35,6 +38,7 @@ namespace PARR.GeneratorTemplates.Services
this.settingsFromDb = settingsFromDb;
this.robotConfigurationService = robotConfigurationService;
this.applicationsInWorkService = applicationsInWorkService;
this.templateDistributor = templateDistributor;
}
public async Task CreateTemplates(GeneratorTemplateMq query)
@@ -95,7 +99,85 @@ namespace PARR.GeneratorTemplates.Services
}
//Создаем шаблоны
// хосты группируем по РГ, чтоб потом распределить/рассчитать NextRun
var groupingHostByWg = hosts.GroupBy(t => t.WorkGroupId);
foreach (var group in groupingHostByWg)
{
var groupingHosts = group.ToList();
var templates = CreateQueryTemplates(groupingHosts, query);
//заполняем NextRun
templates = await templateDistributor.DistributeTemplateAsync(templates, appInWorkWg.Id);
// сохраняем
foreach (var template in templates)
{
if (!await templateService.CreateAsync(template) || !await templateService.CommitAsync())
{
logger.LogError($"Ошибка при создании шаблона: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, HostId: {template.HostId}");
}
else
{
logger.LogInformation($"Создан шаблон: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, " +
$"HostId: {template.HostId}");
}
}
}
#region создавали шаблоны до того, как стали группировать по РГ
////Создаем шаблоны
//foreach (var host in hosts)
//{
// var appInWork = host.ApplicationsInHosts.FirstOrDefault(t => t.ApplicationId == query.ApplicationId)?.Application?.ApplicationsInWorks.FirstOrDefault(a => a.WorkId == query.WorkId);
// if (appInWork == null)
// {
// // такого не может быть, так как выполнился запрос при получении списка хостов, но мало ли
// logger.LogError($"Ошибка при создании шаблона. В таблице ApplicationsInWorks не найден Id согласно запроса WorkId: {query.WorkId}, ApplicationId: {query.ApplicationId}");
// return;
// }
// var template = new Template
// {
// Id = Guid.NewGuid(),
// //Name = TemplateHelpers.GenerateTemplateName("ЗО" ,settingsFromDb.TemplatePrefixName, host.Ek, appInWork.Work!.Name),
// //Генерить имя с полным именем работы и подстановкой ЭК
// //Name = TemplateHelpers.GenerateTemplateNameWithResponseArea(host.ResponseArea!.Name, settingsFromDb.TemplatePrefixName, host.Ek, appInWork.Work!.Name.ApplyShortcode(Constants.Shortcode.Shortcodes.EK, host.Ek)),
// //Вместо полного имени работы, подставляется сокращенный суффикс или полное имя с ЭК если суффикса нет
// Name = TemplateHelpers.GenerateTemplateNameWithResponseArea(
// host.ResponseArea!.Name,
// settingsFromDb.TemplatePrefixName,
// host.Ek,
// appInWork.Work!.TemplateSuffix ?? appInWork.Work!.Name.ApplyShortcode(Constants.Shortcode.Shortcodes.EK, host.Ek)
// ),
// IsActiveTemplate = query.IsActiveTemplate ?? false,
// IsActiveSchedule = query.IsActiveSchedule ?? false,
// ApplicationInWorkId = appInWork.Id,
// HostId = host.Id,
// //TODO:
// //NextRun = ???,
// LastRun = null
// };
// if (!await templateService.CreateAsync(template) || !await templateService.CommitAsync())
// {
// logger.LogError($"Ошибка при создании шаблона: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, HostId: {template.HostId}");
// }
// else
// {
// logger.LogInformation($"Создан шаблон: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, " +
// $"HostId: {template.HostId}");
// }
//}
#endregion
}
private List<Template> CreateQueryTemplates(List<Host> hosts, GeneratorTemplateMq query)
{
var templates = new List<Template>();
foreach (var host in hosts)
{
var appInWork = host.ApplicationsInHosts.FirstOrDefault(t => t.ApplicationId == query.ApplicationId)?.Application?.ApplicationsInWorks.FirstOrDefault(a => a.WorkId == query.WorkId);
@@ -104,43 +186,40 @@ namespace PARR.GeneratorTemplates.Services
{
// такого не может быть, так как выполнился запрос при получении списка хостов, но мало ли
logger.LogError($"Ошибка при создании шаблона. В таблице ApplicationsInWorks не найден Id согласно запроса WorkId: {query.WorkId}, ApplicationId: {query.ApplicationId}");
return;
//return;
return templates;
}
var template = new Template
{
Id = Guid.NewGuid(),
//TODO:!!!
//Name = TemplateHelpers.GenerateTemplateName("ЗО" ,settingsFromDb.TemplatePrefixName, host.Ek, appInWork.Work!.Name),
//Генерить имя с полным именем работы и подстановкой ЭК
//Name = TemplateHelpers.GenerateTemplateNameWithResponseArea(host.ResponseArea!.Name, settingsFromDb.TemplatePrefixName, host.Ek, appInWork.Work!.Name.ApplyShortcode(Constants.Shortcode.Shortcodes.EK, host.Ek)),
//Вместо полного имени работы, подставляется сокращенный суффикс или полное имя с ЭК если суффикса нет
Name = TemplateHelpers.GenerateTemplateNameWithResponseArea(
host.ResponseArea!.Name,
settingsFromDb.TemplatePrefixName,
host.Ek,
host.ResponseArea!.Name,
settingsFromDb.TemplatePrefixName,
host.Ek,
appInWork.Work!.TemplateSuffix ?? appInWork.Work!.Name.ApplyShortcode(Constants.Shortcode.Shortcodes.EK, host.Ek)
),
//IsActiveTemplate = true,
//IsActiveSchedule = true,
IsActiveTemplate = query.IsActiveTemplate ?? false,
IsActiveSchedule = query.IsActiveSchedule ?? false,
ApplicationInWorkId = appInWork.Id,
HostId = host.Id
HostId = host.Id,
// NextRun не задаем значение, его рассчитаем позже
//NextRun = ???,
LastRun = null
};
if (!await templateService.CreateAsync(template) || !await templateService.CommitAsync())
{
logger.LogError($"Ошибка при создании шаблона: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, HostId: {template.HostId}");
}
else
{
logger.LogInformation($"Создан шаблон: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, " +
$"HostId: {template.HostId}");
}
templates.Add(template);
}
return templates;
}
public async Task DeactivateTemplates(GeneratorTemplateMq query)
{
//TODO: !!! тут не учитываются поля query.IsActiveTemplate, query.IsActiveSchedule, просто все деактивируется. !!!

View File

@@ -8,6 +8,7 @@ WORKDIR /src
COPY ["NuGet.config", "."]
COPY ["PARR.GeneratorTemplatesWorker/PARR.GeneratorTemplatesWorker.csproj", "PARR.GeneratorTemplatesWorker/"]
COPY ["PARR.GeneratorTemplates/PARR.GeneratorTemplates.csproj", "PARR.GeneratorTemplates/"]
COPY ["PARR.TemplateDistributor/PARR.TemplateDistributor.csproj", "PARR.TemplateDistributor/"]
COPY ["PARR.BLL/PARR.BLL.csproj", "PARR.BLL/"]
COPY ["PARR.DAL/PARR.DAL.csproj", "PARR.DAL/"]
COPY ["PARR.Constants/PARR.Constants.csproj", "PARR.Constants/"]