feat(aititMainLoader): Сделана основная логика загрущки данных из АИХ ИТ в очередь сообщений

This commit is contained in:
Mikhail Kuznetsov
2025-05-19 10:16:09 +10:00
parent b03af638f6
commit 082bc9bf15
16 changed files with 600 additions and 10 deletions

View File

@@ -0,0 +1,101 @@
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<AihitMainLoader> 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<AihitMainLoader> 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<AihitMainDataMq>();
services.ForEach(service =>
{
loaderSettings.ResponseAreas.ForEach(responseArea =>
{
var EKs = service.Invoke(responseArea);
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 = mqService.Send(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<Func<string, IEnumerable<IMainData>>> GetServices()
{
var serviceList = new List<Func<string, IEnumerable<IMainData>>>();
serviceList.Add(aihitService.GetCvkData);
serviceList.Add(aihitService.GetPtkData);
return serviceList;
}
}
}