diff --git a/PARR.AIHITMainSyncer/Services/SyncerService.cs b/PARR.AIHITMainSyncer/Services/SyncerService.cs index 6de34d88..33c27596 100644 --- a/PARR.AIHITMainSyncer/Services/SyncerService.cs +++ b/PARR.AIHITMainSyncer/Services/SyncerService.cs @@ -38,10 +38,13 @@ namespace PARR.AIHITMainSyncer.Services public async Task SyncAsync(string msg) { - //logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР."); + logger.LogInformation("Запуск синхронизации данных из очереди сообщений в ПАРР."); var objFromQuery = transformService.GetModelFromJson(msg); if (objFromQuery == null) + { + logger.LogWarning("Не удалось десериализовать сообщение в объект AihitMainDataMq. Сообщение: {Message}", msg); return; + } await SyncUnitAsync(objFromQuery); } @@ -49,11 +52,16 @@ namespace PARR.AIHITMainSyncer.Services 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(); if (!objFromQuery.Properties.Any()) + { + logger.LogWarning("Объект {UnitName} не содержит свойств для синхронизации", objFromQuery.Name); return; + } // 1. Создаем копию и нормализуем свойства (удаляем лишние пробелы) var normalizedProperties = new Dictionary(); @@ -102,7 +110,11 @@ namespace PARR.AIHITMainSyncer.Services ) .ToList(); - unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv)); + if (unitValuesToRemove.Any()) + { + logger.LogDebug("Удаляем {Count} устаревших значений для Unit {UnitName}", unitValuesToRemove.Count, unit.Name); + unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv)); + } var unitValueMissing = listAihitData.Where(t => !unit.UnitValues.Any(a => @@ -112,6 +124,8 @@ namespace PARR.AIHITMainSyncer.Services if (unitValueMissing.Any()) { + logger.LogDebug("Найдено {Count} отсутствующих пар значений для Unit {UnitName}", unitValueMissing.Count, unit.Name); + var fieldsInChanges = unitValueMissing.Select(s => s.Key).Distinct().ToList(); var valuesInChanges = unitValueMissing.Select(s => s.Value).Distinct().ToList(); @@ -143,9 +157,19 @@ namespace PARR.AIHITMainSyncer.Services ApplyChange(unit, fieldsNameWithId, valuesWithId, change); 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; } @@ -170,22 +194,25 @@ namespace PARR.AIHITMainSyncer.Services private void ApplyChange(Unit unit, List fieldsNameWithId, List valuesWithId, KeyValuePair change) { - var Field = fieldsNameWithId.FirstOrDefault(t => IsStringEqual(t.AihitName, change.Key)); - var Value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value)); + var field = fieldsNameWithId.FirstOrDefault(t => IsStringEqual(t.AihitName, change.Key)); + var value = valuesWithId.FirstOrDefault(t => IsStringEqual(t.Value, change.Value)); - if (Field == null || Value == null) - logger.LogError($"Ошибка присвоения значения({change.Value}) аттрибуту({change.Key}). FieldId - {Field}, ValueId - {Value}"); + if (field == null || value == null) + { + logger.LogError("Ошибка присвоения значения({Value}) аттрибуту({Key}). FieldId - {FieldId}, ValueId - {ValueId}", + change.Value, change.Key, field?.Id, value?.Id); + } else { - var f = new UnitInValue + var unitInValue = new UnitInValue { UnitId = unit.Id, - FieldId = Field.Id, - ValueId = Value.Id, + FieldId = field.Id, + ValueId = value.Id, DateCreated = DateTimeOffset.UtcNow }; - unit.UnitValues.Add(f); + unit.UnitValues.Add(unitInValue); } } @@ -201,6 +228,8 @@ namespace PARR.AIHITMainSyncer.Services .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); + logger.LogDebug("Синхронизируем {Count} значений (включая null: {HasNull})", normalizedNoneNullValues.Count, hasNull); + // Получаем существующие значения из БД var existingValuesInDb = await unitFieldValueService.Get() .Where(v => normalizedNoneNullValues.Contains(v.Value!) || v.Value == null) @@ -222,7 +251,10 @@ namespace PARR.AIHITMainSyncer.Services newValuesToInsert.Add(null); if (newValuesToInsert.Count == 0) + { + logger.LogDebug("Нет новых значений для добавления в базу данных"); return; + } // Создаём сущности — сохраняем оригинальный регистр из nonNullValues! // (для null — просто null) @@ -259,26 +291,42 @@ namespace PARR.AIHITMainSyncer.Services private async Task SyncFieldsAsync(List fieldsFromAihit, List 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()) { - foreach (var item in newFields) - { - var field = new UnitField - { - Id = Guid.NewGuid(), - AihitName = item, - EsppName = null, - }; + logger.LogDebug("Нет новых полей для добавления в базу данных"); + return; + } - if (!await unitFieldService.CreateAsync(field)) - logger.LogError("Не удалось создать запись в таблице Fields:{item},{field}", item, field); - else - logger.LogInformation("Создана запись а таблице Fields: Fields:{item},{field}", item, field); + logger.LogDebug("Найдено {Count} новых полей для добавления", newFields.Count); + + foreach (var item in newFields) + { + var field = new UnitField + { + Id = Guid.NewGuid(), + AihitName = item, + EsppName = null, + }; + + if (!await unitFieldService.CreateAsync(field)) + { + logger.LogError("Не удалось создать запись в таблице Fields: {FieldName}", item); } - if (!await unitFieldService.CommitAsync()) - logger.LogError($"Не удалось применить изменения по добавлению новых Fields в базе данных"); + else + { + logger.LogInformation("Создана запись в таблице Fields: {FieldName}", item); + } + } + + if (!await unitFieldService.CommitAsync()) + { + logger.LogError("Не удалось применить изменения по добавлению новых Fields в базе данных"); + } + else + { + logger.LogDebug("Успешно зафиксированы изменения по добавлению новых Fields"); } } @@ -297,7 +345,14 @@ namespace PARR.AIHITMainSyncer.Services var unit = await GetUnitByName(name.Trim()); if (unit == null) + { + logger.LogDebug("Unit с именем {UnitName} не найден, создаем новый", name); unit = await CreateUnitAsync(name); + } + else + { + logger.LogDebug("Найден существующий Unit с именем {UnitName}", name); + } return unit; } @@ -308,9 +363,14 @@ namespace PARR.AIHITMainSyncer.Services var unit = new Unit { Name = name.Trim().ToUpperInvariant() }; 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 - logger.LogInformation($"----- Создан Unit: {unit.Name} -----"); + { + logger.LogInformation("Создан Unit: {UnitName}", unit.Name); + } return unit; } diff --git a/PARR.TemplateUpdater/Services/TemplateUpdaterService.cs b/PARR.TemplateUpdater/Services/TemplateUpdaterService.cs index d8296c6c..668c7d73 100644 --- a/PARR.TemplateUpdater/Services/TemplateUpdaterService.cs +++ b/PARR.TemplateUpdater/Services/TemplateUpdaterService.cs @@ -40,7 +40,7 @@ namespace PARR.TemplateUpdater.Services var isValid = await IsValidAsync(query); if (!isValid) { - logger.LogError($"Не валидны входные данные. Конец обработки сообщения {query.ToJson()}"); + logger.LogError("Не валидны входные данные. Конец обработки сообщения {Query}", query.ToJson()); return; } @@ -51,7 +51,7 @@ namespace PARR.TemplateUpdater.Services .FirstOrDefaultAsync(t => t.Id == query.TemplateId); if (template == null) { - logger.LogError($"Не найден шаблон с id {query.TemplateId}"); + logger.LogError("Не найден шаблон с id {TemplateId}", query.TemplateId); return; } @@ -140,7 +140,7 @@ namespace PARR.TemplateUpdater.Services var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.TemplateOrder, template); 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) @@ -149,14 +149,17 @@ namespace PARR.TemplateUpdater.Services var config = robotConfigurationService.GetFromTemplateByRobotCode(RobotsEnum.ScheduleOrder, template); 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)) - 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,41 +173,41 @@ namespace PARR.TemplateUpdater.Services var template = await templateService.Get().AsNoTracking().AnyAsync(t => t.Id == query.TemplateId); if (!template) { - logger.LogError($"Сообщение не валидно. Не найден шаблон с id: {query.TemplateId}"); + logger.LogError("Сообщение не валидно. Не найден шаблон с id: {TemplateId}", query.TemplateId); 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; } - var existTemplateName = await templateService.Get().AsNoTracking().AnyAsync(t => - t.Id != query.TemplateId - && t.Name.ToUpper() == query.Name.Trim().ToUpper() + var existTemplateName = await templateService.Get().AsNoTracking().AnyAsync(t => + t.Id != query.TemplateId + && t.Name!.ToUpper() == query.Name.Trim().ToUpper() && t.Index == query.Index); if (existTemplateName) { - logger.LogError($"Сообщение не валидно. Имя шаблона не уникально: {query.Name}"); + logger.LogError("Сообщение не валидно. Имя шаблона не уникально: {TemplateName}", query.Name); return false; } var job = await jobService.Get().AsNoTracking().AnyAsync(t => t.Id == query.JobId); if (!job) { - logger.LogError($"Сообщение не валидно. Не найдена работа с JobId: {query.JobId}"); + logger.LogError("Сообщение не валидно. Не найдена работа с JobId: {JobId}", query.JobId); return false; } var unit = await unitService.Get().AsNoTracking().AnyAsync(t => t.Id == query.UnitId); if (!unit) { - logger.LogError($"Сообщение не валидно. Не найден unit с UnitId: {query.UnitId}"); + logger.LogError("Сообщение не валидно. Не найден unit с UnitId: {UnitId}", query.UnitId); return false; } return true; } } -} +} \ No newline at end of file