using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 轨迹查询服务 /// public partial class TrackService { private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; /// /// 查询轨迹 /// /// /// /// [HttpPost("Track/Query")] public async Task>> QueryAsync(GetTrackInput input) { var res = new List(); 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(); 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>(true, res, "操作成功"); } private void TracksOrdered(List 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, "不支持的排序方式"); } } }