diff --git a/src/TrackCenter.Application/Dtos/ProvideServices/GetPageTrackOrderInput.cs b/src/TrackCenter.Application/Dtos/ProvideServices/GetPageTrackOrderInput.cs
index 24f24b2d..7e9b1d55 100644
--- a/src/TrackCenter.Application/Dtos/ProvideServices/GetPageTrackOrderInput.cs
+++ b/src/TrackCenter.Application/Dtos/ProvideServices/GetPageTrackOrderInput.cs
@@ -46,6 +46,111 @@ public class GetPageTrackOrderInput : PageInfoInput
/// 创建时间截止
///
public DateTime? CreateTimeEnd { get; set; }
+
+ ///
+ /// 尾程单号(支持逗号分隔多值,等值匹配)
+ ///
+ public string? TrackNo { get; set; }
+
+ ///
+ /// 其他单号(支持逗号分隔多值,等值匹配)
+ ///
+ public string? OtherNo { get; set; }
+
+ ///
+ /// 销售产品
+ ///
+ public string? Product { get; set; }
+
+ ///
+ /// 渠道
+ ///
+ public string? Channel { get; set; }
+
+ ///
+ /// API 编码 / 服务商代码
+ ///
+ public string? ApiCode { get; set; }
+
+ ///
+ /// 国家编码
+ ///
+ public string? CountryCode { get; set; }
+
+ ///
+ /// 州省
+ ///
+ public string? Province { get; set; }
+
+ ///
+ /// 城市
+ ///
+ public string? City { get; set; }
+
+ ///
+ /// 邮编
+ ///
+ public string? Postcode { get; set; }
+
+ ///
+ /// 邮箱
+ ///
+ public string? Email { get; set; }
+
+ ///
+ /// 最新轨迹状态
+ ///
+ public string? NewestTrackStatus { get; set; }
+
+ ///
+ /// 最新轨迹内容
+ ///
+ public string? NewestTrackContent { get; set; }
+
+ ///
+ /// 最新轨迹内容英文
+ ///
+ public string? NewestTrackEnContent { get; set; }
+
+ ///
+ /// 最新轨迹发生地
+ ///
+ public string? NewestTrackPlace { get; set; }
+
+ ///
+ /// 最新轨迹时间开始
+ ///
+ public DateTime? NewestTrackTimeStart { get; set; }
+
+ ///
+ /// 最新轨迹时间截止
+ ///
+ public DateTime? NewestTrackTimeEnd { get; set; }
+
+ ///
+ /// 最新轨迹时区
+ ///
+ public float? NewestTrackTimeZone { get; set; }
+
+ ///
+ /// 是否完结
+ ///
+ public bool? IsFinish { get; set; }
+
+ ///
+ /// 预计到达时间开始
+ ///
+ public DateTime? EstimatedDeliveryDateStart { get; set; }
+
+ ///
+ /// 预计到达时间截止
+ ///
+ public DateTime? EstimatedDeliveryDateEnd { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
}
///
diff --git a/src/TrackCenter.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs b/src/TrackCenter.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs
index 5af210cd..6c02e225 100644
--- a/src/TrackCenter.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs
+++ b/src/TrackCenter.Domain/Dtos/Order/GetPageTrackOrderInputVO.cs
@@ -41,6 +41,111 @@ public class GetPageTrackOrderInputVO : PageInfoInput
/// 创建时间截止
///
public DateTime? CreateTimeEnd { get; set; }
+
+ ///
+ /// 尾程单号(支持逗号分隔多值,等值匹配)
+ ///
+ public string? TrackNo { get; set; }
+
+ ///
+ /// 其他单号(支持逗号分隔多值,等值匹配)
+ ///
+ public string? OtherNo { get; set; }
+
+ ///
+ /// 销售产品
+ ///
+ public string? Product { get; set; }
+
+ ///
+ /// 渠道
+ ///
+ public string? Channel { get; set; }
+
+ ///
+ /// API 编码 / 服务商代码
+ ///
+ public string? ApiCode { get; set; }
+
+ ///
+ /// 国家编码
+ ///
+ public string? CountryCode { get; set; }
+
+ ///
+ /// 州省
+ ///
+ public string? Province { get; set; }
+
+ ///
+ /// 城市
+ ///
+ public string? City { get; set; }
+
+ ///
+ /// 邮编
+ ///
+ public string? Postcode { get; set; }
+
+ ///
+ /// 邮箱
+ ///
+ public string? Email { get; set; }
+
+ ///
+ /// 最新轨迹状态
+ ///
+ public string? NewestTrackStatus { get; set; }
+
+ ///
+ /// 最新轨迹内容
+ ///
+ public string? NewestTrackContent { get; set; }
+
+ ///
+ /// 最新轨迹内容英文
+ ///
+ public string? NewestTrackEnContent { get; set; }
+
+ ///
+ /// 最新轨迹发生地
+ ///
+ public string? NewestTrackPlace { get; set; }
+
+ ///
+ /// 最新轨迹时间开始
+ ///
+ public DateTime? NewestTrackTimeStart { get; set; }
+
+ ///
+ /// 最新轨迹时间截止
+ ///
+ public DateTime? NewestTrackTimeEnd { get; set; }
+
+ ///
+ /// 最新轨迹时区
+ ///
+ public float? NewestTrackTimeZone { get; set; }
+
+ ///
+ /// 是否完结
+ ///
+ public bool? IsFinish { get; set; }
+
+ ///
+ /// 预计到达时间开始
+ ///
+ public DateTime? EstimatedDeliveryDateStart { get; set; }
+
+ ///
+ /// 预计到达时间截止
+ ///
+ public DateTime? EstimatedDeliveryDateEnd { get; set; }
+
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
}
///
diff --git a/src/TrackCenter.Repository/Repositories/OrderRepository.cs b/src/TrackCenter.Repository/Repositories/OrderRepository.cs
index 0067abf6..e5a4d057 100644
--- a/src/TrackCenter.Repository/Repositories/OrderRepository.cs
+++ b/src/TrackCenter.Repository/Repositories/OrderRepository.cs
@@ -19,56 +19,14 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
}
public async Task> GetTrackOrderPagedList(GetPageTrackOrderInputVO input)
{
- //查询完去重
PagedResult pageList;
- //没传递单号时
if (input.OrderNos.IsNullOrEmpty())
{
- pageList = await Context.Queryable()
- .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(), 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,59 +47,18 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
orderHashset.UnionWith(orderIdsForThirdParty);
orderIds = orderHashset.ToList();
- //没有任何单
if (orderIds.Count == 0)
{
return new PagedResult();
}
- pageList = await Context.Queryable()
- .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().Where(a => orderIds.Contains(a.Id)), 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);
}
- //填充数描述信息
pageList.Items.ForEach(x =>
{
x.OrderTypeName = x.OrderType.GetDescription();
@@ -151,6 +68,111 @@ public class OrderRepository : BasicRepository, IOrderRepository, I
return pageList;
}
+ private static System.Linq.Expressions.Expression> TrackOrderListSelector =>
+ 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
+ };
+
+ ///
+ /// 表头筛选:客户/单号/产品/渠道/轨迹内容等
+ ///
+ private static ISugarQueryable ApplyTrackOrderListFilters(
+ ISugarQueryable 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;
+ }
+
+ private static List SplitMultiValues(string? raw)
+ {
+ if (raw.IsNullOrWhiteSpace()) return new List();
+ 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(
string serviceProviderCode, string orderNo, string? appKey = null, TrackOrderType? orderType = null)
{