91 lines
3.5 KiB
C#
91 lines
3.5 KiB
C#
using DotNetCore.CAP;
|
||
using SJZY.Expand.ABP.Core.Logger;
|
||
using SJZY.Expand.ABP.Core.PublicMethords;
|
||
using SJZY.Track.Application.Contract.Events;
|
||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||
using SJZY.Track.Domain.Consts;
|
||
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 ICapPublisher _capPublisher;
|
||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||
|
||
public TrackDeleteEventHandler(IProvideQueries provideQueries,
|
||
IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsRepository trackDetailsRepository)
|
||
{
|
||
_provideQueries = provideQueries;
|
||
_orderRepository = orderRepository;
|
||
_capPublisher = capPublisher;
|
||
_trackDetailsRepository = trackDetailsRepository;
|
||
}
|
||
|
||
[CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)]
|
||
public async Task ConsumerAsync(TrackDeleteEvent @event)
|
||
{
|
||
var dup = @event.Visited.Intersect(@event.OrderIds).ToArray();
|
||
if (dup.Any())
|
||
{
|
||
LogHelper.Error($"删除轨迹订单时,发现循环依赖:{dup.JoinAsString(",")}");
|
||
return;
|
||
}
|
||
|
||
await DeleteTrackAsync(@event);
|
||
|
||
// 根据订单关联关系异步向下刷(异步)
|
||
var linkedOrders = await _orderRepository.GetLinkedOrdersAsync(@event.OrderIds);
|
||
foreach (var orderId in @event.OrderIds)
|
||
{
|
||
foreach (var group in linkedOrders.Where(x => x.OwnerOrderId == orderId)
|
||
.GroupBy(x => x.SubSystemId))
|
||
{
|
||
var nextEvent = @event.DeepCopy();
|
||
nextEvent.Visited.AddRange(@event.OrderIds);
|
||
nextEvent.TrackCodes = @event.TrackCodes;
|
||
nextEvent.SubSystemId = group.Key;
|
||
nextEvent.OrderIds = group.Select(x => x.OrderId).ToArray();
|
||
|
||
// 不同子系统需要做内容映射
|
||
if (@event.SubSystemId != nextEvent.SubSystemId)
|
||
{
|
||
var mapCodes = await _provideQueries
|
||
.MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCodes.ToArray());
|
||
|
||
if (mapCodes.Count == 0)
|
||
{
|
||
//throw new BusinessException(message: "订单跨子系统,未配置内容映射,请联系管理员");
|
||
return;
|
||
}
|
||
|
||
nextEvent.TrackCodes = mapCodes;
|
||
}
|
||
|
||
await _capPublisher.PublishAsync(GlobalConst.TrackDeleteSubscribe, nextEvent);
|
||
}
|
||
}
|
||
}
|
||
|
||
private async Task DeleteTrackAsync(TrackDeleteEvent @event)
|
||
{
|
||
// 删除轨迹(删的是同子系统下的单,所以code是统一的)
|
||
var isOk = await _trackDetailsRepository.DeleteTrackAsync(@event.OrderIds, @event.TrackCodes);
|
||
|
||
if (isOk)
|
||
{
|
||
// 触发订单主表更新事件
|
||
await _capPublisher.PublishDelayAsync(TimeSpan.FromSeconds(3),
|
||
GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
|
||
new TrackChangeAfterUpdateOrderEvent
|
||
{
|
||
OrderIds = @event.OrderIds,
|
||
IsDelete = true
|
||
});
|
||
}
|
||
}
|
||
} |