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(@event.Attach); if (optionType == OptionType.新增.ToString()) { logStr = JsonConvert.DeserializeObject(@event.RequestParams)!.Log; } else if (optionType == OptionType.修改.ToString()) { logStr = JsonConvert.DeserializeObject(@event.RequestParams)!.Log; } if (logStr.IsNullOrEmpty()) throw new InvalidOperationException(); var log = JsonConvert.DeserializeObject(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 }); } } }