From 615fd1b25bc488b643cf95289db5356ec410711e Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Thu, 25 Sep 2025 16:28:18 +1000 Subject: [PATCH] =?UTF-8?q?feat(aihitMainSyncer):=20=D0=BD=D0=B5=D0=B1?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D1=88=D0=BE=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3,=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8?= =?UTF-8?q?=D0=B1=D0=BA=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B2=D0=BE=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B5=D0=B9,=20?= =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BD=D1=8B=20=D0=BB=D0=B8=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D0=B8=D0=BF=D1=8B=20=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/SyncerService.cs | 205 ++---------------- 1 file changed, 13 insertions(+), 192 deletions(-) diff --git a/PARR.AIHITMainSyncer/Services/SyncerService.cs b/PARR.AIHITMainSyncer/Services/SyncerService.cs index 54c10e5b..5a6a4f90 100644 --- a/PARR.AIHITMainSyncer/Services/SyncerService.cs +++ b/PARR.AIHITMainSyncer/Services/SyncerService.cs @@ -47,7 +47,7 @@ namespace PARR.AIHITMainSyncer.Services 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()) return; @@ -55,12 +55,13 @@ namespace PARR.AIHITMainSyncer.Services var listAihitData = new List>(); 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(s.Key.Trim(), s.Value?.Trim())).ToList(); 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( SplitValues(p).Distinct().Select(s => new KeyValuePair(s.Key.Trim(), s.Value?.Trim())) @@ -113,113 +114,9 @@ namespace PARR.AIHITMainSyncer.Services 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(); - 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; } - private static List> SplitValues(Dictionary multiValueProperties) - { - var splitedProperties = new List>(); - foreach (var multiValueProperty in multiValueProperties) - { - if (multiValueProperty.Value == null) - splitedProperties.Add(new KeyValuePair(multiValueProperty.Key, multiValueProperty.Value)); - else - { - var values = multiValueProperty.Value.Split(',').Select(s => s.Trim()); - - foreach (var value in values) - splitedProperties.Add(new KeyValuePair(multiValueProperty.Key, value)); - } - } - - return splitedProperties; - } private static List> SplitValues(KeyValuePair multiValueProperty) { @@ -233,19 +130,14 @@ namespace PARR.AIHITMainSyncer.Services foreach (var value in values) splitedProperties.Add(new KeyValuePair(multiValueProperty.Key, value)); - } return splitedProperties; } + private void ApplyChange(Unit unit, List fieldsNameWithId, List valuesWithId, KeyValuePair 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 Value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value)); @@ -263,30 +155,10 @@ namespace PARR.AIHITMainSyncer.Services unit.UnitValues.Add(f); } - //} - //else - //{ - // uValue.ValueId = valuesWithId.First(t => IsStringEqual(t.Value, change.Value)).Id; - // uValue.DateModified = DateTimeOffset.UtcNow; - //} + } - //private List> GetChangesInUnit(List> 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 values) { // все поля из АИХИТ @@ -329,10 +201,11 @@ namespace PARR.AIHITMainSyncer.Services } } - - private async Task SyncFieldsAsync(List fieldsFromAihit, List fieldsFromDB) + //private async Task SyncFieldsAsync(List fieldsFromAihit, List fieldsFromDB) + private async Task SyncFieldsAsync(List fieldsFromAihit, List 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()) { @@ -346,9 +219,9 @@ namespace PARR.AIHITMainSyncer.Services }; if (!await unitFieldService.CreateAsync(field)) - logger.LogError($"Не удалось создать запись в таблице Fields: {item}, {field.ToJson()}"); + logger.LogError("Не удалось создать запись в таблице Fields:{item},{field}", item, field); else - logger.LogInformation($"Создана запись а таблице Fields: {item}, {field.ToJson()}"); + logger.LogInformation("Создана запись а таблице Fields: Fields:{item},{field}", item, field); } if (!await unitFieldService.CommitAsync()) logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных"); @@ -356,30 +229,6 @@ namespace PARR.AIHITMainSyncer.Services } - //private Dictionary GetPropertiesWithMultiValueFields(Dictionary properties, List 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) { //var _value1 = value1?.ToLower().Trim(); @@ -400,6 +249,7 @@ namespace PARR.AIHITMainSyncer.Services return unit; } + private async Task CreateUnitAsync(string name) { var unit = new Unit { Name = name.Trim() }; @@ -429,33 +279,4 @@ namespace PARR.AIHITMainSyncer.Services .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; - } } \ No newline at end of file