Логика создания шаблонов

This commit is contained in:
Mikhail Trubnikov
2023-09-25 11:47:13 +10:00
parent 6c3ac936a1
commit 251d23e9b4
10 changed files with 1601 additions and 17 deletions

View File

@@ -0,0 +1,15 @@
namespace PARR.BLL.Helpers
{
public static class SqlHelpers
{
/// <summary>
/// Преобразует Regex в Like для SQL
/// </summary>
/// <param name="regexPattern"></param>
/// <returns></returns>
public static string RegexToLike(string regexPattern)
{
return regexPattern.Replace("*", "%").ToLower();
}
}
}

View File

@@ -0,0 +1,21 @@
namespace PARR.BLL.Helpers
{
public static class TemplateHelpers
{
/// <summary>
/// Генерация имени шаблона
/// </summary>
/// <param name="prefix"></param>
/// <param name="ek"></param>
/// <param name="work"></param>
/// <returns></returns>
public static string GenerateTemplateName(string prefix, string ek, string work)
{
if (string.IsNullOrEmpty(prefix))
prefix = "ПАРР-PREFIX";
var splitter = "__";
return prefix + splitter + ek + splitter + work.Replace(" ", "-").ToUpper();
}
}
}

View File

@@ -117,7 +117,7 @@ namespace PARR.DAL.Context
new { Name = nameof(SettingsFromDb.Initiator), Description = "Инициатор регламентной работы, указывается при создании шаблона в ЕСПП.", Value = "КУЗНЕЦОВ МИХАИЛ ВАЛЕРЬЕВИЧ (IVC_KUZNETSOVMV@DVGD.OAO.RZD)" }, new { Name = nameof(SettingsFromDb.Initiator), Description = "Инициатор регламентной работы, указывается при создании шаблона в ЕСПП.", Value = "КУЗНЕЦОВ МИХАИЛ ВАЛЕРЬЕВИЧ (IVC_KUZNETSOVMV@DVGD.OAO.RZD)" },
new { Name = nameof(SettingsFromDb.ClosingCode), Description = "Код закрытия регламентной работы, указывается при создании шаблона в ЕСПП.", Value = "выполнен" }, new { Name = nameof(SettingsFromDb.ClosingCode), Description = "Код закрытия регламентной работы, указывается при создании шаблона в ЕСПП.", Value = "выполнен" },
new { Name = nameof(SettingsFromDb.Category), Description = "Категория создаваемого объекта в ЕСПП", Value = "регламентная работа" }, new { Name = nameof(SettingsFromDb.Category), Description = "Категория создаваемого объекта в ЕСПП", Value = "регламентная работа" },
new { Name = nameof(SettingsFromDb.TemplatePrefixName), Description = "Префикс имени шаблона в ЕСПП", Value = "ПАРР-ДВС-ПТК__" } new { Name = nameof(SettingsFromDb.TemplatePrefixName), Description = "Префикс имени шаблона в ЕСПП", Value = "ПАРР-ДВС-ПТК" }
); );
}); });

View File

@@ -1,10 +1,4 @@
using System; namespace PARR.DAL.Contracts
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PARR.DAL.Contracts
{ {
public class AIHTITSettings public class AIHTITSettings
{ {

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace PARR.DAL.Migrations
{
/// <inheritdoc />
public partial class TblSettingUpdPrefix : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "Settings",
keyColumn: "Name",
keyValue: "TemplatePrefixName",
column: "Value",
value: "ПАРР-ДВС-ПТК");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.UpdateData(
table: "Settings",
keyColumn: "Name",
keyValue: "TemplatePrefixName",
column: "Value",
value: "ПАРР-ДВС-ПТК__");
}
}
}

View File

@@ -616,7 +616,7 @@ namespace PARR.DAL.Migrations
{ {
Name = "TemplatePrefixName", Name = "TemplatePrefixName",
Description = "Префикс имени шаблона в ЕСПП", Description = "Префикс имени шаблона в ЕСПП",
Value = "ПАРР-ДВС-ПТК__" Value = "ПАРР-ДВС-ПТК"
}); });
}); });

View File

@@ -44,7 +44,9 @@ namespace PARR.GeneratorTemplates
// logger.LogInformation($"Привет откуда надо!!! ${msg}"); // logger.LogInformation($"Привет откуда надо!!! ${msg}");
// //todo: идем дальеш! // //todo: идем дальеш!
string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"deactivate\",\"Ek\":\"вРТ-*RZD\"}"; //string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"create\",\"Ek\":\"вРТ-*RZD\"}";
string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"create\",\"Ek\":\"*ДВС\"}";
//string msg = "{\"WorkId\":\"91219bec-e5f7-4a1a-b4c9-c135035d2498\",\"ApplicationId\":\"13044a1f-fa0c-476f-b501-2b8d06bac9f8\",\"Action\":\"deactivate\",\"Ek\":\"вРТ-*RZD\"}";
await GenerateTemplates(msg); await GenerateTemplates(msg);
// // проверить как ту дела с асинком // // проверить как ту дела с асинком

View File

@@ -1,40 +1,108 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using PARR.BLL.Domain.Mq; using PARR.BLL.Domain.Mq;
using PARR.BLL.Helpers;
using PARR.DAL.Contracts; using PARR.DAL.Contracts;
using PARR.DAL.Models;
using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces;
using System.Text.Json;
namespace PARR.GeneratorTemplates.Services namespace PARR.GeneratorTemplates.Services
{ {
internal class TemplateManager : ITemplateManager internal class TemplateManager : ITemplateManager
{ {
private readonly ITemplateService templateService; private readonly ITemplateService templateService;
private readonly IHostService hostService;
private readonly ILogger<TemplateManager> logger; private readonly ILogger<TemplateManager> logger;
private readonly SettingsFromDb settingsFromDb;
public TemplateManager( public TemplateManager(
ITemplateService templateService, ITemplateService templateService,
ILogger<TemplateManager> logger IHostService hostService,
ILogger<TemplateManager> logger,
SettingsFromDb settingsFromDb
) )
{ {
this.templateService = templateService; this.templateService = templateService;
this.hostService = hostService;
this.logger = logger; this.logger = logger;
this.settingsFromDb = settingsFromDb;
} }
public async Task CreateTemplates(GeneratorTemplateMq query) public async Task CreateTemplates(GeneratorTemplateMq query)
{ {
//Согласно параметрам, находит все ЭК в таблице Hosts. //Согласно параметрам, находит все ЭК в таблице Hosts.
//Далее проверяет есть ли такие шаблоны в таблице Templates, если нет, то создает. //Далее проверяет есть ли такие шаблоны в таблице Templates, если нет, то создает, активирует и ставит статус Creating.
//Если такие шаблоны уже есть, ничего с ними не делает. //Если такие шаблоны уже есть, ничего с ними не делает.
//TODO: string ekPattern = SqlHelpers.RegexToLike(query.Ek);
// список хостов для создания шаблонов
var hosts = await hostService.Get()
.Include(t => t.ApplicationsInHosts)
.ThenInclude(t => t.Application).ThenInclude(t => t!.ApplicationsInWorks).ThenInclude(w => w.Work)
.Include(t => t.Templates)
.ThenInclude(w => w.ApplicationsInWork)
.Where(t =>
//TODO: add status ЭК
t.ApplicationsInHosts.Any(h =>
h.ApplicationId == query.ApplicationId
&& h.Application!.ApplicationsInWorks.Any(w => w.WorkId == query.WorkId)
)
&& EF.Functions.Like(t.Ek.ToLower(), ekPattern)
// смотрим что нет такого шаблона
&& t.Templates.Any(templ => templ.ApplicationsInWork!.WorkId == query.WorkId && templ.ApplicationsInWork.ApplicationId == query.ApplicationId) == false
)
.AsSplitQuery()
.ToListAsync();
if (!hosts.Any())
{
logger.LogInformation($"Не найдено ЭК попадающих под условие: ${JsonSerializer.Serialize(query)}");
return;
}
//Создаем шаблоны
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),
IsActive = true,
StatusCode = (int)StatusTemplateEnum.Creating,
ApplicationInWorkId = appInWork.Id,
HostId = host.Id
};
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}, IsActive: {template.IsActive}, StatusCode: {template.StatusCode}");
}
}
} }
public async Task DeactivateTemplates(GeneratorTemplateMq query) public async Task DeactivateTemplates(GeneratorTemplateMq query)
{ {
//Ищет все активные шаблоны согласно параметрам в таблице Templates, и деактивирует их. Меняем на статус Updating //Ищет все активные шаблоны согласно параметрам в таблице Templates, и деактивирует их. Меняем на статус Updating
// делаем sql форматдля like из запроса. // делаем sql формат для like из запроса.
string pattern = query.Ek.Replace("*", "%").ToLower(); string ekPattern = SqlHelpers.RegexToLike(query.Ek);
var existTemplates = await templateService.Get() var existTemplates = await templateService.Get()
.Include(t => t.Host) .Include(t => t.Host)
@@ -43,7 +111,8 @@ namespace PARR.GeneratorTemplates.Services
t.IsActive == true t.IsActive == true
&& t.ApplicationsInWork!.ApplicationId == query.ApplicationId && t.ApplicationsInWork!.ApplicationId == query.ApplicationId
&& t.ApplicationsInWork!.WorkId == query.WorkId && t.ApplicationsInWork!.WorkId == query.WorkId
&& EF.Functions.Like(t.Host!.Ek.ToLower(), pattern) //TODO: add status ЭК
&& EF.Functions.Like(t.Host!.Ek.ToLower(), ekPattern)
) )
.ToListAsync(); .ToListAsync();

View File

@@ -19,7 +19,7 @@ IHost host = Host.CreateDefaultBuilder(args)
//}) //})
.ConfigureServices((hostContext, services) => .ConfigureServices((hostContext, services) =>
{ {
//services.AddGeneratorTemplateSettings(hostContext.Configuration); services.AddGeneratorTemplateSettings(hostContext.Configuration);
services.AddHostedService<Worker>(); services.AddHostedService<Worker>();
}) })