using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Track.Application.Contract.Events; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.EventHandlers; public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ICapPublisher _capPublisher; public TrackDeleteEventHandler(IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository, ICapPublisher capPublisher) { _provideQueries = provideQueries; _trackDetailsRepository = trackDetailsRepository; _orderRepository = orderRepository; _capPublisher = capPublisher; } [CapSubscribe(GlobalConst.TrackDeleteSubscribe)] public async Task ConsumerAsync(TrackDeleteEvent @event) { if (@event.Visited.Contains(@event.OrderId)) { LogHelper.Error($"轨迹订单循环依赖预警:{@event.Visited.JoinAsString(",")}"); return; } @event.Visited.Add(@event.OrderId); // 不同子系统需要做内容映射 if (@event.UpSubSystemId != 0 && @event.UpSubSystemId != @event.SubSystemId) { var mapCodes = await _provideQueries .MapTrackCodesAsync(@event.UpSubSystemId, @event.SubSystemId, @event.TrackCodes.ToArray()); if (mapCodes.Count == 0) { //throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员"); return; } @event.TrackCodes = mapCodes; } await DeleteTrackAsync(@event); } private async Task DeleteTrackAsync(TrackDeleteEvent @event) { // 删除轨迹 await _trackDetailsRepository.DeleteTrackAsync(@event.OrderId, @event.TrackCodes); // 根据订单关联关系异步向下刷 var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderId); foreach (var linkedOrder in linkedOrders) { var nextEvent = new TrackDeleteEvent { OrderId = linkedOrder.OrderId, TrackCodes = @event.TrackCodes, SubSystemId = linkedOrder.SubSystemId, UpSubSystemId = @event.SubSystemId }; await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent); } } }