using DotNetCore.CAP; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Queries; using SJZY.UserCenter.HttpApi.Services; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.EventHandlers; public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ITrackPushCacheService _trackPushCacheService; private readonly ICapPublisher _capPublisher; public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher, IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository, ITrackPushCacheService trackPushCacheService) { _orderRepository = orderRepository; _capPublisher = capPublisher; _provideQueries = provideQueries; _trackDetailsRepository = trackDetailsRepository; _trackPushCacheService = trackPushCacheService; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe)] public async Task ConsumerAsync(TrackUpsertEvent @event) { // 不同子系统需要做内容映射 if (@event.UpSubSystemId != @event.SubSystemId) { var mapCode = await _provideQueries .MapTrackContentCodeAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCode); if (mapCode == default) { //throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); return; } @event.TrackCode = mapCode; } await UpsertTrackAsync(@event); } internal async Task UpsertTrackAsync(TrackUpsertEvent @event) { // 不存在则新增轨迹,存在则更新 var track = await _trackDetailsRepository.GetFirstOrDefaultAsync(@event.OrderId, @event.TrackCode); var orderIsCompleted = false; if (track == default) { // 根据轨迹code在订单模板内容中寻找匹配的 var trackContent = await _provideQueries.MatchTrackContentAsync(@event.OrderId, @event.TrackCode); if (trackContent == default) { //throw new BusinessException(message: $"订单:{@event.OrderNo} 所绑定的模板,没有一条内容可以匹配轨迹代码:{@event.TrackCode}"); return; } orderIsCompleted = trackContent.IsCompleted; track = new TrackDetailsIndex { OrderId = @event.OrderId, OrderNo = @event.OrderNo, OrderType = @event.OrderType, TrackStatus = trackContent.Status, TrackCode = @event.TrackCode, TrackContent = trackContent.Content, TrackEnContent = trackContent.EnContent, TrackPlace = @event.TrackPlace, TrackTime = @event.TrackTime, TraceTimeZone = @event.TraceTimeZone, CreateUser = CurrentUserRequest.CurrentUser.Name, CreateTime = DateTime.Now }; // todo:推送只做新增的,更新和删除的不做先 if (!@event.IsPushCompleted && await _trackPushCacheService.IsPushAsync(@event.CustomId)) { //await PushTrack(); } } else { track.TrackPlace = @event.TrackPlace; track.TrackTime = @event.TrackTime; track.TraceTimeZone = @event.TraceTimeZone; track.UpdateUser = CurrentUserRequest.CurrentUser.Name; track.UpdateTime = DateTime.Now; } await _trackDetailsRepository.UpsertAsync(track); // 触发订单主表更新事件 await _capPublisher.PublishAsync(GlobalConst.UpdateOrderTrackSubscribe, new UpdateOrderTrackEvent { OrderId = track.OrderId, IsCompleted = orderIsCompleted, TrackContent = track.TrackContent, TrackEnContent = track.TrackEnContent, TrackPlace = track.TrackPlace, TrackTime = track.TrackTime }); // 根据订单关联关系异步向下刷 var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); foreach (var linkedOrder in linkedOrders) { var nextEvent = @event.DeepCopy(); nextEvent.OrderId = linkedOrder.OrderId; nextEvent.OrderType = linkedOrder.OrderType; nextEvent.OrderNo = linkedOrder.OrderNo; nextEvent.SubSystemId = linkedOrder.SubSystemId; nextEvent.IsPushCompleted = linkedOrder.IsPushCompleted; nextEvent.CustomId = linkedOrder.CustomId; nextEvent.UpSubSystemId = @event.SubSystemId; await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, nextEvent); } } }