using System.Diagnostics; 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; using SJZY.Track.Domain.Dtos.TrackTemplate; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; namespace SJZY.Track.Application.Services.TrackOrders; [ApiExplorerSettings(GroupName = "轨迹订单")] [Route("/Track/Order")] public class TrackOrderService : ApplicationService { private readonly IOrderRepository _orderRepository; private readonly ITrackOrderQueries _trackOrderQueries; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackContentRepository _trackContentRepository; private readonly ITrackPushRecordsRepository _trackPushRecordsRepository; public TrackOrderService( IOrderRepository orderRepository, ITrackOrderQueries trackOrderQueries, ITrackDetailsRepository trackDetailsRepository, ITrackContentRepository trackContentRepository, ITrackPushRecordsRepository trackPushRecordsRepository ) { _orderRepository = orderRepository; _trackOrderQueries = trackOrderQueries; _trackDetailsRepository = trackDetailsRepository; _trackContentRepository = trackContentRepository; _trackPushRecordsRepository = trackPushRecordsRepository; } #region 轨迹订单明细 /// /// 根据轨迹订单id获取轨迹订单明细列表 /// /// /// [HttpPost("GetDetails")] public async Task> GetOrderDetails(GetOrderDetailsInput input) { var trackDetails = await _trackDetailsRepository.GetListAsync(input.OrderId); if (!trackDetails.IsNullOrEmpty()) { var list = ObjectMapper.Map, List>(trackDetails); var trackCodes = list.Where(a => !a.Code.IsNullOrWhiteSpace()).Select(a => a.Code).Distinct().ToList(); var trackContents = await _trackContentRepository.GetTrackContentAttributeValue( new GetTemplateContentAttributeValueInputVO { SubSystemId = input.SubSystemId, TrackTemplateIds = input.TrackTemplateIds, TrackCodes = trackCodes }); Debug.Assert(input.TrackTemplateIds != null, "input.TrackTemplateIds != null"); input.TrackTemplateIds = input.TrackTemplateIds.Where(a => a > 0).ToList(); list.ForEach(a => { var trackContentsOfTemplates = trackContents.Where(b => b.SubSystemId == input.SubSystemId && b.TrackCode == a.Code && input.TrackTemplateIds.Contains(b.TrackTemplateId)) .ToList(); GetTemplateContentAttributeValueVO? trackContent = null; var insertData = input.TrackTemplateIds .Intersect(trackContentsOfTemplates.Select(aa => aa.TrackTemplateId)).ToList(); if (!insertData.IsNullOrEmpty()) { trackContent = trackContentsOfTemplates.FirstOrDefault(it => it.TrackTemplateId == insertData.FirstOrDefault()); } if (trackContent != null) { a.IsExternal = trackContent.IsExternal; } if (a.TrackTimeZoneValue == 0f) { a.TrackTimeZone = "GTM +00:00"; } else { // 将小数形式的小时转换为时区偏移量 int hours = (int)a.TrackTimeZoneValue; // 提取整数部分作为小时 int minutes = (int)((a.TrackTimeZoneValue - hours) * 60); // 将小数部分乘以 60 转换为分钟 TimeSpan offset = new TimeSpan(hours, minutes, 0); string timeZoneStr = offset.ToString(); string flag = a.TrackTimeZoneValue > 0f ? "+" : ""; a.TrackTimeZone = $"GTM {flag}{timeZoneStr.RemovePostFix(":00")}"; } }); return list; } return new List(); } #endregion #region 轨迹订单列表 /// /// 获取分页的轨迹订单 /// /// /// [HttpPost("GetTrackOrderList")] public async Task> GetPageTrackOrder(GetPageTrackOrderInput input) { var vo = ObjectMapper.Map(input); var pageList = await _trackOrderQueries.GetPageTrackOrder(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 }); } /// /// 获取轨迹计数器 /// /// [HttpGet("GetTrackCounter")] public async Task GetTrackCounterAsync() { var counts = await _trackOrderQueries.GetTrackProblemCountsAsync(); return new GetTrackCounterOutput { TotalCount = counts.Sum(x => x.Count), ErrorCount = counts.FirstOrDefault(x => x.ProblemType == (int)TrackProblemType.Error)?.Count ?? 0, WarnCount = counts.FirstOrDefault(x => x.ProblemType == (int)TrackProblemType.Warn)?.Count ?? 0, }; } /// /// 获取轨迹推送记录 /// /// /// 订单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; } }