feat(aihit): В Loader добавлена процедура mao2.dbo.sp_IPP_PARR_PTK_get_EK_REG для загрузки данных по региональным ЭК
This commit is contained in:
@@ -5,29 +5,22 @@ namespace PARR.AIHITLoaderWorker
|
||||
public class Worker : BackgroundService
|
||||
{
|
||||
private readonly ILogger<Worker> _logger;
|
||||
private readonly IServiceProvider serviceProvider;
|
||||
private readonly IAihitMainLoader aihitMainLoader;
|
||||
|
||||
public Worker(
|
||||
ILogger<Worker> logger,
|
||||
IServiceProvider serviceProvider
|
||||
IAihitMainLoader aihitMainLoader
|
||||
)
|
||||
{
|
||||
_logger = logger;
|
||||
this.serviceProvider = serviceProvider;
|
||||
this.aihitMainLoader = aihitMainLoader;
|
||||
}
|
||||
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
using (var scope = serviceProvider.CreateScope())
|
||||
{
|
||||
var aihitLoader = scope.ServiceProvider.GetService<IAihitMainLoader>();
|
||||
|
||||
if (aihitLoader == null)
|
||||
throw new Exception("<22><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IAihitMainLoader, scope.ServiceProvider.GetService<IAihitMainLoader>()");
|
||||
|
||||
await aihitLoader.StartAsync();
|
||||
}
|
||||
await aihitMainLoader.StartAsync();
|
||||
await Task.Delay(Timeout.Infinite, stoppingToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,56 +48,78 @@ namespace PARR.AIHITMainLoader
|
||||
|
||||
|
||||
private async Task LoadDataAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
logger.LogInformation("Запуск загрузки данных из АИХ ИТ.");
|
||||
using (var scope = serviceProvider.CreateScope())
|
||||
{
|
||||
var aihitService = scope.ServiceProvider.GetService<IAihitService>();
|
||||
if (aihitService == null)
|
||||
throw new Exception($"Не найден сервис: {nameof(IAihitService)}");
|
||||
|
||||
var services = GetServices();
|
||||
var services = GetServices(aihitService);
|
||||
|
||||
var listToMq = new List<AihitMainDataMq>();
|
||||
|
||||
services.ForEach(service =>
|
||||
|
||||
foreach (var service in services)
|
||||
{
|
||||
loaderSettings.ResponseAreas.ForEach(responseArea =>
|
||||
foreach (var responseArea in loaderSettings.ResponseAreas)
|
||||
{
|
||||
logger.LogDebug($"responseArea = {responseArea}");
|
||||
var EKs = service.Invoke(responseArea);
|
||||
|
||||
if (EKs != null && EKs.Any())
|
||||
EKs.ToList().ForEach(item =>
|
||||
if (EKs?.Any() == true)
|
||||
{
|
||||
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++)
|
||||
foreach (var item in EKs)
|
||||
{
|
||||
var batch = preparedData.Skip(i * loaderSettings.PackageSize).Take(loaderSettings.PackageSize).ToList();
|
||||
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;
|
||||
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($"Список ЭК переданных в RabbitMQ: {string.Join(", ", batch)}");
|
||||
logger.LogDebug($"Отправлено сообщений: {batch.Count()}, пример первого: {batch.FirstOrDefault()?.Substring(0, Math.Min(200, batch.FirstOrDefault()?.Length ?? 0))}...");
|
||||
}
|
||||
else
|
||||
logger.LogError($"Ошибка при передаче данных в Rabbit, не переданные сообщения: {string.Join(", ", sendResult.NotSendMessages!)}");
|
||||
}
|
||||
|
||||
// await Task.CompletedTask;
|
||||
}
|
||||
} catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, "Ошибка при выполнении загрузки данных из АИХ ИТ.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using PARR.AIHITMainLoader.Models;
|
||||
using PARR.BLL.Domain.Mq;
|
||||
|
||||
namespace PARR.AIHITMainLoader.Context
|
||||
{
|
||||
@@ -10,5 +11,29 @@ namespace PARR.AIHITMainLoader.Context
|
||||
|
||||
public DbSet<CvkData> CvkDatas { get; set; }
|
||||
public DbSet<PtkData> PtkDatas { get; set; }
|
||||
public DbSet<PtkData> RegEKDatas { get; set; }
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
//Делаем это чтобы EF не пытался трекать объкты полученые из хранимой процедуры
|
||||
base.OnModelCreating(modelBuilder);
|
||||
|
||||
modelBuilder.Entity<CvkData>(entity =>
|
||||
{
|
||||
entity.HasNoKey();
|
||||
entity.ToView(null);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<PtkData>(entity =>
|
||||
{
|
||||
entity.HasNoKey();
|
||||
entity.ToView(null);
|
||||
});
|
||||
modelBuilder.Entity<RegEKData>(entity =>
|
||||
{
|
||||
entity.HasNoKey();
|
||||
entity.ToView(null);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
94
PARR.AIHITMainLoader/Models/RegEKData.cs
Normal file
94
PARR.AIHITMainLoader/Models/RegEKData.cs
Normal file
@@ -0,0 +1,94 @@
|
||||
using PARR.BLL.Domain.Mq;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
namespace PARR.AIHITMainLoader.Models
|
||||
{
|
||||
public class RegEKData : IMainData
|
||||
{
|
||||
[Column("ЗОНА_ОТВЕТСТВЕННОСТИ")]
|
||||
public string? ResponseArea { get; set; }
|
||||
|
||||
[Column("КАТЕГОРИЯ_ЭК")]
|
||||
public string? EKCategory { get; set; }
|
||||
|
||||
[Key]
|
||||
[Column("КОД_ПОИСКА_ЭК")]
|
||||
public string? EKFindCode { get; set; }
|
||||
|
||||
[Column("КРАТКОЕ_НАИМЕНОВАНИЕ")]
|
||||
public string? ShortName { get; set; }
|
||||
|
||||
[Column("МВЗ")]
|
||||
public string? MVZ { get; set; }
|
||||
|
||||
[Column("МОДЕЛЬ")]
|
||||
public string? Model { get; set; }
|
||||
|
||||
[Column("ОТВЕТСТВЕННЫЙ_ЗА_ЭК")]
|
||||
public string? ResponsibleByEK { get; set; }
|
||||
|
||||
[Column("ПОДКАТЕГОРИЯ_ЭК")]
|
||||
public string? EKSubCategory { get; set; }
|
||||
|
||||
[Column("ПРОИЗВОДИТЕЛЬ_РАЗРАБОТЧИК")]
|
||||
public string? Developer { get; set; }
|
||||
|
||||
[Column("РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК")]
|
||||
public string? WorkGroup { get; set; }
|
||||
|
||||
[Column("СТАТУС")]
|
||||
public string? Status { get; set; }
|
||||
|
||||
[Column("ТИП_ЭК")]
|
||||
public string? EKType { get; set; }
|
||||
|
||||
[Column("РГ_смены")]
|
||||
public string? ShiftWorkGroup { get; set; }
|
||||
|
||||
[Column("Сервер СПД")]
|
||||
public string? SPDServerType { get; set; }
|
||||
|
||||
[Column("Сервер БИР")]
|
||||
public string? BIRServerType { get; set; }
|
||||
|
||||
[Column("АКТИВЕН")]
|
||||
public int Active { get; set; }
|
||||
|
||||
[Column("НЕУНИКАЛЬНЫЙ_ЭК")]
|
||||
public int IsNotUnique { get; set; }
|
||||
|
||||
[Column("ЗО_РГ")]
|
||||
public string? WorkGroupResponseArea { get; set; }
|
||||
|
||||
|
||||
public AihitMainDataMq ToMainData()
|
||||
{
|
||||
return new AihitMainDataMq
|
||||
{
|
||||
Name = EKFindCode!,//TODO Ты прям уверен???
|
||||
Properties = new Dictionary<string, string?>
|
||||
{
|
||||
{"ЗОНА_ОТВЕТСТВЕННОСТИ", ResponseArea },
|
||||
{"КАТЕГОРИЯ_ЭК", EKCategory },
|
||||
{"КРАТКОЕ_НАИМЕНОВАНИЕ", ShortName },
|
||||
{"MVZ", MVZ },
|
||||
{"МОДЕЛЬ", Model },
|
||||
{"ОТВЕТСТВЕННЫЙ_ЗА_ЭК", ResponsibleByEK },
|
||||
{"ПОДКАТЕГОРИЯ_ЭК", EKSubCategory },
|
||||
{"ПРОИЗВОДИТЕЛЬ_РАЗРАБОТЧИК", Developer },
|
||||
{"РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК", WorkGroup },
|
||||
{"СТАТУС", Status },
|
||||
{"ТИП_ЭК", EKType },
|
||||
{"РГ_смены", ShiftWorkGroup },
|
||||
{"Сервер СПД", SPDServerType },
|
||||
{"Сервер БИР", BIRServerType },
|
||||
{"АКТИВЕН", Active.ToString() },
|
||||
{"НЕУНИКАЛЬНЫЙ_ЭК", IsNotUnique.ToString() },
|
||||
{"ЗО_РГ", WorkGroupResponseArea },
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,5 +67,30 @@ namespace PARR.AIHITMainLoader.Services
|
||||
|
||||
return new List<IMainData>();
|
||||
}
|
||||
|
||||
|
||||
|
||||
public IEnumerable<IMainData>? GetRegionalEKData(string respArea)
|
||||
{
|
||||
var parameters = new List<SqlParameter>() { new SqlParameter("@зо", respArea) };
|
||||
|
||||
try
|
||||
{
|
||||
var result = context.Set<RegEKData>().FromSqlRaw($"EXEC mao2.dbo.sp_IPP_PARR_PTK_get_EK_REG @зо", parameters.ToArray()).AsEnumerable();
|
||||
|
||||
if (result == null || !result.Any())
|
||||
{
|
||||
logger.LogWarning($"Процедура sp_IPP_PARR_PTK_get_EK_REG вернула пустой список ЭК");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, $"Ошибка при выполнении ХП sp_IPP_PARR_PTK_get_EK_REG({respArea})");
|
||||
}
|
||||
|
||||
return new List<IMainData>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,5 +6,6 @@ namespace PARR.AIHITMainLoader.Services
|
||||
{
|
||||
IEnumerable<IMainData>? GetPtkData(string respArea);
|
||||
IEnumerable<IMainData>? GetCvkData(string respArea);
|
||||
IEnumerable<IMainData>? GetRegionalEKData(string respArea);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user