feat(aihitRelationshpsSyncer): refactoring

This commit is contained in:
Mikhail Kuznetsov
2025-05-30 16:46:33 +10:00
parent 03ef20db26
commit 93a932390e

View File

@@ -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()))
{ {
@@ -171,7 +217,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
return await unitService.Get() return await unitService.Get()
.Include(u => u.ChildUnits) .Include(u => u.ChildUnits)
.ThenInclude(t=>t.ChildUnit) .ThenInclude(t => t.ChildUnit)
.FirstAsync(u => u.Name.ToLower() == ekName.ToLower().Trim()); .FirstAsync(u => u.Name.ToLower() == ekName.ToLower().Trim());
} }
} }