94 lines
3.8 KiB
C#
94 lines
3.8 KiB
C#
using DotNetCore.CAP;
|
||
using SJZY.Track.Application.Contract.Events;
|
||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
|
||
using SJZY.Track.Domain.Consts;
|
||
using Volo.Abp.DependencyInjection;
|
||
|
||
namespace SJZY.Track.Application.EventHandlers;
|
||
|
||
public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe
|
||
{
|
||
private readonly IOrderRepository _orderRepository;
|
||
private readonly ITrackDetailsRepository _trackDetailsRepository;
|
||
|
||
public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository,
|
||
ITrackDetailsRepository trackDetailsRepository)
|
||
{
|
||
_orderRepository = orderRepository;
|
||
_trackDetailsRepository = trackDetailsRepository;
|
||
}
|
||
|
||
[CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)]
|
||
public async Task ConsumerAsync(TrackChangeAfterUpdateOrderEvent @event)
|
||
{
|
||
var orders = await _orderRepository.GetListAsync(x => @event.OrderIds.Contains(x.Id),
|
||
x => new OrderEntity
|
||
{
|
||
Id = x.Id,
|
||
IsCompleted = x.IsCompleted,
|
||
LatestTrackContent = x.LatestTrackContent,
|
||
LatestTrackEnContent = x.LatestTrackEnContent,
|
||
LatestTrackPlace = x.LatestTrackPlace,
|
||
LatestTrackTime = x.LatestTrackTime,
|
||
LatestTrackTimeZone = x.LatestTrackTimeZone,
|
||
});
|
||
|
||
if (orders.Count == 0) return;
|
||
|
||
// todo:delete可能发生回退,直接去es查最新轨迹,但是可能es还没有刷盘,导致回退失效,可以考虑加个定时任务弥补
|
||
if (@event.IsDelete)
|
||
{
|
||
foreach (var order in orders)
|
||
{
|
||
var tracks = await _trackDetailsRepository.GetListAsync(@event.OrderIds);
|
||
|
||
var track = tracks.Where(x => x.OrderId == order.Id).MaxBy(x => x.TrackTime);
|
||
// 删除全部轨迹导致的重置行为
|
||
if (track == default)
|
||
{
|
||
if (order.LatestTrackTime == null) return;
|
||
|
||
// tips:订单是支持从已完成态到未完成态的
|
||
order.ResetTrackInfo();
|
||
}
|
||
else
|
||
{
|
||
// 删除引发的回退更新
|
||
order.IsCompleted = @event.IsCompleted;
|
||
order.LatestTrackContent = track.TrackContent;
|
||
order.LatestTrackEnContent = track.TrackEnContent;
|
||
order.LatestTrackPlace = track.TrackPlace;
|
||
order.LatestTrackTime = track.TrackTime;
|
||
order.LatestTrackTimeZone = track.TrackTimeZone;
|
||
}
|
||
}
|
||
}
|
||
else // upsert可以直接计算
|
||
{
|
||
foreach (var order in orders)
|
||
{
|
||
if (order.LatestTrackTime != null &&
|
||
@event.TrackTime.Subtract(TimeSpan.FromHours(@event.TrackTimeZone)) <
|
||
order.LatestTrackTime.Value.Subtract(TimeSpan.FromHours(order.LatestTrackTimeZone ?? 0)))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// upsert引发的更新
|
||
order.IsCompleted = @event.IsCompleted;
|
||
order.LatestTrackContent = @event.TrackContent;
|
||
order.LatestTrackEnContent = @event.TrackEnContent;
|
||
order.LatestTrackPlace = @event.TrackPlace;
|
||
order.LatestTrackTime = @event.TrackTime;
|
||
order.LatestTrackTimeZone = @event.TrackTimeZone;
|
||
}
|
||
}
|
||
|
||
await _orderRepository.UpdateRangeAsync(orders, x => new
|
||
{
|
||
x.IsCompleted, x.LatestTrackContent, x.LatestTrackEnContent, x.LatestTrackPlace, x.LatestTrackTime,
|
||
x.LatestTrackTimeZone
|
||
});
|
||
}
|
||
} |