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; + } + } }