This commit is contained in:
Mikhail Kuznetsov
2025-05-30 09:52:55 +10:00
4 changed files with 242 additions and 243 deletions

View File

@@ -8,140 +8,140 @@ namespace PARR.AIHITMainLoader.Models
{ {
[Column("IP_АДРЕС")] [Column("IP_АДРЕС")]
public string? IP { get; set; } public string? IP { get; set; }
[Column("МЕТКА")] [Column("МЕТКА")]
public string? Metka { get; set; } public string? Metka { get; set; }
[Column("АКТИВЕН")] [Column("АКТИВЕН")]
public string? IsActive { get; set; } public string? IsActive { get; set; }
[Column("ВАЖНЫЙ_ЭК")] [Column("ВАЖНЫЙ_ЭК")]
public string? IsImportant { get; set; } public string? IsImportant { get; set; }
[Column("ВРЕМЯ_СОЗДАНИЯ")] [Column("ВРЕМЯ_СОЗДАНИЯ")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
[Column("ДОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ")] [Column("ДОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ")]
public string? AdditionalInfo { get; set; } public string? AdditionalInfo { get; set; }
[Column("ЗОНА_ОТВЕТСТВЕННОСТИ")] [Column("ЗОНА_ОТВЕТСТВЕННОСТИ")]
public string? ResponseArea { get; set; } public string? ResponseArea { get; set; }
[Column("КАТЕГОРИЯ_ЭК")] [Column("КАТЕГОРИЯ_ЭК")]
public string? EKCategory { get; set; } public string? EKCategory { get; set; }
[Column("КОД_ПОИСКАК")] [Column("КОД_ПОИСКАК")]
public string? EKFindCode { get; set; } public string? EKFindCode { get; set; }
[Column("КОД_ПРОДУКТА")] [Column("КОД_ПРОДУКТА")]
public string? ProductCode { get; set; } public string? ProductCode { get; set; }
[Column("КОД_УСЛУГИ")] [Column("КОД_УСЛУГИ")]
public string? ServiceCode { get; set; } public string? ServiceCode { get; set; }
[Column("КРАТКОЕ_НАИМЕНОВАНИЕ")] [Column("КРАТКОЕ_НАИМЕНОВАНИЕ")]
public string? ShortName { get; set; } public string? ShortName { get; set; }
[Column("ОТВЕТСТВЕННЫЙ_ЗАК")] [Column("ОТВЕТСТВЕННЫЙ_ЗАК")]
public string? ResponsibleByEK { get; set; } public string? ResponsibleByEK { get; set; }
[Column("ПЛАНОВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ")] [Column("ПЛАНОВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ")]
public DateTime? PlannedTimeToRepair { get; set; } public DateTime? PlannedTimeToRepair { get; set; }
[Column("ПОДКАТЕГОРИЯ_ЭК")] [Column("ПОДКАТЕГОРИЯ_ЭК")]
public string? EKSubCategory { get; set; } public string? EKSubCategory { get; set; }
[Column("ПОЛНОЕ_НАИМЕНОВАНИЕ")] [Column("ПОЛНОЕ_НАИМЕНОВАНИЕ")]
public string? FullName { get; set; } public string? FullName { get; set; }
[Column("ПРЕДПИСАНИЕ")] [Column("ПРЕДПИСАНИЕ")]
public string? Prescription { get; set; } public string? Prescription { get; set; }
[Column("ПРЕДПРИЯТИЕ")] [Column("ПРЕДПРИЯТИЕ")]
public string? Company { get; set; } public string? Company { get; set; }
[Column("РАБОЧАЯ_ГР_ОТВ_ЗАК")] [Column("РАБОЧАЯ_ГР_ОТВ_ЗАК")]
public string? WorkGroup { get; set; } public string? WorkGroup { get; set; }
[Column("РАСПОЛОЖЕНИЕ")] [Column("РАСПОЛОЖЕНИЕ")]
public string? Location { get; set; } public string? Location { get; set; }
[Column("РЕВИЗОРК")] [Column("РЕВИЗОРК")]
public string? EKRevizor { get; set; } public string? EKRevizor { get; set; }
[Column("РЕГИСТРАТОРК")] [Column("РЕГИСТРАТОРК")]
public string? EKRegister { get; set; } public string? EKRegister { get; set; }
[Column("СЕТЕВОЕМЯ")] [Column("СЕТЕВОЕМЯ")]
public string? NetworkName { get; set; } public string? NetworkName { get; set; }
[Column("СТАТУС")] [Column("СТАТУС")]
public string? Status { get; set; } public string? Status { get; set; }
[Column("ТИП_ЭК")] [Column("ТИП_ЭК")]
public string? EKType { get; set; } public string? EKType { get; set; }
[Column("ФАКТИЧЕСКОЕ_ЗАВЕРШЕНИЕКСПЛУАТАЦИИ")] [Column("ФАКТИЧЕСКОЕ_ЗАВЕРШЕНИЕКСПЛУАТАЦИИ")]
public DateTime? EndExplotationDate { get; set; } public DateTime? EndExplotationDate { get; set; }
[Column("ФАКТИЧЕСКОЕ_НАЧАЛОКСПЛУАТАЦИИ")] [Column("ФАКТИЧЕСКОЕ_НАЧАЛОКСПЛУАТАЦИИ")]
public DateTime? StartExplotationDate { get; set; } public DateTime? StartExplotationDate { get; set; }
[Column("ЦЕЛЕВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ")] [Column("ЦЕЛЕВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ")]
public string? TargetRepairTime { get; set; } public string? TargetRepairTime { get; set; }
[Column("SYSMODTIME")] [Column("SYSMODTIME")]
public DateTime? SysModTime { get; set; } public DateTime? SysModTime { get; set; }
[Column("SYSMODUSER")] [Column("SYSMODUSER")]
public string? SysModUser { get; set; } public string? SysModUser { get; set; }
[Column("НОВЫЙ_КОД_ПОИСКА")] [Column("НОВЫЙ_КОД_ПОИСКА")]
public string? NewEKFindCode { get; set; } public string? NewEKFindCode { get; set; }
[Column("СТАРЫЙ_КОД_ПОИСКА")] [Column("СТАРЫЙ_КОД_ПОИСКА")]
public string? OldEKFindCode { get; set; } public string? OldEKFindCode { get; set; }
[Column("НАПРАВЛЕНИЕТСК")] [Column("НАПРАВЛЕНИЕТСК")]
public string? CTSDirection { get; set; } public string? CTSDirection { get; set; }
[Key] [Key]
[Column("ID")] [Column("ID")]
public int? AIHID { get; set; } public int? AIHID { get; set; }
[Column("недостоверныеанные")] [Column("недостоверныеанные")]
public char? IsUnreliableData { get; set; } public char? IsUnreliableData { get; set; }
[Column("РГ_смены")] [Column("РГ_смены")]
public string? ShiftWorkGroup { get; set; } public string? ShiftWorkGroup { get; set; }
[Column("КлиентскоеО")] [Column("КлиентскоеО")]
public string? ClientSoftware { get; set; } public string? ClientSoftware { get; set; }
[Column("Клиентская_ОС")] [Column("Клиентская_ОС")]
public string? ClientOS { get; set; } public string? ClientOS { get; set; }
[Column("Тип СУБД")] [Column("Тип СУБД")]
public string? DBType { get; set; } public string? DBType { get; set; }
[Column("Тип сервера приложений")] [Column("Тип сервера приложений")]
public string? APPType { get; set; } public string? APPType { get; set; }
[Column("Тип сервера ЦК БС")] [Column("Тип сервера ЦК БС")]
public string? CKBSServerType { get; set; } public string? CKBSServerType { get; set; }
[Column("Тип сервера ИБ")] [Column("Тип сервера ИБ")]
public string? IBServerType { get; set; } public string? IBServerType { get; set; }
[Column("Тип сервера инфраструктуры")] [Column("Тип сервера инфраструктуры")]
public string? InfrastructureServerType { get; set; } public string? InfrastructureServerType { get; set; }
[Column("Тип сервера мониторинга")] [Column("Тип сервера мониторинга")]
public string? MonitoringServerType { get; set; } public string? MonitoringServerType { get; set; }
[Column("ОС")] [Column("ОС")]
public string? OSType { get; set; } public string? OSType { get; set; }
[Column("ЗО_РГ")] [Column("ЗО_РГ")]
public string? WorkGroupResponseArea { get; set; } public string? WorkGroupResponseArea { get; set; }
@@ -154,39 +154,39 @@ namespace PARR.AIHITMainLoader.Models
Properties = new Dictionary<string, string?> Properties = new Dictionary<string, string?>
{ {
{"IP_АДРЕС", IP }, {"IP_АДРЕС", IP },
{"МЕТКА", Metka }, //{"МЕТКА", Metka },
{"АКТИВЕН", IsActive }, //{"АКТИВЕН", IsActive },
{"ВАЖНЫЙ_ЭК", IsImportant }, //{"ВАЖНЫЙ_ЭК", IsImportant },
{"ВРЕМЯ_СОЗДАНИЯ", CreateTime.ToString() ?? null}, //{"ВРЕМЯ_СОЗДАНИЯ", CreateTime.ToString() ?? null},
{ОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ", AdditionalInfo }, //{ОПОЛНИТЕЛЬНАЯ_ИНФОРМАЦИЯ", AdditionalInfo },
{"КАТЕГОРИЯ_ЭК", EKCategory }, {"КАТЕГОРИЯ_ЭК", EKCategory },
{"КОД_ПРОДУКТА", EKFindCode }, //{"КОД_ПРОДУКТА", EKFindCode },
{"КОД_УСЛУГИ", ProductCode }, //{"КОД_УСЛУГИ", ProductCode },
{"КРАТКОЕ_НАИМЕНОВАНИЕ", ShortName }, {"КРАТКОЕ_НАИМЕНОВАНИЕ", ShortName },
{"ОТВЕТСТВЕННЫЙ_ЗАК", ResponsibleByEK }, {"ОТВЕТСТВЕННЫЙ_ЗАК", ResponsibleByEK },
{"ПЛАНОВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ", PlannedTimeToRepair.ToString() ?? null }, //{"ПЛАНОВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ", PlannedTimeToRepair.ToString() ?? null },
{ОДКАТЕГОРИЯ_ЭК", EKSubCategory }, {ОДКАТЕГОРИЯ_ЭК", EKSubCategory },
{ОЛНОЕ_НАИМЕНОВАНИЕ", FullName }, {ОЛНОЕ_НАИМЕНОВАНИЕ", FullName },
{"ПРЕДПИСАНИЕ", Prescription }, //{"ПРЕДПИСАНИЕ", Prescription },
{"ПРЕДПРИЯТИЕ", Company }, //{"ПРЕДПРИЯТИЕ", Company },
{"РАБОЧАЯ_ГР_ОТВ_ЗАК", WorkGroup }, {"РАБОЧАЯ_ГР_ОТВ_ЗАК", WorkGroup },
{"РАСПОЛОЖЕНИЕ", Location }, //{"РАСПОЛОЖЕНИЕ", Location },
{"РЕВИЗОРК", EKRevizor }, //{"РЕВИЗОРК", EKRevizor },
{"РЕГИСТРАТОРК", EKRegister }, //{"РЕГИСТРАТОРК", EKRegister },
{"СЕТЕВОЕМЯ", NetworkName }, //{"СЕТЕВОЕМЯ", NetworkName },
{"СТАТУС", Status }, {"СТАТУС", Status },
{"ТИП_ЭК", EKType }, {"ТИП_ЭК", EKType },
{АКТИЧЕСКОЕ_ЗАВЕРШЕНИЕКСПЛУАТАЦИИ", EndExplotationDate.ToString() ?? null }, //{АКТИЧЕСКОЕ_ЗАВЕРШЕНИЕКСПЛУАТАЦИИ", EndExplotationDate.ToString() ?? null },
{АКТИЧЕСКОЕ_НАЧАЛОКСПЛУАТАЦИИ", StartExplotationDate.ToString() ?? null }, //{АКТИЧЕСКОЕ_НАЧАЛОКСПЛУАТАЦИИ", StartExplotationDate.ToString() ?? null },
{ЕЛЕВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ", TargetRepairTime }, //{ЕЛЕВОЕ_ВРЕМЯ_ВОССТАНОВЛЕНИЯ", TargetRepairTime },
{"SYSMODTIME", SysModTime.ToString() ?? null }, //{"SYSMODTIME", SysModTime.ToString() ?? null },
{"SYSMODUSER", SysModUser }, //{"SYSMODUSER", SysModUser },
{"НОВЫЙ_КОД_ПОИСКА", NewEKFindCode }, //{"НОВЫЙ_КОД_ПОИСКА", NewEKFindCode },
{"СТАРЫЙ_КОД_ПОИСКА", OldEKFindCode }, //{"СТАРЫЙ_КОД_ПОИСКА", OldEKFindCode },
{"НАПРАВЛЕНИЕТСК", CTSDirection }, //{"НАПРАВЛЕНИЕТСК", CTSDirection },
{"ID", AIHID.ToString() }, //{"ID", AIHID.ToString() },
{едостоверныеанные", IsUnreliableData.ToString() }, //{едостоверныеанные", IsUnreliableData.ToString() },
{"РГ_смены", ShiftWorkGroup }, //{"РГ_смены", ShiftWorkGroup },
{"КлиентскоеО", ClientSoftware }, {"КлиентскоеО", ClientSoftware },
{"Клиентская_ОС", ClientOS }, {"Клиентская_ОС", ClientOS },
{"Тип СУБД", DBType }, {"Тип СУБД", DBType },

View File

@@ -1,4 +1,6 @@
using Microsoft.Extensions.Logging; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using PARR.BLL.Domain.Mq; using PARR.BLL.Domain.Mq;
using PARR.BLL.Services.Interfaces; using PARR.BLL.Services.Interfaces;
using PARR.DAL.Extensions; using PARR.DAL.Extensions;
@@ -34,191 +36,206 @@ namespace PARR.AIHITMainSyncer.Services
public async Task SyncAsync(string msg) public async Task SyncAsync(string msg)
{ {
logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР."); logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР.");
try var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg);
{ if (objFromQuery == null)
var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg); return;
if (objFromQuery == null)
return;
await SyncUnitAsync(objFromQuery); await SyncUnitAsync(objFromQuery);
}
catch (Exception ex)
{
logger.LogCritical(ex, "Ошибка синхронизации!!!!!!!!!!");
}
} }
private async Task SyncUnitAsync(AihitMainDataMq objFromQuery) private async Task SyncUnitAsync(AihitMainDataMq objFromQuery)
{ {
var isChanged = false; await SyncFieldsAsync(objFromQuery.Properties);
var unit = await unitService.GetByName(objFromQuery.Name); await SyncValuesAsync(objFromQuery.Properties);
foreach (var item in objFromQuery.Properties) Unit unit = await GetUnit(objFromQuery.Name);
{ //актуализируем справочники в соответствии с пришедшими данными
var field = await CreateUnitFieldIfNotExistAsync(item.Key);
var value = await CreateFieldValueIfNotExistAsync(field, item.Value);
//Если ЭК не найден то создаём его var changes = GetChangesInUnit(objFromQuery.Properties, unit);
if (unit == null)
unit = await CreateUnitAsync(objFromQuery);
//else
// logger.LogDebug($"Найден Unit в БД: {unit.Name})");
//теперь проверяем наличие поля связанного с этим ЭК if (changes.Any())
if (SyncFields(unit, field) && !isChanged)
isChanged = true;
//Синхронизируем значение
if (SyncValues(unit, field, value) && !isChanged)
isChanged = true;
}
if (isChanged && !await unitService.CommitAsync())
logger.LogError($"Не удалось изменить Unit {objFromQuery.Name}");
else
logger.LogDebug($"----- Набор данных в Unit изменён: {objFromQuery.Name} -----");
}
private bool SyncFields(Unit unit, UnitField field)
{
var isChanged = false;
var fieldInUnit = unit!.UnitFields.FirstOrDefault(u => u.FieldId == field.Id);
if (fieldInUnit == null)
{ {
if (!isChanged) isChanged = true; var fieldsNameWithId = await unitFieldService.Get().AsNoTracking().Where(t => changes.Select(c =>
unit.UnitFields.Add( Sanitize(c.Key.ToLower())).Any(c =>
new UnitInField { UnitId = unit.Id, FieldId = field.Id, DateCreated = DateTimeOffset.UtcNow } 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();
return isChanged; foreach (var change in changes)
}
private bool SyncValues(Unit unit, UnitField field, UnitFieldValue value)
{
var isChanged = false;
var valueInUnit = unit!.UnitValues.FirstOrDefault(uv => uv.FieldId == field.Id);
if (valueInUnit == null)
{
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; ApplyChange(unit, fieldsNameWithId, valuesWithId, change);
valueInUnit.DateModified = DateTime.UtcNow;
} }
}
return isChanged; if (!await unitService.CommitAsync())
logger.LogError($"Не удалось применить изменения по актуализиции аттрибуто Unit {unit.Name} в базе данных");
}
} }
private async Task<Unit> CreateUnitAsync(AihitMainDataMq objFromQuery) private void ApplyChange(Unit unit, List<UnitField> fieldsNameWithId, List<UnitFieldValue> valuesWithId, KeyValuePair<string, string?> change)
{ {
var unit = new Unit { Name = objFromQuery.Name.Trim() }; var uValue = unit.UnitValues.FirstOrDefault(t => IsStringEqual(t.Field?.AihitName, change.Key));
if (uValue == null)
{
var f = new UnitInValue
{
UnitId = unit.Id,
FieldId = fieldsNameWithId.First(t => IsStringEqual(t.AihitName, change.Key)).Id,
ValueId = valuesWithId.First(t => IsStringEqual(t.Value, change.Value)).Id,
DateCreated = DateTimeOffset.UtcNow
};
unit.UnitValues.Add(f);
}
else
{
uValue.ValueId = valuesWithId.First(t => IsStringEqual(t.Value, change.Value)).Id;
uValue.DateModified = DateTimeOffset.UtcNow;
}
}
private List<KeyValuePair<string, string?>> GetChangesInUnit(Dictionary<string, string?> properties, Unit unit)
{
return 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();
}
private async Task SyncValuesAsync(Dictionary<string, string?> properties)
{
// все поля из АИХИТ
var valuesFromAihit = properties.Select(t => t.Value?.Trim()).Distinct();
// список values для поиска в БД без null
var valuesFromAihitWithoutNull = valuesFromAihit.Where(x => x != null).Select(t => t!.ToLower()).ToList();
var valuesInDb = await unitFieldValueService.Get().Where(t =>
(t.Value != null &&
valuesFromAihitWithoutNull.Any(x => x == t.Value.ToLower())
)
|| (t.Value == null)
).Select(t => t.Value)
.ToListAsync();
if (!valuesFromAihit.Any(x => x == null))
valuesInDb.Remove(null);
var newValues = valuesFromAihit.Where(t => !valuesInDb.Any(x => IsStringEqual(x, t))).ToList();
if (newValues.Any())
{
foreach (var item in newValues)
{
var value = new UnitFieldValue
{
Id = Guid.NewGuid(),
DateCreated = DateTimeOffset.UtcNow,
Value = Sanitize(item)
};
if (!await unitFieldValueService.CreateAsync(value))
logger.LogError($"Не удалось создать запись в таблице FieldValues: {item}, {value.ToJson()}");
else
logger.LogInformation($"Создана запись а таблице FieldValues: {item}, {value.ToJson()}");
}
if (!await unitFieldValueService.CommitAsync())
logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных");
}
}
private async Task SyncFieldsAsync(Dictionary<string, string?> properties)
{
var fields = properties.Select(t => t.Key.Trim());
var newFields = fields.Where(t => !unitFieldService.Get().Any(f => f.AihitName.ToLower() == t.ToLower()));
if (newFields.Any())
{
foreach (var item in newFields)
{
var field = new UnitField
{
Id = Guid.NewGuid(),
AihitName = Sanitize(item)!,
EsppName = null,
};
if (!await unitFieldService.CreateAsync(field))
logger.LogError($"Не удалось создать запись в таблице Fields: {item}, {field.ToJson()}");
else
logger.LogInformation($"Создана запись а таблице Fields: {item}, {field.ToJson()}");
}
if (!await unitFieldService.CommitAsync())
logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных");
}
}
private string? Sanitize(string? value)
{
var _value = value?.Trim();
return _value;
}
private bool IsStringEqual(string? value1, string? value2)
{
var _value1 = value1?.ToLower().Trim();
var _value2 = value2?.ToLower().Trim();
return _value1 == _value2;
}
private async Task<Unit> GetUnit(string name)
{
var unit = await GetUnitByName(name.Trim());
if (unit == null)
unit = await CreateUnitAsync(name);
return unit;
}
private async Task<Unit> CreateUnitAsync(string name)
{
var unit = new Unit { Name = name.Trim() };
if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync()) if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync())
logger.LogError($"Не удалось создать Unit {unit.Name}"); logger.LogError($"Не удалось создать Unit {unit.Name}");
else else
logger.LogDebug($"----- Создан Unit: {unit.Name} -----"); logger.LogInformation($"----- Создан Unit: {unit.Name} -----");
return (await unitService.GetByName(unit.Name))!; return unit;
} }
private async Task<UnitField> CreateUnitFieldIfNotExistAsync(string name) public async Task<Unit?> GetUnitByName(string name)
{ {
var existUnitField = await unitFieldService.GetByAihitNameAsync(name); return await GetUnitWithFieldsAndValues()
.FirstOrDefaultAsync(u => u.Name.ToLower() == name.ToLower());
if (existUnitField != null)
return existUnitField;
var field = new UnitField
{
Id = Guid.NewGuid(),
AihitName = name.Trim(),
EsppName = null,
};
if (!await unitFieldService.CreateAsync(field) || !await unitFieldService.CommitAsync())
logger.LogError($"Не удалось создать запись в таблице Fields: {name}, {field.ToJson()}");
else
logger.LogDebug($"Создана запись а таблице Fields: {name}, {field.ToJson()}");
return (await unitFieldService.GetAsync(field.Id))!;
} }
private async Task<UnitFieldValue> CreateFieldValueIfNotExistAsync(UnitField field, string? value) private IQueryable<Unit> GetUnitWithFieldsAndValues()
{ {
var existUnitFieldValue = await unitFieldValueService.GetByValueNameAsync(value); return unitService.Get()
.Include(t => t.UnitValues)
//если значение существует отдаем его .ThenInclude(uv => uv.Field)
if (existUnitFieldValue != null) .Include(t => t.UnitValues)
{ .ThenInclude(uf => uf.Value);
//проверяем связь с таблицей 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
logger.LogDebug($"Создана связь таблицы FieldValues и Fields: {unitFieldValueService.ToJson()}");
}
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
logger.LogDebug($"Создана запись а таблице Values: {newValue.Value}, {newValue.ToJson()}");
return (await unitFieldValueService.GetAsync(newValue.Id))!;
} }
} }
} }

View File

@@ -18,22 +18,5 @@ namespace PARR.DAL.Services.Implementations.Unit
{ {
this.dataContext = dataContext; this.dataContext = dataContext;
} }
public async Task<Models.Unit.Unit?> GetByName(string name)
{
return await GetUnitWithFieldsAndValues()
.FirstOrDefaultAsync(u => u.Name.ToLower().Trim() == name.ToLower().Trim());
}
private IQueryable<Models.Unit.Unit> GetUnitWithFieldsAndValues()
{
return EntitySet
.Include(u => u.UnitFields)
.ThenInclude(f => f.UnitField)
.Include(u => u.UnitValues)
.ThenInclude(v => v.Value);
}
} }
} }

View File

@@ -4,6 +4,5 @@ namespace PARR.DAL.Services.Interfaces.Unit
{ {
public interface IUnitService : IBaseService<Models.Unit.Unit> public interface IUnitService : IBaseService<Models.Unit.Unit>
{ {
Task<Models.Unit.Unit?> GetByName(string name);
} }
} }