fix:匹配轨迹刷新单号 #5
@ -114,12 +114,13 @@ 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;
|
||||||
|
|
||||||
//回传单号可能是主单也可能是外部单号
|
// 回传单号按拉取优先级配置可能是客户单号 / 跟踪号 / 其他单号,不全是主单号
|
||||||
//通过平台code和(外部单号/主单号)查询主单
|
var order = await orderRepository.GetTrackOrderByProviderAndOrderNo(
|
||||||
var order = await orderRepository.GetTrackOrderByProviderAndOrderNo(attach.ServiceProviderCode, orderNo!);
|
attach.ServiceProviderCode, orderNo!, attach.AppKey, attach.OrderType);
|
||||||
if (order == default)
|
if (order == default)
|
||||||
{
|
{
|
||||||
logger.LogWarning($"{attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}");
|
logger.LogWarning(
|
||||||
|
$"{attach.ToJson()},轨迹消费失败,找不到主单,平台code:{attach.ServiceProviderCode},单号:{orderNo}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,12 +13,16 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
|
|||||||
Task<PagedResult<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input);
|
Task<PagedResult<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 通过三方平台和三方单号查询订单
|
/// 通过服务商与拉取回传单号查询主单。
|
||||||
|
/// 回传单号可能是客户单号 / 跟踪号 / 其他单号(拉取优先级配置),不全是主单号。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="serviceProviderCode">三方平台</param>
|
/// <param name="serviceProviderCode">服务商 code</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(string serviceProviderCode, string orderNo);
|
Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(
|
||||||
|
string serviceProviderCode, string orderNo, string? appKey = null, TrackOrderType? orderType = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建订单
|
/// 创建订单
|
||||||
|
|||||||
@ -151,19 +151,27 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
|
|||||||
return pageList;
|
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<OrderEntity>()
|
var orderList = await Context.Queryable<OrderEntity>()
|
||||||
.LeftJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId)
|
.InnerJoin<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
|
||||||
|| (b.ServiceProviderCode == serviceProviderCode && b.OrderNo == orderNo))
|
|| a.TrackNo == 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,
|
||||||
Platform = b.ServiceProviderCode,
|
a.TrackNo,
|
||||||
OrderNumber = b.OrderNo
|
a.ThirdPartyOrderNumber,
|
||||||
|
PullOrderNo = b.OrderNo
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
@ -172,12 +180,14 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
|
|||||||
return default;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
var order = orderList.First();
|
// 多条时按匹配精度优先:拉取状态外部单号 > 跟踪号 > 其他单号 > 客户单号
|
||||||
//当出现了多条记录匹配,优先使用外部单匹配提升精确度
|
var matchOrder =
|
||||||
var matchOrder = orderList.FirstOrDefault(x => x.Platform == serviceProviderCode && x.OrderNumber == orderNo);
|
orderList.FirstOrDefault(x => x.PullOrderNo == orderNo)
|
||||||
return matchOrder != null
|
?? orderList.FirstOrDefault(x => x.TrackNo == orderNo)
|
||||||
? (matchOrder.Id, matchOrder.OrderNo, matchOrder.Customer)
|
?? orderList.FirstOrDefault(x => x.ThirdPartyOrderNumber == orderNo)
|
||||||
: (order.Id, order.OrderNo, order.Customer);
|
?? orderList.First();
|
||||||
|
|
||||||
|
return (matchOrder.Id, matchOrder.OrderNo, matchOrder.Customer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<int> CreateOrderAsync(OrderEntity order)
|
public async Task<int> CreateOrderAsync(OrderEntity order)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user