From e9cd70e91073be697496b0aafb74147d22b08054 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Mon, 5 Feb 2024 16:56:44 +1000 Subject: [PATCH] =?UTF-8?q?refactor(aihit):=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D0=B9=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=20=D1=81=D0=B8=D0=BD=D1=85=D1=80?= =?UTF-8?q?=D0=BE=D0=BD=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D0=B8=20aihit.=20?= =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B0=D0=B1?= =?UTF-8?q?=D0=BB=D0=B8=D1=86=D1=8B=20=D0=B8=D0=B7=20=D0=91=D0=94.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.AIHIT/AIHIT/Context/AIHITContext.cs | 15 - PARR.AIHIT/AIHIT/ISyncher.cs | 7 - .../AIHIT/MappingProfiles/RequestToDomain.cs | 48 - .../Resolvers/EkStatusCodeResolver.cs | 24 - .../Resolvers/ResponseAreaCodeResolver.cs | 27 - PARR.AIHIT/AIHIT/Models/EK.cs | 100 - PARR.AIHIT/AIHIT/PARR.AIHIT.csproj | 21 - .../AIHIT/Properties/launchSettings.json | 12 - PARR.AIHIT/AIHIT/Services/AIHITService.cs | 42 - PARR.AIHIT/AIHIT/Services/IAIHITService.cs | 9 - PARR.AIHIT/AIHIT/Settings/SyncherSettings.cs | 10 - PARR.AIHIT/AIHIT/Syncher.cs | 376 --- PARR.AIHIT/AIHIT/SyncherInstaller.cs | 45 - PARR.API.sln | 28 +- PARR.DAL/Context/DataContext.cs | 30 - .../20240205064510_removeTblAihit.Designer.cs | 2527 +++++++++++++++++ .../20240205064510_removeTblAihit.cs | 135 + .../Migrations/DataContextModelSnapshot.cs | 347 --- PARR.DAL/Models/AIHIT/RawDataEK.cs | 60 - PARR.DAL/Models/AIHIT/Setting.cs | 21 - PARR.DAL/ParrDalInstaller.cs | 4 - .../Implementations/AIHIT/RawDataEKService.cs | 39 - .../Implementations/AIHIT/SettingService.cs | 23 - .../Interfaces/AIHIT/IRawDataEKService.cs | 9 - .../Interfaces/AIHIT/ISettingService.cs | 8 - PARR.Worker/PARR.Worker/Dockerfile | 33 - .../PARR.Worker/PARR.AIHITWorker.csproj | 26 - PARR.Worker/PARR.Worker/Program.cs | 33 - .../Properties/launchSettings.json | 14 - .../PARR.Worker/Settings/WorkerSettings.cs | 7 - PARR.Worker/PARR.Worker/Worker.cs | 72 - .../PARR.Worker/appsettings.Development.json | 44 - PARR.Worker/PARR.Worker/appsettings.json | 45 - README.md | 8 +- 34 files changed, 2675 insertions(+), 1574 deletions(-) delete mode 100644 PARR.AIHIT/AIHIT/Context/AIHITContext.cs delete mode 100644 PARR.AIHIT/AIHIT/ISyncher.cs delete mode 100644 PARR.AIHIT/AIHIT/MappingProfiles/RequestToDomain.cs delete mode 100644 PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/EkStatusCodeResolver.cs delete mode 100644 PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/ResponseAreaCodeResolver.cs delete mode 100644 PARR.AIHIT/AIHIT/Models/EK.cs delete mode 100644 PARR.AIHIT/AIHIT/PARR.AIHIT.csproj delete mode 100644 PARR.AIHIT/AIHIT/Properties/launchSettings.json delete mode 100644 PARR.AIHIT/AIHIT/Services/AIHITService.cs delete mode 100644 PARR.AIHIT/AIHIT/Services/IAIHITService.cs delete mode 100644 PARR.AIHIT/AIHIT/Settings/SyncherSettings.cs delete mode 100644 PARR.AIHIT/AIHIT/Syncher.cs delete mode 100644 PARR.AIHIT/AIHIT/SyncherInstaller.cs create mode 100644 PARR.DAL/Migrations/20240205064510_removeTblAihit.Designer.cs create mode 100644 PARR.DAL/Migrations/20240205064510_removeTblAihit.cs delete mode 100644 PARR.DAL/Models/AIHIT/RawDataEK.cs delete mode 100644 PARR.DAL/Models/AIHIT/Setting.cs delete mode 100644 PARR.DAL/Services/Implementations/AIHIT/RawDataEKService.cs delete mode 100644 PARR.DAL/Services/Implementations/AIHIT/SettingService.cs delete mode 100644 PARR.DAL/Services/Interfaces/AIHIT/IRawDataEKService.cs delete mode 100644 PARR.DAL/Services/Interfaces/AIHIT/ISettingService.cs delete mode 100644 PARR.Worker/PARR.Worker/Dockerfile delete mode 100644 PARR.Worker/PARR.Worker/PARR.AIHITWorker.csproj delete mode 100644 PARR.Worker/PARR.Worker/Program.cs delete mode 100644 PARR.Worker/PARR.Worker/Properties/launchSettings.json delete mode 100644 PARR.Worker/PARR.Worker/Settings/WorkerSettings.cs delete mode 100644 PARR.Worker/PARR.Worker/Worker.cs delete mode 100644 PARR.Worker/PARR.Worker/appsettings.Development.json delete mode 100644 PARR.Worker/PARR.Worker/appsettings.json diff --git a/PARR.AIHIT/AIHIT/Context/AIHITContext.cs b/PARR.AIHIT/AIHIT/Context/AIHITContext.cs deleted file mode 100644 index da793ca6..00000000 --- a/PARR.AIHIT/AIHIT/Context/AIHITContext.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using PARR.AIHIT.Models; - -namespace PARR.AIHIT.Context -{ - internal class AIHITContext : DbContext - { - public AIHITContext(DbContextOptions options) : base(options) { } - - - - public DbSet EKs { get; set; } - - } -} diff --git a/PARR.AIHIT/AIHIT/ISyncher.cs b/PARR.AIHIT/AIHIT/ISyncher.cs deleted file mode 100644 index 4e2913c9..00000000 --- a/PARR.AIHIT/AIHIT/ISyncher.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace PARR.AIHIT -{ - public interface ISyncher - { - Task InvokeFromDatabase(); - } -} diff --git a/PARR.AIHIT/AIHIT/MappingProfiles/RequestToDomain.cs b/PARR.AIHIT/AIHIT/MappingProfiles/RequestToDomain.cs deleted file mode 100644 index a1c47e7f..00000000 --- a/PARR.AIHIT/AIHIT/MappingProfiles/RequestToDomain.cs +++ /dev/null @@ -1,48 +0,0 @@ -using AutoMapper; -using PARR.AIHIT.MappingProfiles.Resolvers; -using PARR.AIHIT.Models; -using PARR.DAL.Models; -using PARR.DAL.Models.AIHIT; - -namespace PARR.AIHIT.MappingProfiles -{ - internal class RequestToDomain : Profile - { - public RequestToDomain() - { - //CreateMap() - // .ForMember(d => d.HostName, o => o.MapFrom(s => (s.Attributes!["ХОСТ"] != null) ? s.Attributes!["ХОСТ"]!.Value.Trim() : "")) - // .ForMember(d => d.IP, o => o.MapFrom(s => s.Attributes!["IP_АДРЕС"]!.Value.Trim())) - // .ForMember(d => d.RegionalEK, o => o.MapFrom(s => s.Attributes!["РЕГИОНАЛЬНЫЙ_ЭК"]!.Value.Trim())) - // .ForMember(d => d.LinkEK, o => o.MapFrom(s => s.Attributes!["СВЯЗАННЫЙ_ЭК"]!.Value.Trim())) - // .ForMember(d => d.Status, o => o.MapFrom(s => s.Attributes!["СТАТУС"]!.Value.Trim())) - // .ForMember(d => d.WorkGroup, o => o.MapFrom(s => (s.Attributes!["РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК"] != null) ? s.Attributes!["РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК"]!.Value.Trim() : "")) - // .ForMember(d => d.Responsible, o => o.MapFrom(s => s.Attributes!["ОТВЕТСТВЕННЫЙ_ЗА_ЭК"]!.Value.Trim())); - - CreateMap() - .ForMember(d => d.Ek, o => o.MapFrom(s => s.EKFindCode))//TODO Определить имя хоста по - .ForMember(d => d.IP, o => o.MapFrom(s => s.IP)) - .ForMember(d => d.EkStatusCode, o => o.MapFrom()) - //.ForMember(d => d.StatusStr, o => o.MapFrom(s => s.Status)) - .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.WorkGroup)) - .ForMember(d => d.ResponseAreaCode, o => o.MapFrom()) - .ForMember(d => d.ResponseArea, o => o.Ignore()); - //.ForMember(d => d.ResponseAreaStr, o => o.MapFrom(s => s.ResponseArea)); - //CreateMap() - // .ForMember(d => d.HostName, o => o.MapFrom(s => s.HostName)) - // .ForMember(d => d.IP, o => o.MapFrom(s => s.IP)) - // .ForMember(d => d.RegionalEK, o => o.MapFrom(s => s.RegionalEK)) - // .ForMember(d => d.LinkEK, o => o.MapFrom(s => s.LinkEK)) - // .ForMember(d => d.Status, o => o.MapFrom(s => s.Status)) - // .ForMember(d => d.WorkGroup, o => o.MapFrom(s => s.WorkGroup)) - // .ForMember(d => d.Responsible, o => o.MapFrom(s => s.Responsible)) - // .ForMember(d => d.OS, o => o.MapFrom(s => s.OS)) - // .ForMember(d => d.DB, o => o.MapFrom(s => s.DB)) - // .ForMember(d => d.APP, o => o.MapFrom(s => s.APP)); - - CreateMap(); - - - } - } -} diff --git a/PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/EkStatusCodeResolver.cs b/PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/EkStatusCodeResolver.cs deleted file mode 100644 index 4d5cead8..00000000 --- a/PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/EkStatusCodeResolver.cs +++ /dev/null @@ -1,24 +0,0 @@ -using AutoMapper; -using PARR.DAL.Contracts; -using PARR.DAL.Models; -using PARR.DAL.Models.AIHIT; -using System.Text.RegularExpressions; - -namespace PARR.AIHIT.MappingProfiles.Resolvers -{ - internal class EkStatusCodeResolver : IValueResolver - { - public int Resolve(RawDataEK source, Host destination, int destMember, ResolutionContext context) - { - var pattern = "\\d+"; - var regex = new Regex(pattern); - - int.TryParse(regex.Match(source.Status!).Value, out int result); - - if (!Enum.IsDefined(typeof(EkStatusEnum), result)) - throw new Exception($"Неверный статус ЭК {source.Status}"); - - return result; - } - } -} diff --git a/PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/ResponseAreaCodeResolver.cs b/PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/ResponseAreaCodeResolver.cs deleted file mode 100644 index 22e51751..00000000 --- a/PARR.AIHIT/AIHIT/MappingProfiles/Resolvers/ResponseAreaCodeResolver.cs +++ /dev/null @@ -1,27 +0,0 @@ -using AutoMapper; -using PARR.DAL.Contracts; -using PARR.DAL.Models; -using PARR.DAL.Models.AIHIT; -using System.Text.RegularExpressions; - -namespace PARR.AIHIT.MappingProfiles.Resolvers -{ - internal class ResponseAreaCodeResolver : IValueResolver - { - public int Resolve(RawDataEK source, Host destination, int destMember, ResolutionContext context) - { - var pattern = "\\d+"; - var regex = new Regex(pattern); - - int.TryParse(regex.Match(source.ResponseArea!).Value, out int result); - - if (result == 0) - return (int)ResponseAreaEnum.gvc; - - if (!Enum.IsDefined(typeof(ResponseAreaEnum), result)) - throw new Exception($"Неверный код дороги {source.ResponseArea}"); - - return result; - } - } -} diff --git a/PARR.AIHIT/AIHIT/Models/EK.cs b/PARR.AIHIT/AIHIT/Models/EK.cs deleted file mode 100644 index 1005beeb..00000000 --- a/PARR.AIHIT/AIHIT/Models/EK.cs +++ /dev/null @@ -1,100 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace PARR.AIHIT.Models -{ - public class EK - { - [Column("IP_АДРЕС")] - public string? IP { get; set; } - [Column("МЕТКА")] - public string? Metka { get; set; } - [Column("АКТИВЕН")] - public string? IsActive { get; set; } - [Column("ВАЖНЫЙ_ЭК")] - public string? IsImportant { get; set; } - [Column("ВРЕМЯ_СОЗДАНИЯ")] - public DateTime? CreateTime { get; set; } - [Column("ДОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ")] - public string? AdditionalInfo { get; set; } - [Column("ЗОНА_ОТВЕТСТВЕННОСТИ")] - public string? ResponseArea { get; set; } - [Column("КАТЕГОРИЯ_ЭК")] - public string? EKCategory { get; set; } - [Column("КОД_ПОИСКА_ЭК")] - public string? EKFindCode { get; set; } - [Column("КОД_ПРОДУКТА")] - public string? ProductCode { get; set; } - [Column("КОД_УСЛУГИ")] - public string? ServiceCode { get; set; } - [Column("КРАТКОЕ_НАИМЕНОВАНИЕ")] - public string? ShortName { get; set; } - [Column("ОТВЕТСТВЕННЫЙ_ЗА_ЭК")] - public string? ResponsibleByEK { get; set; } - [Column("ПЛАНОВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ")] - public DateTime? PlannedTimeToRepair { get; set; } - [Column("ПОДКАТЕГОРИЯ_ЭК")] - public string? EKSubCategory { get; set; } - [Column("ПОЛНОЕ_НАИМЕНОВАНИЕ")] - public string? FullName { get; set; } - [Column("ПРЕДПИСАНИЕ")] - public string? Prescription { get; set; } - [Column("ПРЕДПРИЯТИЕ")] - public string? Company { get; set; } - [Column("РАБОЧАЯ_ГР_ОТВ_ЗА_ЭК")] - public string? WorkGroup { get; set; } - [Column("РАСПОЛОЖЕНИЕ")] - public string? Location { get; set; } - [Column("РЕВИЗОР_ЭК")] - public string? EKRevizor { get; set; } - [Column("РЕГИСТРАТОР_ЭК")] - public string? EKRegister { get; set; } - [Column("СЕТЕВОЕ_ИМЯ")] - public string? NetworkName { get; set; } - [Column("СТАТУС")] - public string? Status { get; set; } - [Column("ТИП_ЭК")] - public string? EKType { get; set; } - [Column("ФАКТИЧЕСКОЕ_ЗАВЕРШЕНИЕ_ЭКСПЛУАТАЦИИ")] - public DateTime? EndExplotationDate { get; set; } - [Column("ФАКТИЧЕСКОЕ_НАЧАЛО_ЭКСПЛУАТАЦИИ")] - public DateTime? StartExplotationDate { get; set; } - [Column("ЦЕЛЕВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ")] - public string? TargetRepairTime { get; set; } - [Column("SYSMODTIME")] - public DateTime? SysModTime { get; set; } - [Column("SYSMODUSER")] - public string? SysModUser { get; set; } - [Column("НОВЫЙ_КОД_ПОИСКА")] - public string? NewEKFindCode { get; set; } - [Column("СТАРЫЙ_КОД_ПОИСКА")] - public string? OldEKFindCode { get; set; } - [Column("НАПРАВЛЕНИЕ_ЦТС_ЦК")] - public string? CTSDirection { get; set; } - [Key] - [Column("ID")] - public int? AIHID { get; set; } - [Column("недостоверные_данные")] - public char? IsUnreliableData { get; set; } - [Column("РГ_смены")] - public string? ShiftWorkGroup { get; set; } - [Column("Клиентское_ПО")] - public string? ClientSoftware { get; set; } - [Column("Клиентская_ОС")] - public string? ClientOS { get; set; } - [Column("Тип СУБД")] - public string? DBType { get; set; } - [Column("Тип сервера приложений")] - public string? APPType { get; set; } - [Column("Тип сервера ЦК БС")] - public string? CKBSServerType { get; set; } - [Column("Тип сервера ИБ")] - public string? IBServerType { get; set; } - [Column("Тип сервера инфраструктуры")] - public string? InfrastructureServerType { get; set; } - [Column("Тип сервера мониторинга")] - public string? MonitoringServerType { get; set; } - [Column("ОС")] - public string? OSType { get; set; } - } -} diff --git a/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj b/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj deleted file mode 100644 index fdfd5289..00000000 --- a/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - net7.0 - enable - enable - - - - - - - - - - - - - - - diff --git a/PARR.AIHIT/AIHIT/Properties/launchSettings.json b/PARR.AIHIT/AIHIT/Properties/launchSettings.json deleted file mode 100644 index 16f66015..00000000 --- a/PARR.AIHIT/AIHIT/Properties/launchSettings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "profiles": { - "PARR.AIHIT": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "https://localhost:1090;http://localhost:1092" - } - } -} \ No newline at end of file diff --git a/PARR.AIHIT/AIHIT/Services/AIHITService.cs b/PARR.AIHIT/AIHIT/Services/AIHITService.cs deleted file mode 100644 index 6fe45b29..00000000 --- a/PARR.AIHIT/AIHIT/Services/AIHITService.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Microsoft.Data.SqlClient; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; -using PARR.AIHIT.Context; -using PARR.AIHIT.Models; - -namespace PARR.AIHIT.Services -{ - internal class AIHITService : IAIHITService - { - private readonly AIHITContext context; - private readonly ILogger logger; - - public AIHITService(AIHITContext context, ILogger logger) - { - this.context = context; - this.logger = logger; - } - public List? GetEKList(string respArea) - { - var parameters = new List() { new SqlParameter("@зо",respArea)}; - - try - { - var result = context.Set().FromSqlRaw($"EXEC mao2.dbo.sp_IPP_PARR_PTK_get_EK @зо", parameters.ToArray()).ToList(); - - if (result == null || !result.Any()) - { - logger.LogWarning($"Процедура sp_IPP_PARR_PTK_get_EK вернула пустой список ЭК"); - } - - return result; - } - catch (Exception ex) - { - logger.LogError(ex, $"Ошибка при выполнении ХП sp_IPP_PARR_PTK_get_EK({respArea})"); - } - - return null; - } - } -} diff --git a/PARR.AIHIT/AIHIT/Services/IAIHITService.cs b/PARR.AIHIT/AIHIT/Services/IAIHITService.cs deleted file mode 100644 index afd88db4..00000000 --- a/PARR.AIHIT/AIHIT/Services/IAIHITService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using PARR.AIHIT.Models; - -namespace PARR.AIHIT.Services -{ - internal interface IAIHITService - { - List? GetEKList(string respArea); - } -} diff --git a/PARR.AIHIT/AIHIT/Settings/SyncherSettings.cs b/PARR.AIHIT/AIHIT/Settings/SyncherSettings.cs deleted file mode 100644 index b81a3050..00000000 --- a/PARR.AIHIT/AIHIT/Settings/SyncherSettings.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace PARR.AIHIT.Settings -{ - internal class SyncherSettings - { - public int OccursEvery { get; set; } - public string? IncludeAddresses { get; set; } - - public List IncludeAddressesArray => IncludeAddresses == null ? new List() : IncludeAddresses.Split(",").ToList(); - } -} diff --git a/PARR.AIHIT/AIHIT/Syncher.cs b/PARR.AIHIT/AIHIT/Syncher.cs deleted file mode 100644 index 7e2d27c5..00000000 --- a/PARR.AIHIT/AIHIT/Syncher.cs +++ /dev/null @@ -1,376 +0,0 @@ -using AutoMapper; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; -using PARR.AIHIT.Services; -using PARR.DAL.Contracts; -using PARR.DAL.Extensions; -using PARR.DAL.Models; -using PARR.DAL.Models.AIHIT; -using PARR.DAL.Services.Interfaces; -using PARR.DAL.Services.Interfaces.AIHIT; -using System.Text; - -namespace PARR.AIHIT -{ - internal class Syncher : ISyncher - { - private readonly ILogger logger; - private readonly IHostService hostService; - private readonly IMapper mapper; - private readonly IApplicationService appService; - private readonly IApplicationTypeService appTypeService; - private readonly IApplicationInHostService appInHostService; - private readonly IRawDataEKService rawDataEKService; - private readonly ISettingService settingService; - private readonly IAIHITService aihitService; - - public List AppTypes { get; private set; } = new List(); - - public Syncher( - ILogger logger, - IHostService hostService, - IMapper mapper, - IApplicationService appService, - IApplicationTypeService appTypeService, - IApplicationInHostService appInHostService, - IRawDataEKService rawDataEKService, - ISettingService settingService, - IAIHITService aihitService - ) - { - this.hostService = hostService; - this.mapper = mapper; - this.appService = appService; - this.appTypeService = appTypeService; - this.appInHostService = appInHostService; - this.rawDataEKService = rawDataEKService; - this.settingService = settingService; - this.aihitService = aihitService; - this.logger = logger; - } - - private async Task GetAppTypesAsync() - { - AppTypes = await appTypeService.Get().ToListAsync(); - } - - - public async Task InvokeFromDatabase() - { - await GetAppTypesAsync(); - - //Получаем зоны ответственности из БД - var respAreas = await settingService.Get() - .Where(ra => ra.Group == AIHTITSettings.RespAreaGroupName) - .ToListAsync(); -#if !DEBUG - //Запускаем хранимую процедуру в АИХ ИТ и складываем в таблицу RawDataEKs, предварительно почистив старые данные - foreach (var respArea in respAreas) - { - logger.LogDebug($"-= Получение данных об ЭК зоны ответственности {respArea.Name} =-"); - var eksFromAIHIT = aihitService.GetEKList(respArea.Value)?.ToList(); - - if (eksFromAIHIT == null) - continue; - - //Удаляем текущие данные по зоне ответственности respArea - logger.LogDebug($"-= Удаление существующих данных об ЭК зоны ответственности {respArea.Name} =-"); - var toDelete = rawDataEKService.Get().Where(rd => rd.ResponseArea == respArea.Value).ToList(); - toDelete.ForEach(d => rawDataEKService.Delete(d)); - - if(!await rawDataEKService.CommitAsync()) - { - logger.LogError($"Не удалось создать удалить записи в rawDataEK зоны ответственности {respArea.Name}"); - continue; - } - - logger.LogDebug($"-= Создание новых записей об ЭК зоны ответственности {respArea.Name} =-"); - foreach (var ek in eksFromAIHIT) - { - // создаем - var mappedEK = mapper.Map(ek); - - mappedEK.Id = Guid.NewGuid(); - mappedEK.DateCreated = DateTimeOffset.UtcNow; - - //if (!await rawDataEKService.CreateAsync(mappedEK) || !await rawDataEKService.CommitAsync()) - if (!await rawDataEKService.CreateAsync(mappedEK)) - { - logger.LogError($"Не удалось создать запись rawDataEK {mappedEK.ShortName}({mappedEK.IP})"); - continue; - } - else - logger.LogInformation($"Создана запись rawDataEK {mappedEK.ShortName}({mappedEK.IP}), зона ответственности {respArea.Name}"); - } - - logger.LogDebug($"-= Запись в базу данных записей об ЭК зоны ответственности {respArea.Name} "); - if (!await rawDataEKService.CommitAsync()) - logger.LogError($"Информация о хостах зоны ответственности {respArea.Name} не записана "); - - logger.LogDebug($"-= Конец синхронизации данных об ЭК зоны ответственности {respArea.Name} =-"); - } -#endif - //Разбираем сырые данные - - //Получаем интересующие статусы ЭК - var statusList = await settingService.Get() - .Where(s => s.Group == AIHTITSettings.StatusGroupName) - .Select(s => s.Value.Trim()) - .ToListAsync(); - - if (statusList == null || statusList.Count == 0) - return; - - //Берём только активные ЭК - var eks = await rawDataEKService.Get() - .Where(e => e.IsActive == "t" && (e.Status != null && statusList.Contains(e.Status.Trim())) && e.EKFindCode.StartsWith("ВРТ-")) - .ToListAsync(); - - foreach (var ek in eks) - { - if (ek.IP == null) - continue; - - var host = await hostService.GetHostWithAppsAsync(ek.IP); - var mappedHost = mapper.Map(ek); - //TODO Валидация по внешним связям - - var hostApplications = await GetAndFillApplicationsAsync(ek); - - if (host == null) - { - // создаем - if (!await hostService.CreateAsync(mappedHost) || !await hostService.CommitAsync()) - { - logger.LogError($"Не удалось создать узел {mappedHost.IP}"); - continue; - } - else - logger.LogInformation($"----- Создан Host: {mappedHost.Id} -----"); - - host = await hostService.GetHostWithAppsAsync(mappedHost.IP); - // Синхронизация Applications - await SyncApplicationAndHostAsync(host, hostApplications); - } - else - { - // обновляем - var isChanged = false; - if (!host.EkStatusCode!.Equals(mappedHost.EkStatusCode)) - { - host.EkStatusCode = mappedHost.EkStatusCode; - isChanged = true; - } - else if (mappedHost.WorkGroup != null && (host.WorkGroup == null || !host.WorkGroup!.Equals(mappedHost.WorkGroup))) - { - host.WorkGroup = mappedHost.WorkGroup; - isChanged = true; - } - - if (isChanged) - { - host.DateModified = DateTimeOffset.UtcNow; - if (!await hostService.CommitAsync()) - logger.LogError($"Не удалось обновить узел {mappedHost.IP}"); - else - logger.LogInformation($"Обновлён Host: {mappedHost.Id}"); - } - - // Синхронизация Applications - await SyncApplicationAndHostAsync(host, hostApplications, true); - } - } - } - - /// - /// Метод синхронизации - /// - /// Хост - /// Список программного обеспечения - /// Признак обновления поля DateModified - /// - - private async Task SyncApplicationAndHostAsync(Host? host, List hostApplications, bool isUpdateDateModified = false) - { - var isUpdated = false; - if (host == null) - return; - - logger.LogDebug($"Host: {host.Ek}({host.IP}), начало синхронизации приложений ({hostApplications.Count()}) "); - - foreach (var changedHostApp in hostApplications) - { - var exist = host.ApplicationsInHosts.FirstOrDefault(a => a.ApplicationId == changedHostApp.Id); - - if (exist == null) - { - //add - logger.LogInformation($"Host: {host.Ek}({host.IP}), добавление нового приложения Application {changedHostApp.Name}"); - - var newAppHost = new ApplicationInHost { Id = Guid.NewGuid(), ApplicationId = changedHostApp.Id, HostId = host.Id }; - if (!await appInHostService.CreateAsync(newAppHost)) - logger.LogError($"Не удалось создать ApplicationInHost {changedHostApp.Name}, host: {host.Ek}({host.IP})"); - - isUpdated = true; - } - } - - foreach (var app in host.ApplicationsInHosts) - { - var appToRemove = hostApplications.FirstOrDefault(a => a.Id == app.ApplicationId); - - if (appToRemove == null) - { - //todo remove appToRemove - var obj = await appInHostService.Get().FirstOrDefaultAsync(t => t.ApplicationId == app.ApplicationId && t.HostId == host.Id); - if (obj != null) - { - logger.LogInformation($"Host: {host.Ek}({host.IP}), удаление неактуального приложения Application {app.Application?.Name}"); - appInHostService.Delete(obj); - - if (!await hostService.CommitAsync()) - logger.LogError($"Не удалось удалить Application {app.Application?.Name} узла {host.Ek}({host.IP})"); - - isUpdated = true; - } - } - } - - if (isUpdated && isUpdateDateModified) - host.DateModified = DateTimeOffset.UtcNow; - - if (!await appInHostService.CommitAsync()) - logger.LogError($"Не удалось обновить ApplicationInHost для Host: {host.Ek}({host.IP})"); - - logger.LogDebug($"Host: {host.Ek}({host.IP} конец синхронизации приложений"); - - } - - - private async Task> GetAndFillApplicationsAsync(RawDataEK vm) - { - //logger.LogDebug($"Начало парсинга данных о программном обеспечении(СП, БД, ОС) из АИХ ИТ"); - var applications = new List(); - - if (vm.APPType != null) - { - var appList = vm.APPType.Split(new char[] { ',', ';' }).Distinct().ToList(); - foreach (var app in appList) - { - var created = await CreateAppIfNotExistAsync(app, ApplicationTypesEnum.APP); - if (created != null) - applications.Add(created); - } - } - if (vm.DBType != null) - { - var appList = vm.DBType.Split(new char[] { ',', ';' }).Distinct().ToList(); - foreach (var app in appList) - { - var created = await CreateAppIfNotExistAsync(app, ApplicationTypesEnum.DB); - if (created != null) - applications.Add(created); - } - } - if (vm.OSType != null) - { - var appList = vm.OSType.Split(new char[] { ',', ';' }).Distinct().ToList(); - foreach (var app in appList) - { - var created = await CreateAppIfNotExistAsync(app, ApplicationTypesEnum.OS); - if (created != null) - applications.Add(created); - } - } - - //logger.LogDebug($"Конец парсинга данных о программном обеспечении(СП, БД, ОС) из АИХ ИТ"); - - return applications; - } - - - private List GetAppFromXML(string? appField) - { - if (string.IsNullOrEmpty(appField)) - return new List(); - - var appList = appField.Split(";").Distinct().ToList(); - //appList.ForEach(item => item.Trim()); - - return appList; - } - - - private List GetDBFromXML(string? dbField) - { - if (string.IsNullOrEmpty(dbField)) - return new List(); - - var dbList = dbField.Split(";").Distinct().ToList(); - - return dbList; - } - - - private List GetOSFromXML(string? osField) - { - if (string.IsNullOrEmpty(osField)) - return new List(); - - var osList = osField.Split(";").Distinct().ToList(); - - return osList; - } - - - private async Task CreateAppIfNotExistAsync(string appName, ApplicationTypesEnum type) - { - if (string.IsNullOrEmpty(appName) || string.IsNullOrWhiteSpace(appName)) return null; - - var existApp = await appService.GetByNameAsync(appName); - if (existApp != null) - return existApp; - - //Создаем - var appType = GetAppTypeByName(type); - if (appType == null) - { - logger.LogError($"Не удалось создать запись в таблице Applications: {appName}, так как не получил AppType: {type.ToString()}"); - return null; - } - - var app = new Application - { - Id = Guid.NewGuid(), - Name = appName.Trim(), - ApplicationTypeId = appType.Id - }; - - if (!await appService.CreateAsync(app) || !await appService.CommitAsync()) - logger.LogError($"Не удалось создать запись в таблице Application: {appName}, {app.ToJson()}"); - else - logger.LogInformation($"Создана запись а таблице Application: {appName}, {app.ToJson()}"); - - return await appService.GetAsync(app.Id); - } - - - private ApplicationType? GetAppTypeByName(ApplicationTypesEnum type) - { - var existType = AppTypes.FirstOrDefault(t => t.Name == type.ToString()); - if (existType == null) - logger.LogError($"Не найден AppType: {type}"); - - return existType; - } - - - private static string EncodeString(string str) - { - byte[] bStr = Encoding.GetEncoding("koi8r").GetBytes(str); - Encoding encoding = Encoding.GetEncoding("koi8r"); - str = encoding.GetString(bStr, 0, bStr.Length); - return str; - } - } -} \ No newline at end of file diff --git a/PARR.AIHIT/AIHIT/SyncherInstaller.cs b/PARR.AIHIT/AIHIT/SyncherInstaller.cs deleted file mode 100644 index fa1f93ef..00000000 --- a/PARR.AIHIT/AIHIT/SyncherInstaller.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using PARR.AIHIT.Context; -using PARR.AIHIT.Services; -using PARR.AIHIT.Settings; -using PARR.BLL; -using PARR.DAL; -using PARR.Mail; - -namespace PARR.AIHIT -{ - public static class SyncherInstaller - { - public static void InstallSyncerServices(this IServiceCollection services, IConfiguration configuration) - { - var syncherSettings = new SyncherSettings(); - configuration.GetSection(nameof(SyncherSettings)).Bind(syncherSettings); - services.AddSingleton(syncherSettings); - - services.InstallMailServices(configuration); - services.InstallDalServices(configuration); - services.InstallBllServices(configuration); - - services.AddDbContext(options => - options.UseSqlServer( - configuration.GetConnectionString("AihitConnection") - , sqlServerOptions => sqlServerOptions.CommandTimeout(1800) - )); - - services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies()); - - services.AddTransient(); - services.AddTransient(); - - - - - //services.AddDbContext (options => - //{ - // options.UseSqlServer("server=(10.248.19.97);uid=awhit-ipp-parr;pwd=ET3h$9y1LH#D"); - //}); - } - } -} diff --git a/PARR.API.sln b/PARR.API.sln index 4ce9a332..cacc7524 100644 --- a/PARR.API.sln +++ b/PARR.API.sln @@ -9,10 +9,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.DAL", "PARR.DAL\PARR.D EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Mail", "PARR.Mail\PARR.Mail\PARR.Mail.csproj", "{228C8124-69E4-4AE0-8C33-0438E54FF1BA}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHITWorker", "PARR.Worker\PARR.Worker\PARR.AIHITWorker.csproj", "{D15F308C-9F63-4D69-B06E-DDA26FEE9BAB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHIT", "PARR.AIHIT\AIHIT\PARR.AIHIT.csproj", "{3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C170A32C-5A9D-4F1C-B6FF-FAE12736ED17}" ProjectSection(SolutionItems) = preProject .gitignore = .gitignore @@ -60,16 +56,17 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppScheduleSync", "PA EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppScheduleSyncWorker", "PARR.EsppScheduleSyncWorker\PARR.EsppScheduleSyncWorker.csproj", "{C597A1D7-1BC5-493B-BC29-03EC830FB090}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.AIHITLoader", "PARR.AIHITLoader\PARR.AIHITLoader.csproj", "{E7F3C8FB-445B-4711-8F89-0B7DA7DB4537}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHITLoader", "PARR.AIHITLoader\PARR.AIHITLoader.csproj", "{E7F3C8FB-445B-4711-8F89-0B7DA7DB4537}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.AIHITLoaderWorker", "PARR.AIHITLoaderWorker\PARR.AIHITLoaderWorker.csproj", "{E9434123-E697-42E2-B7C0-FE08766B98D1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHITLoaderWorker", "PARR.AIHITLoaderWorker\PARR.AIHITLoaderWorker.csproj", "{E9434123-E697-42E2-B7C0-FE08766B98D1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.AIHITSyncer", "PARR.AIHITSyncer\PARR.AIHITSyncer.csproj", "{4177B13B-585C-44C7-B3C1-6B6E46D6BABC}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHITSyncer", "PARR.AIHITSyncer\PARR.AIHITSyncer.csproj", "{4177B13B-585C-44C7-B3C1-6B6E46D6BABC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.AIHITSyncerWorker", "PARR.AIHITSyncerWorker\PARR.AIHITSyncerWorker.csproj", "{4FA79176-F833-4879-8437-37EA053BAA94}" -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.NextRun", "PARR.NextRun\PARR.NextRun.csproj", "{92400205-B781-4C6C-BDA3-6D3652C2B62F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.AIHITSyncerWorker", "PARR.AIHITSyncerWorker\PARR.AIHITSyncerWorker.csproj", "{4FA79176-F833-4879-8437-37EA053BAA94}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.NextRunWorker", "PARR.NextRunWorker\PARR.NextRunWorker.csproj", "{47C6E193-257A-4001-84D7-11B640E3D1A0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.NextRun", "PARR.NextRun\PARR.NextRun.csproj", "{92400205-B781-4C6C-BDA3-6D3652C2B62F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.NextRunWorker", "PARR.NextRunWorker\PARR.NextRunWorker.csproj", "{47C6E193-257A-4001-84D7-11B640E3D1A0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -89,14 +86,6 @@ Global {228C8124-69E4-4AE0-8C33-0438E54FF1BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {228C8124-69E4-4AE0-8C33-0438E54FF1BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {228C8124-69E4-4AE0-8C33-0438E54FF1BA}.Release|Any CPU.Build.0 = Release|Any CPU - {D15F308C-9F63-4D69-B06E-DDA26FEE9BAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D15F308C-9F63-4D69-B06E-DDA26FEE9BAB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D15F308C-9F63-4D69-B06E-DDA26FEE9BAB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D15F308C-9F63-4D69-B06E-DDA26FEE9BAB}.Release|Any CPU.Build.0 = Release|Any CPU - {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3ED4E1CE-2AF5-4EB3-B7DF-B77CCC242B9E}.Release|Any CPU.Build.0 = Release|Any CPU {AB278172-BFB4-4D54-9022-2D2A5B3338D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AB278172-BFB4-4D54-9022-2D2A5B3338D7}.Release|Any CPU.ActiveCfg = Release|Any CPU {7BAB9170-743D-4542-8881-9B161EE81BB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -171,7 +160,6 @@ Global {C597A1D7-1BC5-493B-BC29-03EC830FB090}.Debug|Any CPU.Build.0 = Debug|Any CPU {C597A1D7-1BC5-493B-BC29-03EC830FB090}.Release|Any CPU.ActiveCfg = Release|Any CPU {C597A1D7-1BC5-493B-BC29-03EC830FB090}.Release|Any CPU.Build.0 = Release|Any CPU -<<<<<<< HEAD {E7F3C8FB-445B-4711-8F89-0B7DA7DB4537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E7F3C8FB-445B-4711-8F89-0B7DA7DB4537}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7F3C8FB-445B-4711-8F89-0B7DA7DB4537}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -188,7 +176,6 @@ Global {4FA79176-F833-4879-8437-37EA053BAA94}.Debug|Any CPU.Build.0 = Debug|Any CPU {4FA79176-F833-4879-8437-37EA053BAA94}.Release|Any CPU.ActiveCfg = Release|Any CPU {4FA79176-F833-4879-8437-37EA053BAA94}.Release|Any CPU.Build.0 = Release|Any CPU -======= {92400205-B781-4C6C-BDA3-6D3652C2B62F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {92400205-B781-4C6C-BDA3-6D3652C2B62F}.Debug|Any CPU.Build.0 = Debug|Any CPU {92400205-B781-4C6C-BDA3-6D3652C2B62F}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -197,7 +184,6 @@ Global {47C6E193-257A-4001-84D7-11B640E3D1A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {47C6E193-257A-4001-84D7-11B640E3D1A0}.Release|Any CPU.ActiveCfg = Release|Any CPU {47C6E193-257A-4001-84D7-11B640E3D1A0}.Release|Any CPU.Build.0 = Release|Any CPU ->>>>>>> next-run EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/PARR.DAL/Context/DataContext.cs b/PARR.DAL/Context/DataContext.cs index 5a40978d..f518c07e 100644 --- a/PARR.DAL/Context/DataContext.cs +++ b/PARR.DAL/Context/DataContext.cs @@ -2,7 +2,6 @@ using PARR.Constants; using PARR.DAL.Contracts; using PARR.DAL.Models; -using PARR.DAL.Models.AIHIT; namespace PARR.DAL.Context { @@ -17,8 +16,6 @@ namespace PARR.DAL.Context public DbSet ApplicationTypes { get; set; } public DbSet ApplicationsInHosts { get; set; } - public DbSet Settings { get; set; } - public DbSet RawDataEKs { get; set; } public DbSet