feat(aihitSyncer): Изменена логика обработки множественных значений, пришедших из АИХ ИТ в одном поле, добавлена обработка тегов.

This commit is contained in:
Mikhail Kuznetsov
2026-03-25 11:57:09 +10:00
parent c8322302a7
commit 4864b9b343
3 changed files with 50 additions and 14 deletions

View File

@@ -55,7 +55,7 @@ namespace PARR.AIHITMainSyncer.Services
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().ToListAsync();
if (!objFromQuery.Properties.Any())
{
@@ -84,7 +84,7 @@ namespace PARR.AIHITMainSyncer.Services
var propertiesWithMultipleValues = objFromQuery.Properties.Where(t => !propertisWithSimpleValues.Any(a => t.Key.Trim() == a.Key)).ToList();
propertiesWithMultipleValues.ForEach(p => listAihitData.AddRange(
SplitValues(p).Distinct().Select(s => new KeyValuePair<string, string?>(s.Key.Trim(), s.Value?.Trim()))
SplitValues(p, fieldsFromDB).Distinct().Select(s => new KeyValuePair<string, string?>(s.Key.Trim(), s.Value?.Trim()))
));
var unit = await GetUnit(objFromQuery.Name);
@@ -174,21 +174,52 @@ namespace PARR.AIHITMainSyncer.Services
}
private static List<KeyValuePair<string, string?>> SplitValues(KeyValuePair<string, string?> multiValueProperty)
private List<KeyValuePair<string, string?>> SplitValues(KeyValuePair<string, string?> multiValueProperty, List<UnitField> fieldsFromDB)
{
var splitedProperties = new List<KeyValuePair<string, string?>>();
var result = new List<KeyValuePair<string, string?>>();
if (multiValueProperty.Value == null)
splitedProperties.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, multiValueProperty.Value));
else
// Обработка null или пустой строки
if (string.IsNullOrEmpty(multiValueProperty.Value))
{
var values = multiValueProperty.Value.Split(',').Select(s => s.Trim());
foreach (var value in values)
splitedProperties.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, value));
result.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, multiValueProperty.Value));
return result;
}
return splitedProperties;
// Поиск конфигурации поля для тега
// Рекомендация: если метод вызывается в цикле, передавайте найденное поле внешним слоем
var tagUnitField = fieldsFromDB.FirstOrDefault(f => f.Code == "tag");
bool isTagProperty = tagUnitField != null && multiValueProperty.Key == tagUnitField.AihitName;
string[] splitValues;
if (isTagProperty)
{
// Для тегов нормализуем разделители до пробела
var normalizedValue = multiValueProperty.Value
.Replace(';', ' ')
.Replace('.', ' ')
.Replace(',', ' ');
splitValues = normalizedValue.Split(' ', StringSplitOptions.RemoveEmptyEntries);
}
else
{
// Для остальных полей стандартный разделитель - запятая
splitValues = multiValueProperty.Value.Split(',', StringSplitOptions.RemoveEmptyEntries);
}
foreach (var value in splitValues)
{
var trimmedValue = value.Trim();
// Добавляем только непустые значения после обрезки пробелов
if (!string.IsNullOrEmpty(trimmedValue))
{
result.Add(new KeyValuePair<string, string?>(multiValueProperty.Key, trimmedValue));
}
}
return result;
}