fix:修复轨迹完整预警时新增轨迹可以导致明细的缺失轨迹状态发生变化

This commit is contained in:
hardstylewyl 2025-04-01 09:29:07 +08:00
parent 7b31da7cd0
commit e5956abbf7
3 changed files with 53 additions and 22 deletions

View File

@ -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<CompleteWarningDetailsIndex>();
var updateDetails = new List<CompleteWarningDetailsIndex>();
var closeDetailsIds = new HashSet<string>();
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<int>(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<CompleteWarningDetailsIndex> HandleExistsDetails(
HashSet<int> trackStatusIds,
List<CompleteWarningDetailsIndex> details,
Dictionary<int, CompleteWarningRuleItemEntity> ruleItemDict
)
{
var updateDetails = new List<CompleteWarningDetailsIndex>();
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<int> 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<int> trackStatusIds)
{
// 构建实际缺失的状态
var missingGroups = new List<HashSet<int>>();
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: 预警主体关闭

View File

@ -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

View File

@ -101,4 +101,20 @@ public sealed class CompleteWarningRuleItemEntity : IFullAuditedBasicEntitys, IE
return false;
}
// 构建缺失轨迹状态表达式
// 根据规则和已有轨迹,构建缺失轨迹状态表达式
public string BuildMissingTrackStatusIdExpression(HashSet<int> trackStatusIds)
{
// 构建实际缺失的状态
var missingGroups = new List<HashSet<int>>();
foreach (var group in GetRequireTrackStatusIdGroups())
{
if (group.Intersect(trackStatusIds).Any())
continue;
missingGroups.Add(group);
}
return string.Join(',', missingGroups.Select(sub => string.Join('/', sub)));
}
}