feat(aititMainLoader): Сделана основная логика загрущки данных из АИХ ИТ в очередь сообщений
This commit is contained in:
101
PARR.AIHITMainLoader/AihitMainLoader.cs
Normal file
101
PARR.AIHITMainLoader/AihitMainLoader.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user