diff --git a/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs b/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs index efe2cacf..9aef7e2b 100644 --- a/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs +++ b/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging; using PARR.AIHITRelationshipsSyncer.Models; using PARR.AIHITRelationshipsSyncer.Services.Interfaces; +using PARR.AIHITRelationshipsSyncer.Settings; using PARR.DAL.Models.Unit; using PARR.DAL.Services.Interfaces.Unit; using System.Reactive; @@ -13,23 +14,31 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations { private readonly ILogger logger; private readonly IUnitService unitService; + private readonly WorkerSettings workerSettings; public RelationshipsSyncSrevice(ILogger logger, - IUnitService unitService + IUnitService unitService, + WorkerSettings workerSettings ) { this.logger = logger; this.unitService = unitService; + this.workerSettings = workerSettings; } public async Task SyncAsync(List aihitdata) { var groupedData = aihitdata.Where(t => t.EKFindCode != null && t.ChildEk != null).GroupBy(ad => ad.EKFindCode); + //var i = 0; + //var c = groupedData.Count(); + var onlyUpdateTransactionCount = 0; //Перебираем сгруппированные по родительскому ЭК данные foreach (var parrent in groupedData) { + //i = i+1; + //Получаем имя родителя var parentName = parrent.First().EKFindCode; @@ -42,13 +51,26 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations return; } //Из данных АИХ ИТ получаем имена всех дочерних ЭК - var childsName = parrent.Select(t => t.ChildEk); + var childsName = parrent.Where(t => t.ChildEk != parentName).Select(t => t.ChildEk); //Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре Unit - await SyncChildSUnitAsync(unit, childsName); + var isChanged = await SyncChildSUnitAsync(unit, childsName); + if (!isChanged) onlyUpdateTransactionCount = ++onlyUpdateTransactionCount; + + //logger.LogInformation($"Обработка № {i.ToString()} из {c}. Выполнено только обновление поля DateSynced - {onlyUpdateTransactionCount}"); + + if (onlyUpdateTransactionCount == workerSettings.CommitAfter) + { + //применяем изменения в базе данных + if (!await unitService.CommitAsync()) + logger.LogError($"Не удалось изменить связи Unit после {workerSettings.CommitAfter} обновлений поля DateSynced"); + else + logger.LogDebug($"----- Изменены связи Unit после {workerSettings.CommitAfter} обновлений поля DateSynced -----"); + onlyUpdateTransactionCount = 0; + } //применяем изменения в базе данных - if (!await unitService.CommitAsync()) + if (isChanged && !await unitService.CommitAsync()) logger.LogError($"Не удалось изменить связи Unit {unit.Name}"); else logger.LogDebug($"----- Изменены связи Unit: {unit.Name} -----"); @@ -82,7 +104,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations } } - private async Task SyncChildSUnitAsync(Unit unit, IEnumerable childsName) + private async Task SyncChildSUnitAsync(Unit unit, IEnumerable childsName) { var isChanged = false; @@ -95,7 +117,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations isChanged = true; } - + //проверяем отсутсвующие связи var absentChildrens = childsName.Where(c => !unit.ChildUnits.Any(x => x.ChildUnit?.Name.ToLower() == c.ToLower().Trim())); foreach (var absentChildren in absentChildrens) @@ -104,7 +126,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations if (childUnit == null) { logger.LogError($"Ошибка получения дочернего ЭК. Из базы пришел NULL для ЭК{absentChildren}"); - return ; + return false; } unit.ChildUnits.Add( @@ -115,51 +137,17 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations DateCreated = DateTimeOffset.UtcNow, } ); + logger.LogInformation($"----- Создан связь Unit {unit.Name} - {childUnit.Name}-----"); + + if (!isChanged) + isChanged = true; } foreach (var child in unit.ChildUnits) { child.DateSynced = DateTimeOffset.UtcNow; - } - } - - - /// - /// Синхронизация дочерней связи в ЭК по имени - /// - /// Unit должен иметь в себе все данные о дочерних связях - /// Имя дочернего ЭК - /// - private async Task SyncChildUnitAsync(Unit unit, string childName) - { - //if (childName.ToLower() != "рпа-робин-рцку-спиуи-прочее-26-гор") - // continue; - //Ищем детей по имени - var child = unit.ChildUnits.FirstOrDefault(t => t.ChildUnit?.Name.ToLower() == childName!.ToLower().Trim()); - - //Не нашли создаём и сразу пишем в базу, чтобы если попадуться дубликаты в списке они были созданы - if (child == null) - { - var childUnit = await GetUnitByNameAsync(childName!); - unit.ChildUnits.Add( - new UnitInUnit - { - ParentUnitId = unit.Id, - ChildUnitId = childUnit.Id, - DateCreated = DateTimeOffset.UtcNow, - DateSynced = DateTimeOffset.UtcNow - } - ); - - //не чесно!!! todo: - if (!await unitService.CommitAsync()) - logger.LogError($"Не удалось создать связь Unit {unit.Name} с {childUnit.Name}"); - else - logger.LogInformation($"----- Создана новая связь Unit {unit.Name} с {childUnit.Name} -----"); } - //Для всех обновляем дату синхронизации - else - child.DateSynced = DateTimeOffset.UtcNow; + return isChanged; } @@ -197,7 +185,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations } else { - logger.LogDebug($"----- Создан Unit: {unit.Name} -----"); + logger.LogInformation($"----- Создан Unit: {unit.Name} -----"); return unit; } } diff --git a/PARR.AIHITRelationshipsSyncer/Settings/WorkerSettings.cs b/PARR.AIHITRelationshipsSyncer/Settings/WorkerSettings.cs index 52136d30..09eb2ef2 100644 --- a/PARR.AIHITRelationshipsSyncer/Settings/WorkerSettings.cs +++ b/PARR.AIHITRelationshipsSyncer/Settings/WorkerSettings.cs @@ -3,5 +3,6 @@ internal class WorkerSettings { public TimeSpan RepeatEvery { get; set; } + public int CommitAfter { get; set; } } } diff --git a/PARR.AIHITRelationshipsSyncerWorker/appsettings.json b/PARR.AIHITRelationshipsSyncerWorker/appsettings.json index 659d9d27..07e76ce6 100644 --- a/PARR.AIHITRelationshipsSyncerWorker/appsettings.json +++ b/PARR.AIHITRelationshipsSyncerWorker/appsettings.json @@ -9,7 +9,26 @@ "Microsoft.Hosting.Lifetime": "Information" } }, + "Serilog": { + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "WriteTo": [ + { + "Name": "File", + "Args": { + "path": "log/log-.txt", + "rollingInterval": "Day" + } + } + ] + }, "WorkerSettings": { - "RepeatEvery": "12:00:00" + "RepeatEvery": "12:00:00", + "CommitAfter": 5000 } }