From 08f0ebeeaebf907a16679122a0c4518224ac01ba Mon Sep 17 00:00:00 2001 From: xiaolipro <2357729423@qq.com> Date: Wed, 15 Jan 2025 15:02:03 +0800 Subject: [PATCH] =?UTF-8?q?optimize&fix=EF=BC=9Aforce=20push=20event=20cas?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EventHandlers/TrackPushEventHandler.cs | 291 +++++++++--------- 1 file changed, 153 insertions(+), 138 deletions(-) diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs index 03acbc70..09d58a78 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs @@ -96,130 +96,21 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe private async Task DoPushAsync(TrackPushEvent @event) { var items = new List(); - TrackPushContentConfigDto? config; - var isSystemPush = @event.OperationMan == null; - if (isSystemPush && !@event.ForcedPush) + if (@event.OperationMan == null) { - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - foreach (var order in _orders) + if (@event.OptionType == OptionType.新增) { - if (config == null) - { - TrackPushFailedPublicTopic($"没有在推送映射配置中找到关于轨迹代码[{@event.TrackCode}]的配置", @event, order); - return; - } - - // 系统不推异常单,只能人工操作 - if (order.QuestionType == (int) TrackProblemType.Error) - { - TrackPushFailedPublicTopic("系统不推异常单,只能人工操作", @event, order); - continue; - } - - // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行,为了约束顺序 - var (resultConfig, nextCode) = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event.TrackCode); - if (resultConfig == null) - { - TrackPushFailedPublicTopic($"推送顺序异常,下一个要推送的应为[{nextCode}]", @event, order); - continue; - } - - config = resultConfig; - - // 是否自动推送 - if (!config.IsAutoPush) - { - TrackPushFailedPublicTopic($"没有设置为自动推送,如果要推送请手动推送", @event, order); - continue; - } - - // 配置的类型如何和订单类型不一致则不允许推送 - if (config.OrderType != order.OrderType) - { - TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); - continue; - } - - var log = new TrackPushRecordIndex - { - OptionType = @event.OptionType.ToString(), - OrderId = order.Id, - OrderNo = order.OrderNo, - TrackStatus = @event.SystemPushInfo.TrackStatus, - TrackCode = @event.TrackCode, - TrackContent = @event.SystemPushInfo.TrackContent, - TrackPlace = @event.SystemPushInfo.TrackPlace, - TrackTime = @event.SystemPushInfo.TrackTime, - TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, - CreateUser = GlobalConst.SystemUser, - SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq, - Extra = @event.SystemPushInfo.Extra - }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); - item.Log = JsonConvert.SerializeObject(log); - items.Add(item); + await BuiltSystemPushItemsAsync(@event, items); + } + else if (@event.OptionType == OptionType.修改) + { + await BuiltManualPushItemsAsync(@event, items); } } - // 手工或强制推送,不会校验已推和顺序问题,因为可能是更新 else - { - config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); - foreach (var order in _orders) - { - if (config == null) - { - 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.OrderType != order.OrderType) - { - TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); - continue; - } - - var log = new TrackPushRecordIndex - { - OptionType = @event.OptionType.ToString(), - OrderId = order.Id, - OrderNo = order.OrderNo, - TrackStatus = @event.SystemPushInfo.TrackStatus, - TrackCode = @event.TrackCode, - TrackContent = @event.SystemPushInfo.TrackContent, - TrackPlace = @event.SystemPushInfo.TrackPlace, - TrackTime = @event.SystemPushInfo.TrackTime, - TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, - CreateUser = @event.OperationMan, - SubSystemCode = @event.SubSystemCode, - IsToMq = @event.IsToMq, - Extra = @event.SystemPushInfo.Extra - }; - var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); - item.Log = JsonConvert.SerializeObject(log); - items.Add(item); - } + // 手工推送,不会校验已推和顺序问题,因为可能是更新 + await BuiltManualPushItemsAsync(@event, items); } if (items.Count == 0) return; @@ -236,12 +127,129 @@ 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}"); + 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}"); } } } + private async Task BuiltManualPushItemsAsync(TrackPushEvent @event, List items) + { + // tips: 手工强制推送直接使用配置 + var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + foreach (var order in _orders) + { + if (config is { IsAllPush: true }) + { + // 非强制推送需要 推断 本次推送 是否可行 + if (!@event.ForcedPush) + { + config = GetValidPushConfigAsync(_pushConfigs, order.LatestPushTrackCode, @event); + } + } + + if (config == null) + { + TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order); + return; + } + + + //配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, + order); + continue; + } + + var log = new TrackPushRecordIndex + { + OptionType = @event.OptionType.ToString(), + OrderId = order.Id, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + CreateUser = @event.OperationMan, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra + }; + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); + item.Log = JsonConvert.SerializeObject(log); + items.Add(item); + } + } + + private async Task BuiltSystemPushItemsAsync(TrackPushEvent @event, List items) + { + var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); + foreach (var order in _orders) + { + 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); + if (config == null) + { + TrackPushFailedPublicTopic("推送顺序异常,找不到有效推送配置", @event, order); + continue; + } + + // 是否自动推送 + if (!config.IsAutoPush) + { + TrackPushFailedPublicTopic("没有设置为自动推送,如果要推送请手动推送", @event, order); + continue; + } + + // 配置的类型如何和订单类型不一致则不允许推送 + if (config.OrderType != order.OrderType) + { + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, + order); + continue; + } + + var log = new TrackPushRecordIndex + { + OptionType = @event.OptionType.ToString(), + OrderId = order.Id, + OrderNo = order.OrderNo, + TrackStatus = @event.SystemPushInfo.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.SystemPushInfo.TrackContent, + TrackPlace = @event.SystemPushInfo.TrackPlace, + TrackTime = @event.SystemPushInfo.TrackTime, + TrackTimeZone = @event.SystemPushInfo.TrackTimeZone, + CreateUser = GlobalConst.SystemUser, + SubSystemCode = @event.SubSystemCode, + IsToMq = @event.IsToMq, + Extra = @event.SystemPushInfo.Extra + }; + var item = await BuiltPushItem(config, log, @event.SystemPushInfo.CompareFields); + item.Log = JsonConvert.SerializeObject(log); + items.Add(item); + } + } + private async Task DoUpdateAsync(TrackPushEvent @event) { var config = _pushConfigs.FirstOrDefault(x => x.TrackCode == @event.TrackCode); @@ -253,7 +261,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe //配置的类型如何和订单类型不一致则不允许推送 if (config.OrderType != order.OrderType) { - TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, order); + TrackPushFailedPublicTopic($"订单类型{order.OrderType}和配置中的订单类型[{config.OrderType}]不一致,不能推送", @event, + order); continue; } @@ -292,8 +301,10 @@ 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}"); + 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}"); } } } @@ -363,12 +374,15 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { //反序列化出的JsonElement和字典字符串类型做比较 var a = ((JsonElement) x["code"]!).GetString(); - var b = cur["code"]!.ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 + var b = cur["code"]! + .ToString(); //tips: 需要要将object类型的字符串转为string类型,否则使用的是引用比较,反序列化出的string一定和本地string引用不同 return a == b; - }).WhereIf(!compareFields.IsNullOrWhiteSpace(), x => + }) + .WhereIf(!compareFields.IsNullOrWhiteSpace(), x => { if (x["extra"] == null || log.Extra == null) return false; - return TextJsonHelper.EqByJsonElementField(x["extra"]!, TextJsonHelper.Deserialize(log.Extra), compareFields!); + return TextJsonHelper.EqByJsonElementField(x["extra"]!, + TextJsonHelper.Deserialize(log.Extra), compareFields!); }) .FirstOrDefault(); @@ -376,8 +390,8 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe { body.Data.Remove(old); } - } + // //添加当前要推送的轨迹 body!.Data.Add(cur); } @@ -392,24 +406,28 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe /// 根据轨迹代码推断下一个(升序)要推送的内容,如果找不到或者已经是最后一个了 /// 则查询有没有可交换的推送,没有就返回null /// - private static (TrackPushContentConfigDto? config, string nextCode) GetValidPushConfigAsync(List cache, - string? latestPushTrackCode, string? trackCode) + private static TrackPushContentConfigDto? GetValidPushConfigAsync(List cache, + string? latestPushTrackCode, TrackPushEvent @event) { + var trackCode = @event.TrackCode; var idx = cache.FindIndex(x => x.TrackCode == latestPushTrackCode); + if (@event.ForcedPush && trackCode == latestPushTrackCode) + { + //强制推送,允许重复推送当前轨迹 + return cache[idx]; + } + if (idx + 1 >= cache.Count) return default; // 推完了 // find next var matched = cache[idx + 1].TrackCode == trackCode ? cache[idx + 1] - : // find swap - cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); + : cache.FirstOrDefault(x => x.TrackCode == cache[idx + 1].SwapTrackCode); //没推完,可能不符合推送顺序 - return matched != null && matched.TrackCode == trackCode - ? (matched, matched.TrackCode) - : (default, matched?.TrackCode ?? cache[idx + 1].TrackCode); + return matched != null && matched.TrackCode == trackCode ? matched : default; } /// @@ -433,10 +451,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } //轨迹推送失败(被拦截) - private void TrackPushFailedPublicTopic( - string failedMessage, - TrackPushEvent @event, - OrderEntity order) + private void TrackPushFailedPublicTopic(string failedMessage, TrackPushEvent @event, OrderEntity order) { _broadcastingService.TrackPushFailedPubilcTopic(new TrackPushRecordDto {