feat(aihitMainSyncer): небольшой рефакторинг, устранена ошибка задвоения записей, убраны лишние типы данных.

This commit is contained in:
Mikhail Kuznetsov
2025-09-25 16:28:18 +10:00
parent a3ed9d0103
commit 615fd1b25b

View File

@@ -47,7 +47,7 @@ namespace PARR.AIHITMainSyncer.Services
private async Task SyncUnitAsync(AihitMainDataMq objFromQuery) private async Task SyncUnitAsync(AihitMainDataMq objFromQuery)
{ {
//Получаем сразу словарь атрибутов, чтобы не ходить каждый раз в базу //Получаем сразу словарь атрибутов, чтобы не ходить каждый раз в базу
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())
return; return;
@@ -55,12 +55,13 @@ namespace PARR.AIHITMainSyncer.Services
var listAihitData = new List<KeyValuePair<string, string?>>(); var listAihitData = new List<KeyValuePair<string, string?>>();
var propertisWithSimpleValues = objFromQuery.Properties var propertisWithSimpleValues = objFromQuery.Properties
.Where(t => fieldsFromDB.Any(a => IsStringEqual(t.Key, a.Name) && a.IsMultipleValue != true)) //.Where(t => fieldsFromDB.Any(a => IsStringEqual(t.Key.Trim(), a.Name) && a.IsMultipleValue != true))
.Where(t => fieldsFromDB.Any(a => IsStringEqual(t.Key.Trim(), a.AihitName) && a.IsMultipleValue != true))
.Select(s => new KeyValuePair<string, string?>(s.Key.Trim(), s.Value?.Trim())).ToList(); .Select(s => new KeyValuePair<string, string?>(s.Key.Trim(), s.Value?.Trim())).ToList();
listAihitData.AddRange(propertisWithSimpleValues); listAihitData.AddRange(propertisWithSimpleValues);
var propertiesWithMultipleValues = objFromQuery.Properties.Except(propertisWithSimpleValues).ToList(); var propertiesWithMultipleValues = objFromQuery.Properties.Where(t => !propertisWithSimpleValues.Any(a => t.Key.Trim() == a.Key)).ToList();
propertiesWithMultipleValues.ForEach(p => listAihitData.AddRange( propertiesWithMultipleValues.ForEach(p => listAihitData.AddRange(
SplitValues(p).Distinct().Select(s => new KeyValuePair<string, string?>(s.Key.Trim(), s.Value?.Trim())) SplitValues(p).Distinct().Select(s => new KeyValuePair<string, string?>(s.Key.Trim(), s.Value?.Trim()))
@@ -113,113 +114,9 @@ namespace PARR.AIHITMainSyncer.Services
logger.LogError($"Не удалось применить изменения по актуализиции аттрибуто Unit {unit.Name} в базе данных"); logger.LogError($"Не удалось применить изменения по актуализиции аттрибуто Unit {unit.Name} в базе данных");
} }
//Проверяем наличие всех полей и их значений в справочниках
//var fieldNamesToCreate = objFromQuery.Properties.Keys.Where(t => !fieldsFromDB.Any(a => t == a.Name));
//foreach (var item in fieldsToCreate)
//{
//}
//Превращаем словарь в лист так как могут содержаться аттрибуты с несколькими значениями
/*var list = new List<ValueWithId>();
foreach (var property in objFromQuery.Properties)
{
var key = property.Key;
var existingField = fieldsFromDB.FirstOrDefault(t => IsStringEqual(t.Name, key));
if (existingField == null)
{
var newField = new UnitField { Id = Guid.NewGuid(), AihitName = key, DateCreated = DateTimeOffset.UtcNow };
if (await unitFieldService.CreateAsync(newField))
existingField = new FieldDto { Id = newField.Id, Name = newField.AihitName };
else {
logger.LogError($"Ошибка создания атрибута с именем {key}");
return;
}
}
if(existingField.IsMultipleValue == true)
{
} else
list.Add(new ValueWithId { FieldId, })
}
/*
Unit unit = await GetUnit(objFromQuery.Name);
var fieldsFromDB = await unitFieldService.Get().Select(t => new FieldRecord { AihitName = t.AihitName, IsMultipleValue = t.IsMultipleValue }).ToListAsync();
var multiValueProperties = GetPropertiesWithMultiValueFields(objFromQuery.Properties, fieldsFromDB);
var simplifiedProperties = objFromQuery.Properties.Except(multiValueProperties).ToDictionary(t => t.Key, t => t.Value).ToList();
var changes = GetChangesInUnit(simplifiedProperties, unit);
if (multiValueProperties.Any())
{
var splitedProperties = SplitValue(multiValueProperties);
changes.AddRange(GetChangesInUnit(splitedProperties, unit));
}
if (changes.Any())
{
await SyncFieldsAsync(changes.Select(s => s.Key).ToList()!, fieldsFromDB);
await SyncValuesAsync(changes.Select(s => s.Value).ToList()!);
var fieldsNameWithId = await unitFieldService.Get().AsNoTracking().Where(t => changes.Select(c =>
Sanitize(c.Key.ToLower())).Any(c =>
c == t.AihitName.ToLower()
)).ToListAsync();
var valuesWithId = await unitFieldValueService.Get().AsNoTracking().Where(t => changes.Select(c =>
(c.Value == null) ? null : Sanitize(c.Value.ToLower())
).Any(c => c ==
((t.Value == null) ? null : t.Value!.ToLower())
)).ToListAsync();
//Удаляем значения атрибутов, так как это часть индекса и EF не даст просто присвоить значение
var unitValueToRemove = unit.UnitValues.Where(t => fieldsNameWithId.Any(a => a.Id == t.FieldId));
foreach (var unitValue in unitValueToRemove)
unit.UnitValues.Remove(unitValue);
foreach (var change in changes)
{
ApplyChange(unit, fieldsNameWithId, valuesWithId, change);
}
if (!await unitService.CommitAsync())
logger.LogError($"Не удалось применить изменения по актуализиции аттрибуто Unit {unit.Name} в базе данных");
}*/
return; return;
} }
private static List<KeyValuePair<string, string?>> SplitValues(Dictionary<string, string?> multiValueProperties)
{
var splitedProperties = new List<KeyValuePair<string, string?>>();
foreach (var multiValueProperty in multiValueProperties)
{
if (multiValueProperty.Value == null)
splitedProperties.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, multiValueProperty.Value));
else
{
var values = multiValueProperty.Value.Split(',').Select(s => s.Trim());
foreach (var value in values)
splitedProperties.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, value));
}
}
return splitedProperties;
}
private static List<KeyValuePair<string, string?>> SplitValues(KeyValuePair<string, string?> multiValueProperty) private static List<KeyValuePair<string, string?>> SplitValues(KeyValuePair<string, string?> multiValueProperty)
{ {
@@ -233,19 +130,14 @@ namespace PARR.AIHITMainSyncer.Services
foreach (var value in values) foreach (var value in values)
splitedProperties.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, value)); splitedProperties.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, value));
} }
return splitedProperties; return splitedProperties;
} }
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 uValue = unit.UnitValues.FirstOrDefault(t => IsStringEqual(t.Field?.AihitName, change.Key));
//if (uValue == null)
//{
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));
@@ -263,30 +155,10 @@ namespace PARR.AIHITMainSyncer.Services
unit.UnitValues.Add(f); unit.UnitValues.Add(f);
} }
//}
//else
//{
// uValue.ValueId = valuesWithId.First(t => IsStringEqual(t.Value, change.Value)).Id;
// uValue.DateModified = DateTimeOffset.UtcNow;
//}
} }
//private List<KeyValuePair<string, string?>> GetChangesInUnit(List<KeyValuePair<string, string?>> properties, Unit unit)
//{
// var changes = properties.Where(t =>
// !unit.UnitValues.Any(
// uv => uv.Field!.AihitName.ToLower() == Sanitize(t.Key.ToLower()) && (
// (t.Value == null) ?
// uv.Value?.Value == null :
// ((uv.Value?.Value == null) ? null : uv.Value!.Value!.ToLower()) == Sanitize(t.Value.ToLower())
// )
// )
// ).ToList();
// return changes;
//}
private async Task SyncValuesAsync(List<string?> values) private async Task SyncValuesAsync(List<string?> values)
{ {
// все поля из АИХИТ // все поля из АИХИТ
@@ -329,10 +201,11 @@ namespace PARR.AIHITMainSyncer.Services
} }
} }
//private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<FieldDto> fieldsFromDB)
private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<FieldDto> fieldsFromDB) private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<UnitField> fieldsFromDB)
{ {
var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => f.Name == t)); //var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => f.Name == t));
var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => f.AihitName == t));
if (newFields.Any()) if (newFields.Any())
{ {
@@ -346,9 +219,9 @@ namespace PARR.AIHITMainSyncer.Services
}; };
if (!await unitFieldService.CreateAsync(field)) if (!await unitFieldService.CreateAsync(field))
logger.LogError($"Не удалось создать запись в таблице Fields: {item}, {field.ToJson()}"); logger.LogError("Не удалось создать запись в таблице Fields:{item},{field}", item, field);
else else
logger.LogInformation($"Создана запись а таблице Fields: {item}, {field.ToJson()}"); logger.LogInformation("Создана запись а таблице Fields: Fields:{item},{field}", item, field);
} }
if (!await unitFieldService.CommitAsync()) if (!await unitFieldService.CommitAsync())
logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных"); logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных");
@@ -356,30 +229,6 @@ namespace PARR.AIHITMainSyncer.Services
} }
//private Dictionary<string, string?> GetPropertiesWithMultiValueFields(Dictionary<string, string?> properties, List<FieldRecord> fieldsFromDB)
//{
// var fieldsName = properties.Select(s => Sanitize(s.Key.ToLower()));
// //var multiValueField = await unitFieldService.Get().Where(t =>
// // t.IsMultipleValue == true &&
// // fieldsName.Any(p => p == t.AihitName.ToLower())
// // ).Select(s => s.AihitName.ToLower()).ToListAsync();
// var multiValueField = fieldsFromDB.Where(t => t.IsMultipleValue == true
// && fieldsName.Any(p => p == t.AihitName.ToLower()))
// .Select(s => s.AihitName.ToLower()).ToList();
// return properties.Where(p => multiValueField.Any(a => Sanitize(p.Key.ToLower()) == a)).ToDictionary(t => t.Key, t => t.Value);
//}
//private string? Sanitize(string? value)
//{
// var _value = value?.Trim();
// return _value;
//}
private bool IsStringEqual(string? value1, string? value2) private bool IsStringEqual(string? value1, string? value2)
{ {
//var _value1 = value1?.ToLower().Trim(); //var _value1 = value1?.ToLower().Trim();
@@ -400,6 +249,7 @@ namespace PARR.AIHITMainSyncer.Services
return unit; return unit;
} }
private async Task<Unit> CreateUnitAsync(string name) private async Task<Unit> CreateUnitAsync(string name)
{ {
var unit = new Unit { Name = name.Trim() }; var unit = new Unit { Name = name.Trim() };
@@ -429,33 +279,4 @@ namespace PARR.AIHITMainSyncer.Services
.ThenInclude(uf => uf.Value); .ThenInclude(uf => uf.Value);
} }
} }
//internal record FieldRecord
//{
// public required string AihitName;
// public bool? IsMultipleValue;
//}
//internal class ValueWithId
//{
// public required Guid FieldId;
// public required string FieldName;
// public required Guid ValueId;
// public required string? ValueValue;
//}
internal record FieldDto
{
public required Guid Id;
public required string Name;
public bool? IsMultipleValue;
}
} }