diff --git a/PARR.AIHITLoaderWorker/Worker.cs b/PARR.AIHITLoaderWorker/Worker.cs index b343b356..e8bb52d3 100644 --- a/PARR.AIHITLoaderWorker/Worker.cs +++ b/PARR.AIHITLoaderWorker/Worker.cs @@ -5,29 +5,22 @@ namespace PARR.AIHITLoaderWorker public class Worker : BackgroundService { private readonly ILogger _logger; - private readonly IServiceProvider serviceProvider; + private readonly IAihitMainLoader aihitMainLoader; public Worker( ILogger 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(); - - if (aihitLoader == null) - throw new Exception(" IAihitMainLoader, scope.ServiceProvider.GetService()"); - - await aihitLoader.StartAsync(); - } + await aihitMainLoader.StartAsync(); + await Task.Delay(Timeout.Infinite, stoppingToken); } } } diff --git a/PARR.AIHITMainLoader/AihitMainLoader.cs b/PARR.AIHITMainLoader/AihitMainLoader.cs index 3fa57b1e..2087ba8c 100644 --- a/PARR.AIHITMainLoader/AihitMainLoader.cs +++ b/PARR.AIHITMainLoader/AihitMainLoader.cs @@ -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 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(); - - 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(); + 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(); + + + 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?>> GetServices() + private List?>> GetServices(IAihitService service) { var serviceList = new List?>>(); - serviceList.Add(aihitService.GetCvkData); - serviceList.Add(aihitService.GetPtkData); + serviceList.Add(service.GetCvkData); + serviceList.Add(service.GetPtkData); + serviceList.Add(service.GetRegionalEKData); return serviceList; } diff --git a/PARR.AIHITMainLoader/Context/AIHITContext.cs b/PARR.AIHITMainLoader/Context/AIHITContext.cs index 771a1b2b..73047204 100644 --- a/PARR.AIHITMainLoader/Context/AIHITContext.cs +++ b/PARR.AIHITMainLoader/Context/AIHITContext.cs @@ -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 CvkDatas { get; set; } public DbSet PtkDatas { get; set; } + public DbSet RegEKDatas { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + //Делаем это чтобы EF не пытался трекать объкты полученые из хранимой процедуры + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity(entity => + { + entity.HasNoKey(); + entity.ToView(null); + }); + + modelBuilder.Entity(entity => + { + entity.HasNoKey(); + entity.ToView(null); + }); + modelBuilder.Entity(entity => + { + entity.HasNoKey(); + entity.ToView(null); + }); + } } } diff --git a/PARR.AIHITMainLoader/Models/RegEKData.cs b/PARR.AIHITMainLoader/Models/RegEKData.cs new file mode 100644 index 00000000..7e643319 --- /dev/null +++ b/PARR.AIHITMainLoader/Models/RegEKData.cs @@ -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 + { + {"ЗОНА_ОТВЕТСТВЕННОСТИ", ResponseArea }, + {"КАТЕГОРИЯ_ЭК", EKCategory }, + {"КРАТКОЕ_НАИМЕНОВАНИЕ", ShortName }, + {"MVZ", MVZ }, + {"МОДЕЛЬ", Model }, + {"ОТВЕТСТВЕННЫЙ_ЗА_ЭК", ResponsibleByEK }, + {"ПОДКАТЕГОРИЯ_ЭК", EKSubCategory }, + {"ПРОИЗВОДИТЕЛЬ_РАЗРАБОТЧИК", Developer }, + {"РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК", WorkGroup }, + {"СТАТУС", Status }, + {"ТИП_ЭК", EKType }, + {"РГ_смены", ShiftWorkGroup }, + {"Сервер СПД", SPDServerType }, + {"Сервер БИР", BIRServerType }, + {"АКТИВЕН", Active.ToString() }, + {"НЕУНИКАЛЬНЫЙ_ЭК", IsNotUnique.ToString() }, + {"ЗО_РГ", WorkGroupResponseArea }, + } + }; + } + } +} + diff --git a/PARR.AIHITMainLoader/Services/AihitService.cs b/PARR.AIHITMainLoader/Services/AihitService.cs index 12218d60..6fa8b1fe 100644 --- a/PARR.AIHITMainLoader/Services/AihitService.cs +++ b/PARR.AIHITMainLoader/Services/AihitService.cs @@ -67,5 +67,30 @@ namespace PARR.AIHITMainLoader.Services return new List(); } + + + + public IEnumerable? GetRegionalEKData(string respArea) + { + var parameters = new List() { new SqlParameter("@зо", respArea) }; + + try + { + var result = context.Set().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(); + } } } diff --git a/PARR.AIHITMainLoader/Services/IAihitService.cs b/PARR.AIHITMainLoader/Services/IAihitService.cs index 6676ad4d..dfacbc51 100644 --- a/PARR.AIHITMainLoader/Services/IAihitService.cs +++ b/PARR.AIHITMainLoader/Services/IAihitService.cs @@ -6,5 +6,6 @@ namespace PARR.AIHITMainLoader.Services { IEnumerable? GetPtkData(string respArea); IEnumerable? GetCvkData(string respArea); + IEnumerable? GetRegionalEKData(string respArea); } }