feat(aihitLoader): добавлено зона "ОБЩЕЕ", данные отправляются сразу в очередь после получения от хп, чтобы не копить в памяти данные.

This commit is contained in:
Mikhail Kuznetsov
2025-12-26 12:37:01 +10:00
parent aa14499d3a
commit 450fd1d0a2
5 changed files with 108 additions and 88 deletions

View File

@@ -1,8 +1,20 @@
{ {
"Logging": { "Serilog": {
"LogLevel": { "MinimumLevel": {
"Default": "Information", "Default": "Debug",
"Microsoft.Hosting.Lifetime": "Information" "Override": {
"Microsoft": "Debug",
"Microsoft.Hosting.Lifetime": "Debug"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log/log-.txt",
"rollingInterval": "Day"
} }
} }
]
}
} }

View File

@@ -2,11 +2,14 @@
"ConnectionStrings": { "ConnectionStrings": {
"AihitConnection": "Data Source=10.248.19.97; Initial Catalog=mao2;User ID=awhit-ipp-parr;pwd=ET3h$9y1LH#D;TrustServerCertificate=true;" "AihitConnection": "Data Source=10.248.19.97; Initial Catalog=mao2;User ID=awhit-ipp-parr;pwd=ET3h$9y1LH#D;TrustServerCertificate=true;"
}, },
"Logging": { "Serilog": {
"LogLevel": { "MinimumLevel": {
"Default": "Information", "Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information" "Microsoft.Hosting.Lifetime": "Information"
} }
}
}, },
"WorkerSettings": { "WorkerSettings": {
"RepeatEvery": "12:00:00" "RepeatEvery": "12:00:00"
@@ -35,9 +38,10 @@
"76-СВРД", "76-СВРД",
"63-КБШ", "63-КБШ",
"83-ЗСИБ", "83-ЗСИБ",
"94-ЗАБ" "94-ЗАБ",
"ОБЩЕЕ"
], ],
"PackageSize": 100 "PackageSize": 1000
} }
} }

View File

@@ -55,37 +55,9 @@ namespace PARR.AIHITMainLoader
using (var scope = serviceProvider.CreateScope()) using (var scope = serviceProvider.CreateScope())
{ {
var aihitService = scope.ServiceProvider.GetRequiredService<IAihitService>(); var aihitService = scope.ServiceProvider.GetRequiredService<IAihitService>();
var services = GetServices(aihitService); var services = GetServices(aihitService);
var listToMq = new List<AihitMainDataMq>(); var currentBatch = new List<string>();
foreach (var service in services)
{
foreach (var responseArea in loaderSettings.ResponseAreas)
{
logger.LogDebug($"responseArea = {responseArea}");
var EKs = service.Invoke(responseArea);
if (EKs?.Any() == true)
{
foreach (var item in EKs)
{
if (item != null)
{
var mainData = item.ToMainData();
if (mainData != null)
listToMq.Add(mainData);
}
}
}
}
}
var preparedDataList = listToMq.Select(d => JsonSerializer.Serialize(d)).ToList();
int count = preparedDataList.Count;
int packageSize = loaderSettings.PackageSize; int packageSize = loaderSettings.PackageSize;
if (packageSize <= 0) if (packageSize <= 0)
@@ -94,21 +66,39 @@ namespace PARR.AIHITMainLoader
return; return;
} }
var parts = count == 0 ? 0 : (count + packageSize - 1) / packageSize; foreach (var service in services)
{
foreach (var responseArea in loaderSettings.ResponseAreas)
{
logger.LogDebug($"responseArea = {responseArea}");
var EKs = service.Invoke(responseArea);
for (var i = 0; i < parts; i++) if (EKs?.Any() != true) continue;
foreach (var item in EKs)
{ {
int start = i * packageSize; if (item == null) continue;
int length = Math.Min(packageSize, count - start);
var batch = preparedDataList.GetRange(start, length).ToArray(); var mainData = item.ToMainData();
var sendResult = await mqService.SendAsync(mqSettings, batch); if (mainData == null) continue;
if (sendResult.IsSuccess)
var json = JsonSerializer.Serialize(mainData);
currentBatch.Add(json);
// Отправка, если набрали полный пакет
if (currentBatch.Count >= packageSize)
{ {
logger.LogInformation($"Данные переданы в RabbitMQ: {batch.Count()}"); await SendBatchAsync(currentBatch);
logger.LogDebug($"Отправлено сообщений: {batch.Count()}, пример первого: {batch.FirstOrDefault()?.Substring(0, Math.Min(200, batch.FirstOrDefault()?.Length ?? 0))}..."); currentBatch.Clear();
} }
else }
logger.LogError($"Ошибка при передаче данных в Rabbit, не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}"); }
}
// Отправка остатка
if (currentBatch.Count > 0)
{
await SendBatchAsync(currentBatch);
} }
} }
} }
@@ -118,6 +108,20 @@ namespace PARR.AIHITMainLoader
} }
} }
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!)}");
}
}
private List<Func<string, IEnumerable<IMainData>?>> GetServices(IAihitService service) private List<Func<string, IEnumerable<IMainData>?>> GetServices(IAihitService service)
{ {

View File

@@ -95,7 +95,7 @@ namespace PARR.AIHITMainLoader.Models
public string? IsNotUnique { get; set; } public string? IsNotUnique { get; set; }
[Column("Холодный резерв")] [Column("Холодный резерв")]
public string? ColdReserve { get; set; } public int? ColdReserve { get; set; }
[Column("ДОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ")] [Column("ДОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ")]
public string? AdditionalInformation { get; set; } public string? AdditionalInformation { get; set; }
@@ -135,7 +135,7 @@ namespace PARR.AIHITMainLoader.Models
{"Тип сервера мониторинга", MonitoringServerType }, {"Тип сервера мониторинга", MonitoringServerType },
{"ОС", OSType }, {"ОС", OSType },
{"ЗО_РГ", WorkGroupResponseArea }, {"ЗО_РГ", WorkGroupResponseArea },
{"Холодный резерв", ColdReserve }, {"Холодный резерв", ColdReserve.ToString() },
{ОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ", AdditionalInformation }, {ОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ", AdditionalInformation },
} }
}; };

View File

@@ -124,7 +124,7 @@ namespace PARR.AIHITMainLoader.Services
try try
{ {
var result = context.Set<StoData>().FromSqlRaw($"EXEC mao2.dbo.sp_IPP_PARR_PTK_get_EK_ORG @зо", parameters.ToArray()).AsEnumerable(); var result = context.Set<OrgData>().FromSqlRaw($"EXEC mao2.dbo.sp_IPP_PARR_PTK_get_EK_ORG @зо", parameters.ToArray()).AsEnumerable();
if (result == null || !result.Any()) if (result == null || !result.Any())
{ {