2025-05-19 16:09:55 +10:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
using PARR.BLL.Domain.Mq;
|
|
|
|
|
|
using PARR.BLL.Services.Interfaces;
|
|
|
|
|
|
using PARR.DAL.Extensions;
|
|
|
|
|
|
using PARR.DAL.Models.Unit;
|
|
|
|
|
|
using PARR.DAL.Services.Interfaces.Unit;
|
|
|
|
|
|
|
|
|
|
|
|
namespace PARR.AIHITMainSyncer.Services
|
|
|
|
|
|
{
|
|
|
|
|
|
internal class SyncerService : ISyncerService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly ILogger<SyncerService> logger;
|
|
|
|
|
|
private readonly ITransformService transformService;
|
|
|
|
|
|
private readonly IUnitService unitService;
|
|
|
|
|
|
private readonly IUnitFieldService unitFieldService;
|
2025-05-21 11:53:07 +10:00
|
|
|
|
private readonly IUnitFieldValueService unitFieldValueService;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
|
|
|
|
|
public SyncerService(
|
|
|
|
|
|
ILogger<SyncerService> logger,
|
|
|
|
|
|
ITransformService transformService,
|
|
|
|
|
|
IUnitService unitService,
|
2025-05-21 11:53:07 +10:00
|
|
|
|
IUnitFieldService unitFieldService,
|
|
|
|
|
|
IUnitFieldValueService unitFieldValueService
|
2025-05-19 16:09:55 +10:00
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
this.transformService = transformService;
|
|
|
|
|
|
this.unitService = unitService;
|
|
|
|
|
|
this.unitFieldService = unitFieldService;
|
2025-05-21 11:53:07 +10:00
|
|
|
|
this.unitFieldValueService = unitFieldValueService;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task SyncAsync(string msg)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР.");
|
|
|
|
|
|
var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg);
|
|
|
|
|
|
if (objFromQuery == null)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
await SyncUnitAsync(objFromQuery);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task SyncUnitAsync(AihitMainDataMq objFromQuery)
|
|
|
|
|
|
{
|
2025-05-21 11:53:07 +10:00
|
|
|
|
var isChanged = false;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-22 09:08:11 +10:00
|
|
|
|
var unit = await unitService.GetByName(objFromQuery.Name);
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
foreach (var item in objFromQuery.Properties)
|
|
|
|
|
|
{ //актуализируем справочники в соответствии с пришедшими данными
|
|
|
|
|
|
var field = await CreateUnitFieldIfNotExistAsync(item.Key);
|
|
|
|
|
|
var value = await CreateFieldValueIfNotExistAsync(field, item.Value);
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
//Если ЭК не найден то создаём его
|
|
|
|
|
|
if (unit == null)
|
|
|
|
|
|
unit = await CreateUnitAsync(objFromQuery);
|
|
|
|
|
|
//else
|
|
|
|
|
|
// logger.LogDebug($"Найден Unit в БД: {unit.Name})");
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
//теперь проверяем наличие поля связанного с этим ЭК
|
|
|
|
|
|
if (SyncFields(unit, field) && !isChanged)
|
|
|
|
|
|
isChanged = true;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
//Синхронизируем значение
|
|
|
|
|
|
if (SyncValues(unit, field, value) && !isChanged)
|
|
|
|
|
|
isChanged = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (isChanged && !await unitService.CommitAsync())
|
|
|
|
|
|
logger.LogError($"Не удалось изменить Unit {objFromQuery.Name}");
|
|
|
|
|
|
else
|
2025-05-21 16:50:00 +10:00
|
|
|
|
logger.LogDebug($"----- Набор данных в Unit изменён: {objFromQuery.Name} -----");
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
private bool SyncFields(Unit unit, UnitField field)
|
2025-05-19 16:09:55 +10:00
|
|
|
|
{
|
|
|
|
|
|
var isChanged = false;
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
var fieldInUnit = unit!.UnitFields.FirstOrDefault(u => u.FieldId == field.Id);
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
if (fieldInUnit == null)
|
2025-05-19 16:09:55 +10:00
|
|
|
|
{
|
2025-05-21 11:53:07 +10:00
|
|
|
|
if (!isChanged) isChanged = true;
|
|
|
|
|
|
unit.UnitFields.Add(
|
|
|
|
|
|
new UnitInField { UnitId = unit.Id, FieldId = field.Id, DateCreated = DateTimeOffset.UtcNow }
|
|
|
|
|
|
);
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
return isChanged;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
|
|
|
|
|
|
private bool SyncValues(Unit unit, UnitField field, UnitFieldValue value)
|
2025-05-19 16:09:55 +10:00
|
|
|
|
{
|
2025-05-21 11:53:07 +10:00
|
|
|
|
var isChanged = false;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
var valueInUnit = unit!.UnitValues.FirstOrDefault(uv => uv.FieldId == field.Id);
|
|
|
|
|
|
|
|
|
|
|
|
if (valueInUnit == null)
|
2025-05-19 16:09:55 +10:00
|
|
|
|
{
|
2025-05-21 11:53:07 +10:00
|
|
|
|
if (!isChanged) isChanged = true;
|
|
|
|
|
|
unit.UnitValues.Add(
|
|
|
|
|
|
new UnitInValue
|
|
|
|
|
|
{
|
|
|
|
|
|
UnitId = unit.Id,
|
|
|
|
|
|
FieldId = field.Id,
|
|
|
|
|
|
ValueId = value.Id,
|
|
|
|
|
|
DateCreated = DateTime.UtcNow
|
|
|
|
|
|
}
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (valueInUnit.Value != value)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!isChanged) isChanged = true;
|
|
|
|
|
|
{
|
|
|
|
|
|
valueInUnit.ValueId = value.Id;
|
|
|
|
|
|
valueInUnit.DateModified = DateTime.UtcNow;
|
|
|
|
|
|
}
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
return isChanged;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
private async Task<Unit> CreateUnitAsync(AihitMainDataMq objFromQuery)
|
2025-05-19 16:09:55 +10:00
|
|
|
|
{
|
|
|
|
|
|
var unit = new Unit { Name = objFromQuery.Name.Trim() };
|
|
|
|
|
|
|
|
|
|
|
|
if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync())
|
|
|
|
|
|
logger.LogError($"Не удалось создать Unit {unit.Name}");
|
|
|
|
|
|
else
|
2025-05-21 16:50:00 +10:00
|
|
|
|
logger.LogDebug($"----- Создан Unit: {unit.Name} -----");
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-22 09:08:11 +10:00
|
|
|
|
return (await unitService.GetByName(unit.Name))!;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
private async Task<UnitField> CreateUnitFieldIfNotExistAsync(string name)
|
2025-05-19 16:09:55 +10:00
|
|
|
|
{
|
|
|
|
|
|
var existUnitField = await unitFieldService.GetByAihitNameAsync(name);
|
|
|
|
|
|
|
|
|
|
|
|
if (existUnitField != null)
|
|
|
|
|
|
return existUnitField;
|
|
|
|
|
|
|
|
|
|
|
|
var field = new UnitField
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
|
AihitName = name.Trim(),
|
2025-05-21 11:53:07 +10:00
|
|
|
|
EsppName = null,
|
2025-05-19 16:09:55 +10:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
if (!await unitFieldService.CreateAsync(field) || !await unitFieldService.CommitAsync())
|
|
|
|
|
|
logger.LogError($"Не удалось создать запись в таблице Fields: {name}, {field.ToJson()}");
|
|
|
|
|
|
else
|
2025-05-21 16:50:00 +10:00
|
|
|
|
logger.LogDebug($"Создана запись а таблице Fields: {name}, {field.ToJson()}");
|
2025-05-19 16:09:55 +10:00
|
|
|
|
|
2025-05-21 11:53:07 +10:00
|
|
|
|
return (await unitFieldService.GetAsync(field.Id))!;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private async Task<UnitFieldValue> CreateFieldValueIfNotExistAsync(UnitField field, string? value)
|
|
|
|
|
|
{
|
|
|
|
|
|
var existUnitFieldValue = await unitFieldValueService.GetByValueNameAsync(value);
|
|
|
|
|
|
|
|
|
|
|
|
//если значение существует отдаем его
|
|
|
|
|
|
if (existUnitFieldValue != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
//проверяем связь с таблицей Fields
|
|
|
|
|
|
if (existUnitFieldValue.FieldValues.FirstOrDefault(fv => fv.FieldId == field.Id) == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var unitFieldInUnitFieldValue = new UnitFieldInUnitFieldValue
|
|
|
|
|
|
{
|
|
|
|
|
|
FieldId = field.Id,
|
|
|
|
|
|
FieldValueId = existUnitFieldValue.Id,
|
|
|
|
|
|
DateCreated = DateTime.UtcNow,
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
existUnitFieldValue.FieldValues.Add(unitFieldInUnitFieldValue);
|
|
|
|
|
|
|
|
|
|
|
|
if (!await unitFieldValueService.CommitAsync())
|
|
|
|
|
|
logger.LogError($"Не удалось создать связь таблицы FieldValues и Fields: {unitFieldValueService.ToJson()}");
|
|
|
|
|
|
else
|
2025-05-21 16:50:00 +10:00
|
|
|
|
logger.LogDebug($"Создана связь таблицы FieldValues и Fields: {unitFieldValueService.ToJson()}");
|
2025-05-21 11:53:07 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return existUnitFieldValue;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//значение не найдено значит создаём его
|
|
|
|
|
|
var newValue = new UnitFieldValue
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = Guid.NewGuid(),
|
|
|
|
|
|
Value = (value == null) ? null : value.Trim()
|
|
|
|
|
|
};
|
|
|
|
|
|
//и привязываем значение к полю
|
|
|
|
|
|
newValue.FieldValues.Add(
|
|
|
|
|
|
new UnitFieldInUnitFieldValue
|
|
|
|
|
|
{
|
|
|
|
|
|
FieldId = field.Id,
|
|
|
|
|
|
FieldValueId = newValue.Id,
|
|
|
|
|
|
DateCreated = DateTime.UtcNow,
|
|
|
|
|
|
}
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
//пишем в базу данных
|
|
|
|
|
|
if (!await unitFieldValueService.CreateAsync(newValue) || !await unitFieldValueService.CommitAsync())
|
|
|
|
|
|
logger.LogError($"Не удалось создать запись в таблице Values: {newValue.Value}, {newValue.ToJson()}");
|
|
|
|
|
|
else
|
2025-05-21 16:50:00 +10:00
|
|
|
|
logger.LogDebug($"Создана запись а таблице Values: {newValue.Value}, {newValue.ToJson()}");
|
2025-05-21 11:53:07 +10:00
|
|
|
|
|
|
|
|
|
|
return (await unitFieldValueService.GetAsync(newValue.Id))!;
|
2025-05-19 16:09:55 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|