diff --git a/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs b/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs index 1166d194..a1e94350 100644 --- a/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs +++ b/PARR.AIHITRelationshipsSyncer/Services/Implementations/RelationshipsSyncSrevice.cs @@ -4,6 +4,8 @@ using PARR.AIHITRelationshipsSyncer.Models; using PARR.AIHITRelationshipsSyncer.Services.Interfaces; using PARR.DAL.Models.Unit; using PARR.DAL.Services.Interfaces.Unit; +using System.Reactive; +using Unit = PARR.DAL.Models.Unit.Unit; namespace PARR.AIHITRelationshipsSyncer.Services.Implementations { @@ -23,40 +25,31 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations public async Task SyncAsync(List aihitdata) { - var groupedData = aihitdata.GroupBy(ad => ad.EKFindCode); - - var units = await GetUnitsWithChildrens(); + var groupedData = aihitdata.Where(t => t.EKFindCode != null && t.ChildEk != null).GroupBy(ad => ad.EKFindCode); //Перебираем сгруппированные по родительскому ЭК данные foreach (var item in groupedData) { //Получаем имя родителя - var parentName = item.Select(t => t.EKFindCode).First(); - if (parentName == null) - continue; + var parentName = item.First().EKFindCode; //if (parentName.ToLower() != "ас-рп-рцку-гор") // continue; //По имени получаем экземпляр Unit со всеми дочерними связями - var unit = await GetUnitByNameAsync(parentName); + var unit = await GetUnitByNameAsync(parentName!); //Из данных АИХ ИТ получаем имена всех дочерних ЭК - var childsName = item.Select(t => t.ChildEk).ToList(); - if (childsName == null || childsName.Count == 0) - continue; + var childsName = item.Select(t => t.ChildEk); //Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре Unit foreach (var childName in childsName) { - if (childName == null) - continue; - //if (childName.ToLower() != "рпа-робин-рцку-спиуи-прочее-26-гор") // continue; //Ищем детей по имени - var child = unit.ChildUnits.FirstOrDefault(t => t.ChildUnit?.Name.ToLower() == childName.ToLower().Trim()); - + var child = unit.ChildUnits.FirstOrDefault(t => t.ChildUnit?.Name.ToLower() == childName!.ToLower().Trim()); + //не нашли создаём и сразу пишем в базу, чтобы если попадуться дубликаты в списке они были созданы if (child == null) { @@ -74,7 +67,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations if (!await unitService.CommitAsync()) logger.LogError($"Не удалось создать связь Unit {unit.Name} с {childUnit.Name}"); else - logger.LogDebug($"----- Изменене связи Unit: {unit.Name} -----"); + logger.LogInformation($"----- Создана новая связь Unit {unit.Name} с {childUnit.Name} -----"); } //Для всех обновляем дату синхронизации else @@ -82,8 +75,8 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations } //После проверки пришедших к нам из АИХ ИТ дочерних связей удаляем лишние/уже не существующие в базе - var childsToDelete = unit.ChildUnits.Where(t => childsName.All(a => t.ChildUnit?.Name != a)).ToList(); - if (childsToDelete != null && childsToDelete.Count() > 0) + var childsToDelete = unit.ChildUnits.Where(t => childsName.All(a => t.ChildUnit?.Name != a)); + if (childsToDelete.Any()) DeleteChilds(unit, childsToDelete); //применяем изменения в базе данных @@ -92,6 +85,27 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations else logger.LogDebug($"----- Изменены связи Unit: {unit.Name} -----"); } + + //Удаляем детей у тех кого детей в выборке АИХ ИТ не оказалось + var parentNames = groupedData.Select(t => t.Key); + + var units = await unitService.Get().Include(t => t.ChildUnits).ToListAsync(); + + var parentsToDeleteChild = units.Where(t => parentNames.All(a => t.Name != a) && t.ChildUnits.Any()); + + if (parentsToDeleteChild.Any()) + { + foreach (var unit in parentsToDeleteChild) + { + unit.ChildUnits.Clear(); + + //применяем изменения в базе данных + if (!await unitService.CommitAsync()) + logger.LogError($"Не удалось удалить лишние связи Unit {unit.Name}"); + else + logger.LogInformation($"----- Удалены лишние связи Unit {unit.Name} -----"); + } + } } @@ -100,7 +114,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations /// /// /// - private void DeleteChilds(Unit unit, List unitToDeleteChilds) + private void DeleteChilds(Unit unit, IEnumerable unitToDeleteChilds) { foreach (var childUnit in unitToDeleteChilds) { @@ -110,17 +124,6 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations } - /// - /// Получение списка ЭК с дочерними связями - /// - /// - private async Task> GetUnitsWithChildrens() - { - return await unitService.Get() - .Include(t => t.ChildUnits).ToListAsync(); - } - - /// /// Создать новый ЭК по имени ///