Merge pull request '匹配轨迹拉取单号' (#4) from test into master
All checks were successful
Build and Deploy / deploy (push) Successful in 1m17s

Reviewed-on: #4
This commit is contained in:
zzh 2026-10-19 09:15:01 +08:00
commit f27860a603

View File

@ -49,26 +49,80 @@ public class ProvideQueries : SqlSugarRootlessRepository<TrackCenterDbContext>,
public async Task<List<OrderWithServiceProviderVO>> FindOrderWithServiceProviderAsync(string appKey,
List<string> orderNos)
{
return await Context.Queryable<OrderEntity>()
var orderRows = await Context.Queryable<OrderEntity>()
.InnerJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId)
.LeftJoin<TrackPullConfigEntity>((a, b, c) =>
a.AppKey == c.AppKey && a.ServiceProviderCode == c.ServiceProviderCode)
.LeftJoin<TrackPullPriorityEntity>((a, b, c, d) => c.Id == d.TrackPullConfigId && a.Customer == d.Customer)
.WhereIF(!appKey.IsNullOrWhiteSpace(), a => a.AppKey == appKey)
.Where((a, b) => !a.IsCompleted && orderNos.Contains(a.OrderNo)
&& b.StartTime <= DateTime.Now && b.EndTime >= DateTime.Now)
.Select((a, b, c, d) => new OrderWithServiceProviderVO
.Select((a, b) => new
{
OrderNo = d.OrderNoType == TrackOrderNoType.客户单号 ? a.OrderNo :
d.OrderNoType == TrackOrderNoType.跟踪单号 ? a.TrackNo :
d.OrderNoType == TrackOrderNoType.其他单号 ? a.ThirdPartyOrderNumber : a.OrderNo,
TrackNo = a.TrackNo,
OtherNo = a.ThirdPartyOrderNumber,
OrderType = a.OrderType,
AppKey = a.AppKey,
CustomerOrderNo = a.OrderNo,
a.TrackNo,
a.ThirdPartyOrderNumber,
a.Customer,
a.OrderType,
a.AppKey,
ServiceProviderCode = b.ServiceProviderCode,
})
.ToListAsync();
if (orderRows.Count == 0) return [];
var appKeys = orderRows.Select(x => x.AppKey).Distinct().ToList();
var serviceProviderCodes = orderRows.Select(x => x.ServiceProviderCode).Distinct().ToList();
// 拉取优先级:精确客户优先于 * 兜底;同级按 Priority 升序
var priorities = await Context.Queryable<TrackPullConfigEntity>()
.InnerJoin<TrackPullPriorityEntity>((c, d) => c.Id == d.TrackPullConfigId)
.Where((c, d) => appKeys.Contains(c.AppKey) && serviceProviderCodes.Contains(c.ServiceProviderCode))
.Select((c, d) => new
{
c.AppKey,
c.ServiceProviderCode,
c.OrderType,
d.Customer,
d.OrderNoType,
d.Priority,
})
.ToListAsync();
return orderRows.Select(o =>
{
var matched = priorities
.Where(p => p.AppKey == o.AppKey
&& p.ServiceProviderCode == o.ServiceProviderCode
&& p.OrderType == o.OrderType
&& (p.Customer == o.Customer || p.Customer == GlobalConst.All))
.OrderBy(p => p.Customer == o.Customer ? 0 : 1)
.ThenBy(p => p.Priority)
.FirstOrDefault();
return new OrderWithServiceProviderVO
{
OrderNo = ResolvePullOrderNo(matched?.OrderNoType, o.CustomerOrderNo, o.TrackNo,
o.ThirdPartyOrderNumber),
TrackNo = o.TrackNo,
OtherNo = o.ThirdPartyOrderNumber,
OrderType = o.OrderType,
AppKey = o.AppKey,
ServiceProviderCode = o.ServiceProviderCode,
};
}).ToList();
}
/// <summary>
/// 按拉取优先级配置的单号类型解析下游拉取主单号。
/// </summary>
private static string ResolvePullOrderNo(TrackOrderNoType? orderNoType, string customerOrderNo, string? trackNo,
string? otherNo)
{
return orderNoType switch
{
TrackOrderNoType.客户单号 => customerOrderNo,
TrackOrderNoType.跟踪单号 => trackNo.IsNullOrWhiteSpace() ? customerOrderNo : trackNo!,
TrackOrderNoType.其他单号 => otherNo.IsNullOrWhiteSpace() ? customerOrderNo : otherNo!,
_ => customerOrderNo,
};
}
/// <summary>
@ -153,7 +207,7 @@ public class ProvideQueries : SqlSugarRootlessRepository<TrackCenterDbContext>,
TrackPullConfigVo config,
int pageIndex, int pageSize = 1000)
{
return await Context.Queryable<OrderEntity>()
var rows = await Context.Queryable<OrderEntity>()
.InnerJoin<OrderPullStatusEntity>((a, b) => a.Id == b.OrderId)
.Where((a, b) => b.ServiceProviderCode == config.ServiceProviderCode
&& a.AppKey == config.AppKey
@ -162,20 +216,28 @@ public class ProvideQueries : SqlSugarRootlessRepository<TrackCenterDbContext>,
&& b.EndTime >= DateTime.Now
)
.WhereIF(config.Customer != GlobalConst.All, a => a.Customer == config.Customer)
.Select((a, b) => new OrderWithServiceProviderVO
.Select((a, b) => new
{
OrderNo = config.OrderNoType == TrackOrderNoType.客户单号 ? a.OrderNo :
config.OrderNoType == TrackOrderNoType.跟踪单号 ? a.TrackNo :
config.OrderNoType == TrackOrderNoType.其他单号 ? a.ThirdPartyOrderNumber : a.OrderNo,
TrackNo = a.TrackNo,
OtherNo = a.ThirdPartyOrderNumber,
OrderType = a.OrderType,
AppKey = a.AppKey,
CustomerOrderNo = a.OrderNo,
a.TrackNo,
a.ThirdPartyOrderNumber,
a.OrderType,
a.AppKey,
ServiceProviderCode = b.ServiceProviderCode
})
.Skip((pageIndex - 1) * pageSize)
.Take(pageSize)
.ToListAsync();
return rows.Select(o => new OrderWithServiceProviderVO
{
OrderNo = ResolvePullOrderNo(config.OrderNoType, o.CustomerOrderNo, o.TrackNo, o.ThirdPartyOrderNumber),
TrackNo = o.TrackNo,
OtherNo = o.ThirdPartyOrderNumber,
OrderType = o.OrderType,
AppKey = o.AppKey,
ServiceProviderCode = o.ServiceProviderCode
}).ToList();
}
public async Task<TrackContentVO?> GetTrackContentAsync(string appKey, string trackCode)