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))); + } }