在日常的泛微 E9 二次开发中,我们常常需要对表单中的流程浏览按钮做数据过滤以满足业务需求。泛微提供了一个非常强大的自定义参数 spellSqlWhere,可以通过它实现基于 SQL 的动态筛选功能。本文将详细介绍这一功能,并分享一个实用的解决方案。
先亮方案!注意:仅限流程浏览框
⚠️ 注意事项
建议配合datas查询的sql使用:api/ec/dev/table/getxml 拦截后解决方案,否则你的参数很容易无效~
在流程中,我们可以通过 WfForm.appendBrowserDataUrlParam API 方法扩展浏览按钮取数接口的参数值:
WfForm.appendBrowserDataUrlParam("field6541", { "spellSqlWhere": "and workflow_requestbase.currentnodeid = 202"});
上述代码的核心是利用 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")));}从这段代码可以得出以下几个重要信息:
- 拼接逻辑 :
spellSqlWhere参数的值会被直接拼接到 SQL 查询的WHERE子句中。Util.null2String(var1.get("spellSqlWhere"))的作用是将传入的spellSqlWhere参数安全地拼接到WHERE子句中,避免空值引发异常。
- 来源 :
var1是请求的参数 Map。- 浏览按钮通过请求参数
spellSqlWhere动态传入 SQL 条件。
- 动态扩展 :
- 通过向参数中添加
spellSqlWhere,可以为浏览按钮注入自定义 SQL 条件,从而动态控制浏览按钮的数据展示。
- 通过向参数中添加
功能要点
spellSqlWhere 的核心功能是基于 SQL 的动态筛选。通过将表单上的条件转换为 SQL 语句拼接到查询中,开发者可以快速实现复杂的过滤需求。
使用场景
- 按流程节点过滤 : 在工作流中,不同节点需要查看不同的数据。例如,当前节点只允许看到与当前流程状态相关的数据。
- 基于表单字段动态过滤 : 根据用户在表单中填写的值,实时调整浏览按钮的数据范围。
- 复杂条件查询 : 对接外部系统或处理复杂的业务逻辑时,通过自定义 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 匹配的数据。
- 表单字段值是否正确过滤浏览数据。
实际案例
场景描述
在一个审批流程中,需要在表单中添加一个浏览按钮,过滤出当前流程节点中未审批的流程请求。
解决方案
- 表单中添加浏览按钮,绑定字段
field6541。 - 在节点脚本中添加以下代码:
WfForm.appendBrowserDataUrlParam("field6541", { "spellSqlWhere": "and workflow_requestbase.currentnodeid = " + WfForm.getFieldValue("currentNodeId") + " and workflow_requestbase.requeststatus = 0"});- 动态拼接 SQL 条件:
currentnodeid:当前节点 ID。requeststatus = 0:未审批状态。
结果
浏览按钮只显示符合当前节点且未审批的请求数据,大大提高了用户体验和操作效率。
总结
spellSqlWhere 是一个非常灵活的自定义浏览按钮参数,开发者可以利用它轻松实现复杂的动态 SQL 筛选需求。通过 WfForm.appendBrowserDataUrlParam 方法,可以为浏览按钮动态注入 SQL 条件,适用于各种复杂业务场景。
优点:
- 灵活性高:基于 SQL 动态拼接,几乎没有筛选限制。
- 易于实现:通过简单的 API 调用即可完成。
通过合理利用 spellSqlWhere,我们可以显著增强泛微 E9 的浏览按钮功能,让表单更加智能和高效!