feat(AihitRealtioshpisSyncer): Добавлен параметр отложенного коммита в случае если меняется только дата синхронизации в связи для ускорения работы
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -95,7 +117,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
||||
isChanged = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//проверяем отсутсвующие связи
|
||||
var absentChildrens = childsName.Where(c => !unit.ChildUnits.Any(x => x.ChildUnit?.Name.ToLower() == c.ToLower().Trim()));
|
||||
foreach (var absentChildren in absentChildrens)
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,5 +3,6 @@
|
||||
internal class WorkerSettings
|
||||
{
|
||||
public TimeSpan RepeatEvery { get; set; }
|
||||
public int CommitAfter { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user