diff --git a/src/TrackCenter.Application/Queries/ProvideQueries.cs b/src/TrackCenter.Application/Queries/ProvideQueries.cs index 57da1285..338262a1 100644 --- a/src/TrackCenter.Application/Queries/ProvideQueries.cs +++ b/src/TrackCenter.Application/Queries/ProvideQueries.cs @@ -49,26 +49,80 @@ public class ProvideQueries : SqlSugarRootlessRepository, public async Task> FindOrderWithServiceProviderAsync(string appKey, List orderNos) { - return await Context.Queryable() + var orderRows = await Context.Queryable() .InnerJoin((a, b) => a.Id == b.OrderId) - .LeftJoin((a, b, c) => - a.AppKey == c.AppKey && a.ServiceProviderCode == c.ServiceProviderCode) - .LeftJoin((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() + .InnerJoin((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(); + } + + /// + /// 按拉取优先级配置的单号类型解析下游拉取主单号。 + /// + 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, + }; } /// @@ -153,7 +207,7 @@ public class ProvideQueries : SqlSugarRootlessRepository, TrackPullConfigVo config, int pageIndex, int pageSize = 1000) { - return await Context.Queryable() + var rows = await Context.Queryable() .InnerJoin((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, && 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 GetTrackContentAsync(string appKey, string trackCode)