feat: 轨迹订单列表支持表头全字段筛选
All checks were successful
Build and Deploy / deploy (push) Successful in 57s

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zzh 2026-10-21 10:29:34 +08:00
parent f1ae5563b4
commit 14048080d7
3 changed files with 320 additions and 88 deletions

View File

@ -46,6 +46,111 @@ public class GetPageTrackOrderInput : PageInfoInput
/// 创建时间截止
/// </summary>
public DateTime? CreateTimeEnd { get; set; }
/// <summary>
/// 尾程单号(支持逗号分隔多值,等值匹配)
/// </summary>
public string? TrackNo { get; set; }
/// <summary>
/// 其他单号(支持逗号分隔多值,等值匹配)
/// </summary>
public string? OtherNo { get; set; }
/// <summary>
/// 销售产品
/// </summary>
public string? Product { get; set; }
/// <summary>
/// 渠道
/// </summary>
public string? Channel { get; set; }
/// <summary>
/// API 编码 / 服务商代码
/// </summary>
public string? ApiCode { get; set; }
/// <summary>
/// 国家编码
/// </summary>
public string? CountryCode { get; set; }
/// <summary>
/// 州省
/// </summary>
public string? Province { get; set; }
/// <summary>
/// 城市
/// </summary>
public string? City { get; set; }
/// <summary>
/// 邮编
/// </summary>
public string? Postcode { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string? Email { get; set; }
/// <summary>
/// 最新轨迹状态
/// </summary>
public string? NewestTrackStatus { get; set; }
/// <summary>
/// 最新轨迹内容
/// </summary>
public string? NewestTrackContent { get; set; }
/// <summary>
/// 最新轨迹内容英文
/// </summary>
public string? NewestTrackEnContent { get; set; }
/// <summary>
/// 最新轨迹发生地
/// </summary>
public string? NewestTrackPlace { get; set; }
/// <summary>
/// 最新轨迹时间开始
/// </summary>
public DateTime? NewestTrackTimeStart { get; set; }
/// <summary>
/// 最新轨迹时间截止
/// </summary>
public DateTime? NewestTrackTimeEnd { get; set; }
/// <summary>
/// 最新轨迹时区
/// </summary>
public float? NewestTrackTimeZone { get; set; }
/// <summary>
/// 是否完结
/// </summary>
public bool? IsFinish { get; set; }
/// <summary>
/// 预计到达时间开始
/// </summary>
public DateTime? EstimatedDeliveryDateStart { get; set; }
/// <summary>
/// 预计到达时间截止
/// </summary>
public DateTime? EstimatedDeliveryDateEnd { get; set; }
/// <summary>
/// 目的地时区
/// </summary>
public float? DestinationTimeZone { get; set; }
}
/// <summary>

View File

@ -41,6 +41,111 @@ public class GetPageTrackOrderInputVO : PageInfoInput
/// 创建时间截止
/// </summary>
public DateTime? CreateTimeEnd { get; set; }
/// <summary>
/// 尾程单号(支持逗号分隔多值,等值匹配)
/// </summary>
public string? TrackNo { get; set; }
/// <summary>
/// 其他单号(支持逗号分隔多值,等值匹配)
/// </summary>
public string? OtherNo { get; set; }
/// <summary>
/// 销售产品
/// </summary>
public string? Product { get; set; }
/// <summary>
/// 渠道
/// </summary>
public string? Channel { get; set; }
/// <summary>
/// API 编码 / 服务商代码
/// </summary>
public string? ApiCode { get; set; }
/// <summary>
/// 国家编码
/// </summary>
public string? CountryCode { get; set; }
/// <summary>
/// 州省
/// </summary>
public string? Province { get; set; }
/// <summary>
/// 城市
/// </summary>
public string? City { get; set; }
/// <summary>
/// 邮编
/// </summary>
public string? Postcode { get; set; }
/// <summary>
/// 邮箱
/// </summary>
public string? Email { get; set; }
/// <summary>
/// 最新轨迹状态
/// </summary>
public string? NewestTrackStatus { get; set; }
/// <summary>
/// 最新轨迹内容
/// </summary>
public string? NewestTrackContent { get; set; }
/// <summary>
/// 最新轨迹内容英文
/// </summary>
public string? NewestTrackEnContent { get; set; }
/// <summary>
/// 最新轨迹发生地
/// </summary>
public string? NewestTrackPlace { get; set; }
/// <summary>
/// 最新轨迹时间开始
/// </summary>
public DateTime? NewestTrackTimeStart { get; set; }
/// <summary>
/// 最新轨迹时间截止
/// </summary>
public DateTime? NewestTrackTimeEnd { get; set; }
/// <summary>
/// 最新轨迹时区
/// </summary>
public float? NewestTrackTimeZone { get; set; }
/// <summary>
/// 是否完结
/// </summary>
public bool? IsFinish { get; set; }
/// <summary>
/// 预计到达时间开始
/// </summary>
public DateTime? EstimatedDeliveryDateStart { get; set; }
/// <summary>
/// 预计到达时间截止
/// </summary>
public DateTime? EstimatedDeliveryDateEnd { get; set; }
/// <summary>
/// 目的地时区
/// </summary>
public float? DestinationTimeZone { get; set; }
}
/// <summary>

View File

@ -19,56 +19,14 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
}
public async Task<PagedResult<TrackOrderVO>> GetTrackOrderPagedList(GetPageTrackOrderInputVO input)
{
//查询完去重
PagedResult<TrackOrderVO> pageList;
//没传递单号时
if (input.OrderNos.IsNullOrEmpty())
{
pageList = await Context.Queryable<OrderEntity>()
.WhereIF(!input.AppKey.IsNullOrWhiteSpace(), a => a.AppKey == input.AppKey)
.WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue,
a => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd)
.WhereIF(input.CreateTimeStart.HasValue && (!input.CreateTimeEnd.HasValue),
a => a.CreateTime >= input.CreateTimeStart)
.WhereIF((!input.CreateTimeStart.HasValue) && input.CreateTimeEnd.HasValue,
a => a.CreateTime <= input.CreateTimeEnd)
.WhereIF(!input.Customer.IsNullOrWhiteSpace(), a => a.Customer.Contains(input.Customer!))
.WhereIF(input.TrackOrderType > 0, a => a.OrderType == input.TrackOrderType)
.WhereIF(input.TabType > 0, a => a.QuestionType == input.TabType)
.WhereIF(input.TabType == TrackProblemType.Warn, a => !a.IsCompleted)
pageList = await ApplyTrackOrderListFilters(Context.Queryable<OrderEntity>(), input)
.OrderByDescending(a => a.CreateTime)
.Select(a => new TrackOrderVO
{
Id = a.Id,
OrderNumber = a.OrderNo,
OrderType = a.OrderType,
QuestionType = a.QuestionType,
Customer = a.Customer,
NewestTrackStatus = a.LatestTrackStatus,
NewestTrackContent = a.LatestTrackContent,
NewestTrackEnContent = a.LatestTrackEnContent,
NewestTrackPlace = a.LatestTrackPlace,
NewestTrackTime = a.LatestTrackTime,
NewestTrackTimeZone = a.LatestTrackTimeZone,
IsFinish = a.IsCompleted,
CreateTime = a.CreateTime,
AppKey = a.AppKey,
DestinationTimeZone = a.DestinationTimeZone,
EstimatedDeliveryDate = a.EstimatedDeliveryDate,
TrackNo = a.TrackNo,
OtherNo = a.ThirdPartyOrderNumber,
Channel = a.Channel,
Product = a.ProductCode,
ApiCode = a.ServiceProviderCode,
CountryCode = a.ArrivalCountry,
Province = a.ArrivalProvince,
Postcode = a.ArrivalPostCode,
City = a.ArrivalCity,
Email = a.ArrivalEmail
})
.Select(TrackOrderListSelector)
.ToPagedListAsync(input.PageIndex, input.PageSize);
}
//传递单号时
else
{
var orderNos = input.OrderNos!.Distinct().ToList();
@ -89,27 +47,29 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
orderHashset.UnionWith(orderIdsForThirdParty);
orderIds = orderHashset.ToList();
//没有任何单
if (orderIds.Count == 0)
{
return new PagedResult<TrackOrderVO>();
}
pageList = await Context.Queryable<OrderEntity>()
.Where(a => orderIds.Contains(a.Id))
.WhereIF(!input.AppKey.IsNullOrWhiteSpace(), a => a.AppKey == input.AppKey)
.WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue,
a => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd)
.WhereIF(input.CreateTimeStart.HasValue && (!input.CreateTimeEnd.HasValue),
a => a.CreateTime >= input.CreateTimeStart)
.WhereIF((!input.CreateTimeStart.HasValue) && input.CreateTimeEnd.HasValue,
a => a.CreateTime <= input.CreateTimeEnd)
.WhereIF(!input.Customer.IsNullOrWhiteSpace(), a => a.Customer.Contains(input.Customer!))
.WhereIF(input.TrackOrderType > 0, a => a.OrderType == input.TrackOrderType)
.WhereIF(input.TabType > 0, a => a.QuestionType == input.TabType)
.WhereIF(input.TabType == TrackProblemType.Warn, a => !a.IsCompleted)
pageList = await ApplyTrackOrderListFilters(
Context.Queryable<OrderEntity>().Where(a => orderIds.Contains(a.Id)), input)
.OrderByDescending(a => a.CreateTime)
.Select(a => new TrackOrderVO
.Select(TrackOrderListSelector)
.ToPagedListAsync(input.PageIndex, input.PageSize);
}
pageList.Items.ForEach(x =>
{
x.OrderTypeName = x.OrderType.GetDescription();
x.QuestionTypeName = x.QuestionType.GetDescription();
});
return pageList;
}
private static System.Linq.Expressions.Expression<Func<OrderEntity, TrackOrderVO>> TrackOrderListSelector =>
a => new TrackOrderVO
{
Id = a.Id,
OrderNumber = a.OrderNo,
@ -137,18 +97,80 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
Postcode = a.ArrivalPostCode,
City = a.ArrivalCity,
Email = a.ArrivalEmail
})
.ToPagedListAsync(input.PageIndex, input.PageSize);
};
/// <summary>
/// 表头筛选:客户/单号/产品/渠道/轨迹内容等
/// </summary>
private static ISugarQueryable<OrderEntity> ApplyTrackOrderListFilters(
ISugarQueryable<OrderEntity> query,
GetPageTrackOrderInputVO input)
{
var trackNos = SplitMultiValues(input.TrackNo);
var otherNos = SplitMultiValues(input.OtherNo);
query = query
.WhereIF(!input.AppKey.IsNullOrWhiteSpace(), a => a.AppKey == input.AppKey)
.WhereIF(input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue,
a => a.CreateTime >= input.CreateTimeStart && a.CreateTime <= input.CreateTimeEnd)
.WhereIF(input.CreateTimeStart.HasValue && !input.CreateTimeEnd.HasValue,
a => a.CreateTime >= input.CreateTimeStart)
.WhereIF(!input.CreateTimeStart.HasValue && input.CreateTimeEnd.HasValue,
a => a.CreateTime <= input.CreateTimeEnd)
.WhereIF(!input.Customer.IsNullOrWhiteSpace(), a => a.Customer.Contains(input.Customer!))
.WhereIF(input.TrackOrderType > 0, a => a.OrderType == input.TrackOrderType)
.WhereIF(input.TabType > 0, a => a.QuestionType == input.TabType)
.WhereIF(input.TabType == TrackProblemType.Warn, a => !a.IsCompleted)
.WhereIF(trackNos.Count == 1, a => a.TrackNo.Contains(trackNos[0]))
.WhereIF(trackNos.Count > 1, a => trackNos.Contains(a.TrackNo))
.WhereIF(otherNos.Count == 1, a => a.ThirdPartyOrderNumber != null && a.ThirdPartyOrderNumber.Contains(otherNos[0]))
.WhereIF(otherNos.Count > 1, a => a.ThirdPartyOrderNumber != null && otherNos.Contains(a.ThirdPartyOrderNumber))
.WhereIF(!input.Product.IsNullOrWhiteSpace(), a => a.ProductCode != null && a.ProductCode.Contains(input.Product!))
.WhereIF(!input.Channel.IsNullOrWhiteSpace(), a => a.Channel != null && a.Channel.Contains(input.Channel!))
.WhereIF(!input.ApiCode.IsNullOrWhiteSpace(),
a => a.ServiceProviderCode != null && a.ServiceProviderCode.Contains(input.ApiCode!))
.WhereIF(!input.CountryCode.IsNullOrWhiteSpace(), a => a.ArrivalCountry.Contains(input.CountryCode!))
.WhereIF(!input.Province.IsNullOrWhiteSpace(), a => a.ArrivalProvince != null && a.ArrivalProvince.Contains(input.Province!))
.WhereIF(!input.City.IsNullOrWhiteSpace(), a => a.ArrivalCity.Contains(input.City!))
.WhereIF(!input.Postcode.IsNullOrWhiteSpace(),
a => a.ArrivalPostCode != null && a.ArrivalPostCode.Contains(input.Postcode!))
.WhereIF(!input.Email.IsNullOrWhiteSpace(), a => a.ArrivalEmail != null && a.ArrivalEmail.Contains(input.Email!))
.WhereIF(!input.NewestTrackStatus.IsNullOrWhiteSpace(),
a => a.LatestTrackStatus != null && a.LatestTrackStatus.Contains(input.NewestTrackStatus!))
.WhereIF(!input.NewestTrackContent.IsNullOrWhiteSpace(),
a => a.LatestTrackContent != null && a.LatestTrackContent.Contains(input.NewestTrackContent!))
.WhereIF(!input.NewestTrackEnContent.IsNullOrWhiteSpace(),
a => a.LatestTrackEnContent != null && a.LatestTrackEnContent.Contains(input.NewestTrackEnContent!))
.WhereIF(!input.NewestTrackPlace.IsNullOrWhiteSpace(),
a => a.LatestTrackPlace != null && a.LatestTrackPlace.Contains(input.NewestTrackPlace!))
.WhereIF(input.NewestTrackTimeStart.HasValue && input.NewestTrackTimeEnd.HasValue,
a => a.LatestTrackTime >= input.NewestTrackTimeStart && a.LatestTrackTime <= input.NewestTrackTimeEnd)
.WhereIF(input.NewestTrackTimeStart.HasValue && !input.NewestTrackTimeEnd.HasValue,
a => a.LatestTrackTime >= input.NewestTrackTimeStart)
.WhereIF(!input.NewestTrackTimeStart.HasValue && input.NewestTrackTimeEnd.HasValue,
a => a.LatestTrackTime <= input.NewestTrackTimeEnd)
.WhereIF(input.NewestTrackTimeZone.HasValue, a => a.LatestTrackTimeZone == input.NewestTrackTimeZone)
.WhereIF(input.IsFinish.HasValue, a => a.IsCompleted == input.IsFinish.Value)
.WhereIF(input.EstimatedDeliveryDateStart.HasValue && input.EstimatedDeliveryDateEnd.HasValue,
a => a.EstimatedDeliveryDate >= input.EstimatedDeliveryDateStart &&
a.EstimatedDeliveryDate <= input.EstimatedDeliveryDateEnd)
.WhereIF(input.EstimatedDeliveryDateStart.HasValue && !input.EstimatedDeliveryDateEnd.HasValue,
a => a.EstimatedDeliveryDate >= input.EstimatedDeliveryDateStart)
.WhereIF(!input.EstimatedDeliveryDateStart.HasValue && input.EstimatedDeliveryDateEnd.HasValue,
a => a.EstimatedDeliveryDate <= input.EstimatedDeliveryDateEnd)
.WhereIF(input.DestinationTimeZone.HasValue, a => a.DestinationTimeZone == input.DestinationTimeZone);
return query;
}
//填充数描述信息
pageList.Items.ForEach(x =>
private static List<string> SplitMultiValues(string? raw)
{
x.OrderTypeName = x.OrderType.GetDescription();
x.QuestionTypeName = x.QuestionType.GetDescription();
});
return pageList;
if (raw.IsNullOrWhiteSpace()) return new List<string>();
return raw!
.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
.Where(x => !string.IsNullOrWhiteSpace(x))
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
}
public async Task<(int MainOrderId, string OrderNo, string Customer)> GetTrackOrderByProviderAndOrderNo(