feat(AihitRealtioshpisSyncer): Добавлен параметр отложенного коммита в случае если меняется только дата синхронизации в связи для ускорения работы
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using PARR.AIHITRelationshipsSyncer.Models;
|
using PARR.AIHITRelationshipsSyncer.Models;
|
||||||
using PARR.AIHITRelationshipsSyncer.Services.Interfaces;
|
using PARR.AIHITRelationshipsSyncer.Services.Interfaces;
|
||||||
|
using PARR.AIHITRelationshipsSyncer.Settings;
|
||||||
using PARR.DAL.Models.Unit;
|
using PARR.DAL.Models.Unit;
|
||||||
using PARR.DAL.Services.Interfaces.Unit;
|
using PARR.DAL.Services.Interfaces.Unit;
|
||||||
using System.Reactive;
|
using System.Reactive;
|
||||||
@@ -13,23 +14,31 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
{
|
{
|
||||||
private readonly ILogger<RelationshipsSyncSrevice> logger;
|
private readonly ILogger<RelationshipsSyncSrevice> logger;
|
||||||
private readonly IUnitService unitService;
|
private readonly IUnitService unitService;
|
||||||
|
private readonly WorkerSettings workerSettings;
|
||||||
|
|
||||||
public RelationshipsSyncSrevice(ILogger<RelationshipsSyncSrevice> logger,
|
public RelationshipsSyncSrevice(ILogger<RelationshipsSyncSrevice> logger,
|
||||||
IUnitService unitService
|
IUnitService unitService,
|
||||||
|
WorkerSettings workerSettings
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.unitService = unitService;
|
this.unitService = unitService;
|
||||||
|
this.workerSettings = workerSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task SyncAsync(List<AihitData> aihitdata)
|
public async Task SyncAsync(List<AihitData> aihitdata)
|
||||||
{
|
{
|
||||||
var groupedData = aihitdata.Where(t => t.EKFindCode != null && t.ChildEk != null).GroupBy(ad => ad.EKFindCode);
|
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)
|
foreach (var parrent in groupedData)
|
||||||
{
|
{
|
||||||
|
//i = i+1;
|
||||||
|
|
||||||
//Получаем имя родителя
|
//Получаем имя родителя
|
||||||
var parentName = parrent.First().EKFindCode;
|
var parentName = parrent.First().EKFindCode;
|
||||||
|
|
||||||
@@ -42,13 +51,26 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//Из данных АИХ ИТ получаем имена всех дочерних ЭК
|
//Из данных АИХ ИТ получаем имена всех дочерних ЭК
|
||||||
var childsName = parrent.Select(t => t.ChildEk);
|
var childsName = parrent.Where(t => t.ChildEk != parentName).Select(t => t.ChildEk);
|
||||||
|
|
||||||
//Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре Unit
|
//Проходим циклом по полученному списку для актуализации связей в полученном нами экземпляре 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}");
|
logger.LogError($"Не удалось изменить связи Unit {unit.Name}");
|
||||||
else
|
else
|
||||||
logger.LogDebug($"----- Изменены связи Unit: {unit.Name} -----");
|
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;
|
var isChanged = false;
|
||||||
|
|
||||||
@@ -95,7 +117,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
isChanged = true;
|
isChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//проверяем отсутсвующие связи
|
//проверяем отсутсвующие связи
|
||||||
var absentChildrens = childsName.Where(c => !unit.ChildUnits.Any(x => x.ChildUnit?.Name.ToLower() == c.ToLower().Trim()));
|
var absentChildrens = childsName.Where(c => !unit.ChildUnits.Any(x => x.ChildUnit?.Name.ToLower() == c.ToLower().Trim()));
|
||||||
foreach (var absentChildren in absentChildrens)
|
foreach (var absentChildren in absentChildrens)
|
||||||
@@ -104,7 +126,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
if (childUnit == null)
|
if (childUnit == null)
|
||||||
{
|
{
|
||||||
logger.LogError($"Ошибка получения дочернего ЭК. Из базы пришел NULL для ЭК{absentChildren}");
|
logger.LogError($"Ошибка получения дочернего ЭК. Из базы пришел NULL для ЭК{absentChildren}");
|
||||||
return ;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unit.ChildUnits.Add(
|
unit.ChildUnits.Add(
|
||||||
@@ -115,51 +137,17 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
DateCreated = DateTimeOffset.UtcNow,
|
DateCreated = DateTimeOffset.UtcNow,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
logger.LogInformation($"----- Создан связь Unit {unit.Name} - {childUnit.Name}-----");
|
||||||
|
|
||||||
|
if (!isChanged)
|
||||||
|
isChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var child in unit.ChildUnits)
|
foreach (var child in unit.ChildUnits)
|
||||||
{
|
{
|
||||||
child.DateSynced = DateTimeOffset.UtcNow;
|
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} -----");
|
|
||||||
}
|
}
|
||||||
//Для всех обновляем дату синхронизации
|
return isChanged;
|
||||||
else
|
|
||||||
child.DateSynced = DateTimeOffset.UtcNow;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -197,7 +185,7 @@ namespace PARR.AIHITRelationshipsSyncer.Services.Implementations
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
logger.LogDebug($"----- Создан Unit: {unit.Name} -----");
|
logger.LogInformation($"----- Создан Unit: {unit.Name} -----");
|
||||||
return unit;
|
return unit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,5 +3,6 @@
|
|||||||
internal class WorkerSettings
|
internal class WorkerSettings
|
||||||
{
|
{
|
||||||
public TimeSpan RepeatEvery { get; set; }
|
public TimeSpan RepeatEvery { get; set; }
|
||||||
|
public int CommitAfter { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,26 @@
|
|||||||
"Microsoft.Hosting.Lifetime": "Information"
|
"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": {
|
"WorkerSettings": {
|
||||||
"RepeatEvery": "12:00:00"
|
"RepeatEvery": "12:00:00",
|
||||||
|
"CommitAfter": 5000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user