using Microsoft.Extensions.Logging; using PARR.AIHITMainLoader.Models; using PARR.AIHITMainLoader.Services; using PARR.AIHITMainLoader.Settings; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using System.Text.Json; namespace PARR.AIHITMainLoader { internal class AihitMainLoader : IAihitMainLoader { private readonly ILogger logger; private readonly IIntervalService intervalService; private readonly WorkerSettings workerSettings; private readonly LoaderSettings loaderSettings; private readonly MqSettings mqSettings; private readonly IAihitService aihitService; private readonly IMqService mqService; public AihitMainLoader( ILogger logger, IIntervalService intervalService, WorkerSettings workerSettings, LoaderSettings loaderSettings, MqSettings mqSettings, IAihitService aihitService, IMqService mqService ) { this.logger = logger; this.intervalService = intervalService; this.workerSettings = workerSettings; this.loaderSettings = loaderSettings; this.mqSettings = mqSettings; this.aihitService = aihitService; this.mqService = mqService; } public async Task StartAsync() { logger.LogInformation("Запуск сервиса загрузки данных из АИХ ИТ."); await intervalService.IntervalInitAsync(LoadDataAsync, workerSettings.RepeatEvery); } private async Task LoadDataAsync() { logger.LogInformation("Запуск загрузки данных из АИХ ИТ."); var services = GetServices(); var listToMq = new List(); services.ForEach(service => { loaderSettings.ResponseAreas.ForEach(responseArea => { logger.LogDebug($"responseArea = {responseArea}"); var EKs = service.Invoke(responseArea); if (EKs != null && EKs.Any()) EKs.ToList().ForEach(item => { listToMq.Add(item.ToMainData()); }); }); }); var preparedData = listToMq.Select(d => JsonSerializer.Serialize(d)); var parts = listToMq.Count() / loaderSettings.PackageSize; parts++; for (var i = 0; i < parts; i++) { var batch = preparedData.Skip(i * loaderSettings.PackageSize).Take(loaderSettings.PackageSize).ToList(); var sendResult = await mqService.SendAsync(mqSettings, batch.ToArray()); if (sendResult.IsSuccess) { logger.LogInformation($"Данные переданы в RabbitMQ: {batch.Count()}"); logger.LogDebug($"Список ЭК переданных в RabbitMQ: {string.Join(", ", batch)}"); } else logger.LogError($"Ошибка при передаче данных в Rabbit, не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}"); } // await Task.CompletedTask; } private List?>> GetServices() { var serviceList = new List?>>(); serviceList.Add(aihitService.GetCvkData); serviceList.Add(aihitService.GetPtkData); return serviceList; } } }