feat(aihitMainSyncer): незначительные изменения.

This commit is contained in:
Mikhail Kuznetsov
2026-02-05 14:27:02 +10:00
parent 7b3e64c733
commit 25e7fe4b90

View File

@@ -38,10 +38,13 @@ namespace PARR.AIHITMainSyncer.Services
public async Task SyncAsync(string msg) public async Task SyncAsync(string msg)
{ {
//logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР."); logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР.");
var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg); var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg);
if (objFromQuery == null) if (objFromQuery == null)
{
logger.LogWarning("Не удалось десериализовать сообщение в объект AihitMainDataMq. Сообщение: {Message}", msg);
return; return;
}
await SyncUnitAsync(objFromQuery); await SyncUnitAsync(objFromQuery);
} }
@@ -49,11 +52,16 @@ namespace PARR.AIHITMainSyncer.Services
private async Task SyncUnitAsync(AihitMainDataMq objFromQuery) private async Task SyncUnitAsync(AihitMainDataMq objFromQuery)
{ {
logger.LogDebug("Начинаем синхронизацию Unit для объекта с именем: {UnitName}", objFromQuery.Name);
//Получаем сразу словарь атрибутов, чтобы не ходить каждый раз в базу //Получаем сразу словарь атрибутов, чтобы не ходить каждый раз в базу
var fieldsFromDB = await unitFieldService.Get().AsNoTracking()/*.Select(t => new FieldDto { Id = t.Id, Name = t.AihitName, IsMultipleValue = t.IsMultipleValue })*/.ToListAsync(); var fieldsFromDB = await unitFieldService.Get().AsNoTracking()/*.Select(t => new FieldDto { Id = t.Id, Name = t.AihitName, IsMultipleValue = t.IsMultipleValue })*/.ToListAsync();
if (!objFromQuery.Properties.Any()) if (!objFromQuery.Properties.Any())
{
logger.LogWarning("Объект {UnitName} не содержит свойств для синхронизации", objFromQuery.Name);
return; return;
}
// 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы) // 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы)
var normalizedProperties = new Dictionary<string, string?>(); var normalizedProperties = new Dictionary<string, string?>();
@@ -102,7 +110,11 @@ namespace PARR.AIHITMainSyncer.Services
) )
.ToList(); .ToList();
unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv)); if (unitValuesToRemove.Any())
{
logger.LogDebug("Удаляем {Count} устаревших значений для Unit {UnitName}", unitValuesToRemove.Count, unit.Name);
unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv));
}
var unitValueMissing = listAihitData.Where(t => var unitValueMissing = listAihitData.Where(t =>
!unit.UnitValues.Any(a => !unit.UnitValues.Any(a =>
@@ -112,6 +124,8 @@ namespace PARR.AIHITMainSyncer.Services
if (unitValueMissing.Any()) if (unitValueMissing.Any())
{ {
logger.LogDebug("Найдено {Count} отсутствующих пар значений для Unit {UnitName}", unitValueMissing.Count, unit.Name);
var fieldsInChanges = unitValueMissing.Select(s => s.Key).Distinct().ToList(); var fieldsInChanges = unitValueMissing.Select(s => s.Key).Distinct().ToList();
var valuesInChanges = unitValueMissing.Select(s => s.Value).Distinct().ToList(); var valuesInChanges = unitValueMissing.Select(s => s.Value).Distinct().ToList();
@@ -143,9 +157,19 @@ namespace PARR.AIHITMainSyncer.Services
ApplyChange(unit, fieldsNameWithId, valuesWithId, change); ApplyChange(unit, fieldsNameWithId, valuesWithId, change);
if (!await unitService.CommitAsync()) if (!await unitService.CommitAsync())
logger.LogError($"Не удалось применить изменения по актуализиции аттрибуто Unit {unit.Name} в базе данных"); {
logger.LogError("Не удалось применить изменения по актуализиции аттрибуто Unit {UnitName} в базе данных", unit.Name);
return;
}
logger.LogInformation("Успешно обновлены атрибуты для Unit {UnitName}. Добавлено {AddedCount} значений", unit.Name, unitValueMissing.Count);
}
else
{
logger.LogDebug("Нет новых значений для синхронизации для Unit {UnitName}", unit.Name);
} }
logger.LogInformation("Завершена синхронизация Unit {UnitName}", unit.Name);
return; return;
} }
@@ -170,22 +194,25 @@ namespace PARR.AIHITMainSyncer.Services
private void ApplyChange(Unit unit, List<UnitField> fieldsNameWithId, List<UnitFieldValue> valuesWithId, KeyValuePair<string, string?> change) private void ApplyChange(Unit unit, List<UnitField> fieldsNameWithId, List<UnitFieldValue> valuesWithId, KeyValuePair<string, string?> change)
{ {
var Field = fieldsNameWithId.FirstOrDefault(t => IsStringEqual(t.AihitName, change.Key)); var field = fieldsNameWithId.FirstOrDefault(t => IsStringEqual(t.AihitName, change.Key));
var Value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value)); var value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value));
if (Field == null || Value == null) if (field == null || value == null)
logger.LogError($"Ошибка присвоения значения({change.Value}) аттрибуту({change.Key}). FieldId - {Field}, ValueId - {Value}"); {
logger.LogError("Ошибка присвоения значения({Value}) аттрибуту({Key}). FieldId - {FieldId}, ValueId - {ValueId}",
change.Value, change.Key, field?.Id, value?.Id);
}
else else
{ {
var f = new UnitInValue var unitInValue = new UnitInValue
{ {
UnitId = unit.Id, UnitId = unit.Id,
FieldId = Field.Id, FieldId = field.Id,
ValueId = Value.Id, ValueId = value.Id,
DateCreated = DateTimeOffset.UtcNow DateCreated = DateTimeOffset.UtcNow
}; };
unit.UnitValues.Add(f); unit.UnitValues.Add(unitInValue);
} }
} }
@@ -201,6 +228,8 @@ namespace PARR.AIHITMainSyncer.Services
.Distinct(StringComparer.OrdinalIgnoreCase) .Distinct(StringComparer.OrdinalIgnoreCase)
.ToList(); .ToList();
logger.LogDebug("Синхронизируем {Count} значений (включая null: {HasNull})", normalizedNoneNullValues.Count, hasNull);
// Получаем существующие значения из БД // Получаем существующие значения из БД
var existingValuesInDb = await unitFieldValueService.Get() var existingValuesInDb = await unitFieldValueService.Get()
.Where(v => normalizedNoneNullValues.Contains(v.Value!) || v.Value == null) .Where(v => normalizedNoneNullValues.Contains(v.Value!) || v.Value == null)
@@ -222,7 +251,10 @@ namespace PARR.AIHITMainSyncer.Services
newValuesToInsert.Add(null); newValuesToInsert.Add(null);
if (newValuesToInsert.Count == 0) if (newValuesToInsert.Count == 0)
{
logger.LogDebug("Нет новых значений для добавления в базу данных");
return; return;
}
// Создаём сущности — сохраняем оригинальный регистр из nonNullValues! // Создаём сущности — сохраняем оригинальный регистр из nonNullValues!
// (для null — просто null) // (для null — просто null)
@@ -259,26 +291,42 @@ namespace PARR.AIHITMainSyncer.Services
private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<UnitField> fieldsFromDB) private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<UnitField> fieldsFromDB)
{ {
var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => f.AihitName == t)); var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => IsStringEqual(f.AihitName, t))).ToList();
if (newFields.Any()) if (!newFields.Any())
{ {
foreach (var item in newFields) logger.LogDebug("Нет новых полей для добавления в базу данных");
{ return;
var field = new UnitField }
{
Id = Guid.NewGuid(),
AihitName = item,
EsppName = null,
};
if (!await unitFieldService.CreateAsync(field)) logger.LogDebug("Найдено {Count} новых полей для добавления", newFields.Count);
logger.LogError("Не удалось создать запись в таблице Fields:{item},{field}", item, field);
else foreach (var item in newFields)
logger.LogInformation("Создана запись а таблице Fields: Fields:{item},{field}", item, field); {
var field = new UnitField
{
Id = Guid.NewGuid(),
AihitName = item,
EsppName = null,
};
if (!await unitFieldService.CreateAsync(field))
{
logger.LogError("Не удалось создать запись в таблице Fields: {FieldName}", item);
} }
if (!await unitFieldService.CommitAsync()) else
logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных"); {
logger.LogInformation("Создана запись в таблице Fields: {FieldName}", item);
}
}
if (!await unitFieldService.CommitAsync())
{
logger.LogError("Не удалось применить изменения по добавлению новых Fields в базе данных");
}
else
{
logger.LogDebug("Успешно зафиксированы изменения по добавлению новых Fields");
} }
} }
@@ -297,7 +345,14 @@ namespace PARR.AIHITMainSyncer.Services
var unit = await GetUnitByName(name.Trim()); var unit = await GetUnitByName(name.Trim());
if (unit == null) if (unit == null)
{
logger.LogDebug("Unit с именем {UnitName} не найден, создаем новый", name);
unit = await CreateUnitAsync(name); unit = await CreateUnitAsync(name);
}
else
{
logger.LogDebug("Найден существующий Unit с именем {UnitName}", name);
}
return unit; return unit;
} }
@@ -308,9 +363,14 @@ namespace PARR.AIHITMainSyncer.Services
var unit = new Unit { Name = name.Trim().ToUpperInvariant() }; var unit = new Unit { Name = name.Trim().ToUpperInvariant() };
if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync()) if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync())
logger.LogError($"Не удалось создать Unit {unit.Name}"); {
logger.LogError("Не удалось создать Unit {UnitName}", unit.Name);
throw new InvalidOperationException($"Не удалось создать Unit {unit.Name}");
}
else else
logger.LogInformation($"----- Создан Unit: {unit.Name} -----"); {
logger.LogInformation("Создан Unit: {UnitName}", unit.Name);
}
return unit; return unit;
} }