From 974ec3c9e049ab8ddf482f33ff5ea97401f925ca Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Wed, 19 Nov 2025 14:06:41 +1000 Subject: [PATCH] =?UTF-8?q?feat(aihitMainSyncer):=20=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=BE=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BF=D1=80=D0=B8=D1=85=D0=BE=D0=B4=D0=B8=D0=B2?= =?UTF-8?q?=D0=B8=D1=88=D0=B8=D1=85=20=D0=B2=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/SyncerService.cs | 18 +++++++--- PARR.AIHITSyncerWorker/Worker.cs | 36 +++++++++++++++++-- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/PARR.AIHITMainSyncer/Services/SyncerService.cs b/PARR.AIHITMainSyncer/Services/SyncerService.cs index 57f3053a..f002b746 100644 --- a/PARR.AIHITMainSyncer/Services/SyncerService.cs +++ b/PARR.AIHITMainSyncer/Services/SyncerService.cs @@ -57,7 +57,6 @@ namespace PARR.AIHITMainSyncer.Services var listAihitData = new List>(); var propertisWithSimpleValues = objFromQuery.Properties - //.Where(t => fieldsFromDB.Any(a => IsStringEqual(t.Key.Trim(), a.Name) && a.IsMultipleValue != true)) .Where(t => fieldsFromDB.Any(a => IsStringEqual(t.Key.Trim(), a.AihitName) && a.IsMultipleValue != true)) .Select(s => new KeyValuePair(s.Key.Trim(), s.Value?.Trim())).ToList(); @@ -75,10 +74,21 @@ namespace PARR.AIHITMainSyncer.Services .Select(kv => new { kv.Key, kv.Value }) .ToList(); + // Определяем, какие ПОЛЯ обновляются этим сообщением + var fieldsInMessage = listAihitData + .Select(kv => kv.Key) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToHashSet(); + var unitValuesToRemove = unit.UnitValues - .Where(uv => !incomingPairs.Any(ip => - IsStringEqual(uv.Field!.AihitName, ip.Key) && - IsStringEqual(uv.Value!.Value, ip.Value))) + .Where(uv => + uv.Field != null && + fieldsInMessage.Contains(uv.Field.AihitName) && + !listAihitData.Any(kv => + IsStringEqual(uv.Field.AihitName, kv.Key) && + IsStringEqual(uv.Value?.Value, kv.Value) + ) + ) .ToList(); unitValuesToRemove.ForEach(uv => unit.UnitValues.Remove(uv)); diff --git a/PARR.AIHITSyncerWorker/Worker.cs b/PARR.AIHITSyncerWorker/Worker.cs index d12479c9..bb40dc0d 100644 --- a/PARR.AIHITSyncerWorker/Worker.cs +++ b/PARR.AIHITSyncerWorker/Worker.cs @@ -16,8 +16,40 @@ namespace PARR.AIHITSyncerWorker protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - await aihitSyncer.StartAsync(); - await Task.Delay(Timeout.Infinite, stoppingToken); + //await aihitSyncer.StartAsync(); + //await Task.Delay(Timeout.Infinite, stoppingToken); + while (!stoppingToken.IsCancellationRequested) + { + try + { + await aihitSyncer.StartAsync(); + await Task.Delay(Timeout.Infinite, stoppingToken); + // StartAsync ( ), + // , , Task.Delay break. + // StartAsync , + // , ** ** . + // , . + _logger.LogWarning("AihitMainSyncer . 10 ..."); + } + catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested) + { + // + break; + } + catch (Exception ex) + { + _logger.LogError(ex, " Worker. 10 ..."); + } + + try + { + await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken); + } + catch (OperationCanceledException) + { + break; + } + } }