129 lines
5.2 KiB
C#
129 lines
5.2 KiB
C#
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);
|
||
}
|
||
}
|
||
} |