2025-11-18 17:56:12 +10:00
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2025-05-19 10:16:09 +10:00
|
|
|
|
using PARR.AIHITMainLoader.Models;
|
|
|
|
|
|
using PARR.AIHITMainLoader.Services;
|
|
|
|
|
|
using PARR.AIHITMainLoader.Settings;
|
2026-04-14 16:27:27 +10:00
|
|
|
|
using PARR.Core.Common.Interfaces;
|
|
|
|
|
|
using PARR.Core.Common.Interfaces.RabbitServices;
|
2026-01-22 10:56:02 +10:00
|
|
|
|
using System.Text.Encodings.Web;
|
2025-05-19 10:16:09 +10:00
|
|
|
|
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;
|
2026-04-14 12:01:49 +10:00
|
|
|
|
private readonly IRabbitService mqService;
|
2025-11-18 17:56:12 +10:00
|
|
|
|
private readonly IServiceProvider serviceProvider;
|
2025-05-19 10:16:09 +10:00
|
|
|
|
|
2026-01-22 10:56:02 +10:00
|
|
|
|
private static readonly JsonSerializerOptions jsonOptions = new JsonSerializerOptions
|
|
|
|
|
|
{
|
|
|
|
|
|
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2025-05-19 10:16:09 +10:00
|
|
|
|
public AihitMainLoader(
|
|
|
|
|
|
ILogger<AihitMainLoader> logger,
|
|
|
|
|
|
IIntervalService intervalService,
|
|
|
|
|
|
WorkerSettings workerSettings,
|
|
|
|
|
|
LoaderSettings loaderSettings,
|
|
|
|
|
|
MqSettings mqSettings,
|
2026-04-14 12:01:49 +10:00
|
|
|
|
IRabbitService mqService,
|
2025-11-18 17:56:12 +10:00
|
|
|
|
IServiceProvider serviceProvider
|
2025-05-19 10:16:09 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
this.intervalService = intervalService;
|
|
|
|
|
|
this.workerSettings = workerSettings;
|
|
|
|
|
|
this.loaderSettings = loaderSettings;
|
|
|
|
|
|
this.mqSettings = mqSettings;
|
|
|
|
|
|
this.mqService = mqService;
|
2025-11-18 17:56:12 +10:00
|
|
|
|
this.serviceProvider = serviceProvider;
|
2025-05-19 10:16:09 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task StartAsync()
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation("Запуск сервиса загрузки данных из АИХ ИТ.");
|
|
|
|
|
|
|
|
|
|
|
|
await intervalService.IntervalInitAsync(LoadDataAsync, workerSettings.RepeatEvery);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task LoadDataAsync()
|
|
|
|
|
|
{
|
2025-11-18 17:56:12 +10:00
|
|
|
|
try
|
2025-05-19 10:16:09 +10:00
|
|
|
|
{
|
2025-11-18 17:56:12 +10:00
|
|
|
|
logger.LogInformation("Запуск загрузки данных из АИХ ИТ.");
|
|
|
|
|
|
using (var scope = serviceProvider.CreateScope())
|
2025-05-19 10:16:09 +10:00
|
|
|
|
{
|
2025-11-19 11:52:41 +10:00
|
|
|
|
var aihitService = scope.ServiceProvider.GetRequiredService<IAihitService>();
|
2025-11-18 17:56:12 +10:00
|
|
|
|
var services = GetServices(aihitService);
|
2025-05-19 10:16:09 +10:00
|
|
|
|
|
2025-12-26 12:37:01 +10:00
|
|
|
|
var currentBatch = new List<string>();
|
|
|
|
|
|
int packageSize = loaderSettings.PackageSize;
|
2025-05-19 10:16:09 +10:00
|
|
|
|
|
2025-12-26 12:37:01 +10:00
|
|
|
|
if (packageSize <= 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError("Некорректный размер пакета: {PackageSize}. Ожидалось > 0.", packageSize);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2025-05-19 10:16:09 +10:00
|
|
|
|
|
2025-11-18 17:56:12 +10:00
|
|
|
|
foreach (var service in services)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var responseArea in loaderSettings.ResponseAreas)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogDebug($"responseArea = {responseArea}");
|
|
|
|
|
|
var EKs = service.Invoke(responseArea);
|
|
|
|
|
|
|
2025-12-26 12:37:01 +10:00
|
|
|
|
if (EKs?.Any() != true) continue;
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var item in EKs)
|
2025-11-18 17:56:12 +10:00
|
|
|
|
{
|
2025-12-26 12:37:01 +10:00
|
|
|
|
if (item == null) continue;
|
|
|
|
|
|
|
|
|
|
|
|
var mainData = item.ToMainData();
|
|
|
|
|
|
if (mainData == null) continue;
|
|
|
|
|
|
|
2026-01-22 10:56:02 +10:00
|
|
|
|
var json = JsonSerializer.Serialize(mainData, jsonOptions);
|
2025-12-26 12:37:01 +10:00
|
|
|
|
currentBatch.Add(json);
|
|
|
|
|
|
|
|
|
|
|
|
// Отправка, если набрали полный пакет
|
|
|
|
|
|
if (currentBatch.Count >= packageSize)
|
2025-11-18 17:56:12 +10:00
|
|
|
|
{
|
2025-12-26 12:37:01 +10:00
|
|
|
|
await SendBatchAsync(currentBatch);
|
|
|
|
|
|
currentBatch.Clear();
|
2025-11-18 17:56:12 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-26 12:37:01 +10:00
|
|
|
|
// Отправка остатка
|
|
|
|
|
|
if (currentBatch.Count > 0)
|
2025-11-18 17:56:12 +10:00
|
|
|
|
{
|
2025-12-26 12:37:01 +10:00
|
|
|
|
await SendBatchAsync(currentBatch);
|
2025-11-18 17:56:12 +10:00
|
|
|
|
}
|
2025-05-19 10:16:09 +10:00
|
|
|
|
}
|
2025-11-19 11:52:41 +10:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
2025-11-18 17:56:12 +10:00
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(ex, "Ошибка при выполнении загрузки данных из АИХ ИТ.");
|
2025-05-19 10:16:09 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-26 12:37:01 +10:00
|
|
|
|
private async Task SendBatchAsync(List<string> batch)
|
|
|
|
|
|
{
|
|
|
|
|
|
var sendResult = await mqService.SendAsync(mqSettings, batch.ToArray());
|
|
|
|
|
|
if (sendResult.IsSuccess)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation($"Данные переданы в RabbitMQ: {batch.Count}");
|
|
|
|
|
|
logger.LogDebug($"Отправлено сообщений: {batch.Count}, пример первого: {batch.FirstOrDefault()?.Substring(0, Math.Min(200, batch.FirstOrDefault()?.Length ?? 0))}...");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError($"Ошибка при передаче данных в RabbitMQ. Не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-19 10:16:09 +10:00
|
|
|
|
|
2025-11-18 17:56:12 +10:00
|
|
|
|
private List<Func<string, IEnumerable<IMainData>?>> GetServices(IAihitService service)
|
2025-05-19 10:16:09 +10:00
|
|
|
|
{
|
2025-11-19 11:52:41 +10:00
|
|
|
|
return new()
|
|
|
|
|
|
{
|
|
|
|
|
|
service.GetCvkData,
|
|
|
|
|
|
service.GetPtkData,
|
2025-12-24 11:22:12 +10:00
|
|
|
|
service.GetRegionalEKData,
|
|
|
|
|
|
service.GetStoData,
|
|
|
|
|
|
service.GetOrgData
|
2025-11-19 11:52:41 +10:00
|
|
|
|
};
|
2025-05-19 10:16:09 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|