diff --git a/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs b/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs index cb5e2e09..efe2cacf 100644 --- a/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs +++ b/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs @@ -28,30 +28,24 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations var groupedData = aihitdata.Where(t => t.EKFindCode != null && t.ChildEk != null).GroupBy(ad => ad.EKFindCode); //Перебираем сгруппированные по родительскому ЭК данные - foreach (var item in groupedData) + foreach (var parrent in groupedData) { //Получаем имя родителя - var parentName = item.First().EKFindCode; - - //if (parentName.ToLower() != "ас-рп-рцку-гор") - // continue; + var parentName = parrent.First().EKFindCode; //По имени получаем экземпляр Unit со всеми дочерними связями var unit = await GetUnitByNameAsync(parentName!); + if (unit == null) + { + logger.LogError($"Не удалось получиться родительский ЭК по имени{parentName}"); + return; + } //Из данных АИХ ИТ получаем имена всех дочерних ЭК - var childsName = item.Select(t => t.ChildEk); + var childsName = parrent.Select(t => t.ChildEk); //Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре Unit - foreach (var childName in childsName) - { - await SyncChildUnit(unit, childName!); - } - - //После проверки пришедших к нам из АИХ ИТ дочерних связей удаляем лишние/уже не существующие в базе - var childsToDelete = unit.ChildUnits.Where(t => childsName.All(a => t.ChildUnit?.Name != a)); - if (childsToDelete.Any()) - DeleteChilds(unit, childsToDelete); + await SyncChildSUnitAsync(unit, childsName); //применяем изменения в базе данных if (!await unitService.CommitAsync()) @@ -61,9 +55,21 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations } //Удаляем детей у тех кого детей в выборке АИХ ИТ не оказалось + await RemoveWasteRelationships(groupedData); + + //применяем изменения в базе данных + if (!await unitService.CommitAsync()) + logger.LogError($"Не удалось удалить лишние связи"); + else + logger.LogInformation($"----- Иереархические связи актуализированы -----"); + } + + private async Task RemoveWasteRelationships(IEnumerable> groupedData) + { var parentNames = groupedData.Select(t => t.Key); - var units = await unitService.Get().Include(t => t.ChildUnits).ToListAsync(); + var units = await unitService.Get() + .Include(t => t.ChildUnits).ToListAsync(); var parentsToDeleteChild = units.Where(t => parentNames.All(a => t.Name != a) && t.ChildUnits.Any()); @@ -72,16 +78,51 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations foreach (var unit in parentsToDeleteChild) { unit.ChildUnits.Clear(); - - //применяем изменения в базе данных - if (!await unitService.CommitAsync()) - logger.LogError($"Не удалось удалить лишние связи Unit {unit.Name}"); - else - logger.LogInformation($"----- Удалены лишние связи Unit {unit.Name} -----"); } } } + private async Task SyncChildSUnitAsync(Unit unit, IEnumerable childsName) + { + var isChanged = false; + + //удаляем лишние дочерние связи существующие только в БД + var childsToDelete = unit.ChildUnits.Where(t => !childsName.Any(a => t.ChildUnit?.Name.ToLower() == a!.ToLower().Trim())); + if (childsToDelete.Any()) + { + DeleteChilds(unit, childsToDelete); + if (!isChanged) + isChanged = true; + } + + + //проверяем отсутсвующие связи + var absentChildrens = childsName.Where(c => !unit.ChildUnits.Any(x => x.ChildUnit?.Name.ToLower() == c.ToLower().Trim())); + foreach (var absentChildren in absentChildrens) + { + var childUnit = await GetUnitByNameAsync(absentChildren!); + if (childUnit == null) + { + logger.LogError($"Ошибка получения дочернего ЭК. Из базы пришел NULL для ЭК{absentChildren}"); + return ; + } + + unit.ChildUnits.Add( + new UnitInUnit + { + ParentUnitId = unit.Id, + ChildUnitId = childUnit.Id, + DateCreated = DateTimeOffset.UtcNow, + } + ); + } + + foreach (var child in unit.ChildUnits) + { + child.DateSynced = DateTimeOffset.UtcNow; + } + } + /// /// Синхронизация дочерней связи в ЭК по имени @@ -89,7 +130,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations /// Unit должен иметь в себе все данные о дочерних связях /// Имя дочернего ЭК /// - private async Task SyncChildUnit(Unit unit, string childName) + private async Task SyncChildUnitAsync(Unit unit, string childName) { //if (childName.ToLower() != "рпа-робин-рцку-спиуи-прочее-26-гор") // continue; @@ -110,6 +151,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations } ); + //не чесно!!! todo: if (!await unitService.CommitAsync()) logger.LogError($"Не удалось создать связь Unit {unit.Name} с {childUnit.Name}"); else @@ -130,7 +172,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations { foreach (var childUnit in unitToDeleteChilds) { - logger.LogInformation($"----- Удаление связи Unit: {childUnit.ParentUnit!.Name} - {childUnit.ChildUnit!.Name} -----"); + logger.LogInformation($"----- Удаление связи Unit: {unit.Name} -----"); unit.ChildUnits.Remove(childUnit); } } @@ -141,19 +183,23 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations /// /// /// - private async Task CreateUnit(string ekName) + private async Task CreateUnit(string ekName) { var unit = new Unit { Name = ekName.Trim() }; - if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync()) + if (!await unitService.CreateAsync(unit)) + { logger.LogError($"Не удалось создать Unit {unit.Name}"); + return null; + } else + { logger.LogDebug($"----- Создан Unit: {unit.Name} -----"); - - return unit; + return unit; + } } @@ -162,7 +208,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations /// /// /// - private async Task GetUnitByNameAsync(string ekName) + private async Task GetUnitByNameAsync(string ekName) { if (!unitService.Get().AsNoTracking().Any(u => u.Name.ToLower() == ekName.ToLower().Trim())) { @@ -171,7 +217,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations return await unitService.Get() .Include(u => u.ChildUnits) - .ThenInclude(t=>t.ChildUnit) + .ThenInclude(t => t.ChildUnit) .FirstAsync(u => u.Name.ToLower() == ekName.ToLower().Trim()); } }