feat(aihitRelationshpsSyncer): refactoring
This commit is contained in:
@@ -28,30 +28,24 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
var groupedData = aihitdata.Where(t => t.EKFindCode != null && t.ChildEk != null).GroupBy(ad => ad.EKFindCode);
|
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;
|
var parentName = parrent.First().EKFindCode;
|
||||||
|
|
||||||
//if (parentName.ToLower() != "ас-рп-рцку-гор")
|
|
||||||
// continue;
|
|
||||||
|
|
||||||
//По имени получаем экземпляр Unit со всеми дочерними связями
|
//По имени получаем экземпляр Unit со всеми дочерними связями
|
||||||
var unit = await GetUnitByNameAsync(parentName!);
|
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
|
//Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре Unit
|
||||||
foreach (var childName in childsName)
|
await SyncChildSUnitAsync(unit, childsName);
|
||||||
{
|
|
||||||
await SyncChildUnit(unit, childName!);
|
|
||||||
}
|
|
||||||
|
|
||||||
//После проверки пришедших к нам из АИХ ИТ дочерних связей удаляем лишние/уже не существующие в базе
|
|
||||||
var childsToDelete = unit.ChildUnits.Where(t => childsName.All(a => t.ChildUnit?.Name != a));
|
|
||||||
if (childsToDelete.Any())
|
|
||||||
DeleteChilds(unit, childsToDelete);
|
|
||||||
|
|
||||||
//применяем изменения в базе данных
|
//применяем изменения в базе данных
|
||||||
if (!await unitService.CommitAsync())
|
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<IGrouping<string?, AihitData>> groupedData)
|
||||||
|
{
|
||||||
var parentNames = groupedData.Select(t => t.Key);
|
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());
|
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)
|
foreach (var unit in parentsToDeleteChild)
|
||||||
{
|
{
|
||||||
unit.ChildUnits.Clear();
|
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<string?> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Синхронизация дочерней связи в ЭК по имени
|
/// Синхронизация дочерней связи в ЭК по имени
|
||||||
@@ -89,7 +130,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
/// <param name="unit">Unit должен иметь в себе все данные о дочерних связях</param>
|
/// <param name="unit">Unit должен иметь в себе все данные о дочерних связях</param>
|
||||||
/// <param name="childName">Имя дочернего ЭК</param>
|
/// <param name="childName">Имя дочернего ЭК</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task SyncChildUnit(Unit unit, string childName)
|
private async Task SyncChildUnitAsync(Unit unit, string childName)
|
||||||
{
|
{
|
||||||
//if (childName.ToLower() != "рпа-робин-рцку-спиуи-прочее-26-гор")
|
//if (childName.ToLower() != "рпа-робин-рцку-спиуи-прочее-26-гор")
|
||||||
// continue;
|
// continue;
|
||||||
@@ -110,6 +151,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//не чесно!!! todo:
|
||||||
if (!await unitService.CommitAsync())
|
if (!await unitService.CommitAsync())
|
||||||
logger.LogError($"Не удалось создать связь Unit {unit.Name} с {childUnit.Name}");
|
logger.LogError($"Не удалось создать связь Unit {unit.Name} с {childUnit.Name}");
|
||||||
else
|
else
|
||||||
@@ -130,7 +172,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
{
|
{
|
||||||
foreach (var childUnit in unitToDeleteChilds)
|
foreach (var childUnit in unitToDeleteChilds)
|
||||||
{
|
{
|
||||||
logger.LogInformation($"----- Удаление связи Unit: {childUnit.ParentUnit!.Name} - {childUnit.ChildUnit!.Name} -----");
|
logger.LogInformation($"----- Удаление связи Unit: {unit.Name} -----");
|
||||||
unit.ChildUnits.Remove(childUnit);
|
unit.ChildUnits.Remove(childUnit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,20 +183,24 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ekName"></param>
|
/// <param name="ekName"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task<Unit> CreateUnit(string ekName)
|
private async Task<Unit?> CreateUnit(string ekName)
|
||||||
{
|
{
|
||||||
var unit = new Unit
|
var unit = new Unit
|
||||||
{
|
{
|
||||||
Name = ekName.Trim()
|
Name = ekName.Trim()
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync())
|
if (!await unitService.CreateAsync(unit))
|
||||||
|
{
|
||||||
logger.LogError($"Не удалось создать Unit {unit.Name}");
|
logger.LogError($"Не удалось создать Unit {unit.Name}");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
logger.LogDebug($"----- Создан Unit: {unit.Name} -----");
|
logger.LogDebug($"----- Создан Unit: {unit.Name} -----");
|
||||||
|
|
||||||
return unit;
|
return unit;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -162,7 +208,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="ekName"></param>
|
/// <param name="ekName"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private async Task<Unit> GetUnitByNameAsync(string ekName)
|
private async Task<Unit?> GetUnitByNameAsync(string ekName)
|
||||||
{
|
{
|
||||||
if (!unitService.Get().AsNoTracking().Any(u => u.Name.ToLower() == ekName.ToLower().Trim()))
|
if (!unitService.Get().AsNoTracking().Any(u => u.Name.ToLower() == ekName.ToLower().Trim()))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user