From 9d0b61ffe8b481b12a6f9bd43ce88dda4ee7fca8 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Fri, 28 Mar 2025 17:53:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=9B=9E=E4=BC=A0=E9=A2=84=E8=AD=A6?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E7=BB=B4=E6=8A=A4=E9=87=8D=E8=AF=95=E6=AC=A1?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E9=81=BF=E5=85=8D=E5=B9=B6=E5=8F=91=E5=86=B2?= =?UTF-8?q?=E7=AA=81=20fix:=20=E5=AE=8C=E6=95=B4=E9=A2=84=E8=AD=A6?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E8=BD=A8=E8=BF=B9=E7=8A=B6=E6=80=81=E8=B7=9F?= =?UTF-8?q?=E9=9A=8F=E8=AE=A2=E5=8D=95=E5=AE=9E=E9=99=85=E7=9A=84=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E7=8A=B6=E6=80=81=E8=80=8C=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Hangfire/WarningTaskService.cs | 11 +++- .../Handlers/CompleteWarningHandler.cs | 59 ++++++++++++++++--- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/SJZY.Track.Application/Hangfire/WarningTaskService.cs b/src/SJZY.Track.Application/Hangfire/WarningTaskService.cs index e8c3baa4..defaf532 100644 --- a/src/SJZY.Track.Application/Hangfire/WarningTaskService.cs +++ b/src/SJZY.Track.Application/Hangfire/WarningTaskService.cs @@ -100,6 +100,7 @@ public class WarningTaskService : IWarningTaskService, ITransientDependency items = updateInputs.Cast().ToList(); } + var retryCountChanged = false; // 2.请求 try { @@ -124,6 +125,7 @@ public class WarningTaskService : IWarningTaskService, ITransientDependency // 处理调用接口通失败,直接处于完结状态 await HandlerCallBusinessException(task, msg); + retryCountChanged = true; throw new BusinessException(message: msg); } } @@ -136,8 +138,11 @@ public class WarningTaskService : IWarningTaskService, ITransientDependency finally { // 3.维护回传预警明细的重试次数 - var warningDetailsIds = task.WarningDetailIds.Split(',').ToHashSet(); - await _warningDetailsEsRepository.ReturnWarningDetailsRetryIncrementAsync(warningDetailsIds); + if (!retryCountChanged) + { + var warningDetailsIds = task.WarningDetailIds.Split(',').ToHashSet(); + await _warningDetailsEsRepository.ReturnWarningDetailsRetryIncrementAsync(warningDetailsIds); + } } } @@ -154,6 +159,8 @@ public class WarningTaskService : IWarningTaskService, ITransientDependency var addNotifyTasks = new List(); foreach (var detail in warningDetails) { + // 重试次数+1 + detail.RetryCount++; if (detail.Status == ReturnWarningStatus.已关闭.GetHashCode()) continue; diff --git a/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs b/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs index 59cd1912..5b359c26 100644 --- a/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs +++ b/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs @@ -67,19 +67,47 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient }); if (warningDetails.Count == 0) return; + // 查询规则项目 + var ruleItemIds = warningDetails.Select(x => x.CompleteWarningRuleItemId).ToHashSet(); + var ruleItems = await _warningRuleRepository.GetCompleteRuleItemsAsync(ruleItemIds); + var ruleItemDict = ruleItems.ToDictionary(x => x.Id); + // 4.处理明细 var closeDetailIds = new HashSet(); - foreach (var details in warningDetails) + var updateDetails = new List(); + foreach (var detail in warningDetails) { - var trackStatusIds = orderIdTrackStatusGroupsDict.GetValueOrDefault(details.OrderId); - // 订单无任何轨迹,或者不存在检查点状态轨迹 - if (trackStatusIds == null || !trackStatusIds.ContainsKey(details.CheckPointTrackStatusId)) + var ruleItem = ruleItemDict.GetValueOrDefault(detail.CompleteWarningRuleItemId); + // 规则配置不存在直接关闭 + if (ruleItem == null) { - closeDetailIds.Add(details.Id); + closeDetailIds.Add(detail.Id); + continue; } + + var trackStatusIdDict = orderIdTrackStatusGroupsDict.GetValueOrDefault(detail.OrderId); + // 订单无任何轨迹,或者不存在检查点状态轨迹 + if (trackStatusIdDict == null || !trackStatusIdDict.ContainsKey(detail.CheckPointTrackStatusId)) + { + closeDetailIds.Add(detail.Id); + continue; + } + + // 查看缺失轨迹状态表达式是否有变化,如果有则更新 + var trackStatusIds = trackStatusIdDict.Keys.ToHashSet(); + var expression = BuildMissingTrackStatusIdExpression(ruleItem, trackStatusIds); + if (!string.Equals(detail.MissingTrackStatusIds, expression)) + { + detail.MissingTrackStatusIds = expression; + updateDetails.Add(detail); + } + // todo:需要处理要求轨迹完整的情况? } + if (updateDetails.Count > 0) + await _warningDetailsEsRepository.BulkUpdateCompleteWarningDetailsAsync(updateDetails); + if (closeDetailIds.Count == 0) return; // 5.预警信息状态修改为【已关闭】 @@ -166,7 +194,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // 生成预警明细 var needAddDetails = hitRuleItems .Where(x => hitRuleItemIds.Contains(x.Id)) - .Select(x => BuildCompleteWarningDetails(order, x, rule.Version)); + .Select(x => BuildCompleteWarningDetails(order, trackStatusIds, x, rule.Version)); addDetails.AddRange(needAddDetails); } @@ -185,7 +213,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient await _warningTaskRepository.BulkInsertWarningNotifyTaskAsync(notifyTasks); } - private static CompleteWarningDetailsIndex BuildCompleteWarningDetails(OrderEntity order, CompleteWarningRuleItemEntity ruleItem, string version) + private static CompleteWarningDetailsIndex BuildCompleteWarningDetails(OrderEntity order, HashSet trackStatusIds, CompleteWarningRuleItemEntity ruleItem, string version) { return new CompleteWarningDetailsIndex() { @@ -197,7 +225,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // NotifyModes = ruleItem.NotifyModes, NotifyUsers = ruleItem.NotifyUsers, CheckPointTrackStatusId = ruleItem.CheckPointTrackStatusId, - MissingTrackStatusIds = ruleItem.RequireTrackStatusIdExpression, //tips:是否需要明确缺失哪个状态? + MissingTrackStatusIds = BuildMissingTrackStatusIdExpression(ruleItem, trackStatusIds), SubSystemId = order.SubSystemId, CustomId = order.CustomId, @@ -226,6 +254,21 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient ).ToList(); } + // 根据规则和已有轨迹,构建缺失轨迹状态表达式 + private static string BuildMissingTrackStatusIdExpression(CompleteWarningRuleItemEntity ruleItem, HashSet trackStatusIds) + { + // 构建实际缺失的状态 + var missingGroups = new List>(); + foreach (var group in ruleItem.GetRequireTrackStatusIdGroups()) + { + if (group.Intersect(trackStatusIds).Any()) + continue; + missingGroups.Add(group); + } + + return string.Join(',', missingGroups.Select(sub => string.Join('/', sub))); + } + #endregion #region todo-test: 预警主体关闭