feat(aihitMainSyncer): Добавлен Replacement входных данных

This commit is contained in:
Mikhail Kuznetsov
2025-11-27 17:11:14 +10:00
parent f42e5b5ea8
commit 5f84ccf4b8
5 changed files with 86 additions and 12 deletions

View File

@@ -22,6 +22,10 @@ namespace PARR.AIHITMainSyncer
configuration.GetSection(nameof(MqSettings)).Bind(mqSettings); configuration.GetSection(nameof(MqSettings)).Bind(mqSettings);
services.AddSingleton(mqSettings); services.AddSingleton(mqSettings);
var fieldValueReplacementsSettings = new FieldValueReplacementsSettings();
configuration.GetSection(nameof(FieldValueReplacementsSettings)).Bind(fieldValueReplacementsSettings);
services.AddSingleton(fieldValueReplacementsSettings);
services.AddTransient<IAihitMainSyncer, AihitMainSyncer>(); services.AddTransient<IAihitMainSyncer, AihitMainSyncer>();
services.AddTransient<ISyncerService, SyncerService>(); services.AddTransient<ISyncerService, SyncerService>();
} }

View File

@@ -1,6 +1,7 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using PARR.AIHITMainSyncer.Settings;
using PARR.BLL.Domain.Mq; using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces; using PARR.BLL.Services.Interfaces;
using PARR.DAL.Models.Unit; using PARR.DAL.Models.Unit;
@@ -15,13 +16,15 @@ namespace PARR.AIHITMainSyncer.Services
private readonly IUnitService unitService; private readonly IUnitService unitService;
private readonly IUnitFieldService unitFieldService; private readonly IUnitFieldService unitFieldService;
private readonly IUnitFieldValueService unitFieldValueService; private readonly IUnitFieldValueService unitFieldValueService;
private readonly FieldValueReplacementsSettings fieldValueReplacementsSettings;
public SyncerService( public SyncerService(
ILogger<SyncerService> logger, ILogger<SyncerService> logger,
ITransformService transformService, ITransformService transformService,
IUnitService unitService, IUnitService unitService,
IUnitFieldService unitFieldService, IUnitFieldService unitFieldService,
IUnitFieldValueService unitFieldValueService IUnitFieldValueService unitFieldValueService,
FieldValueReplacementsSettings fieldValueReplacementsSettings
) )
{ {
this.logger = logger; this.logger = logger;
@@ -29,6 +32,7 @@ namespace PARR.AIHITMainSyncer.Services
this.unitService = unitService; this.unitService = unitService;
this.unitFieldService = unitFieldService; this.unitFieldService = unitFieldService;
this.unitFieldValueService = unitFieldValueService; this.unitFieldValueService = unitFieldValueService;
this.fieldValueReplacementsSettings = fieldValueReplacementsSettings;
} }
@@ -51,17 +55,24 @@ namespace PARR.AIHITMainSyncer.Services
if (!objFromQuery.Properties.Any()) if (!objFromQuery.Properties.Any())
return; return;
foreach (var kvp in objFromQuery.Properties.ToList()) // 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы)
objFromQuery.Properties[kvp.Key.Trim()] = kvp.Value?.Trim(); var normalizedProperties = new Dictionary<string, string?>();
foreach (var kvp in objFromQuery.Properties)
normalizedProperties[kvp.Key.Trim()] = kvp.Value?.Trim();
// 2. Применяем замены значений к нормализованным свойствам
ApplyFieldValueReplacements(normalizedProperties);
var listAihitData = new List<KeyValuePair<string, string?>>(); var listAihitData = new List<KeyValuePair<string, string?>>();
var propertisWithSimpleValues = objFromQuery.Properties // 3. Обрабатываем простые значения из нормализованных свойств
var propertisWithSimpleValues = normalizedProperties
.Where(t => fieldsFromDB.Any(a => IsStringEqual(t.Key.Trim(), a.AihitName) && 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);
// 4. Обрабатываем множественные значения из нормализованных свойств
var propertiesWithMultipleValues = objFromQuery.Properties.Where(t => !propertisWithSimpleValues.Any(a => t.Key.Trim() == a.Key)).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(
@@ -74,7 +85,7 @@ namespace PARR.AIHITMainSyncer.Services
.Select(kv => new { kv.Key, kv.Value }) .Select(kv => new { kv.Key, kv.Value })
.ToList(); .ToList();
// Определяем, какие ПОЛЯ обновляются этим сообщением // Определяем, какие ПОЛЯ обновляются этим сообщением чтобы случайно не удалить не наши
var fieldsInMessage = listAihitData var fieldsInMessage = listAihitData
.Select(kv => kv.Key) .Select(kv => kv.Key)
.Distinct(StringComparer.OrdinalIgnoreCase) .Distinct(StringComparer.OrdinalIgnoreCase)
@@ -321,5 +332,23 @@ namespace PARR.AIHITMainSyncer.Services
.Include(t => t.UnitValues) .Include(t => t.UnitValues)
.ThenInclude(uf => uf.Value); .ThenInclude(uf => uf.Value);
} }
private void ApplyFieldValueReplacements(Dictionary<string, string?> 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;
}
}
}
}
} }
} }

View File

@@ -0,0 +1,17 @@
namespace PARR.AIHITMainSyncer.Settings
{
internal class FieldValueReplacementsSettings
{
public List<FieldValueReplacement> Replacements { get; set; } = new List<FieldValueReplacement>();
}
internal class FieldValueReplacement
{
public string FieldName { get; set; } = string.Empty;
public List<string> OldValues { get; set; } = new List<string>();
public string NewValue { get; set; } = string.Empty;
}
}

View File

@@ -35,5 +35,29 @@
"User": "aihit_syncer", "User": "aihit_syncer",
"Password": "afsdgDGjhfiU76496as42!@", "Password": "afsdgDGjhfiU76496as42!@",
"PrefetchCount": 100 "PrefetchCount": 100
},
"FieldValueReplacementsSettings": {
"Replacements": [
{
"FieldName": "АКТИВЕН",
"OldValues": [ "t" ],
"NewValue": "1"
},
{
"FieldName": "АКТИВЕН",
"OldValues": [ "f" ],
"NewValue": "0"
},
{
"FieldName": "НЕУНИКАЛЬНЫЙ_ЭК",
"OldValues": [ "t" ],
"NewValue": "1"
},
{
"FieldName": "НЕУНИКАЛЬНЫЙ_ЭК",
"OldValues": [ "f" ],
"NewValue": "0"
}
]
} }
} }

View File

@@ -393,8 +393,8 @@ namespace PARR.DAL.Tests.TransformServices
{ {
// Arrange // Arrange
var pastDate = new DateTimeOffset(2025, 11, 20, 10, 0, 0, TimeSpan.Zero); // Прошлое время 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 futureDate = new DateTimeOffset(2025, 11, 30, 10, 0, 0, TimeSpan.Zero); // Будущее время
var matchingDate = new DateTimeOffset(2025, 11, 26, 10, 0, 0, TimeSpan.Zero); // Совпадает время var matchingDate = new DateTimeOffset(2025, 11, 27, 10, 0, 0, TimeSpan.Zero); // Совпадает время
var scheduleDto = new EsppScheduleDto var scheduleDto = new EsppScheduleDto
{ {
@@ -434,13 +434,13 @@ namespace PARR.DAL.Tests.TransformServices
// Act // Act
var resultFromPast = await service.GetNextDateAsync(Guid.NewGuid(), pastDate); var resultFromPast = await service.GetNextDateAsync(Guid.NewGuid(), pastDate);
var resultFromFutureNonMatching = await service.GetNextDateAsync(Guid.NewGuid(), futureNonMatchingDate); var resultFromFutureMatching = await service.GetNextDateAsync(Guid.NewGuid(), futureDate);
var resultFromFutureMatching = await service.GetNextDateAsync(Guid.NewGuid(), matchingDate); var resultFromSimpleMatching = await service.GetNextDateAsync(Guid.NewGuid(), matchingDate);
// Assert // Assert
Assert.Equal(matchingDate.AddDays(1), resultFromPast); Assert.Equal(matchingDate, resultFromPast);
Assert.Equal(futureNonMatchingDate.AddDays(1), resultFromFutureNonMatching); Assert.Equal(futureDate, resultFromFutureMatching);
Assert.Equal(matchingDate.AddDays(1), resultFromFutureMatching); Assert.Equal(matchingDate, resultFromSimpleMatching);
} }
/* /*