fix:修复轨迹完整预警时新增轨迹可以导致明细的缺失轨迹状态发生变化
This commit is contained in:
parent
7b31da7cd0
commit
e5956abbf7
@ -95,7 +95,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
|
|
||||||
// 查看缺失轨迹状态表达式是否有变化,如果有则更新
|
// 查看缺失轨迹状态表达式是否有变化,如果有则更新
|
||||||
var trackStatusIds = trackStatusIdDict.Keys.ToHashSet();
|
var trackStatusIds = trackStatusIdDict.Keys.ToHashSet();
|
||||||
var expression = BuildMissingTrackStatusIdExpression(ruleItem, trackStatusIds);
|
var expression = ruleItem.BuildMissingTrackStatusIdExpression(trackStatusIds);
|
||||||
if (!string.Equals(detail.MissingTrackStatusIds, expression))
|
if (!string.Equals(detail.MissingTrackStatusIds, expression))
|
||||||
{
|
{
|
||||||
detail.MissingTrackStatusIds = expression;
|
detail.MissingTrackStatusIds = expression;
|
||||||
@ -142,6 +142,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
// 3.以单的维度处理
|
// 3.以单的维度处理
|
||||||
// todo:优化流程减少N+1
|
// todo:优化流程减少N+1
|
||||||
var addDetails = new List<CompleteWarningDetailsIndex>();
|
var addDetails = new List<CompleteWarningDetailsIndex>();
|
||||||
|
var updateDetails = new List<CompleteWarningDetailsIndex>();
|
||||||
var closeDetailsIds = new HashSet<string>();
|
var closeDetailsIds = new HashSet<string>();
|
||||||
foreach (var order in orders)
|
foreach (var order in orders)
|
||||||
{
|
{
|
||||||
@ -169,9 +170,10 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (hitRuleItems.Count == 0 && doneRuleItemIds.Count == 0) return;
|
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
|
var warningDetails = await _warningDetailsEsRepository.GetCompleteWarningDetailsAsync(new GetCompleteWarningDetailsVO
|
||||||
{
|
{
|
||||||
OrderIds = new HashSet<int>(1)
|
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));
|
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
|
var needAddDetails = hitRuleItems
|
||||||
.Where(x => hitRuleItemIds.Contains(x.Id))
|
.Where(x => hitRuleItemIds.Contains(x.Id))
|
||||||
.Select(x => BuildCompleteWarningDetails(order, trackStatusIds, x, rule.Version));
|
.Select(x => BuildCompleteWarningDetails(order, trackStatusIds, x, rule.Version));
|
||||||
@ -202,6 +209,9 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
// 4.预警由于不缺失轨迹变为失效,修改明细状态为【已处理】,并关闭相关预警通知任务
|
// 4.预警由于不缺失轨迹变为失效,修改明细状态为【已处理】,并关闭相关预警通知任务
|
||||||
if (closeDetailsIds.Count > 0)
|
if (closeDetailsIds.Count > 0)
|
||||||
await CloseWarningDetailLinksAsync(closeDetailsIds, CompleteWarningStatus.已处理);
|
await CloseWarningDetailLinksAsync(closeDetailsIds, CompleteWarningStatus.已处理);
|
||||||
|
// 更新预警明细
|
||||||
|
if (updateDetails.Count > 0)
|
||||||
|
await _warningDetailsEsRepository.BulkUpdateCompleteWarningDetailsAsync(updateDetails);
|
||||||
|
|
||||||
if (addDetails.Count == 0) return;
|
if (addDetails.Count == 0) return;
|
||||||
|
|
||||||
@ -213,6 +223,26 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
await _warningTaskRepository.BulkInsertWarningNotifyTaskAsync(notifyTasks);
|
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)
|
private static CompleteWarningDetailsIndex BuildCompleteWarningDetails(OrderEntity order, HashSet<int> trackStatusIds, CompleteWarningRuleItemEntity ruleItem, string version)
|
||||||
{
|
{
|
||||||
return new CompleteWarningDetailsIndex()
|
return new CompleteWarningDetailsIndex()
|
||||||
@ -225,7 +255,7 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
// NotifyModes = ruleItem.NotifyModes,
|
// NotifyModes = ruleItem.NotifyModes,
|
||||||
NotifyUsers = ruleItem.NotifyUsers,
|
NotifyUsers = ruleItem.NotifyUsers,
|
||||||
CheckPointTrackStatusId = ruleItem.CheckPointTrackStatusId,
|
CheckPointTrackStatusId = ruleItem.CheckPointTrackStatusId,
|
||||||
MissingTrackStatusIds = BuildMissingTrackStatusIdExpression(ruleItem, trackStatusIds),
|
MissingTrackStatusIds = ruleItem.BuildMissingTrackStatusIdExpression(trackStatusIds),
|
||||||
|
|
||||||
SubSystemId = order.SubSystemId,
|
SubSystemId = order.SubSystemId,
|
||||||
CustomId = order.CustomId,
|
CustomId = order.CustomId,
|
||||||
@ -254,21 +284,6 @@ public sealed class CompleteWarningHandler : ICompleteWarningHandler, ITransient
|
|||||||
).ToList();
|
).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
|
#endregion
|
||||||
|
|
||||||
#region todo-test: 预警主体关闭
|
#region todo-test: 预警主体关闭
|
||||||
|
|||||||
@ -15,7 +15,7 @@ public sealed class CompleteWarningDetailsIndex : IdBaseIndex
|
|||||||
//public string NotifyModes { get; set; } //通知方式,多个方式(,)分割 eg: 1,2
|
//public string NotifyModes { get; set; } //通知方式,多个方式(,)分割 eg: 1,2
|
||||||
public string NotifyUsers { get; set; } //通知人Json eg: [{"UserId":1,"UserName":"张三"},{"UserId":2,"UserName":"李四"}]
|
public string NotifyUsers { get; set; } //通知人Json eg: [{"UserId":1,"UserName":"张三"},{"UserId":2,"UserName":"李四"}]
|
||||||
public int CheckPointTrackStatusId { get; set; } // (冗余)检查点轨迹状态Id
|
public int CheckPointTrackStatusId { get; set; } // (冗余)检查点轨迹状态Id
|
||||||
public string MissingTrackStatusIds { get; set; } //(冗余)缺失的轨迹状态
|
public string MissingTrackStatusIds { get; set; } //(冗余)缺失的轨迹状态表达式
|
||||||
|
|
||||||
//订单信息
|
//订单信息
|
||||||
public int SubSystemId { get; set; } //(冗余)子系统Id
|
public int SubSystemId { get; set; } //(冗余)子系统Id
|
||||||
|
|||||||
@ -101,4 +101,20 @@ public sealed class CompleteWarningRuleItemEntity : IFullAuditedBasicEntitys, IE
|
|||||||
|
|
||||||
return false;
|
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)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user