From e5956abbf7d215b0b853a13285166e8225fe2517 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 1 Apr 2025 09:29:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E9=A2=84=E8=AD=A6=E6=97=B6=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E5=8F=AF=E4=BB=A5=E5=AF=BC=E8=87=B4=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E7=9A=84=E7=BC=BA=E5=A4=B1=E8=BD=A8=E8=BF=B9=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=8F=91=E7=94=9F=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Handlers/CompleteWarningHandler.cs | 57 ++++++++++++------- .../Complete/CompleteWarningDetailsIndex.cs | 2 +- .../Complete/CompleteWarningRuleItemEntity.cs | 16 ++++++ 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs b/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs index 5b359c26..db1adefa 100644 --- a/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs +++ b/src/SJZY.Track.Application/Services/Warning/Handlers/CompleteWarningHandler.cs @@ -95,7 +95,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // 查看缺失轨迹状态表达式是否有变化,如果有则更新 var trackStatusIds = trackStatusIdDict.Keys.ToHashSet(); - var expression = BuildMissingTrackStatusIdExpression(ruleItem, trackStatusIds); + var expression = ruleItem.BuildMissingTrackStatusIdExpression(trackStatusIds); if (!string.Equals(detail.MissingTrackStatusIds, expression)) { detail.MissingTrackStatusIds = expression; @@ -142,6 +142,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // 3.以单的维度处理 // todo:优化流程减少N+1 var addDetails = new List(); + var updateDetails = new List(); var closeDetailsIds = new HashSet(); foreach (var order in orders) { @@ -169,9 +170,10 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient } if (hitRuleItems.Count == 0 && doneRuleItemIds.Count == 0) return; + var hitRuleItemDict = hitRuleItems.ToDictionary(x => x.Id); // 查出规则已经生成预警信息 - var hitRuleItemIds = hitRuleItems.Select(x => x.Id).ToHashSet(); + var hitRuleItemIds = hitRuleItemDict.Keys.ToHashSet(); var warningDetails = await _warningDetailsEsRepository.GetCompleteWarningDetailsAsync(new GetCompleteWarningDetailsVO { OrderIds = new HashSet(1) @@ -187,11 +189,16 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // 已完结的预警规则,稍后修改明细状态为【已处理】 closeDetailsIds.UnionWith(warningDetails.Where(x => doneRuleItemIds.Contains(x.CompleteWarningRuleItemId)).Select(x => x.Id)); - // 排除已经生成预警信息的规则 - hitRuleItemIds.ExceptWith(warningDetails.Select(x => x.CompleteWarningRuleItemId)); + // 处理已存在的预警明细(命中规则的) + var existsWarningDetails = warningDetails.Where(x => hitRuleItemIds.Contains(x.CompleteWarningRuleItemId)).ToList(); + var needUpdateDetails = HandleExistsDetails(trackStatusIds, existsWarningDetails, hitRuleItemDict); + updateDetails.AddRange(needUpdateDetails); + + // 排除已经生成预警信息的规则 + hitRuleItemIds.ExceptWith(existsWarningDetails.Select(x => x.CompleteWarningRuleItemId)); - if (hitRuleItemIds.Count == 0) continue; // 生成预警明细 + if (hitRuleItemIds.Count == 0) continue; var needAddDetails = hitRuleItems .Where(x => hitRuleItemIds.Contains(x.Id)) .Select(x => BuildCompleteWarningDetails(order, trackStatusIds, x, rule.Version)); @@ -202,6 +209,9 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // 4.预警由于不缺失轨迹变为失效,修改明细状态为【已处理】,并关闭相关预警通知任务 if (closeDetailsIds.Count > 0) await CloseWarningDetailLinksAsync(closeDetailsIds, CompleteWarningStatus.已处理); + // 更新预警明细 + if (updateDetails.Count > 0) + await _warningDetailsEsRepository.BulkUpdateCompleteWarningDetailsAsync(updateDetails); if (addDetails.Count == 0) return; @@ -213,6 +223,26 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient await _warningTaskRepository.BulkInsertWarningNotifyTaskAsync(notifyTasks); } + private static List HandleExistsDetails( + HashSet trackStatusIds, + List details, + Dictionary ruleItemDict + ) + { + var updateDetails = new List(); + foreach (var detail in details) + { + var ruleItem = ruleItemDict[detail.CompleteWarningRuleItemId]; // tips:一定存在 + var expression = ruleItem.BuildMissingTrackStatusIdExpression(trackStatusIds); + // 忽略状态表达式无变化的 + if (string.Equals(detail.MissingTrackStatusIds, expression)) continue; + detail.MissingTrackStatusIds = expression; + updateDetails.Add(detail); + } + + return updateDetails; + } + private static CompleteWarningDetailsIndex BuildCompleteWarningDetails(OrderEntity order, HashSet trackStatusIds, CompleteWarningRuleItemEntity ruleItem, string version) { return new CompleteWarningDetailsIndex() @@ -225,7 +255,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient // NotifyModes = ruleItem.NotifyModes, NotifyUsers = ruleItem.NotifyUsers, CheckPointTrackStatusId = ruleItem.CheckPointTrackStatusId, - MissingTrackStatusIds = BuildMissingTrackStatusIdExpression(ruleItem, trackStatusIds), + MissingTrackStatusIds = ruleItem.BuildMissingTrackStatusIdExpression(trackStatusIds), SubSystemId = order.SubSystemId, CustomId = order.CustomId, @@ -254,21 +284,6 @@ 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: 预警主体关闭 diff --git a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningDetailsIndex.cs b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningDetailsIndex.cs index bf529ce9..af634e8f 100644 --- a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningDetailsIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningDetailsIndex.cs @@ -15,7 +15,7 @@ public sealed class CompleteWarningDetailsIndex : IdBaseIndex //public string NotifyModes { get; set; } //通知方式,多个方式(,)分割 eg: 1,2 public string NotifyUsers { get; set; } //通知人Json eg: [{"UserId":1,"UserName":"张三"},{"UserId":2,"UserName":"李四"}] public int CheckPointTrackStatusId { get; set; } // (冗余)检查点轨迹状态Id - public string MissingTrackStatusIds { get; set; } //(冗余)缺失的轨迹状态 + public string MissingTrackStatusIds { get; set; } //(冗余)缺失的轨迹状态表达式 //订单信息 public int SubSystemId { get; set; } //(冗余)子系统Id diff --git a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningRuleItemEntity.cs b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningRuleItemEntity.cs index d42877c3..c3880646 100644 --- a/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningRuleItemEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/WarningAggregate/Complete/CompleteWarningRuleItemEntity.cs @@ -101,4 +101,20 @@ public sealed class CompleteWarningRuleItemEntity : IFullAuditedBasicEntitys, IE return false; } + + // 构建缺失轨迹状态表达式 + // 根据规则和已有轨迹,构建缺失轨迹状态表达式 + public string BuildMissingTrackStatusIdExpression(HashSet trackStatusIds) + { + // 构建实际缺失的状态 + var missingGroups = new List>(); + foreach (var group in GetRequireTrackStatusIdGroups()) + { + if (group.Intersect(trackStatusIds).Any()) + continue; + missingGroups.Add(group); + } + + return string.Join(',', missingGroups.Select(sub => string.Join('/', sub))); + } }