Логика создания шаблонов
This commit is contained in:
15
PARR.BLL/Helpers/SqlHelpers.cs
Normal file
15
PARR.BLL/Helpers/SqlHelpers.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
21
PARR.BLL/Helpers/TemplateHelpers.cs
Normal file
21
PARR.BLL/Helpers/TemplateHelpers.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 = "ПАРР-ДВС-ПТК" }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
1451
PARR.DAL/Migrations/20230925013923_TblSettingUpdPrefix.Designer.cs
generated
Normal file
1451
PARR.DAL/Migrations/20230925013923_TblSettingUpdPrefix.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
32
PARR.DAL/Migrations/20230925013923_TblSettingUpdPrefix.cs
Normal file
32
PARR.DAL/Migrations/20230925013923_TblSettingUpdPrefix.cs
Normal 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: "ПАРР-ДВС-ПТК__");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -616,7 +616,7 @@ namespace PARR.DAL.Migrations
|
|||||||
{
|
{
|
||||||
Name = "TemplatePrefixName",
|
Name = "TemplatePrefixName",
|
||||||
Description = "Префикс имени шаблона в ЕСПП",
|
Description = "Префикс имени шаблона в ЕСПП",
|
||||||
Value = "ПАРР-ДВС-ПТК__"
|
Value = "ПАРР-ДВС-ПТК"
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
// // проверить как ту дела с асинком
|
// // проверить как ту дела с асинком
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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>();
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user