using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.TrackOrder; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Aggregates.TrackPushAggregate; using SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Application.Services.TrackOrders; [ApiExplorerSettings(GroupName = "轨迹订单")] [Route("/Track/Order")] public class TrackOrderService : ApplicationService { private readonly IOrderOperationRecordRepository _orderOperationRecordRepository; private readonly IOrderRepository _orderRepository; private readonly ITrackContentRepository _trackContentRepository; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackPushRecordsRepository _trackPushRecordsRepository; public TrackOrderService( IOrderRepository orderRepository, ITrackDetailsRepository trackDetailsRepository, ITrackContentRepository trackContentRepository, ITrackPushRecordsRepository trackPushRecordsRepository, IOrderOperationRecordRepository orderOperationRecordRepository) { _orderRepository = orderRepository; _trackDetailsRepository = trackDetailsRepository; _trackContentRepository = trackContentRepository; _trackPushRecordsRepository = trackPushRecordsRepository; _orderOperationRecordRepository = orderOperationRecordRepository; } #region 轨迹订单列表 /// /// 获取分页的轨迹订单 /// /// /// [HttpPost("GetTrackOrderList")] public async Task> GetTrackOrderPagedList(GetPageTrackOrderInput input) { var vo = ObjectMapper.Map(input); var pageList = await _orderRepository.GetTrackOrderPagedList(vo); var pageResultDto = ObjectMapper.Map, UnifyPageResultDto>(pageList); return pageResultDto; } #endregion [HttpPost("UpdateOrderStatus")] public async Task UpdateOrderStatus(UpdateOrderStatusInput input) { var order = await _orderRepository.GetFirstAsync(x => x.Id == input.OrderId); if (order == default) throw new BusinessException(message: "订单不存在"); order.IsCompleted = input.IsCompleted; return await _orderRepository.UpdateColumnAsync(order, x => new { x.IsCompleted }); } /// /// 获取轨迹推送记录 /// /// /// 订单id [HttpGet("GetTrackPushRecords")] public async Task> GetTrackPushRecordsAsync(int orderId) { var records = await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId); var res = ObjectMapper.Map, List>(records); res.ForEach(x => { int hours = (int) x.TrackTimeZone; // 提取整数部分作为小时 int minutes = (int) ((x.TrackTimeZone - hours) * 60); // 将小数部分乘以 60 转换为分钟 x.TrackGTMTimeZone = $"GTM {(x.TrackTimeZone >= 0 ? "+" : "-")}{new TimeSpan(hours, minutes, 0).ToString().RemovePostFix(":00")}"; }); return res; } /// /// 根据订单id获取轨迹明细列表 /// /// /// [HttpPost("GetDetails")] public async Task> GetTracksAsync(int orderId) { var subSystemId = await _orderRepository.GetFirstAsync(x => x.Id == orderId, x => x.SubSystemId); if (subSystemId == default) { throw new BusinessException(message: "订单不存在"); } var trackDetails = await _trackDetailsRepository.GetListAsync(orderId); if (trackDetails.IsNullOrEmpty()) { return new List(); } var list = ObjectMapper.Map, List>(trackDetails); var trackCodes = list.Select(x => x.Code) .Where(x => x != GlobalConst.EmptyString) .Distinct() .ToList(); // 是否对外 if (!trackCodes.IsNullOrEmpty()) { var trackContents = await _trackContentRepository.GetListAsync(x => x.SubSystemId == subSystemId && trackCodes.Contains(x.Code), x => new { x.Code, x.IsExternal }); list.ForEach(x => x.IsExternal = trackContents.FirstOrDefault(y => y.Code == x.Code)?.IsExternal ?? false); } // 计算时区 list.ForEach(a => { if (a.TrackTimeZoneValue == 0f) { a.TrackTimeZone = "GTM +00:00"; } else if (Math.Abs(a.TrackTimeZoneValue - GlobalConst.NoneTrackTimeZone) < 1) { a.TrackTimeZone = "--"; } else { // 将小数形式的小时转换为时区偏移量 var hours = (int) a.TrackTimeZoneValue; // 提取整数部分作为小时 var minutes = (int) ((a.TrackTimeZoneValue - hours) * 60); // 将小数部分乘以 60 转换为分钟 var offset = new TimeSpan(hours, minutes, 0); var timeZoneStr = offset.ToString(); var flag = a.TrackTimeZoneValue > 0f ? "+" : ""; a.TrackTimeZone = $"GTM {flag}{timeZoneStr.RemovePostFix(":00")}"; } }); return list; } /// /// 根据轨迹id删除单条轨迹 /// /// 轨迹id /// [HttpPost("DeleteTrackById")] public async Task DeleteTrackByIdAsync(string trackId) { var track = await _trackDetailsRepository.GetByIdAsync(trackId); // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract if (track == null) { throw new BusinessException(message: "轨迹不存在!"); } await _trackDetailsRepository.DeleteTrackByIdAsync(trackId, track.IndexName); return true; } /// /// 根据订单id查询订单操作记录 /// /// 订单id /// [HttpGet("GetOrderOperationsById")] public async Task> GetOrderOperationsByIdAsync(int orderId) { return await _orderOperationRecordRepository.GetOrderOperationsByIdAsync(orderId); } }