2023-09-04 12:17:50 +10:00
using Microsoft.Extensions.Logging ;
2023-09-22 09:08:13 +10:00
using PARR.BLL.Services.Interfaces ;
2023-11-22 14:19:15 +10:00
using PARR.DAL.Contracts ;
2024-03-20 15:26:14 +10:00
using PARR.DAL.Extensions ;
2023-11-22 14:19:15 +10:00
using PARR.DAL.Models ;
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 ;
2023-09-26 11:31:01 +10:00
private readonly IMqService mqService ;
2023-11-22 14:19:15 +10:00
private readonly ISyncService < EsppObjectTemplate > syncService ;
private readonly SettingsFromDb settingsFromDb ;
2023-09-01 11:47:39 +10:00
public TemplateMQSyncer (
ILogger < TemplateMQSyncer > logger ,
2023-09-26 11:31:01 +10:00
GlobalSettings globalSettings ,
2023-11-22 14:19:15 +10:00
IMqService mqService ,
ISyncService < EsppObjectTemplate > syncService ,
SettingsFromDb settingsFromDb
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 . syncService = syncService ;
this . settingsFromDb = settingsFromDb ;
2023-11-22 16:34:16 +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
}
public void Start ( )
{
2023-11-22 14:19:15 +10:00
var isConnected = mqService . InitConsumer ( 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
2023-09-26 11:31:01 +10:00
logger . LogInformation ( $"Запущена проверка очереди {globalSettings.MqSettings!.QueueName}." ) ;
2023-09-04 12:17:50 +10:00
}
public void Stop ( )
{
2023-09-26 11:31:01 +10:00
mqService . Dispose ( ) ;
2023-09-04 12:17:50 +10:00
logger . LogInformation ( $"=== === === Соединение с очередью {globalSettings.MqSettings!.QueueName} закрыто === === ===" ) ;
}
2023-09-22 09:43:56 +10:00
2023-11-22 14:19:15 +10:00
private async Task SyncTemplateAsync ( string str )
{
await syncService . SyncEsppObjectAsync ( str , ParseStrToEsppObject , ConvertDbObjToEsppObj ) ;
}
/// <summary>
/// Преобразование модели БД в модель для сравнения
/// </summary>
/// <param name="template"></param>
/// <returns></returns>
private EsppObjectTemplate ConvertDbObjToEsppObj ( Template template )
{
var templateFromDb = new EsppObjectTemplate
{
TemplateName = template . Name ,
IsActive = template . IsActiveTemplate ,
WorkGroup = template . Host ! . WorkGroup ! ,
ShortDescription = template . ApplicationsInWork ! . ShortDescription ,
ResponseArea = template . Host ! . ResponseArea ! . Name ,
Duration = template . ApplicationsInWork . TemplateDuration ,
EK = template . Host . Ek ,
2024-02-20 14:55:14 +10:00
FullDescription = Normalize ( template . ApplicationsInWork . FullDescription ) ,
2023-11-22 14:19:15 +10:00
Solution = template . ApplicationsInWork . Solution ,
Process = template . ApplicationsInWork . Work ! . Tnk ! . Subprocess ! . Process ! . Name ,
SubProcess = template . ApplicationsInWork . Work . Tnk . Subprocess . Name ,
2024-03-20 15:26:14 +10:00
TNK = template . ApplicationsInWork . Work . Tnk . Name . ApplyShortcode ( Constants . Shortcode . Shortcodes . EK , template . Host . Ek ) ,
Work = template . ApplicationsInWork . Work . Name . ApplyShortcode ( Constants . Shortcode . Shortcodes . EK , template . Host . Ek )
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 )
{
logger . LogError ( $"Входная строка после сплита не содержит 17 объектов (факт: {splittedContent.Length})." ) ;
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
{
2024-02-15 09:21:01 +10:00
logger . LogWarning ( $"Имя шаблона не соответствует обязательному префиксу({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
{
TemplateName = templateName ,
IsActive = isActive ,
WorkGroup = workGroup ,
ShortDescription = shortDescription ,
//Category = category,
ResponseArea = responseArea ,
Duration = duration ,
EK = ek ,
//Initiator = initiator,
2024-02-20 14:55:14 +10:00
FullDescription = Normalize ( fullDescription ) ,
2023-11-22 14:19:15 +10:00
//ClosingCode = closingCode,
Solution = solution ,
Process = process ,
SubProcess = subProcess ,
TNK = tnk ,
Work = work
//Worker = worker
} ;
return templateFromEspp ;
}
2024-02-19 08:34:52 +10:00
/// <summary>
/// Удаляет ненужные символы из строки
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
2024-02-20 14:47:33 +10:00
private string Normalize ( string str )
2024-02-19 08:34:52 +10:00
{
str = str . Replace ( "\r" , string . Empty ) ;
str = str . Replace ( "\n" , string . Empty ) ;
2024-02-20 14:47:33 +10:00
str = str . Replace ( " " , string . Empty ) ;
2024-02-19 08:34:52 +10:00
return str ;
}
2023-08-31 12:04:05 +10:00
}
}
2023-09-22 09:43:56 +10:00