diff --git a/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs b/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs
index cbcfc734..af38574f 100644
--- a/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs
+++ b/src/TrackCenter.Application/Services/ProvideServices/OrderService.V2.cs
@@ -23,7 +23,9 @@ public partial class OrderService
x.AppKey == AppKey && x.OrderType == TrackOrderType.小包 && x.OrderNo == input.OrderNo);
if (order != null)
{
+ var existing = order;
order = await BuiltOrder(input);
+ ApplyUpsertOntoExisting(order, existing, resetTrackInfoWhenTrackNoChanged: true);
await _orderRepository.UpdateOrderAsync(order);
@@ -71,7 +73,9 @@ public partial class OrderService
x.AppKey == AppKey && x.OrderType == TrackOrderType.大包 && x.OrderNo == input.BagNo);
if (order != null)
{
+ var existing = order;
order = await BuiltOrder(input);
+ ApplyUpsertOntoExisting(order, existing, resetTrackInfoWhenTrackNoChanged: false);
await _orderRepository.UpdateOrderAsync(order);
@@ -119,7 +123,9 @@ public partial class OrderService
x.AppKey == AppKey && x.OrderType == TrackOrderType.主单 && x.OrderNo == input.MasterNo);
if (order != null)
{
+ var existing = order;
order = await BuiltOrder(input);
+ ApplyUpsertOntoExisting(order, existing, resetTrackInfoWhenTrackNoChanged: false);
await _orderRepository.UpdateOrderAsync(order);
@@ -260,6 +266,41 @@ public partial class OrderService
return order;
}
+ ///
+ /// 合并到已有订单:保留 Id;跟踪号未变则保留轨迹摘要,变更则清空便于重拉。
+ ///
+ private static void ApplyUpsertOntoExisting(
+ OrderEntity built,
+ OrderEntity existing,
+ bool resetTrackInfoWhenTrackNoChanged)
+ {
+ built.Id = existing.Id;
+
+ var previousTrackNo = existing.TrackNo?.Trim() ?? string.Empty;
+ var nextTrackNo = built.TrackNo?.Trim() ?? string.Empty;
+ var trackNoChanged = !string.Equals(previousTrackNo, nextTrackNo, StringComparison.Ordinal);
+
+ if (resetTrackInfoWhenTrackNoChanged && trackNoChanged)
+ {
+ built.ResetTrackInfo();
+ return;
+ }
+
+ built.IsCompleted = existing.IsCompleted;
+ built.LatestPushTrackCode = existing.LatestPushTrackCode;
+ built.LatestPushTime = existing.LatestPushTime;
+ built.LatestPushError = existing.LatestPushError;
+ built.LatestTrackStatus = existing.LatestTrackStatus;
+ built.LatestTrackContent = existing.LatestTrackContent;
+ built.LatestTrackEnContent = existing.LatestTrackEnContent;
+ built.LatestTrackTime = existing.LatestTrackTime;
+ built.LatestTrackTimeZone = existing.LatestTrackTimeZone;
+ built.LatestTrackPlace = existing.LatestTrackPlace;
+ built.EstimatedDeliveryDate = existing.EstimatedDeliveryDate;
+ built.DestinationTimeZone = existing.DestinationTimeZone;
+ built.QuestionType = existing.QuestionType;
+ }
+
private static OrderPullStatusEntity CreateOrderPullStatus(TrackPullConfigEntity config, OrderEntity order)
{
var status = new OrderPullStatusEntity
diff --git a/src/TrackCenter.Repository/Repositories/OrderRepository.cs b/src/TrackCenter.Repository/Repositories/OrderRepository.cs
index 672c2402..39dc7578 100644
--- a/src/TrackCenter.Repository/Repositories/OrderRepository.cs
+++ b/src/TrackCenter.Repository/Repositories/OrderRepository.cs
@@ -254,11 +254,33 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
{
using var tran = TransactionHelper.GetReadCommitted();
- // 更新订单主表
+ // 更新订单主表(Upsert 业务字段;勿只更 Customer/AppKey)
await UpdateAsync(order, x => new
{
x.Customer,
x.AppKey,
+ x.TrackNo,
+ x.ThirdPartyOrderNumber,
+ x.Channel,
+ x.ProductCode,
+ x.ServiceProviderCode,
+ x.ArrivalCountry,
+ x.ArrivalProvince,
+ x.ArrivalPostCode,
+ x.ArrivalCity,
+ x.ArrivalEmail,
+ x.LeaveCountry,
+ x.LeaveCity,
+ x.IsTransit,
+ x.IsCompleted,
+ x.LatestTrackStatus,
+ x.LatestTrackContent,
+ x.LatestTrackEnContent,
+ x.LatestTrackTime,
+ x.LatestTrackTimeZone,
+ x.LatestTrackPlace,
+ x.EstimatedDeliveryDate,
+ x.DestinationTimeZone,
});
// 更新订单拉取状态
@@ -280,11 +302,33 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
try
{
- // 更新订单主表
+ // 更新订单主表(与 UpdateOrderAsync 字段对齐)
await UpdateRangeAsync(orders, x => new
{
x.Customer,
- x.AppKey
+ x.AppKey,
+ x.TrackNo,
+ x.ThirdPartyOrderNumber,
+ x.Channel,
+ x.ProductCode,
+ x.ServiceProviderCode,
+ x.ArrivalCountry,
+ x.ArrivalProvince,
+ x.ArrivalPostCode,
+ x.ArrivalCity,
+ x.ArrivalEmail,
+ x.LeaveCountry,
+ x.LeaveCity,
+ x.IsTransit,
+ x.IsCompleted,
+ x.LatestTrackStatus,
+ x.LatestTrackContent,
+ x.LatestTrackEnContent,
+ x.LatestTrackTime,
+ x.LatestTrackTimeZone,
+ x.LatestTrackPlace,
+ x.EstimatedDeliveryDate,
+ x.DestinationTimeZone,
});
var orderIds = orders.Select(x => x.Id).ToHashSet();