diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs index 90e159cc..276ad83b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/BatchUpsertTrackInput.cs @@ -120,6 +120,11 @@ public class BatchUpsertTrackInput : OrderNosInfo [Range(-12, 12)] public float? DestinationTimeZone { get; set; } + /// + /// 重复的情况下,用什么比较 + /// + public string? CompareFields { get; set; } + /// /// 扩展信息字段,用与轨迹推送的附加字段 /// diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs index 2b15e904..d7679cda 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/UpsertTrackInput.cs @@ -129,6 +129,11 @@ public class UpsertTrackInput : OrderNoInfo /// public int OptionUserId { get; set; } + /// + /// 重复的情况下,用什么比较 + /// + public string? CompareFields { get; set; } + /// /// 扩展信息字段,用与轨迹推送的附加字段 /// diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index eff95d65..109f96a5 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -1,7 +1,7 @@ +using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using Newtonsoft.Json.Linq; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; @@ -308,14 +308,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; - // todo:这里也改成统一使用system txt json,不用newtonsoft了 - var extra = JObject.FromObject(x["extra"]!); - var curExtra = JObject.FromObject(log.Extra!); - if (extra.TryGetValue(compareFields!, out var value) && curExtra.TryGetValue(compareFields!, out var curValue) ) - { - return value == curValue; - } - return false; + return EqExtraByFieldForTextJson(x["extra"]!, DeserializeForTextJson(log.Extra)!, compareFields!); }) .FirstOrDefault(); if (old != null) @@ -323,6 +316,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe body.Data.Remove(old); } } + body!.Data.Add(cur); } } @@ -383,10 +377,18 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return string.IsNullOrWhiteSpace(json) ? default : System.Text.Json.JsonSerializer.Deserialize(json); } - private Dictionary? GetExtraDictForTextJson(string? extraStr) + //比较扩展中的某个字段的相等性 + private bool EqExtraByFieldForTextJson(object a, object b, string fieldName) { - return string.IsNullOrWhiteSpace(extraStr) - ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + if (a is not JsonElement aJsonElement || b is not JsonElement bJsonElement) + return false; + + if (aJsonElement.TryGetProperty(fieldName, out var aValue) + && bJsonElement.TryGetProperty(fieldName, out var bValue)) + { + return aValue.ToString() == bValue.ToString(); + } + + return false; } } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index cfdba588..3bf950a9 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using System.Text.Json; using DotNetCore.CAP; using Microsoft.Extensions.Logging; using SJZY.Expand.ABP.Core.Logger; @@ -237,7 +238,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray(); - // todo:条件命名写反了 // important:轨迹code相同,时间、发生地不同的,可能存在多条!! var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true); @@ -282,7 +282,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return false; } - return oldValue == compareValue; + return EqJsonElementObject(oldValue, compareValue); }).ToList(); } @@ -445,10 +445,20 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe return track; } - private Dictionary? GetExtraDictForTextJson(string? extraStr) + private Dictionary? GetExtraDictForTextJson(string? extraStr) { return string.IsNullOrWhiteSpace(extraStr) ? null - : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + : System.Text.Json.JsonSerializer.Deserialize>(extraStr); + } + + private bool EqJsonElementObject(object? a, object? b) + { + if (a is JsonElement aJsonElement && b is JsonElement bJsonElement) + { + return aJsonElement.ToString() == bJsonElement.ToString(); + } + + return false; } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index e13a1a30..0af5624e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -519,6 +519,7 @@ public partial class TrackService : ApplicationService, ITrackService TrackPlacePostcode = input.TrackPlacePostcode, EstimatedDeliveryDate = input.EstimatedDeliveryDate, DestinationTimeZone = input.DestinationTimeZone, + CompareFields = input.CompareFields, Extra = input.Extra, ForcedPush = input.ForcedPush, IsToMq = input.IsToMq,