diff --git a/src/Oms.Application/Integrations/SmallBagTrack/SmallBagTrackUpsertRequestBuilder.cs b/src/Oms.Application/Integrations/SmallBagTrack/SmallBagTrackUpsertRequestBuilder.cs index 7b79ebe..19eef09 100644 --- a/src/Oms.Application/Integrations/SmallBagTrack/SmallBagTrackUpsertRequestBuilder.cs +++ b/src/Oms.Application/Integrations/SmallBagTrack/SmallBagTrackUpsertRequestBuilder.cs @@ -67,16 +67,11 @@ internal sealed class SmallBagTrackUpsertRequestBuilder( }; } - internal static string ResolveTrackNo(Order order) - { - var trackNo = order.TrackNo?.Trim(); - if (!string.IsNullOrWhiteSpace(trackNo)) - { - return trackNo; - } - - return order.ServiceNo?.Trim() ?? string.Empty; - } + /// + /// 仅取运单跟踪号;无值则空串,不回落运单号/客户单号等。 + /// + internal static string ResolveTrackNo(Order order) => + order.TrackNo?.Trim() ?? string.Empty; internal static string? PickSupplierCodeFromProviders( IEnumerable providers, diff --git a/src/Oms.Application/Services/Orders/Batch/OrderBatchActionExecutor.cs b/src/Oms.Application/Services/Orders/Batch/OrderBatchActionExecutor.cs index b5c9283..1c0ef56 100644 --- a/src/Oms.Application/Services/Orders/Batch/OrderBatchActionExecutor.cs +++ b/src/Oms.Application/Services/Orders/Batch/OrderBatchActionExecutor.cs @@ -6,6 +6,7 @@ using Oms.Application.Dtos.Orders; using Oms.Application.Integrations.Itfx; using Oms.Application.Integrations.SmallBagTrack; using Oms.Application.Messaging; +using Oms.Application.Messaging.ParcelCreate; using Oms.Application.Shared; using Oms.Application.Storage; using Oms.Domain.ChannelsAggregate.Repositories; @@ -23,6 +24,7 @@ public sealed class OrderBatchActionExecutor( IObjectStorage fileStorage, ISmallBagTrackOrderClient smallBagTrackOrderClient, ISmallBagTrackUpsertRequestBuilder smallBagTrackUpsertRequestBuilder, + IOrderParcelCreateEventPublisher parcelCreateEventPublisher, OrderDownstreamCredentialResolver downstreamCredentialResolver, IItfxForwardClient itfxForwardClient, OrderFileManager orderFileManager, @@ -231,9 +233,31 @@ public sealed class OrderBatchActionExecutor( if (ItfxCreateOrderOneDataParser.TryParse(forward.ResponseBody, out var data) && data != null) { + var previousTrackNo = order.TrackNo; if (ItfxCreateOrderOneDataParser.ApplyToOrder(order, data)) { await orderRepository.UpdateAsync(order, cancellationToken); + + var nextTrackNo = order.TrackNo?.Trim() ?? string.Empty; + var prevTrackNo = previousTrackNo?.Trim() ?? string.Empty; + if (!string.IsNullOrWhiteSpace(nextTrackNo) + && !string.Equals(nextTrackNo, prevTrackNo, StringComparison.Ordinal)) + { + var trackRequest = await smallBagTrackUpsertRequestBuilder.BuildAsync( + order, + cancellationToken: cancellationToken); + trackRequest.AppendInitialTrackOnSuccess = true; + if (!string.IsNullOrWhiteSpace(authorization)) + { + trackRequest.Authorization = authorization.Trim(); + } + + await parcelCreateEventPublisher.PublishTrackUpsertAsync( + order, + trackRequest, + customerId: order.CustomerId, + cancellationToken); + } } if (!string.IsNullOrWhiteSpace(data.LabelUrl)) diff --git a/src/Oms.Application/Services/Orders/OrderService.DownstreamForward.cs b/src/Oms.Application/Services/Orders/OrderService.DownstreamForward.cs index 4c74d7c..37934fc 100644 --- a/src/Oms.Application/Services/Orders/OrderService.DownstreamForward.cs +++ b/src/Oms.Application/Services/Orders/OrderService.DownstreamForward.cs @@ -57,9 +57,11 @@ public partial class OrderService && ItfxCreateOrderOneDataParser.TryParse(forward.ResponseBody, out var data) && data != null) { + var previousTrackNo = order.TrackNo; if (ItfxCreateOrderOneDataParser.ApplyToOrder(order, data)) { await OrderRepository.UpdateAsync(order); + await EnqueueSmallBagTrackUpsertWhenTrackNoChangedAsync(order, previousTrackNo); } if (!string.IsNullOrWhiteSpace(data.LabelUrl)) @@ -118,9 +120,11 @@ public partial class OrderService && ItfxGetFileDataParser.TryParse(forward.ResponseBody, out var data) && data != null) { + var previousTrackNo = order.TrackNo; if (ItfxGetFileDataParser.ApplyToOrder(order, data)) { await OrderRepository.UpdateAsync(order); + await EnqueueSmallBagTrackUpsertWhenTrackNoChangedAsync(order, previousTrackNo); } if (!string.IsNullOrWhiteSpace(data.Url)) diff --git a/src/Oms.Application/Services/Orders/OrderService.OrderEdit.cs b/src/Oms.Application/Services/Orders/OrderService.OrderEdit.cs index 076e3f3..6b43287 100644 --- a/src/Oms.Application/Services/Orders/OrderService.OrderEdit.cs +++ b/src/Oms.Application/Services/Orders/OrderService.OrderEdit.cs @@ -48,6 +48,7 @@ public partial class OrderService order.ClientNo = newClientNo; } + var previousTrackNo = order.TrackNo; if (input.TrackNo != null) { order.TrackNo = string.IsNullOrWhiteSpace(input.TrackNo) ? null : input.TrackNo.Trim(); @@ -155,6 +156,11 @@ public partial class OrderService afterSnap, remark); + if (input.TrackNo != null) + { + await EnqueueSmallBagTrackUpsertWhenTrackNoChangedAsync(order, previousTrackNo); + } + return (await MapOrderOutputsAsync([order])).First(); } diff --git a/src/Oms.Application/Services/Orders/OrderService.ParcelBilling.cs b/src/Oms.Application/Services/Orders/OrderService.ParcelBilling.cs index e2e7fa6..9d3b15a 100644 --- a/src/Oms.Application/Services/Orders/OrderService.ParcelBilling.cs +++ b/src/Oms.Application/Services/Orders/OrderService.ParcelBilling.cs @@ -3201,6 +3201,25 @@ public partial class OrderService await ParcelCreateEventPublisher.PublishTrackUpsertAsync(order, request, customer?.Id); } + /// + /// 跟踪号相对旧值有变更且新值非空时,再创建/更新一次轨迹订单。 + /// + private async Task EnqueueSmallBagTrackUpsertWhenTrackNoChangedAsync( + Order order, + string? previousTrackNo, + bool appendInitialTrack = true) + { + var next = order.TrackNo?.Trim() ?? string.Empty; + var prev = previousTrackNo?.Trim() ?? string.Empty; + if (string.IsNullOrWhiteSpace(next) + || string.Equals(next, prev, StringComparison.Ordinal)) + { + return; + } + + await EnqueueSmallBagTrackUpsertAsync(order, customer: null, receiver: null, appendInitialTrack); + } + private async Task EnqueueLifecycleTrackAppendAsync(Order order, string trackCode) { if (string.IsNullOrWhiteSpace(order.ServiceNo)) diff --git a/src/Oms.Tests/SmallBagTrackUpsertRequestBuilderTests.cs b/src/Oms.Tests/SmallBagTrackUpsertRequestBuilderTests.cs index 4be8521..df70e79 100644 --- a/src/Oms.Tests/SmallBagTrackUpsertRequestBuilderTests.cs +++ b/src/Oms.Tests/SmallBagTrackUpsertRequestBuilderTests.cs @@ -20,7 +20,7 @@ public class SmallBagTrackUpsertRequestBuilderTests } [Fact] - public void ResolveTrackNo_FallsBackToServiceNoWhenTrackNoEmpty() + public void ResolveTrackNo_EmptyWhenTrackNoMissing() { var order = new Order { @@ -28,7 +28,7 @@ public class SmallBagTrackUpsertRequestBuilderTests TrackNo = null }; - Assert.Equal("IDE2607221859123456", SmallBagTrackUpsertRequestBuilder.ResolveTrackNo(order)); + Assert.Equal(string.Empty, SmallBagTrackUpsertRequestBuilder.ResolveTrackNo(order)); } [Fact]