From 77896c4277e5c581334f5102afa8077f4ac0139f Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Tue, 20 Oct 2026 11:06:41 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E5=8C=B9=E9=85=8D=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E5=88=B7=E6=96=B0=E5=8D=95=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Rabbit/TrackRefreshEventHandler.cs | 9 +++--- .../OrderAggregate/IOrderRepository.cs | 12 ++++--- .../Repositories/OrderRepository.cs | 32 ++++++++++++------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs b/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs index 6d5f68d1..c74258d8 100644 --- a/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs +++ b/src/TrackCenter.Application/Rabbit/TrackRefreshEventHandler.cs @@ -114,12 +114,13 @@ public class TrackRefreshEventHandler( var trackToken = orderToken.SelectToken(paramConfig.TrackDetailsPath); if (trackToken is null) return; - //回传单号可能是主单也可能是外部单号 - //通过平台code和(外部单号/主单号)查询主单 - var order = await orderRepository.GetTrackOrderByProviderAndOrderNo(attach.ServiceProviderCode, orderNo!); + // 回传单号按拉取优先级配置可能是客户单号 / 跟踪号 / 其他单号,不全是主单号 + var order = await orderRepository.GetTrackOrderByProviderAndOrderNo( + attach.ServiceProviderCode, orderNo!, attach.AppKey, attach.OrderType); if (order == default) { - logger.LogWarning($"{attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}"); + logger.LogWarning( + $"{attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}"); return; } diff --git a/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs b/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs index aed3410c..ea05f5b8 100644 --- a/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs +++ b/src/TrackCenter.Domain/Aggregates/OrderAggregate/IOrderRepository.cs @@ -13,12 +13,16 @@ public interface IOrderRepository : IBasicRepository Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input); /// - /// 通过三方平台和三方单号查询订单 + /// 通过服务商与拉取回传单号查询主单。 + /// 回传单号可能是客户单号 / 跟踪号 / 其他单号(拉取优先级配置),不全是主单号。 /// - /// 三方平台 - /// 三方平台单号 + /// 服务商 code + /// 拉取时下发、回传的单号 + /// 应用,可选,缩小匹配范围 + /// 订单类型,可选,缩小匹配范围 /// (主单id,主单号,客户) - Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo); + Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo( + string serviceProviderCode, string orderNo, string? appKey = null, TrackOrderType? orderType = null); /// /// 创建订单 diff --git a/src/TrackCenter.Repository/Repositories/OrderRepository.cs b/src/TrackCenter.Repository/Repositories/OrderRepository.cs index 3f62cdd7..0067abf6 100644 --- a/src/TrackCenter.Repository/Repositories/OrderRepository.cs +++ b/src/TrackCenter.Repository/Repositories/OrderRepository.cs @@ -151,19 +151,27 @@ public class OrderRepository : BasicRepository, IOrderRepository, I return pageList; } - public async Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo) + public async Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo( + string serviceProviderCode, string orderNo, string? appKey = null, TrackOrderType? orderType = null) { + // 拉取优先级可能配置为客户单号 / 跟踪号 / 其他单号,回传的 orderNo 不一定是主单号 var orderList = await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.OrderId) + .InnerJoin((a, b) => a.Id == b.OrderId) + .Where((a, b) => b.ServiceProviderCode == serviceProviderCode) + .WhereIF(!appKey.IsNullOrWhiteSpace(), a => a.AppKey == appKey) + .WhereIF(orderType.HasValue, a => a.OrderType == orderType!.Value) .Where((a, b) => a.OrderNo == orderNo - || (b.ServiceProviderCode == serviceProviderCode && b.OrderNo == orderNo)) + || a.TrackNo == orderNo + || a.ThirdPartyOrderNumber == orderNo + || b.OrderNo == orderNo) .Select((a, b) => new { a.Id, a.Customer, a.OrderNo, - Platform = b.ServiceProviderCode, - OrderNumber = b.OrderNo + a.TrackNo, + a.ThirdPartyOrderNumber, + PullOrderNo = b.OrderNo }) .ToListAsync(); @@ -172,12 +180,14 @@ public class OrderRepository : BasicRepository, IOrderRepository, I return default; } - var order = orderList.First(); - //当出现了多条记录匹配,优先使用外部单匹配提升精确度 - var matchOrder = orderList.FirstOrDefault(x => x.Platform == serviceProviderCode && x.OrderNumber == orderNo); - return matchOrder != null - ? (matchOrder.Id, matchOrder.OrderNo, matchOrder.Customer) - : (order.Id, order.OrderNo, order.Customer); + // 多条时按匹配精度优先:拉取状态外部单号 > 跟踪号 > 其他单号 > 客户单号 + var matchOrder = + orderList.FirstOrDefault(x => x.PullOrderNo == orderNo) + ?? orderList.FirstOrDefault(x => x.TrackNo == orderNo) + ?? orderList.FirstOrDefault(x => x.ThirdPartyOrderNumber == orderNo) + ?? orderList.First(); + + return (matchOrder.Id, matchOrder.OrderNo, matchOrder.Customer); } public async Task CreateOrderAsync(OrderEntity order)