using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 轨迹查询服务 /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] public class TrackQueryService : ApplicationService { private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; public TrackQueryService(ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository, IProvideQueries provideQueries) { _trackDetailsRepository = trackDetailsRepository; _orderRepository = orderRepository; _provideQueries = provideQueries; } /// /// 根据订单号获取轨迹 /// /// /// /// [HttpPost("Track/Query")] public async Task> QueryAsync(GetTrackInput input) { if (input.OrderNos.Count > 500) { throw new BusinessException(message: "最多只能查询500单"); } var res = new List(); input.OrderNos = input.OrderNos.Distinct().ToList(); // 单号去重 var details = await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos); 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, Location = x.TrackPlace, Time = x.TrackTime.AddHours(input.TimeZone!.Value - x.TraceTimeZone), TimeZone = input.TimeZone!.Value }).ToList(); res.Add(item); } await TrackDetailSort(res, input); return res; } #region 轨迹订单明细列表 /// /// 根据轨迹订单id获取轨迹订单明细列表 /// /// /// [HttpPost("/Track/GetDetails")] public async Task> GetOrderDetails(GetOrderDetailsInput input) { var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId); if (!trackDetails.IsNullOrEmpty()) { var list = ObjectMapper.Map, List>(trackDetails); return list; } return new List(); } #endregion #region 轨迹订单分页 /// /// 获取分页的轨迹订单 /// /// /// [HttpPost("/Track/GetTrackOrderList")] public async Task> GetPageTrackOrder(GetPageTrackOrderInput input) { var vo = ObjectMapper.Map(input); var pageList = await _orderRepository.GetPageTrackOrder(vo); var pageResultDto = ObjectMapper.Map, UnifyPageResultDto>(pageList); return pageResultDto; } #endregion private async Task TrackDetailSort(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 SortMethod.ByTrackTimeDesc: list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; case SortMethod.ByTemplate: var orderTemplates = await _provideQueries .GetOrderTemplateLinksAsync(input.OrderType, input.OrderNos); var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList(); var templateContent = await _provideQueries.GetOrderedTrackCodesAsync(distinctTemplateIds); list.ForEach(item => { var codes = new List(); // 多模板拼接显示 foreach (var orderTemplate in orderTemplates.Where(x => x.OrderNo == item.OrderNo)) { codes.AddRange(templateContent .Where(t => t.TemplateId == orderTemplate.TemplateId) .Select(t => t.Code)); } item.TrackDetails = item.TrackDetails .Where(x => codes.Contains(x.Code)) // 剔除不在模板内容中的元素 .OrderBy(x => codes.IndexOf(x.Code)) // 按照在模板内容的位置排序 .ToList(); }); break; default: throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); } } }