fix: UpsertSmallBag 存在时更新 TrackNo 等业务字段
All checks were successful
Build and Deploy / deploy (push) Successful in 52s

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zzh 2026-10-10 19:20:10 +08:00
parent 4cae065e17
commit 76c8a83368
2 changed files with 88 additions and 3 deletions

View File

@ -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;
}
/// <summary>
/// 合并到已有订单:保留 Id;跟踪号未变则保留轨迹摘要,变更则清空便于重拉。
/// </summary>
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

View File

@ -254,11 +254,33 @@ public class OrderRepository : BasicRepository<OrderEntity>, 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<OrderEntity>, 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();