feat(aihit): В Loader добавлена процедура mao2.dbo.sp_IPP_PARR_PTK_get_EK_REG для загрузки данных по региональным ЭК

This commit is contained in:
Mikhail Kuznetsov
2025-11-18 17:56:12 +10:00
parent c3c6ab787e
commit 629a487875
6 changed files with 212 additions and 51 deletions

View File

@@ -1,4 +1,5 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.AIHITMainLoader.Models;
using PARR.AIHITMainLoader.Services;
using PARR.AIHITMainLoader.Settings;
@@ -15,8 +16,8 @@ namespace PARR.AIHITMainLoader
private readonly WorkerSettings workerSettings;
private readonly LoaderSettings loaderSettings;
private readonly MqSettings mqSettings;
private readonly IAihitService aihitService;
private readonly IMqService mqService;
private readonly IServiceProvider serviceProvider;
public AihitMainLoader(
ILogger<AihitMainLoader> logger,
@@ -24,8 +25,8 @@ namespace PARR.AIHITMainLoader
WorkerSettings workerSettings,
LoaderSettings loaderSettings,
MqSettings mqSettings,
IAihitService aihitService,
IMqService mqService
IMqService mqService,
IServiceProvider serviceProvider
)
{
this.logger = logger;
@@ -33,8 +34,8 @@ namespace PARR.AIHITMainLoader
this.workerSettings = workerSettings;
this.loaderSettings = loaderSettings;
this.mqSettings = mqSettings;
this.aihitService = aihitService;
this.mqService = mqService;
this.serviceProvider = serviceProvider;
}
@@ -48,55 +49,77 @@ namespace PARR.AIHITMainLoader
private async Task LoadDataAsync()
{
logger.LogInformation("Запуск загрузки данных из АИХ ИТ.");
var services = GetServices();
var listToMq = new List<AihitMainDataMq>();
services.ForEach(service =>
try
{
loaderSettings.ResponseAreas.ForEach(responseArea =>
logger.LogInformation("Запуск загрузки данных из АИХ ИТ.");
using (var scope = serviceProvider.CreateScope())
{
logger.LogDebug($"responseArea = {responseArea}");
var EKs = service.Invoke(responseArea);
var aihitService = scope.ServiceProvider.GetService<IAihitService>();
if (aihitService == null)
throw new Exception($"Не найден сервис: {nameof(IAihitService)}");
if (EKs != null && EKs.Any())
EKs.ToList().ForEach(item =>
var services = GetServices(aihitService);
var listToMq = new List<AihitMainDataMq>();
foreach (var service in services)
{
foreach (var responseArea in loaderSettings.ResponseAreas)
{
listToMq.Add(item.ToMainData());
});
});
});
logger.LogDebug($"responseArea = {responseArea}");
var EKs = service.Invoke(responseArea);
var preparedData = listToMq.Select(d => JsonSerializer.Serialize(d));
if (EKs?.Any() == true)
{
foreach (var item in EKs)
{
if (item != null)
{
var mainData = item.ToMainData();
if (mainData != null)
listToMq.Add(mainData);
}
}
}
}
}
var parts = listToMq.Count() / loaderSettings.PackageSize;
parts++;
var preparedDataList = listToMq.Select(d => JsonSerializer.Serialize(d)).ToList();
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)}");
int count = preparedDataList.Count;
int packageSize = loaderSettings.PackageSize;
var parts = count == 0 ? 0 : (count + packageSize - 1) / packageSize;
for (var i = 0; i < (count + packageSize - 1) / packageSize; i++)
{
int start = i * packageSize;
int length = Math.Min(packageSize, count - start);
var batch = preparedDataList.GetRange(start, length).ToArray();
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($"Ошибка при передаче данных в Rabbit, не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}");
}
}
else
logger.LogError($"Ошибка при передаче данных в Rabbit, не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}");
} catch (Exception ex)
{
logger.LogError(ex, "Ошибка при выполнении загрузки данных из АИХ ИТ.");
}
// await Task.CompletedTask;
}
private List<Func<string, IEnumerable<IMainData>?>> GetServices()
private List<Func<string, IEnumerable<IMainData>?>> GetServices(IAihitService service)
{
var serviceList = new List<Func<string, IEnumerable<IMainData>?>>();
serviceList.Add(aihitService.GetCvkData);
serviceList.Add(aihitService.GetPtkData);
serviceList.Add(service.GetCvkData);
serviceList.Add(service.GetPtkData);
serviceList.Add(service.GetRegionalEKData);
return serviceList;
}