CoolGuard事件查询增加策略和规则筛选,条件结果展示

策略规则筛选

效果展示

首先需要一个级联选择器,依次是应用-策略集-策略-规则,当然如果后期增加了租户或部门的概念可以再加。

结合事件筛选后

其他相关的也都带上了这个条件

选择应用-策略集-策略-规则查询

如下只有一条数据满足此条件。

规则命中排序

其实增加了策略和规则筛选的主要目的是为了事件分析,特别是规则命中的分析,但还有一些不确定的内容,所以还无法展开聊。

目前还没做好,只是将规则code和version聚合计数排序,后面还需要再完善,如补充其他规则信息,扩展排序之外的更有价值的分析等。

json 复制代码
[
  {
    "code": "33a5b1ad71864121b6990f1d34bce39e",
    "count": 77,
    "version": 4
  },
  {
    "code": "4d3527f1096541e8b7fe5367603a4ea4",
    "count": 36,
    "version": 4
  },
  {
    "code": "664f30f443874698979674ee2c67474a",
    "count": 2,
    "version": 2
  },
  {
    "code": "974a5d51c36747038f97f08321a3d043",
    "count": 47,
    "version": 4
  }
]

条件结果展示

效果展示

如上事件结果的规则增加了条件结果展示

展示也是嵌套的,如果叶子节点满足则是绿色,如果不满足则是红色,如果因为条件短路表示跳过是橘色,条件组会依据组合的"与或"关系展示对应的按钮颜色。

下面是测试的,其中还有问题,就是第一个和最后一个高度不确定时会超出部分,不是很美观,暂时未解决。

另外在结合事件结果展示也比较丑,整体设计上还需要优化一下。

大概实现

后端数据准备

条件新增结果字段

分别对应true/false/skipped

条件运行并设置结果如下

java 复制代码
public boolean cond(Cond cond, FieldContext fieldContext, IndicatorContext indicatorContext) {
    log.info("条件:{}", cond);
    if (cond == null) {
        return true;
    }
    // 如果有子节点,则递归计算子节点的结果
    if (CollUtil.isNotEmpty(cond.getChildren())) {
        List<Cond> children = cond.getChildren();
        boolean finalResult;
        switch (cond.getRelation().toUpperCase()) {
            case "AND" -> {
                finalResult = true;
                for (int i = 0; i < children.size(); i++) {
                    Cond child = children.get(i);
                    // 递归计算子条件结果
                    boolean childResult = cond(child, fieldContext, indicatorContext);

                    if (!childResult) {
                        // 发现第一个 FALSE,触发短路
                        finalResult = false;
                        child.setResult(CondResult.FALSE);

                        // 标记后续所有兄弟节点为 SKIPPED
                        for (int j = i + 1; j < children.size(); j++) {
                            children.get(j).setResult(CondResult.SKIPPED);
                        }
                        break; // 退出外层 for 循环 (短路)
                    } else {
                        // 子条件为 TRUE,标记结果并继续
                        child.setResult(CondResult.TRUE);
                    }
                }
            }
            case "OR" -> {
                finalResult = false;
                for (int i = 0; i < children.size(); i++) {
                    Cond child = children.get(i);
                    // 递归计算子条件结果
                    boolean childResult = cond(child, fieldContext, indicatorContext);

                    if (childResult) {
                        // 发现第一个 TRUE,触发短路
                        finalResult = true;
                        child.setResult(CondResult.TRUE);

                        // 标记后续所有兄弟节点为 SKIPPED
                        for (int j = i + 1; j < children.size(); j++) {
                            children.get(j).setResult(CondResult.SKIPPED);
                        }
                        break; // 退出外层 for 循环 (短路)
                    } else {
                        // 子条件为 FALSE,标记结果并继续
                        child.setResult(CondResult.FALSE);
                    }
                }
            }
            default -> throw new IllegalArgumentException("Unsupported relation: " + cond.getRelation());
        }
        // 注入父节点的聚合结果
        cond.setResult(finalResult ? CondResult.TRUE : CondResult.FALSE);
        return finalResult;
    }

    // 处理叶子节点
    boolean leafResult = condLeaf(cond, fieldContext, indicatorContext);
    cond.setResult(leafResult ? CondResult.TRUE : CondResult.FALSE);
    return leafResult;
}

这样条件结果展示需要的数据就具备了

前端组件调整

从父组件到每个单项条件组件增加showResult,根据传入值决定是否是条件结果展示模式。

当然下面还有如:条件层级(与或条件组层级)、不可编辑、条件模式(规则模式:可以设置指标,针对规则条件配置;指标模式:不可设置指标,针对指标条件配置),都是之前已经有的了。

另外前端也加上结果字段,同时表单校验规则修改一下,允许result为空。

同时组件调整一下,判断是否要展示结果,展示结果时使用特定的样式。

最后

最后补充一下,因为我本地测试和演示环境使用的是同一套es,所以在演示环境看到的有些事件数据关联的规则或策略是找不到,这些只在我本地存储。

相关推荐
这是个栗子1 小时前
【Vue代码分析】前端动态路由传参与可选参数标记:实现“添加/查看”模式的灵活路由配置
前端·javascript·vue.js
刘一说2 小时前
Vue 动态路由参数丢失问题详解:为什么 `:id` 拿不到值?
前端·javascript·vue.js
熊猫钓鱼>_>2 小时前
动态网站发布部署核心问题详解
前端·nginx·容器化·网页开发·云服务器·静态部署
方也_arkling2 小时前
elementPlus按需导入配置
前端·javascript·vue.js
好好研究2 小时前
Spring Boot - Thymeleaf模板引擎
java·spring boot·后端·thymeleaf
爬山算法2 小时前
Hibernate(76)如何在混合持久化环境中使用Hibernate?
java·后端·hibernate
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest
她说..2 小时前
策略模式+工厂模式实现单接口适配多审核节点
java·spring boot·后端·spring·简单工厂模式·策略模式
沛沛老爹2 小时前
Web开发者转型AI:多模态Agent视频分析技能开发实战
前端·人工智能·音视频
csdn_aspnet2 小时前
ASP.NET 8 - Cookie 身份验证
后端·asp.net·cookie·.net8