diff --git a/PARR.AIHITMainSyncer/AihitMainSyncerInstaller.cs b/PARR.AIHITMainSyncer/AihitMainSyncerInstaller.cs index 5f306a1a..c1628cc7 100644 --- a/PARR.AIHITMainSyncer/AihitMainSyncerInstaller.cs +++ b/PARR.AIHITMainSyncer/AihitMainSyncerInstaller.cs @@ -22,6 +22,10 @@ namespace PARR.AIHITMainSyncer configuration.GetSection(nameof(MqSettings)).Bind(mqSettings); services.AddSingleton(mqSettings); + var fieldValueReplacementsSettings = new FieldValueReplacementsSettings(); + configuration.GetSection(nameof(FieldValueReplacementsSettings)).Bind(fieldValueReplacementsSettings); + services.AddSingleton(fieldValueReplacementsSettings); + services.AddTransient(); services.AddTransient(); } diff --git a/PARR.AIHITMainSyncer/Services/SyncerService.cs b/PARR.AIHITMainSyncer/Services/SyncerService.cs index f002b746..a87a1f37 100644 --- a/PARR.AIHITMainSyncer/Services/SyncerService.cs +++ b/PARR.AIHITMainSyncer/Services/SyncerService.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; +using PARR.AIHITMainSyncer.Settings; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.DAL.Models.Unit; @@ -15,13 +16,15 @@ namespace PARR.AIHITMainSyncer.Services private readonly IUnitService unitService; private readonly IUnitFieldService unitFieldService; private readonly IUnitFieldValueService unitFieldValueService; + private readonly FieldValueReplacementsSettings fieldValueReplacementsSettings; public SyncerService( ILogger logger, ITransformService transformService, IUnitService unitService, IUnitFieldService unitFieldService, - IUnitFieldValueService unitFieldValueService + IUnitFieldValueService unitFieldValueService, + FieldValueReplacementsSettings fieldValueReplacementsSettings ) { this.logger = logger; @@ -29,6 +32,7 @@ namespace PARR.AIHITMainSyncer.Services this.unitService = unitService; this.unitFieldService = unitFieldService; this.unitFieldValueService = unitFieldValueService; + this.fieldValueReplacementsSettings = fieldValueReplacementsSettings; } @@ -51,17 +55,24 @@ namespace PARR.AIHITMainSyncer.Services if (!objFromQuery.Properties.Any()) return; - foreach (var kvp in objFromQuery.Properties.ToList()) - objFromQuery.Properties[kvp.Key.Trim()] = kvp.Value?.Trim(); + // 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы) + var normalizedProperties = new Dictionary(); + foreach (var kvp in objFromQuery.Properties) + normalizedProperties[kvp.Key.Trim()] = kvp.Value?.Trim(); + + // 2. Применяем замены значений к нормализованным свойствам + ApplyFieldValueReplacements(normalizedProperties); var listAihitData = new List>(); - var propertisWithSimpleValues = objFromQuery.Properties + // 3. Обрабатываем простые значения из нормализованных свойств + var propertisWithSimpleValues = normalizedProperties .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); + // 4. Обрабатываем множественные значения из нормализованных свойств var propertiesWithMultipleValues = objFromQuery.Properties.Where(t => !propertisWithSimpleValues.Any(a => t.Key.Trim() == a.Key)).ToList(); propertiesWithMultipleValues.ForEach(p => listAihitData.AddRange( @@ -74,7 +85,7 @@ namespace PARR.AIHITMainSyncer.Services .Select(kv => new { kv.Key, kv.Value }) .ToList(); - // Определяем, какие ПОЛЯ обновляются этим сообщением + // Определяем, какие ПОЛЯ обновляются этим сообщением чтобы случайно не удалить не наши var fieldsInMessage = listAihitData .Select(kv => kv.Key) .Distinct(StringComparer.OrdinalIgnoreCase) @@ -321,5 +332,23 @@ namespace PARR.AIHITMainSyncer.Services .Include(t => t.UnitValues) .ThenInclude(uf => uf.Value); } + + private void ApplyFieldValueReplacements(Dictionary properties) + { + foreach (var replacement in fieldValueReplacementsSettings.Replacements) + { + if (properties.ContainsKey(replacement.FieldName)) + { + var currentValue = properties[replacement.FieldName]; + // Проверяем, содержится ли текущее значение в списке OldValues (с учетом регистра) + if (replacement.OldValues.Contains(currentValue, StringComparer.OrdinalIgnoreCase)) + { + logger.LogDebug("Заменяем значение поля '{FieldName}' с '{OldValue}' на '{NewValue}'", + replacement.FieldName, currentValue, replacement.NewValue); + properties[replacement.FieldName] = replacement.NewValue; + } + } + } + } } } \ No newline at end of file diff --git a/PARR.AIHITMainSyncer/Settings/FieldValueReplacementsSettings.cs b/PARR.AIHITMainSyncer/Settings/FieldValueReplacementsSettings.cs new file mode 100644 index 00000000..f31b87ac --- /dev/null +++ b/PARR.AIHITMainSyncer/Settings/FieldValueReplacementsSettings.cs @@ -0,0 +1,17 @@ +namespace PARR.AIHITMainSyncer.Settings +{ + internal class FieldValueReplacementsSettings + { + public List Replacements { get; set; } = new List(); + + } + + + internal class FieldValueReplacement + { + public string FieldName { get; set; } = string.Empty; + + public List OldValues { get; set; } = new List(); + public string NewValue { get; set; } = string.Empty; + } +} diff --git a/PARR.AIHITSyncerWorker/appsettings.json b/PARR.AIHITSyncerWorker/appsettings.json index ae13fc2f..994553b4 100644 --- a/PARR.AIHITSyncerWorker/appsettings.json +++ b/PARR.AIHITSyncerWorker/appsettings.json @@ -35,5 +35,29 @@ "User": "aihit_syncer", "Password": "afsdgDGjhfiU76496as42!@", "PrefetchCount": 100 + }, + "FieldValueReplacementsSettings": { + "Replacements": [ + { + "FieldName": "АКТИВЕН", + "OldValues": [ "t" ], + "NewValue": "1" + }, + { + "FieldName": "АКТИВЕН", + "OldValues": [ "f" ], + "NewValue": "0" + }, + { + "FieldName": "НЕУНИКАЛЬНЫЙ_ЭК", + "OldValues": [ "t" ], + "NewValue": "1" + }, + { + "FieldName": "НЕУНИКАЛЬНЫЙ_ЭК", + "OldValues": [ "f" ], + "NewValue": "0" + } + ] } } diff --git a/PARR.DAL.Tests/TransformServices/EsppScheduleTransformServiceTests.cs b/PARR.DAL.Tests/TransformServices/EsppScheduleTransformServiceTests.cs index ffd260ec..e720889b 100644 --- a/PARR.DAL.Tests/TransformServices/EsppScheduleTransformServiceTests.cs +++ b/PARR.DAL.Tests/TransformServices/EsppScheduleTransformServiceTests.cs @@ -393,8 +393,8 @@ namespace PARR.DAL.Tests.TransformServices { // Arrange var pastDate = new DateTimeOffset(2025, 11, 20, 10, 0, 0, TimeSpan.Zero); // Прошлое время - var futureNonMatchingDate = new DateTimeOffset(2025, 11, 27, 10, 0, 0, TimeSpan.Zero); // Будущее время - var matchingDate = new DateTimeOffset(2025, 11, 26, 10, 0, 0, TimeSpan.Zero); // Совпадает время + var futureDate = new DateTimeOffset(2025, 11, 30, 10, 0, 0, TimeSpan.Zero); // Будущее время + var matchingDate = new DateTimeOffset(2025, 11, 27, 10, 0, 0, TimeSpan.Zero); // Совпадает время var scheduleDto = new EsppScheduleDto { @@ -434,13 +434,13 @@ namespace PARR.DAL.Tests.TransformServices // Act var resultFromPast = await service.GetNextDateAsync(Guid.NewGuid(), pastDate); - var resultFromFutureNonMatching = await service.GetNextDateAsync(Guid.NewGuid(), futureNonMatchingDate); - var resultFromFutureMatching = await service.GetNextDateAsync(Guid.NewGuid(), matchingDate); + var resultFromFutureMatching = await service.GetNextDateAsync(Guid.NewGuid(), futureDate); + var resultFromSimpleMatching = await service.GetNextDateAsync(Guid.NewGuid(), matchingDate); // Assert - Assert.Equal(matchingDate.AddDays(1), resultFromPast); - Assert.Equal(futureNonMatchingDate.AddDays(1), resultFromFutureNonMatching); - Assert.Equal(matchingDate.AddDays(1), resultFromFutureMatching); + Assert.Equal(matchingDate, resultFromPast); + Assert.Equal(futureDate, resultFromFutureMatching); + Assert.Equal(matchingDate, resultFromSimpleMatching); } /*