101 lines
3.5 KiB
C#
101 lines
3.5 KiB
C#
using DotNetCore.CAP;
|
||
using Newtonsoft.Json;
|
||
using SJZY.InterfaceRelay.Application.Contracts;
|
||
using SJZY.Track.Application.Contract.Dtos.TrackPush;
|
||
using SJZY.Track.Application.Helpers;
|
||
using SJZY.Track.Domain.Aggregates.OrderAggregate;
|
||
using SJZY.Track.Domain.Aggregates.TrackPushAggregate;
|
||
using SJZY.Track.Domain.Consts;
|
||
using SJZY.Track.Domain.Enums;
|
||
using Volo.Abp.DependencyInjection;
|
||
|
||
namespace SJZY.Track.Application.EventHandlers;
|
||
|
||
public class TrackPushCompletedEventHandler : ITransientDependency, ICapSubscribe
|
||
{
|
||
private readonly ITrackPushRecordsRepository _trackPushRecordsRepository;
|
||
private readonly IOrderRepository _orderRepository;
|
||
|
||
public TrackPushCompletedEventHandler(ITrackPushRecordsRepository trackPushRecordsRepository,
|
||
IOrderRepository orderRepository)
|
||
{
|
||
_trackPushRecordsRepository = trackPushRecordsRepository;
|
||
_orderRepository = orderRepository;
|
||
}
|
||
|
||
[CapSubscribe(GlobalConst.TrackPushCompletedSubscribe, Group = GlobalConst.TrackPushSubscribe)]
|
||
public async Task ConsumerAsync(InterfaceRelayForwardReplayEvent @event)
|
||
{
|
||
string logStr = null;
|
||
var optionType = Base64Helper.DeSerialize<string>(@event.Attach);
|
||
if (optionType == OptionType.新增.ToString())
|
||
{
|
||
logStr = JsonConvert.DeserializeObject<TrackPushInput>(@event.RequestParams)!.Log;
|
||
}
|
||
else if (optionType == OptionType.修改.ToString())
|
||
{
|
||
logStr = JsonConvert.DeserializeObject<TrackUpdateInput>(@event.RequestParams)!.Log;
|
||
}
|
||
|
||
if (logStr.IsNullOrEmpty()) throw new InvalidOperationException();
|
||
var log = JsonConvert.DeserializeObject<TrackPushRecordIndex>(logStr!);
|
||
|
||
if (log == null) throw new BusinessException(message: "轨迹推送返回结果解析异常");
|
||
log.IsSuccess = @event.IsSuccess;
|
||
log.Message = @event.Message;
|
||
log.RequestId = @event.RequestId;
|
||
|
||
// 往es 写推送日志
|
||
await _trackPushRecordsRepository.AddAsync(log);
|
||
|
||
// if (!log.IsSuccess)
|
||
// {
|
||
// // 重试过程中不会去更新订单主表
|
||
// if (@event.RetryNum < 3)
|
||
// {
|
||
// @event.RetryNum++;
|
||
// await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, @event);
|
||
// return;
|
||
// }
|
||
// }
|
||
|
||
// 同步去更新订单主表
|
||
await TrackPushAfterUpdateOrderAsync(log);
|
||
}
|
||
|
||
private async Task TrackPushAfterUpdateOrderAsync(TrackPushRecordIndex log)
|
||
{
|
||
// tips:只有新增会影响推送进度?
|
||
if (log.OptionType != OptionType.新增.ToString()) return;
|
||
|
||
var order = new OrderEntity
|
||
{
|
||
Id = log.OrderId
|
||
};
|
||
|
||
/*
|
||
* 异常:最近一条推送是失败
|
||
*/
|
||
if (!log.IsSuccess)
|
||
{
|
||
order.QuestionType = (int)TrackProblemType.Error;
|
||
order.LatestPushError = log.Message;
|
||
await _orderRepository.UpdateColumnAsync(order, x => new
|
||
{
|
||
x.QuestionType, x.LatestPushError
|
||
});
|
||
}
|
||
else
|
||
{
|
||
// 还原成正常态
|
||
order.QuestionType = (int)TrackProblemType.None;
|
||
order.LatestPushError = null;
|
||
order.LatestPushTrackCode = log.TrackCode;
|
||
order.LatestPushTime = log.CreateTime;
|
||
await _orderRepository.UpdateColumnAsync(order, x => new
|
||
{
|
||
x.LatestPushTrackCode, x.LatestPushTime, x.QuestionType, x.LatestPushError
|
||
});
|
||
}
|
||
}
|
||
} |