feat(AihitRealtioshpisSyncer): Добавлен параметр отложенного коммита в случае если меняется только дата синхронизации в связи для ускорения работы

This commit is contained in:
Mikhail Kuznetsov
2025-06-02 14:42:58 +10:00
parent 93a932390e
commit 943370010f
3 changed files with 56 additions and 48 deletions

View File

@@ -2,6 +2,7 @@
using Microsoft.Extensions.Logging;
using PARR.AIHITRelationshipsSyncer.Models;
using PARR.AIHITRelationshipsSyncer.Services.Interfaces;
using PARR.AIHITRelationshipsSyncer.Settings;
using PARR.DAL.Models.Unit;
using PARR.DAL.Services.Interfaces.Unit;
using System.Reactive;
@@ -13,23 +14,31 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
{
private readonly ILogger<RelationshipsSyncSrevice> logger;
private readonly IUnitService unitService;
private readonly WorkerSettings workerSettings;
public RelationshipsSyncSrevice(ILogger<RelationshipsSyncSrevice> logger,
IUnitService unitService
IUnitService unitService,
WorkerSettings workerSettings
)
{
this.logger = logger;
this.unitService = unitService;
this.workerSettings = workerSettings;
}
public async Task SyncAsync(List<AihitData> aihitdata)
{
var groupedData = aihitdata.Where(t => t.EKFindCode != null && t.ChildEk != null).GroupBy(ad => ad.EKFindCode);
//var i = 0;
//var c = groupedData.Count();
var onlyUpdateTransactionCount = 0;
//Перебираем сгруппированные по родительскому ЭК данные
foreach (var parrent in groupedData)
{
//i = i+1;
//Получаем имя родителя
var parentName = parrent.First().EKFindCode;
@@ -42,13 +51,26 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
return;
}
//Из данных АИХ ИТ получаем имена всех дочерних ЭК
var childsName = parrent.Select(t => t.ChildEk);
var childsName = parrent.Where(t => t.ChildEk != parentName).Select(t => t.ChildEk);
//Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре Unit
await SyncChildSUnitAsync(unit, childsName);
var isChanged = await SyncChildSUnitAsync(unit, childsName);
if (!isChanged) onlyUpdateTransactionCount = ++onlyUpdateTransactionCount;
//logger.LogInformation($"Обработка № {i.ToString()} из {c}. Выполнено только обновление поля DateSynced - {onlyUpdateTransactionCount}");
if (onlyUpdateTransactionCount == workerSettings.CommitAfter)
{
//применяем изменения в базе данных
if (!await unitService.CommitAsync())
logger.LogError($"Не удалось изменить связи Unit после {workerSettings.CommitAfter} обновлений поля DateSynced");
else
logger.LogDebug($"----- Изменены связи Unit после {workerSettings.CommitAfter} обновлений поля DateSynced -----");
onlyUpdateTransactionCount = 0;
}
//применяем изменения в базе данных
if (!await unitService.CommitAsync())
if (isChanged && !await unitService.CommitAsync())
logger.LogError($"Не удалось изменить связи Unit {unit.Name}");
else
logger.LogDebug($"----- Изменены связи Unit: {unit.Name} -----");
@@ -82,7 +104,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
}
}
private async Task SyncChildSUnitAsync(Unit unit, IEnumerable<string?> childsName)
private async Task<bool> SyncChildSUnitAsync(Unit unit, IEnumerable<string?> childsName)
{
var isChanged = false;
@@ -104,7 +126,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
if (childUnit == null)
{
logger.LogError($"Ошибка получения дочернего ЭК. Из базы пришел NULL для ЭК{absentChildren}");
return ;
return false;
}
unit.ChildUnits.Add(
@@ -115,51 +137,17 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
DateCreated = DateTimeOffset.UtcNow,
}
);
logger.LogInformation($"----- Создан связь Unit {unit.Name} - {childUnit.Name}-----");
if (!isChanged)
isChanged = true;
}
foreach (var child in unit.ChildUnits)
{
child.DateSynced = DateTimeOffset.UtcNow;
}
}
/// <summary>
/// Синхронизация дочерней связи в ЭК по имени
/// </summary>
/// <param name="unit">Unit должен иметь в себе все данные о дочерних связях</param>
/// <param name="childName">Имя дочернего ЭК</param>
/// <returns></returns>
private async Task SyncChildUnitAsync(Unit unit, string childName)
{
//if (childName.ToLower() != "рпа-робин-рцку-спиуи-прочее-26-гор")
// continue;
//Ищем детей по имени
var child = unit.ChildUnits.FirstOrDefault(t => t.ChildUnit?.Name.ToLower() == childName!.ToLower().Trim());
//Не нашли создаём и сразу пишем в базу, чтобы если попадуться дубликаты в списке они были созданы
if (child == null)
{
var childUnit = await GetUnitByNameAsync(childName!);
unit.ChildUnits.Add(
new UnitInUnit
{
ParentUnitId = unit.Id,
ChildUnitId = childUnit.Id,
DateCreated = DateTimeOffset.UtcNow,
DateSynced = DateTimeOffset.UtcNow
}
);
//не чесно!!! todo:
if (!await unitService.CommitAsync())
logger.LogError($"Не удалось создать связь Unit {unit.Name} с {childUnit.Name}");
else
logger.LogInformation($"----- Создана новая связь Unit {unit.Name} с {childUnit.Name} -----");
}
//Для всех обновляем дату синхронизации
else
child.DateSynced = DateTimeOffset.UtcNow;
return isChanged;
}
@@ -197,7 +185,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
}
else
{
logger.LogDebug($"----- Создан Unit: {unit.Name} -----");
logger.LogInformation($"----- Создан Unit: {unit.Name} -----");
return unit;
}
}

View File

@@ -3,5 +3,6 @@
internal class WorkerSettings
{
public TimeSpan RepeatEvery { get; set; }
public int CommitAfter { get; set; }
}
}

View File

@@ -9,7 +9,26 @@
"Microsoft.Hosting.Lifetime": "Information"
}
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "log/log-.txt",
"rollingInterval": "Day"
}
}
]
},
"WorkerSettings": {
"RepeatEvery": "12:00:00"
"RepeatEvery": "12:00:00",
"CommitAfter": 5000
}
}