2023-09-22 15:30:57 +10:00
using Microsoft.EntityFrameworkCore ;
using Microsoft.Extensions.Logging ;
using PARR.BLL.Domain.Mq ;
2023-09-25 11:47:13 +10:00
using PARR.BLL.Helpers ;
2023-09-22 15:30:57 +10:00
using PARR.DAL.Contracts ;
2023-09-25 11:47:13 +10:00
using PARR.DAL.Models ;
2023-09-22 15:30:57 +10:00
using PARR.DAL.Services.Interfaces ;
2023-09-25 11:47:13 +10:00
using System.Text.Json ;
2023-09-22 15:30:57 +10:00
namespace PARR.GeneratorTemplates.Services
{
internal class TemplateManager : ITemplateManager
{
private readonly ITemplateService templateService ;
2023-09-25 11:47:13 +10:00
private readonly IHostService hostService ;
2023-09-22 15:30:57 +10:00
private readonly ILogger < TemplateManager > logger ;
2023-09-25 11:47:13 +10:00
private readonly SettingsFromDb settingsFromDb ;
2023-10-05 16:56:02 +10:00
private readonly IRobotConfigurationService robotConfigurationService ;
2023-09-22 15:30:57 +10:00
public TemplateManager (
ITemplateService templateService ,
2023-09-25 11:47:13 +10:00
IHostService hostService ,
ILogger < TemplateManager > logger ,
2023-10-05 16:56:02 +10:00
SettingsFromDb settingsFromDb ,
IRobotConfigurationService robotConfigurationService
2023-09-22 15:30:57 +10:00
)
{
this . templateService = templateService ;
2023-09-25 11:47:13 +10:00
this . hostService = hostService ;
2023-09-22 15:30:57 +10:00
this . logger = logger ;
2023-09-25 11:47:13 +10:00
this . settingsFromDb = settingsFromDb ;
2023-10-05 16:56:02 +10:00
this . robotConfigurationService = robotConfigurationService ;
2023-09-22 15:30:57 +10:00
}
public async Task CreateTemplates ( GeneratorTemplateMq query )
{
//Согласно параметрам, находит все ЭК в таблице Hosts.
2023-09-25 11:47:13 +10:00
//Далее проверяет есть ли такие шаблоны в таблице Templates, если нет, то создает, активирует и ставит статус Creating.
2023-09-22 15:30:57 +10:00
//Если такие шаблоны уже есть, ничего с ними не делает.
2023-09-25 11:47:13 +10:00
string ekPattern = SqlHelpers . RegexToLike ( query . Ek ) ;
// список хостов для создания шаблонов
2023-09-25 15:32:22 +10:00
var queryHosts = hostService . Get ( )
2023-09-25 11:47:13 +10:00
. 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 = >
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
2023-09-25 15:32:22 +10:00
) ;
// статус ЭК
if ( query . StatusEk > 0 )
queryHosts = queryHosts . Where ( t = > t . EkStatusCode = = query . StatusEk ) ;
var hosts = await queryHosts
. AsSplitQuery ( )
. ToListAsync ( ) ;
2023-09-25 11:47:13 +10:00
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 ) ,
2023-10-05 16:56:02 +10:00
IsActiveTemplate = true ,
IsActiveSchedule = true ,
2023-09-25 11:47:13 +10:00
ApplicationInWorkId = appInWork . Id ,
2023-10-06 14:24:58 +10:00
HostId = host . Id
2023-09-25 11:47:13 +10:00
} ;
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}, " +
2023-10-06 14:24:58 +10:00
$"HostId: {template.HostId}" ) ;
2023-09-25 11:47:13 +10:00
}
}
2023-09-22 15:30:57 +10:00
}
public async Task DeactivateTemplates ( GeneratorTemplateMq query )
{
//Ищет все активные шаблоны согласно параметрам в таблице Templates, и деактивирует их. Меняем на статус Updating
2023-09-25 11:47:13 +10:00
// делаем sql формат для like из запроса.
string ekPattern = SqlHelpers . RegexToLike ( query . Ek ) ;
2023-09-22 15:30:57 +10:00
2023-09-25 15:32:22 +10:00
var queryTemplates = templateService . Get ( )
2023-09-22 15:30:57 +10:00
. Include ( t = > t . Host )
. Include ( t = > t . ApplicationsInWork )
2023-10-05 16:56:02 +10:00
. Include ( t = > t . RobotConfigurations )
2023-09-22 15:30:57 +10:00
. Where ( t = >
2023-10-05 16:56:02 +10:00
( t . IsActiveTemplate = = true | | t . IsActiveSchedule = = true )
2023-09-22 15:30:57 +10:00
& & t . ApplicationsInWork ! . ApplicationId = = query . ApplicationId
& & t . ApplicationsInWork ! . WorkId = = query . WorkId
2023-09-25 11:47:13 +10:00
& & EF . Functions . Like ( t . Host ! . Ek . ToLower ( ) , ekPattern )
2023-09-25 15:32:22 +10:00
) ;
// статус ЭК
if ( query . StatusEk > 0 )
queryTemplates = queryTemplates . Where ( t = > t . Host ! . EkStatusCode = = query . StatusEk ) ;
var existTemplates = await queryTemplates
. AsSplitQuery ( )
. ToListAsync ( ) ;
2023-09-22 15:30:57 +10:00
if ( ! existTemplates . Any ( ) )
{
logger . LogInformation ( "Нет шаблонов для деактивации" ) ;
return ;
}
existTemplates . ForEach ( item = >
{
item . DateModified = DateTimeOffset . UtcNow ;
2023-10-05 16:56:02 +10:00
if ( item . IsActiveTemplate )
{
item . IsActiveTemplate = false ;
//необходимо обновить шаблон
var config = robotConfigurationService . GetFromTemplateByRobotCode ( RobotsEnum . TemplateOrder , ref item ) ;
robotConfigurationService . ChangeTaskStatus ( TaskStatusEnum . Updating , ref config ) ;
}
if ( item . IsActiveSchedule )
{
item . IsActiveSchedule = false ;
//необходимо обновить расписание
var config = robotConfigurationService . GetFromTemplateByRobotCode ( RobotsEnum . ScheduleOrder , ref item ) ;
robotConfigurationService . ChangeTaskStatus ( TaskStatusEnum . Updating , ref config ) ;
}
2023-09-22 15:30:57 +10:00
} ) ;
if ( await templateService . CommitAsync ( ) )
existTemplates . ForEach ( item = > logger . LogInformation ( $"Деактивирован шаблон: {item.Name}" ) ) ;
else
existTemplates . ForEach ( item = > logger . LogError ( $"Ошибка при дактивации шаблона: {item.Name}" ) ) ;
}
}
}