using DotNetCore.CAP; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Queries; using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 轨迹服务 /// [ApiExplorerSettings(GroupName = "提供接口")] public class TrackService : ApplicationService { private readonly IOrderRepository _orderRepository; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackQueries _trackQueries; private readonly ICapPublisher _capPublisher; public TrackService(ITrackQueries trackQueries, IOrderRepository orderRepository, ITrackDetailsRepository trackDetailsRepository, ICapPublisher capPublisher) { _trackQueries = trackQueries; _orderRepository = orderRepository; _trackDetailsRepository = trackDetailsRepository; _capPublisher = capPublisher; } /// /// 新增/更新订单轨迹接口 /// /// /// /// [HttpPost("Track/Upsert")] public async Task UpsertTrackAsync(UpsertTrackInput input) { var orderId = await _orderRepository.GetFirstAsync(x => x.OrderType == input.OrderType && x.OrderNo == input.OrderNo, x => x.Id); if (orderId == default) { throw new BusinessException(message: $"订单:{input.OrderNo}不存在"); } // 不存在则新增轨迹,存在则更新 var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(orderId, input.TrackCode); if (track == default) { var trackContent = await _trackQueries.MatchTrackContentAsync(orderId, input.TrackCode); if (trackContent == default) { throw new BusinessException(message: $"订单:{input.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{input.TrackCode}"); } track = new TrackDetailsIndex { OrderId = orderId, OrderNo = input.OrderNo, OrderType = input.OrderType, TrackStatus = trackContent.Status, TrackCode = input.TrackCode, TrackContent = trackContent.Content, TrackEnContent = trackContent.EnContent, TrackPlace = input.TrackPlace, TrackTime = input.TrackTime, TraceTimeZone = input.TraceTimeZone, CreateUserId = CurrentUserRequest.CurrentUser.UserId, CreateTime = DateTime.Now }; await _trackDetailsRepository.CreateAsync(track); } else { track.UpdateUserId = CurrentUserRequest.CurrentUser.UserId; track.UpdateTime = DateTime.Now; track.TrackPlace = input.TrackPlace; track.TrackTime = input.TrackTime; track.TraceTimeZone = input.TraceTimeZone; await _trackDetailsRepository.UpdateAsync(track); } // 根据订单关联关系向下刷,不同子系统还需要做内容映射 var linkedOrderIds = await _orderRepository.GetLinkedOrderIdsAsync(orderId); if (linkedOrderIds.Count > 0) { await _capPublisher.PublishAsync(TrackCustomer.CapSubscribe, new TrackUpsertEvent { }); } // 推送 return true; } }