feat(aihit): AIHITLoadWorker + AIHITSyncWorker

This commit is contained in:
Mikhail Kuznetsov
2024-02-05 14:45:09 +10:00
parent 2ee7ad9dd4
commit 3d71f4cbe9
24 changed files with 826 additions and 19 deletions

View File

@@ -0,0 +1,120 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PARR.AIHITLoader.Models;
using PARR.AIHITLoader.Services;
using PARR.AIHITLoader.Settings;
using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces;
using System.Globalization;
using System.Text.Json;
namespace PARR.AIHITLoader
{
internal class AihitLoader : IAihitLoader
{
private readonly IIntervalService intervalService;
private readonly ILogger<AihitLoader> logger;
private readonly WorkerSettings workerSettings;
private readonly LoaderSettings loaderSettings;
private readonly IMqService mqService;
private readonly MqSettings mqSettings;
private readonly IServiceProvider serviceProvider;
public AihitLoader(
IIntervalService intervalService,
ILogger<AihitLoader> logger,
WorkerSettings workerSettings,
LoaderSettings loaderSettings,
IMqService mqService,
MqSettings mqSettings,
IServiceProvider serviceProvider
)
{
this.intervalService = intervalService;
this.logger = logger;
this.workerSettings = workerSettings;
this.loaderSettings = loaderSettings;
this.mqService = mqService;
this.mqSettings = mqSettings;
this.serviceProvider = serviceProvider;
}
public async Task StartAsync()
{
logger.LogInformation("Запуск сервиса загрузки данных из АИХИТ.");
await intervalService.IntervalInitAsync(UploadDataAsync, workerSettings.RepeatEvery);
}
private async Task UploadDataAsync()
{
foreach (var respArea in loaderSettings.ResponseAreas)
{
var aihitData = GetDataFromAihit(respArea);
if (aihitData == null) return;
var filteredAIhitData = FilterData(aihitData);
var preparedData = filteredAIhitData.Select(d => JsonSerializer.Serialize(MapAihitToDomain(d)));
var parts = preparedData.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;
}
/// <summary>
/// Фильтруем входные данные из АИХ ИТ по необходимости. На первом этапе берём только эк по максе ВРТ-*
/// </summary>
/// <param name="aihitData"></param>
/// <returns></returns>
private List<EK> FilterData(List<EK> aihitData)
{
var vrt = aihitData.Where(ek => ek.EKFindCode!.StartsWith("ВРТ", true, CultureInfo.GetCultureInfo("ru-RU"))).ToList();
return vrt.Where(vrt => vrt.IP != null).ToList();
}
private List<EK>? GetDataFromAihit(string respArea)
{
using (var scope = serviceProvider.CreateScope())
{
var aihitService = scope.ServiceProvider.GetService<IAIHITService>();
if (aihitService == null)
throw new Exception("Не смог получить серивс IAIHITService, scope.ServiceProvider.GetService<IAIHITService>()");
return aihitService.GetEKList(respArea);
}
}
private AihitDataMq MapAihitToDomain(EK ek)
{
return new AihitDataMq
{
EK = ek.EKFindCode!,
IP = ek.IP,
APPType = ek.APPType,
DBType = ek.DBType,
OSType = ek.OSType,
WorkGroup = ek.WorkGroup,
Status = (ek.Status == "00-ГВЦ")? "99-ГВЦ": ek.Status!,
ResponseArea = ek.ResponseArea!
};
}
}
}