feat(aihitMainSyncer): Добавлен Replacement входных данных
This commit is contained in:
@@ -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>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user