MENU

[Ecology E9] [ 精华 ] 流程浏览按钮自定义参数自定义sql筛选

• 2024 年 12 月 26 日 • 阅读: 1091 • OA

在日常的泛微 E9 二次开发中,我们常常需要对表单中的流程浏览按钮做数据过滤以满足业务需求。泛微提供了一个非常强大的自定义参数 spellSqlWhere,可以通过它实现基于 SQL 的动态筛选功能。本文将详细介绍这一功能,并分享一个实用的解决方案。


先亮方案!注意:仅限流程浏览框

注意事项

建议配合datas查询的sql使用:api/ec/dev/table/getxml 拦截后解决方案,否则你的参数很容易无效~

在流程中,我们可以通过 WfForm.appendBrowserDataUrlParam API 方法扩展浏览按钮取数接口的参数值:

WfForm.appendBrowserDataUrlParam("field6541", {
    "spellSqlWhere": "and workflow_requestbase.currentnodeid = 202"
});

2024-12-26T06:12:49.png
上述代码的核心是利用 spellSqlWhere 参数直接向 SQL 查询中拼接条件,非常适合实现基于表单动态条件的数据过滤。


背景分析

关键代码解析

在研究过程中,发现了泛微的部分源码逻辑:

private String getFromSql(Map<String, Object> var1, List<String> var2) {
    String var3 = (String)var2.get(0);
    String var4 = (String)var2.get(1);
    StringBuilder var5 = new StringBuilder();
    var5.append(" where 1=1 ").append(Util.null2String(var1.get("spellSqlWhere")));
}

从这段代码可以得出以下几个重要信息:

  1. 拼接逻辑

    • spellSqlWhere 参数的值会被直接拼接到 SQL 查询的 WHERE 子句中。
    • Util.null2String(var1.get("spellSqlWhere")) 的作用是将传入的 spellSqlWhere 参数安全地拼接到 WHERE 子句中,避免空值引发异常。
  2. 来源

    • var1 是请求的参数 Map。
    • 浏览按钮通过请求参数 spellSqlWhere 动态传入 SQL 条件。
  3. 动态扩展

    • 通过向参数中添加 spellSqlWhere,可以为浏览按钮注入自定义 SQL 条件,从而动态控制浏览按钮的数据展示。

功能要点

spellSqlWhere 的核心功能是基于 SQL 的动态筛选。通过将表单上的条件转换为 SQL 语句拼接到查询中,开发者可以快速实现复杂的过滤需求。

使用场景

  1. 按流程节点过滤
    在工作流中,不同节点需要查看不同的数据。例如,当前节点只允许看到与当前流程状态相关的数据。
  2. 基于表单字段动态过滤
    根据用户在表单中填写的值,实时调整浏览按钮的数据范围。
  3. 复杂条件查询
    对接外部系统或处理复杂的业务逻辑时,通过自定义 SQL 条件过滤数据。

实现步骤

1. 定义浏览按钮并关联字段

在 E9 中设计表单,添加一个浏览按钮,并绑定一个字段(如 field6541)。

2. 使用 WfForm.appendBrowserDataUrlParam 扩展参数

在工作流节点脚本中,使用 WfForm.appendBrowserDataUrlParam 方法向浏览按钮添加 spellSqlWhere 参数。例如:

WfForm.appendBrowserDataUrlParam("field6541", {
    "spellSqlWhere": "and workflow_requestbase.currentnodeid = 202"
});

3. 动态构建 SQL 条件

根据业务需要,可以动态拼接不同的 SQL 条件。例如,基于表单字段值动态筛选:

var condition = "and workflow_requestbase.requestid = " + WfForm.getFieldValue("field1234");
WfForm.appendBrowserDataUrlParam("field6541", {
    "spellSqlWhere": condition
});

4. 测试并验证

通过实际操作表单,测试浏览按钮的数据是否按预期过滤。例如:

  • 当前节点是否只显示与当前节点 ID 匹配的数据。
  • 表单字段值是否正确过滤浏览数据。

实际案例

场景描述

在一个审批流程中,需要在表单中添加一个浏览按钮,过滤出当前流程节点中未审批的流程请求。

解决方案

  1. 表单中添加浏览按钮,绑定字段 field6541
  2. 在节点脚本中添加以下代码:
WfForm.appendBrowserDataUrlParam("field6541", {
    "spellSqlWhere": "and workflow_requestbase.currentnodeid = " + WfForm.getFieldValue("currentNodeId") + 
                     " and workflow_requestbase.requeststatus = 0"
});
  1. 动态拼接 SQL 条件:

    • currentnodeid:当前节点 ID。
    • requeststatus = 0:未审批状态。

结果

浏览按钮只显示符合当前节点且未审批的请求数据,大大提高了用户体验和操作效率。


总结

spellSqlWhere 是一个非常灵活的自定义浏览按钮参数,开发者可以利用它轻松实现复杂的动态 SQL 筛选需求。通过 WfForm.appendBrowserDataUrlParam 方法,可以为浏览按钮动态注入 SQL 条件,适用于各种复杂业务场景。

优点:

  • 灵活性高:基于 SQL 动态拼接,几乎没有筛选限制。
  • 易于实现:通过简单的 API 调用即可完成。

通过合理利用 spellSqlWhere,我们可以显著增强泛微 E9 的浏览按钮功能,让表单更加智能和高效!

添加新评论

已有 13 条评论
  1. wintsa wintsa

    等等,我可以这样写吗@(吐舌)
    比如我的浏览框是uf_abc的表单,但是我流程直接添加WfForm.appendBrowserDataUrlParam("field6541", {

    "spellSqlWhere": "and exists (select * from xxxxxxx)"

    });
    这样好像就不需要在新建浏览框那先设定一个where了?

    1. wanzizi wanzizi

      @wintsa不行滴这个只支持流程选择框

    2. @wintsa我查看了建模浏览框代码,里面没有固定这个参数,只有在流程浏览框里才可以使用这个参数

    3. wintsa wintsa

      @丸子不是呀,我的是流程里面的浏览框,只不过单选浏览是引用的模块的表单

  2. 华梅轩煜 华梅轩煜

    其他浏览框可以吗,比如岗位选择

    1. @华梅轩煜这个就需要看一下源码了,通常来讲不一定可以,暂时只有流程可以这么做

    2. xx xx

      @丸子这个源码是看的哪部分@(乖)

    3. @xx哪个,本文章的代码在BrowserAction.class 如果你问得岗位选择的话,那我还真没注意过,如果你会的话,可以开远程调试打断点看下

    4. xx xx

      @丸子现在我是有个请假类型的浏览框 拉的是考勤里面的假期类型,想根据流程里某个字段的值对浏览框的选项进行筛选,用这个可以实现么,或者咋实现,我看那个前端接口api文档里面好像没有能实现的

    5. @xx费点劲,实现起来比较麻烦,不过你可以把请假类型改为下拉框,自定义值对应好请假类型浏览框即可
      WfForm.controlSelectOption来控制下拉框,这样似乎实现起来好一些

    6. xx xx

      @丸子好的,感谢感谢@(乖)

  3. cwx cwx

    丸子大佬,想问问你,集成中心-数据展现集成中,做一个浏览按钮,数据来源选择自定义地址,这个地址会返回XML格式的body数据, 这样会形成一个浏览框,然后把某个字段设置为查询字段/查询字段默认显示, 在流程框中,根据条件去筛选数据,这时候的条件查询会区分大小写, 那么如何才能实现不区分大小写筛选呢?

    1. @cwx哦豁,这个我还真没使用过,你可以看看条件会不会传给你的自定义地址,如果传给了自定义地址重新获取的数据,那肯定就是自定义地址源的问题。暂时没看到组件有这个配置项