Merge branch 'dev' of gitlab.dvgd.oao.rzd:devptk/parr/parr_api into dev
This commit is contained in:
@@ -38,10 +38,13 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
|
|
||||||
public async Task SyncAsync(string msg)
|
public async Task SyncAsync(string msg)
|
||||||
{
|
{
|
||||||
//logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР.");
|
logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР.");
|
||||||
var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg);
|
var objFromQuery = transformService.GetModelFromJson<AihitMainDataMq>(msg);
|
||||||
if (objFromQuery == null)
|
if (objFromQuery == null)
|
||||||
|
{
|
||||||
|
logger.LogWarning("Не удалось десериализовать сообщение в объект AihitMainDataMq. Сообщение: {Message}", msg);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
await SyncUnitAsync(objFromQuery);
|
await SyncUnitAsync(objFromQuery);
|
||||||
}
|
}
|
||||||
@@ -49,11 +52,16 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
|
|
||||||
private async Task SyncUnitAsync(AihitMainDataMq objFromQuery)
|
private async Task SyncUnitAsync(AihitMainDataMq objFromQuery)
|
||||||
{
|
{
|
||||||
|
logger.LogDebug("Начинаем синхронизацию Unit для объекта с именем: {UnitName}", objFromQuery.Name);
|
||||||
|
|
||||||
//Получаем сразу словарь атрибутов, чтобы не ходить каждый раз в базу
|
//Получаем сразу словарь атрибутов, чтобы не ходить каждый раз в базу
|
||||||
var fieldsFromDB = await unitFieldService.Get().AsNoTracking()/*.Select(t => new FieldDto { Id = t.Id, Name = t.AihitName, IsMultipleValue = t.IsMultipleValue })*/.ToListAsync();
|
var fieldsFromDB = await unitFieldService.Get().AsNoTracking()/*.Select(t => new FieldDto { Id = t.Id, Name = t.AihitName, IsMultipleValue = t.IsMultipleValue })*/.ToListAsync();
|
||||||
|
|
||||||
if (!objFromQuery.Properties.Any())
|
if (!objFromQuery.Properties.Any())
|
||||||
|
{
|
||||||
|
logger.LogWarning("Объект {UnitName} не содержит свойств для синхронизации", objFromQuery.Name);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы)
|
// 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы)
|
||||||
var normalizedProperties = new Dictionary<string, string?>();
|
var normalizedProperties = new Dictionary<string, string?>();
|
||||||
@@ -102,7 +110,11 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
)
|
)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
if (unitValuesToRemove.Any())
|
||||||
|
{
|
||||||
|
logger.LogDebug("Удаляем {Count} устаревших значений для Unit {UnitName}", unitValuesToRemove.Count, unit.Name);
|
||||||
unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv));
|
unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv));
|
||||||
|
}
|
||||||
|
|
||||||
var unitValueMissing = listAihitData.Where(t =>
|
var unitValueMissing = listAihitData.Where(t =>
|
||||||
!unit.UnitValues.Any(a =>
|
!unit.UnitValues.Any(a =>
|
||||||
@@ -112,6 +124,8 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
|
|
||||||
if (unitValueMissing.Any())
|
if (unitValueMissing.Any())
|
||||||
{
|
{
|
||||||
|
logger.LogDebug("Найдено {Count} отсутствующих пар значений для Unit {UnitName}", unitValueMissing.Count, unit.Name);
|
||||||
|
|
||||||
var fieldsInChanges = unitValueMissing.Select(s => s.Key).Distinct().ToList();
|
var fieldsInChanges = unitValueMissing.Select(s => s.Key).Distinct().ToList();
|
||||||
var valuesInChanges = unitValueMissing.Select(s => s.Value).Distinct().ToList();
|
var valuesInChanges = unitValueMissing.Select(s => s.Value).Distinct().ToList();
|
||||||
|
|
||||||
@@ -143,9 +157,19 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
ApplyChange(unit, fieldsNameWithId, valuesWithId, change);
|
ApplyChange(unit, fieldsNameWithId, valuesWithId, change);
|
||||||
|
|
||||||
if (!await unitService.CommitAsync())
|
if (!await unitService.CommitAsync())
|
||||||
logger.LogError($"Не удалось применить изменения по актуализиции аттрибуто Unit {unit.Name} в базе данных");
|
{
|
||||||
|
logger.LogError("Не удалось применить изменения по актуализиции аттрибуто Unit {UnitName} в базе данных", unit.Name);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.LogInformation("Успешно обновлены атрибуты для Unit {UnitName}. Добавлено {AddedCount} значений", unit.Name, unitValueMissing.Count);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogDebug("Нет новых значений для синхронизации для Unit {UnitName}", unit.Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogInformation("Завершена синхронизация Unit {UnitName}", unit.Name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,22 +194,25 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
|
|
||||||
private void ApplyChange(Unit unit, List<UnitField> fieldsNameWithId, List<UnitFieldValue> valuesWithId, KeyValuePair<string, string?> change)
|
private void ApplyChange(Unit unit, List<UnitField> fieldsNameWithId, List<UnitFieldValue> valuesWithId, KeyValuePair<string, string?> change)
|
||||||
{
|
{
|
||||||
var Field = fieldsNameWithId.FirstOrDefault(t => IsStringEqual(t.AihitName, change.Key));
|
var field = fieldsNameWithId.FirstOrDefault(t => IsStringEqual(t.AihitName, change.Key));
|
||||||
var Value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value));
|
var value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value));
|
||||||
|
|
||||||
if (Field == null || Value == null)
|
if (field == null || value == null)
|
||||||
logger.LogError($"Ошибка присвоения значения({change.Value}) аттрибуту({change.Key}). FieldId - {Field}, ValueId - {Value}");
|
{
|
||||||
|
logger.LogError("Ошибка присвоения значения({Value}) аттрибуту({Key}). FieldId - {FieldId}, ValueId - {ValueId}",
|
||||||
|
change.Value, change.Key, field?.Id, value?.Id);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var f = new UnitInValue
|
var unitInValue = new UnitInValue
|
||||||
{
|
{
|
||||||
UnitId = unit.Id,
|
UnitId = unit.Id,
|
||||||
FieldId = Field.Id,
|
FieldId = field.Id,
|
||||||
ValueId = Value.Id,
|
ValueId = value.Id,
|
||||||
DateCreated = DateTimeOffset.UtcNow
|
DateCreated = DateTimeOffset.UtcNow
|
||||||
};
|
};
|
||||||
|
|
||||||
unit.UnitValues.Add(f);
|
unit.UnitValues.Add(unitInValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -201,6 +228,8 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
|
logger.LogDebug("Синхронизируем {Count} значений (включая null: {HasNull})", normalizedNoneNullValues.Count, hasNull);
|
||||||
|
|
||||||
// Получаем существующие значения из БД
|
// Получаем существующие значения из БД
|
||||||
var existingValuesInDb = await unitFieldValueService.Get()
|
var existingValuesInDb = await unitFieldValueService.Get()
|
||||||
.Where(v => normalizedNoneNullValues.Contains(v.Value!) || v.Value == null)
|
.Where(v => normalizedNoneNullValues.Contains(v.Value!) || v.Value == null)
|
||||||
@@ -222,7 +251,10 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
newValuesToInsert.Add(null);
|
newValuesToInsert.Add(null);
|
||||||
|
|
||||||
if (newValuesToInsert.Count == 0)
|
if (newValuesToInsert.Count == 0)
|
||||||
|
{
|
||||||
|
logger.LogDebug("Нет новых значений для добавления в базу данных");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Создаём сущности — сохраняем оригинальный регистр из nonNullValues!
|
// Создаём сущности — сохраняем оригинальный регистр из nonNullValues!
|
||||||
// (для null — просто null)
|
// (для null — просто null)
|
||||||
@@ -259,10 +291,16 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
|
|
||||||
private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<UnitField> fieldsFromDB)
|
private async Task SyncFieldsAsync(List<string> fieldsFromAihit, List<UnitField> fieldsFromDB)
|
||||||
{
|
{
|
||||||
var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => f.AihitName == t));
|
var newFields = fieldsFromAihit.Where(t => !fieldsFromDB.Any(f => IsStringEqual(f.AihitName, t))).ToList();
|
||||||
|
|
||||||
if (newFields.Any())
|
if (!newFields.Any())
|
||||||
{
|
{
|
||||||
|
logger.LogDebug("Нет новых полей для добавления в базу данных");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogDebug("Найдено {Count} новых полей для добавления", newFields.Count);
|
||||||
|
|
||||||
foreach (var item in newFields)
|
foreach (var item in newFields)
|
||||||
{
|
{
|
||||||
var field = new UnitField
|
var field = new UnitField
|
||||||
@@ -273,12 +311,22 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (!await unitFieldService.CreateAsync(field))
|
if (!await unitFieldService.CreateAsync(field))
|
||||||
logger.LogError("Не удалось создать запись в таблице Fields:{item},{field}", item, field);
|
{
|
||||||
else
|
logger.LogError("Не удалось создать запись в таблице Fields: {FieldName}", item);
|
||||||
logger.LogInformation("Создана запись а таблице Fields: Fields:{item},{field}", item, field);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogInformation("Создана запись в таблице Fields: {FieldName}", item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!await unitFieldService.CommitAsync())
|
if (!await unitFieldService.CommitAsync())
|
||||||
logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных");
|
{
|
||||||
|
logger.LogError("Не удалось применить изменения по добавлению новых Fields в базе данных");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogDebug("Успешно зафиксированы изменения по добавлению новых Fields");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,7 +345,14 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
var unit = await GetUnitByName(name.Trim());
|
var unit = await GetUnitByName(name.Trim());
|
||||||
|
|
||||||
if (unit == null)
|
if (unit == null)
|
||||||
|
{
|
||||||
|
logger.LogDebug("Unit с именем {UnitName} не найден, создаем новый", name);
|
||||||
unit = await CreateUnitAsync(name);
|
unit = await CreateUnitAsync(name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogDebug("Найден существующий Unit с именем {UnitName}", name);
|
||||||
|
}
|
||||||
|
|
||||||
return unit;
|
return unit;
|
||||||
}
|
}
|
||||||
@@ -308,9 +363,14 @@ namespace PARR.AIHITMainSyncer.Services
|
|||||||
var unit = new Unit { Name = name.Trim().ToUpperInvariant() };
|
var unit = new Unit { Name = name.Trim().ToUpperInvariant() };
|
||||||
|
|
||||||
if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync())
|
if (!await unitService.CreateAsync(unit) || !await unitService.CommitAsync())
|
||||||
logger.LogError($"Не удалось создать Unit {unit.Name}");
|
{
|
||||||
|
logger.LogError("Не удалось создать Unit {UnitName}", unit.Name);
|
||||||
|
throw new InvalidOperationException($"Не удалось создать Unit {unit.Name}");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
logger.LogInformation($"----- Создан Unit: {unit.Name} -----");
|
{
|
||||||
|
logger.LogInformation("Создан Unit: {UnitName}", unit.Name);
|
||||||
|
}
|
||||||
|
|
||||||
return unit;
|
return unit;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ namespace PARR.TemplateUpdater.Services
|
|||||||
var isValid = await IsValidAsync(query);
|
var isValid = await IsValidAsync(query);
|
||||||
if (!isValid)
|
if (!isValid)
|
||||||
{
|
{
|
||||||
logger.LogError($"Не валидны входные данные. Конец обработки сообщения {query.ToJson()}");
|
logger.LogError("Не валидны входные данные. Конец обработки сообщения {Query}", query.ToJson());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ namespace PARR.TemplateUpdater.Services
|
|||||||
.FirstOrDefaultAsync(t => t.Id == query.TemplateId);
|
.FirstOrDefaultAsync(t => t.Id == query.TemplateId);
|
||||||
if (template == null)
|
if (template == null)
|
||||||
{
|
{
|
||||||
logger.LogError($"Не найден шаблон с id {query.TemplateId}");
|
logger.LogError("Не найден шаблон с id {TemplateId}", query.TemplateId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,7 +140,7 @@ namespace PARR.TemplateUpdater.Services
|
|||||||
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, template);
|
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, template);
|
||||||
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
|
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
|
||||||
|
|
||||||
logger.LogDebug($"Для шаблона {nameof(template.Id)}:{template.Id} устанавливаю статус {RobotStatusEnum.Wait.ToString()}");
|
logger.LogDebug("Для шаблона {TemplateId} устанавливаю статус {Status}", template.Id, RobotStatusEnum.Wait.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scheduleIsChanged)
|
if (scheduleIsChanged)
|
||||||
@@ -149,14 +149,17 @@ namespace PARR.TemplateUpdater.Services
|
|||||||
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template);
|
var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template);
|
||||||
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
|
robotConfigurationService.ChangeTaskStatus(TaskStatusEnum.Updating, config);
|
||||||
|
|
||||||
logger.LogDebug($"Для расписания {nameof(template.Id)}:{template.Id} устанавливаю статус {RobotStatusEnum.Wait.ToString()}");
|
logger.LogDebug("Для расписания {TemplateId} устанавливаю статус {Status}", template.Id, RobotStatusEnum.Wait.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!await templateService.CommitAsync(query.Initiator))
|
if (!await templateService.CommitAsync(query.Initiator))
|
||||||
logger.LogError($"Не удалось сохранить изменения в БД. {nameof(TemplateUpdaterMq)}: {query.ToJson()}.");
|
{
|
||||||
|
logger.LogError("Не удалось сохранить изменения в БД. {QueryType}: {Query}", nameof(TemplateUpdaterMq), query.ToJson());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
logger.LogInformation($"Выполнено изменение шаблона в БД. Отправлен запрос на синхронизацию шаблона: {templateIsChanged}, расписания: {scheduleIsChanged} .Query {query.ToJson()}");
|
logger.LogInformation("Выполнено изменение шаблона в БД. Отправлен запрос на синхронизацию шаблона: {TemplateIsChanged}, расписания: {ScheduleIsChanged}. Query {Query}", templateIsChanged, scheduleIsChanged, query.ToJson());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -170,37 +173,37 @@ namespace PARR.TemplateUpdater.Services
|
|||||||
var template = await templateService.Get().AsNoTracking().AnyAsync(t => t.Id == query.TemplateId);
|
var template = await templateService.Get().AsNoTracking().AnyAsync(t => t.Id == query.TemplateId);
|
||||||
if (!template)
|
if (!template)
|
||||||
{
|
{
|
||||||
logger.LogError($"Сообщение не валидно. Не найден шаблон с id: {query.TemplateId}");
|
logger.LogError("Сообщение не валидно. Не найден шаблон с id: {TemplateId}", query.TemplateId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(query.Name.Trim()))
|
if (string.IsNullOrEmpty(query.Name?.Trim()))
|
||||||
{
|
{
|
||||||
logger.LogError($"Сообщение не валидно. Имя шаблона не может быть пустым: {query.Name}");
|
logger.LogError("Сообщение не валидно. Имя шаблона не может быть пустым: {TemplateName}", query.Name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var existTemplateName = await templateService.Get().AsNoTracking().AnyAsync(t =>
|
var existTemplateName = await templateService.Get().AsNoTracking().AnyAsync(t =>
|
||||||
t.Id != query.TemplateId
|
t.Id != query.TemplateId
|
||||||
&& t.Name.ToUpper() == query.Name.Trim().ToUpper()
|
&& t.Name!.ToUpper() == query.Name.Trim().ToUpper()
|
||||||
&& t.Index == query.Index);
|
&& t.Index == query.Index);
|
||||||
if (existTemplateName)
|
if (existTemplateName)
|
||||||
{
|
{
|
||||||
logger.LogError($"Сообщение не валидно. Имя шаблона не уникально: {query.Name}");
|
logger.LogError("Сообщение не валидно. Имя шаблона не уникально: {TemplateName}", query.Name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var job = await jobService.Get().AsNoTracking().AnyAsync(t => t.Id == query.JobId);
|
var job = await jobService.Get().AsNoTracking().AnyAsync(t => t.Id == query.JobId);
|
||||||
if (!job)
|
if (!job)
|
||||||
{
|
{
|
||||||
logger.LogError($"Сообщение не валидно. Не найдена работа с JobId: {query.JobId}");
|
logger.LogError("Сообщение не валидно. Не найдена работа с JobId: {JobId}", query.JobId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var unit = await unitService.Get().AsNoTracking().AnyAsync(t => t.Id == query.UnitId);
|
var unit = await unitService.Get().AsNoTracking().AnyAsync(t => t.Id == query.UnitId);
|
||||||
if (!unit)
|
if (!unit)
|
||||||
{
|
{
|
||||||
logger.LogError($"Сообщение не валидно. Не найден unit с UnitId: {query.UnitId}");
|
logger.LogError("Сообщение не валидно. Не найден unit с UnitId: {UnitId}", query.UnitId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user