2025-12-04 09:26:17 +10:00
using Microsoft.Extensions.Logging ;
2026-04-14 16:27:27 +10:00
using PARR.Core.Common.Interfaces.RabbitServices ;
2026-04-30 10:35:31 +10:00
using PARR.Domain.Entities ;
2026-05-04 11:55:07 +10:00
using PARR.Domain.Settings ;
2023-11-22 14:19:15 +10:00
using PARR.EsppSync ;
using PARR.EsppTemplateSync.Domain ;
2023-09-01 11:47:39 +10:00
using PARR.EsppTemplateSync.Settings ;
2023-08-31 12:04:05 +10:00
namespace PARR.EsppTemplateSync
{
internal class TemplateMQSyncer : ITemplateSyncer
{
2023-09-01 11:47:39 +10:00
private readonly ILogger < TemplateMQSyncer > logger ;
private readonly GlobalSettings globalSettings ;
2026-04-14 12:01:49 +10:00
private readonly IRabbitService mqService ;
2023-11-22 14:19:15 +10:00
private readonly SettingsFromDb settingsFromDb ;
2025-08-20 14:10:22 +10:00
private readonly ISyncService < EsppObjectTemplate > syncService ;
2023-09-01 11:47:39 +10:00
public TemplateMQSyncer (
ILogger < TemplateMQSyncer > logger ,
2023-09-26 11:31:01 +10:00
GlobalSettings globalSettings ,
2026-04-14 12:01:49 +10:00
IRabbitService mqService ,
2025-08-01 14:45:36 +10:00
SettingsFromDb settingsFromDb ,
2025-08-20 14:10:22 +10:00
ISyncService < EsppObjectTemplate > syncService
2023-09-01 11:47:39 +10:00
)
{
this . logger = logger ;
this . globalSettings = globalSettings ;
2023-09-26 11:31:01 +10:00
this . mqService = mqService ;
2023-11-22 14:19:15 +10:00
this . settingsFromDb = settingsFromDb ;
2025-08-20 14:10:22 +10:00
this . syncService = syncService ;
2026-01-06 13:57:22 +10:00
2023-09-01 11:47:39 +10:00
if ( globalSettings . MqSettings = = null )
{
logger . LogError ( "Нет секции настроек хранилища. MqSettings, EsppTemplates" ) ;
throw new Exception ( "Нет секции настроек хранилища. MqSettings, EsppTemplates" ) ;
}
2023-09-04 12:17:50 +10:00
}
2025-08-20 14:10:22 +10:00
public async Task StartAsync ( )
2023-09-04 12:17:50 +10:00
{
2025-08-20 14:10:22 +10:00
var isConnected = await mqService . InitConsumerAsync ( globalSettings ! . MqSettings ! , SyncTemplateAsync ) ;
2023-09-04 12:17:50 +10:00
2023-09-26 11:31:01 +10:00
if ( ! isConnected )
throw new Exception ( "Ошибка при подключении к RabbitMq" ) ;
2023-09-22 09:43:56 +10:00
2026-01-26 17:16:56 +10:00
logger . LogInformation ( "Запущена проверка очереди {QueueName}." , globalSettings . MqSettings ! . QueueName ) ;
2023-09-04 12:17:50 +10:00
}
2025-08-20 14:10:22 +10:00
public async Task StopAsync ( )
2023-09-04 12:17:50 +10:00
{
2025-08-20 14:10:22 +10:00
await mqService . DisposeAsync ( ) ;
2023-09-04 12:17:50 +10:00
2026-01-26 17:16:56 +10:00
logger . LogInformation ( "=== === === Соединение с очередью {QueueName} закрыто === === ===" , globalSettings . MqSettings ! . QueueName ) ;
2023-09-04 12:17:50 +10:00
}
2023-09-22 09:43:56 +10:00
2023-11-22 14:19:15 +10:00
private async Task SyncTemplateAsync ( string str )
{
2025-08-20 14:10:22 +10:00
await syncService . SyncEsppObjectAsync ( str , ParseStrToEsppObject , ConvertDbObjToEsppObj ) ;
2023-11-22 14:19:15 +10:00
}
/// <summary>
/// Преобразование модели БД в модель для сравнения
/// </summary>
2025-08-01 14:45:36 +10:00
/// <param name="template">template должен обязательно содержать в с е б е информацию о Job+Group и Unit+BaseFields</param>
2023-11-22 14:19:15 +10:00
/// <returns></returns>
2025-08-06 10:33:55 +10:00
private EsppObjectTemplate ConvertDbObjToEsppObj ( Template template )
2023-11-22 14:19:15 +10:00
{
var templateFromDb = new EsppObjectTemplate
{
2025-11-28 15:32:06 +10:00
TemplateName = template . Name . ToUpper ( ) ,
2023-11-22 14:19:15 +10:00
IsActive = template . IsActiveTemplate ,
2024-06-04 12:03:15 +10:00
//WorkGroup = template.Host!.WorkGroup!,
2026-01-06 13:57:22 +10:00
//WorkGroup = template.Unit!.BaseFields!.WorkGroup!,
WorkGroup = template . Job ! . WorkGroupMask ,
2025-08-01 14:45:36 +10:00
//ShortDescription = Normalize(template.Job.Group.ShortDescription.ApplyShortcode(Constants.Shortcodes.ShortcodeEnum.EK,template.Unit.Name)),
2025-08-21 14:51:40 +10:00
ShortDescription = template . Job ! . Group ! . ShortDescription , //TODO Вынести в переменную
2024-06-18 15:16:54 +10:00
//ResponseArea = template.Host!.ResponseArea!.Name,
2026-01-13 14:36:07 +10:00
////З О берем РГ а не хоста
//ResponseArea = template.Unit!.BaseFields!.ResponseArea!,
ResponseArea = template . Job . ResponseAreaMask ,
2025-06-25 14:17:34 +10:00
Duration = template . Job . Group . TemplateDuration ,
2026-01-13 14:36:07 +10:00
EK = template . Unit ! . Name ,
2025-08-21 14:51:40 +10:00
FullDescription = template . Job . Group . FullDescription ,
Solution = template . Job . Group . Solution ,
2025-06-25 14:17:34 +10:00
Process = template . Job . Tnk ! . Subprocess ! . Process ! . Name ,
SubProcess = template . Job . Tnk . Subprocess . Name ,
2025-08-01 14:45:36 +10:00
//TNK = template.Job.Tnk.Name.ApplyShortcode(Constants.Shortcodes.ShortcodeEnum.EK, template.Unit.Name),
2025-08-06 10:33:55 +10:00
TNK = template . Job . Tnk . Name ,
Work = template . Job . WorkName ,
2026-03-03 10:19:59 +10:00
Initiator = settingsFromDb . Initiator ,
// Исполнитель, мы хотим чтобы он всегда был пустой
Worker = string . Empty
2023-11-22 14:19:15 +10:00
} ;
return templateFromDb ;
}
/// <summary>
/// Парсинг из строки в модель для сравнения
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private EsppObjectTemplate ? ParseStrToEsppObject ( string str )
{
var splittedContent = str . Split ( globalSettings . ParsingSeparator ) ;
if ( splittedContent . Length ! = 17 )
{
2026-01-26 17:16:56 +10:00
logger . LogError ( "Входная строка после сплита не содержит 17 объектов (факт: {Length})." , splittedContent . Length ) ;
2023-11-22 14:19:15 +10:00
return null ;
}
var templateName = splittedContent [ 0 ] . Trim ( ) ;
var currentCulture = Thread . CurrentThread . CurrentCulture ;
2024-03-20 15:26:14 +10:00
2024-02-15 09:21:01 +10:00
//if (!string.IsNullOrEmpty(settingsFromDb.TemplatePrefixName) || !templateName.StartsWith(settingsFromDb.TemplatePrefixName, true, currentCulture))
2024-02-15 14:53:25 +10:00
if ( string . IsNullOrEmpty ( settingsFromDb . TemplatePrefixWithoutVariable ) | | ! templateName . Contains ( settingsFromDb . TemplatePrefixWithoutVariable ) ) // , StringComparison.CurrentCultureIgnoreCase
2023-11-22 14:19:15 +10:00
{
2026-01-26 17:16:56 +10:00
logger . LogWarning ( "Имя шаблона не соответствует обязательному префиксу({Prefix}). Шаблон {TemplateName} игнорирован" , settingsFromDb . TemplatePrefixWithoutVariable , templateName ) ;
2023-11-22 14:19:15 +10:00
return null ;
}
bool . TryParse ( splittedContent [ 1 ] . Trim ( ) , out var isActive ) ;
var workGroup = splittedContent [ 2 ] . Trim ( ) ;
var shortDescription = splittedContent [ 3 ] . Trim ( ) ;
var category = splittedContent [ 4 ] . Trim ( ) ;
var responseArea = splittedContent [ 5 ] . Trim ( ) ;
var duration = splittedContent [ 6 ] . Trim ( ) ;
var ek = splittedContent [ 7 ] . Trim ( ) ;
var initiator = splittedContent [ 8 ] . Trim ( ) ;
var fullDescription = splittedContent [ 9 ] . Trim ( ) ;
var closingCode = splittedContent [ 10 ] . Trim ( ) ;
var solution = splittedContent [ 11 ] . Trim ( ) ;
var process = splittedContent [ 12 ] . Trim ( ) ;
var subProcess = splittedContent [ 13 ] . Trim ( ) ;
var tnk = splittedContent [ 14 ] . Trim ( ) ;
var work = splittedContent [ 15 ] . Trim ( ) ;
var worker = splittedContent [ 16 ] . Trim ( ) ;
var templateFromEspp = new EsppObjectTemplate
{
2025-11-28 15:32:06 +10:00
TemplateName = templateName . ToUpper ( ) ,
2023-11-22 14:19:15 +10:00
IsActive = isActive ,
WorkGroup = workGroup ,
2025-08-21 14:51:40 +10:00
ShortDescription = shortDescription ,
2023-11-22 14:19:15 +10:00
//Category = category,
ResponseArea = responseArea ,
Duration = duration ,
EK = ek ,
2024-08-14 11:00:32 +10:00
Initiator = initiator ,
2025-08-21 14:51:40 +10:00
FullDescription = fullDescription ,
2023-11-22 14:19:15 +10:00
//ClosingCode = closingCode,
2025-08-21 14:51:40 +10:00
Solution = solution ,
2023-11-22 14:19:15 +10:00
Process = process ,
SubProcess = subProcess ,
TNK = tnk ,
2026-03-03 10:19:59 +10:00
Work = work ,
Worker = worker
2023-11-22 14:19:15 +10:00
} ;
return templateFromEspp ;
}
2023-08-31 12:04:05 +10:00
}
2026-01-26 17:16:56 +10:00
}