Compare commits

..

No commits in common. "0bfbad316ca583bc92b92ac6ce8214cdab01b895" and "f27860a60320c608cda3e8ae7edc101dae661419" have entirely different histories.

3 changed files with 19 additions and 34 deletions

View File

@ -114,13 +114,12 @@ public class TrackRefreshEventHandler(
var trackToken = orderToken.SelectToken(paramConfig.TrackDetailsPath); var trackToken = orderToken.SelectToken(paramConfig.TrackDetailsPath);
if (trackToken is null) return; if (trackToken is null) return;
// 回传单号按拉取优先级配置可能是客户单号 / 跟踪号 / 其他单号,不全是主单号 //回传单号可能是主单也可能是外部单号
var order = await orderRepository.GetTrackOrderByProviderAndOrderNo( //通过平台code和(外部单号/主单号)查询主单
attach.ServiceProviderCode, orderNo!, attach.AppKey, attach.OrderType); var order = await orderRepository.GetTrackOrderByProviderAndOrderNo(attach.ServiceProviderCode, orderNo!);
if (order == default) if (order == default)
{ {
logger.LogWarning( logger.LogWarning($"{attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}");
$"{attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}");
return; return;
} }

View File

@ -13,16 +13,12 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
Task<PagedResult<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input); Task<PagedResult<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input);
/// <summary> /// <summary>
/// 通过服务商与拉取回传单号查询主单。 /// 通过三方平台和三方单号查询订单
/// 回传单号可能是客户单号 / 跟踪号 / 其他单号(拉取优先级配置),不全是主单号。
/// </summary> /// </summary>
/// <param name="serviceProviderCode">服务商 code</param> /// <param name="serviceProviderCode">三方平台</param>
/// <param name="orderNo">拉取时下发、回传的单号</param> /// <param name="orderNo">三方平台单号</param>
/// <param name="appKey">应用,可选,缩小匹配范围</param>
/// <param name="orderType">订单类型,可选,缩小匹配范围</param>
/// <returns>(主单id,主单号,客户)</returns> /// <returns>(主单id,主单号,客户)</returns>
Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo( Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo);
string serviceProviderCode, string orderNo, string? appKey = null, TrackOrderType? orderType = null);
/// <summary> /// <summary>
/// 创建订单 /// 创建订单

View File

@ -151,27 +151,19 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
return pageList; return pageList;
} }
public async Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo( public async Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(string serviceProviderCode, string orderNo)
string serviceProviderCode, string orderNo, string? appKey = null, TrackOrderType? orderType = null)
{ {
// 拉取优先级可能配置为客户单号 / 跟踪号 / 其他单号,回传的 orderNo 不一定是主单号
var orderList = await Context.Queryable<OrderEntity>() var orderList = await Context.Queryable<OrderEntity>()
.InnerJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId) .LeftJoin<OrderPullStatusEntity>((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 .Where((a, b) => a.OrderNo == orderNo
|| a.TrackNo == orderNo || (b.ServiceProviderCode == serviceProviderCode && b.OrderNo == orderNo))
|| a.ThirdPartyOrderNumber == orderNo
|| b.OrderNo == orderNo)
.Select((a, b) => new .Select((a, b) => new
{ {
a.Id, a.Id,
a.Customer, a.Customer,
a.OrderNo, a.OrderNo,
a.TrackNo, Platform = b.ServiceProviderCode,
a.ThirdPartyOrderNumber, OrderNumber = b.OrderNo
PullOrderNo = b.OrderNo
}) })
.ToListAsync(); .ToListAsync();
@ -180,14 +172,12 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
return default; return default;
} }
// 多条时按匹配精度优先:拉取状态外部单号 > 跟踪号 > 其他单号 > 客户单号 var order = orderList.First();
var matchOrder = //当出现了多条记录匹配,优先使用外部单匹配提升精确度
orderList.FirstOrDefault(x => x.PullOrderNo == orderNo) var matchOrder = orderList.FirstOrDefault(x => x.Platform == serviceProviderCode && x.OrderNumber == orderNo);
?? orderList.FirstOrDefault(x => x.TrackNo == orderNo) return matchOrder != null
?? orderList.FirstOrDefault(x => x.ThirdPartyOrderNumber == orderNo) ? (matchOrder.Id, matchOrder.OrderNo, matchOrder.Customer)
?? orderList.First(); : (order.Id, order.OrderNo, order.Customer);
return (matchOrder.Id, matchOrder.OrderNo, matchOrder.Customer);
} }
public async Task<int> CreateOrderAsync(OrderEntity order) public async Task<int> CreateOrderAsync(OrderEntity order)