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) {