track/src/SJZY.Track.Application/Services/ProvideServices/TrackQueryService.cs

103 lines
4.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SJZY.Track.Application.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
namespace SJZY.Track.Application.Services.ProvideServices;
/// <summary>
/// 轨迹查询服务
/// </summary>
[ApiExplorerSettings(GroupName = "提供接口")]
public class TrackQueryService : ApplicationService
{
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly IOrderRepository _orderRepository;
private readonly ITrackTemplateRepository _trackTemplateRepository;
public TrackQueryService(ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository,
ITrackTemplateRepository trackTemplateRepository)
{
_trackDetailsRepository = trackDetailsRepository;
_orderRepository = orderRepository;
_trackTemplateRepository = trackTemplateRepository;
}
/// <summary>
/// 根据订单号获取轨迹
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="BusinessException"></exception>
[HttpPost("TrackQuery/GetByOrderNos")]
public async Task<List<GetTrackOutput>> GetByOrderNosAsync(GetTrackInput input)
{
if (input.OrderNos.Count > 500)
{
throw new BusinessException(message: "最多只能查询500单");
}
var res = new List<GetTrackOutput>();
input.OrderNos = input.OrderNos.Distinct().ToList();
var details = await _trackDetailsRepository.GetListAsync(input.OrderNos);
var isTurn = input.TimeZone != 0;
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 = isTurn ? x.TrackTime.AddHours(input.TimeZone - x.TraceTimeZone) : x.TrackTime,
TimeZone = isTurn ? input.TimeZone : x.TraceTimeZone
}).ToList();
res.Add(item);
}
await TrackDetailSort(res, input);
return res;
}
private async Task TrackDetailSort(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 SortMethod.ByTrackTimeDesc:
list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time)));
break;
case SortMethod.ByTemplate:
var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderType, input.OrderNos);
var distinctTemplateIds = orderTemplates.Select(x => x.TemplateId).Distinct().ToList();
var templateContent =
await _trackTemplateRepository.GetTemplateContentOrderlyAsync(distinctTemplateIds);
list.ForEach(item =>
{
var template = orderTemplates.FirstOrDefault(x => x.OrderNo == item.OrderNo);
if (template == default) return;
var codes = templateContent
.Where(x => x.TemplateId == template.TemplateId)
.Select(x => x.Code)
.ToList();
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, "不支持的排序方式");
}
}
}