112 lines
4.3 KiB
C#
112 lines
4.3 KiB
C#
using SJZY.Track.Application.Contract.Dtos.ProvideServices;
|
||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||
|
||
namespace SJZY.Track.Application.Services.ProvideServices;
|
||
|
||
/// <summary>
|
||
/// 轨迹查询服务
|
||
/// </summary>
|
||
public partial class TrackService
|
||
{
|
||
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
|
||
|
||
/// <summary>
|
||
/// 查询轨迹
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
/// <exception cref="BusinessException"></exception>
|
||
[HttpPost("Track/Query")]
|
||
public async Task<UnifyResultDto<List<GetTrackOutput>>> QueryAsync(GetTrackInput input)
|
||
{
|
||
var res = new List<GetTrackOutput>();
|
||
input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空
|
||
|
||
var details = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos);
|
||
|
||
// 是否对外
|
||
var trackCodes = details.Select(x => x.TrackCode)
|
||
.Where(x => x != GlobalConst.EmptyString)
|
||
.Distinct()
|
||
.ToList();
|
||
|
||
var trackContentDic = new Dictionary<string, bool>();
|
||
if (!trackCodes.IsNullOrEmpty())
|
||
{
|
||
var trackContents = await _trackContentRepository.GetListAsync(x =>
|
||
x.SubSystemId == input.SubSystemId && trackCodes.Contains(x.Code),
|
||
x => new
|
||
{
|
||
x.Code,
|
||
x.IsExternal
|
||
});
|
||
trackContents.ForEach(x => trackContentDic.Add(x.Code, x.IsExternal));
|
||
}
|
||
|
||
foreach (var group in details.GroupBy(x => x.OrderId))
|
||
{
|
||
var item = new GetTrackOutput();
|
||
var trackDetails = group.ToList();
|
||
item.OrderNo = trackDetails.First().OrderNo;
|
||
|
||
item.TrackDetails = trackDetails.Select(x => new TrackDetail
|
||
{
|
||
Code = x.TrackCode,
|
||
Status = x.TrackStatus,
|
||
Content = x.TrackContent,
|
||
OriginContent = x.OriginTrackContent,
|
||
Location = x.TrackPlace,
|
||
Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||
? x.TrackTime
|
||
: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8),
|
||
TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||
? null
|
||
: input.TimeZone ?? 8,
|
||
IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal,
|
||
IsVisibility = x.IsVisibility,
|
||
Source = x.Source,
|
||
Remarks = x.Remarks,
|
||
Files = x.Files?.Select(y => new FileItemDto
|
||
{
|
||
FileName = y.FileName,
|
||
OssKey = y.OssKey
|
||
}).ToList(),
|
||
TrackPlaceCity = x.TrackPlaceCity,
|
||
TrackPlaceCityId = x.TrackPlaceCityId,
|
||
TrackPlaceProvince = x.TrackPlaceProvince,
|
||
TrackPlaceProvinceId = x.TrackPlaceProvinceId,
|
||
TrackPlaceNation = x.TrackPlaceNation,
|
||
TrackPlaceNationId = x.TrackPlaceNationId,
|
||
TrackPlacePostcode = x.TrackPlacePostcode,
|
||
DestinationTimeZone = x.DestinationTimeZone,
|
||
EstimatedDeliveryDate = x.EstimatedDeliveryDate,
|
||
Extra = x.Extra
|
||
}).ToList();
|
||
|
||
res.Add(item);
|
||
}
|
||
|
||
// 排序
|
||
TracksOrdered(res, input);
|
||
|
||
return new UnifyResultDto<List<GetTrackOutput>>(true, res, "操作成功");
|
||
}
|
||
|
||
private void TracksOrdered(List<GetTrackOutput> list, GetTrackInput input)
|
||
{
|
||
switch (input.SortMethod)
|
||
{
|
||
case SortMethod.ByTrackTime:
|
||
// tips:quick-sort 直接修改原list
|
||
list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time)));
|
||
break;
|
||
case null:
|
||
case SortMethod.ByTrackTimeDesc:
|
||
list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time)));
|
||
break;
|
||
default:
|
||
throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式");
|
||
}
|
||
}
|
||
}
|