feat(aihitMainSyncer): небольшой рефакторинг, устранена ошибка задвоения записей, убраны лишние типы данных.
This commit is contained in:
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user