diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs index 7bb84c1c..0e978af4 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPush/TrackPushRecordDto.cs @@ -30,7 +30,7 @@ public class TrackPushRecordDto /// /// 接口通请求Id /// - public Guid RequestId { get; set; } + public Guid? RequestId { get; set; } /// /// 信息 diff --git a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs index 6e3d3987..c7f4801d 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackPushCompletedEvent.cs @@ -27,8 +27,9 @@ public class TrackPushCompletedEvent /// /// 接口通请求Id + /// 在请求接口通前被拦截,就不会有请求Id /// - public Guid RequestId { get; set; } + public Guid? RequestId { get; set; } /// /// 信息 diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index caca1139..4a1cb510 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -27,4 +27,10 @@ public interface IBroadcastingService : ITransientDependency /// /// void TrackPushCompletedPublicTopic(TrackPushRecordDto log); + + /// + /// 轨迹推送失败广播(推送前置被拦截,或调用接口通失败) + /// + /// + void TrackPushFailedPubilcTopic(TrackPushRecordDto log); } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 109f96a5..1b5dab76 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -25,19 +25,23 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _trackPushCacheService; private readonly ITrackPushRecordEsRepository _trackPushRecordEsRepository; + private readonly IBroadcastingService _broadcastingService; private List _orders = null!; private List _pushConfigs = null!; public TrackPushEventHandler(IHttpClientProxy httpClientProxy, - IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService, + IOrderRepository orderRepository, + ITrackPushCacheService trackPushCacheService, ITrackPushRecordEsRepository trackPushRecordEsRepository, - IOptionsMonitor options) + IOptionsMonitor options, + IBroadcastingService broadcastingService) { _httpClientProxy = httpClientProxy; _orderRepository = orderRepository; _trackPushCacheService = trackPushCacheService; _trackPushRecordEsRepository = trackPushRecordEsRepository; _options = options; + _broadcastingService = broadcastingService; } [CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)] @@ -97,16 +101,44 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var isSystemPush = @event.OperationMan == null; if (isSystemPush && !@event.ForcedPush) { + config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); foreach (var order in _orders) { - if (order.QuestionType == (int) TrackProblemType.Error) continue; // 系统不推异常单,只能人工操作 + if (config == null) + { + TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); + return; + } + + // 系统不推异常单,只能人工操作 + if (order.QuestionType == (int) TrackProblemType.Error) + { + TrackPushFailedPublicTopic("系统不推异常单,只能人工操作", @event, order); + continue; + } + // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); - if (config == null) continue; + var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + if (resultConfig == null) + { + TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); + continue; + } + config = resultConfig; + // 是否自动推送 - if (!config.IsAutoPush) continue; + if (!config.IsAutoPush) + { + TrackPushFailedPublicTopic($"没有设置为自动推送,如果要推送请手动推送", @event, order); + continue; + } + // 配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + continue; + } var log = new TrackPushRecordIndex { @@ -131,26 +163,42 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } // 手工或强制推送,不会校验已推和顺序问题,因为可能是更新 else + { config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - if (config == null) return; - foreach (var order in _orders) { - if (config is { IsAllPush: true }) + if (config == null) { - // 强制推送只需直接查出配置 - if (@event.ForcedPush) - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - // 推断 本次推送 是否可行 - else - config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); + return; + } + + if (config is { IsAllPush: true }) + { + // 非强制推送需要 推断 本次推送 是否可行 + if (!@event.ForcedPush) + { + var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); + if (resultConfig == null) + { + TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); + continue; + } + + config = resultConfig; + } + + // tips:强制推送直接使用配置 } - if (config == null) continue; //配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + continue; + } var log = new TrackPushRecordIndex { @@ -188,6 +236,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (r.Code != GlobalConst.SuccessCode) { + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, items.Cast().ToList()); throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } @@ -202,7 +251,11 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe foreach (var order in _orders) { //配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) continue; + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + continue; + } var log = new TrackPushRecordIndex { @@ -239,6 +292,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe if (r.Code != GlobalConst.SuccessCode) { + TrackPushFailedPublicTopic($"轨迹中台调用接口通失败,RequestId: {r.RequestId}; Msg: {r.Msg}", @event, r.RequestId, items.Cast().ToList()); throw new BusinessException(message: $"requestId: {r.RequestId}; serviceProviderCode:{serviceProviderCode} Msg: {r.Msg}"); } } @@ -330,7 +384,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了 /// 则查询有没有可交换的推送,没有就返回null /// - private static TrackPushContentConfigDto? GetValidPushConfigAsync(List cache, + private static (TrackPushContentConfigDto? config, string nextCode) GetValidPushConfigAsync(List cache, string? latestPushTrackCode, string? trackCode) { var idx = cache.FindIndex(x => x.TrackCode == latestPushTrackCode); @@ -344,7 +398,10 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe // find swap cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); - return matched != null && matched.TrackCode == trackCode ? matched : default; + //没推完,可能不符合推送顺序 + return matched != null && matched.TrackCode == trackCode + ? (matched, matched.TrackCode) + : (default, matched?.TrackCode ?? cache[idx + 1].TrackCode); } /// @@ -391,4 +448,64 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe return false; } + + //轨迹推送失败(被拦截) + private void TrackPushFailedPublicTopic( + string failedMessage, + TrackPushEvent @event, + OrderEntity order) + { + _broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto + { + //还没请求接口通 + RequestId = null, + IsSuccess = false, + Message = failedMessage, + OperationMan = @event.OperationMan, + PushTime = DateTime.Now, + OptionType = @event.OptionType.ToString(), + IsManualPush = @event.OperationMan != null, + //还没到构建推送内容那一步就被拦截 + PushContent = string.Empty, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackContent = @event.SystemPushInfo.TrackStatus, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackCode = @event.TrackCode, + Extra = @event.SystemPushInfo.Extra, + }); + } + + //轨迹推送失败(请求接口通) + private void TrackPushFailedPublicTopic( + string failedMessage, + TrackPushEvent @event, + Guid requestId, + List pushOrUpdateInputs) + { + foreach (var pushInput in pushOrUpdateInputs) + { + _broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto + { + RequestId = requestId, + IsSuccess = false, + Message = failedMessage, + OperationMan = @event.OperationMan, + PushTime = DateTime.Now, + OptionType = @event.OptionType.ToString(), + IsManualPush = @event.OperationMan != null, + PushContent = SerializeForTextJson(pushInput), + OrderNo = pushInput.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackContent = @event.SystemPushInfo.TrackStatus, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackCode = @event.TrackCode, + Extra = @event.SystemPushInfo.Extra, + }); + } + } } diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 14c6c578..b0415664 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -111,4 +111,10 @@ public class BroadcastingService : IBroadcastingService _rabbitClientBus.Publish(GlobalConst.TrackPushExchange, $"TrackPush.{log.SubSystemCode}", Encoding.UTF8.GetBytes(data.ToJson())); } + + public void TrackPushFailedPubilcTopic(TrackPushRecordDto log) + { + //暂时使用推送完成模型,后续可能会出现有区分度的模型 + TrackPushCompletedPublicTopic(log); + } }