using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; using PARR.DAL.Contracts; using PARR.DAL.Extensions; using PARR.DAL.Models; using PARR.EsppSync; using PARR.EsppTemplateSync.Domain; using PARR.EsppTemplateSync.Settings; namespace PARR.EsppTemplateSync { internal class TemplateMQSyncer : ITemplateSyncer { private readonly ILogger logger; private readonly GlobalSettings globalSettings; private readonly IMqService mqService; private readonly ISyncService syncService; private readonly SettingsFromDb settingsFromDb; public TemplateMQSyncer( ILogger logger, GlobalSettings globalSettings, IMqService mqService, ISyncService syncService, SettingsFromDb settingsFromDb ) { this.logger = logger; this.globalSettings = globalSettings; this.mqService = mqService; this.syncService = syncService; this.settingsFromDb = settingsFromDb; if (globalSettings.MqSettings == null) { logger.LogError("Нет секции настроек хранилища. MqSettings, EsppTemplates"); throw new Exception("Нет секции настроек хранилища. MqSettings, EsppTemplates"); } } public void Start() { var isConnected = mqService.InitConsumer(globalSettings!.MqSettings!, SyncTemplateAsync); if (!isConnected) throw new Exception("Ошибка при подключении к RabbitMq"); logger.LogInformation($"Запущена проверка очереди {globalSettings.MqSettings!.QueueName}."); } public void Stop() { mqService.Dispose(); logger.LogInformation($"=== === === Соединение с очередью {globalSettings.MqSettings!.QueueName} закрыто === === ==="); } private async Task SyncTemplateAsync(string str) { await syncService.SyncEsppObjectAsync(str, ParseStrToEsppObject, ConvertDbObjToEsppObj); } /// /// Преобразование модели БД в модель для сравнения /// /// /// private EsppObjectTemplate ConvertDbObjToEsppObj(Template template) { var templateFromDb = new EsppObjectTemplate { TemplateName = template.Name, IsActive = template.IsActiveTemplate, //WorkGroup = template.Host!.WorkGroup!, WorkGroup = template.Host!.WorkGroup!.Name, ShortDescription = Normalize(template.ApplicationsInWork!.ShortDescription.ApplyShortcode(Constants.Shortcodes.ShortcodeEnum.EK,template.Host.Ek)), //ResponseArea = template.Host!.ResponseArea!.Name, //ЗО берем РГ а не хоста ResponseArea = template.Host!.WorkGroup!.ResponseArea!.Name, Duration = template.ApplicationsInWork.TemplateDuration, EK = template.Host.Ek, FullDescription = Normalize(template.ApplicationsInWork.FullDescription), Solution = Normalize(template.ApplicationsInWork.Solution), Process = template.ApplicationsInWork.Work!.Tnk!.Subprocess!.Process!.Name, SubProcess = template.ApplicationsInWork.Work.Tnk.Subprocess.Name, TNK = template.ApplicationsInWork.Work.Tnk.Name.ApplyShortcode(Constants.Shortcodes.ShortcodeEnum.EK, template.Host.Ek), Work = template.ApplicationsInWork.Work.Name.ApplyShortcode(Constants.Shortcodes.ShortcodeEnum.EK, template.Host.Ek), Initiator = settingsFromDb.Initiator }; return templateFromDb; } /// /// Парсинг из строки в модель для сравнения /// /// /// 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; //if (!string.IsNullOrEmpty(settingsFromDb.TemplatePrefixName) || !templateName.StartsWith(settingsFromDb.TemplatePrefixName, true, currentCulture)) if (string.IsNullOrEmpty(settingsFromDb.TemplatePrefixWithoutVariable) || !templateName.Contains(settingsFromDb.TemplatePrefixWithoutVariable)) // , StringComparison.CurrentCultureIgnoreCase { logger.LogWarning($"Имя шаблона не соответствует обязательному префиксу({settingsFromDb.TemplatePrefixWithoutVariable}). Шаблон {templateName} игнорирован"); 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 = Normalize(shortDescription), //Category = category, ResponseArea = responseArea, Duration = duration, EK = ek, Initiator = initiator, FullDescription = Normalize(fullDescription), //ClosingCode = closingCode, Solution = Normalize(solution), Process = process, SubProcess = subProcess, TNK = tnk, Work = work //Worker = worker }; return templateFromEspp; } /// /// Удаляет ненужные символы из строки /// /// /// private string Normalize(string str) { str = str.Replace("\r", string.Empty); str = str.Replace("\n", string.Empty); str = str.Replace(" ", string.Empty); return str; } } }