using Microsoft.Extensions.Logging; using PARR.BLL.Services.Interfaces; using PARR.DAL.Contracts; 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!, ShortDescription = template.ApplicationsInWork!.ShortDescription, ResponseArea = template.Host!.ResponseArea!.Name, Duration = template.ApplicationsInWork.TemplateDuration, EK = template.Host.Ek, FullDescription = template.ApplicationsInWork.FullDescription, Solution = template.ApplicationsInWork.Solution, Process = template.ApplicationsInWork.Work!.Tnk!.Subprocess!.Process!.Name, SubProcess = template.ApplicationsInWork.Work.Tnk.Subprocess.Name, TNK = template.ApplicationsInWork.Work.Tnk.Name, Work = template.ApplicationsInWork.Work.Name }; 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)) { logger.LogWarning($"Имя шаблона не соответствует обязательному префиксу({settingsFromDb.TemplatePrefixName}). Шаблон {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 = shortDescription, //Category = category, ResponseArea = responseArea, Duration = duration, EK = ek, //Initiator = initiator, FullDescription = fullDescription, //ClosingCode = closingCode, Solution = solution, Process = process, SubProcess = subProcess, TNK = tnk, Work = work //Worker = worker }; return templateFromEspp; } } }