工作流路由触发器是节点之间跳转时处理业务数据的重要接口,一共分两种:1,执行 sql 代码;2,执行 java 代码。同时 sql 又分成 sql 代码检查业务和 sql 执行动作。java 组件同样也同时担负检查和执行业务代 码的双重职责。
sql 代码检查业务负责检查 A 节点是否可以跳转到 B 节点,若业务不允许跳转,则返回一个描述问题的字 符串;若允许跳转,则返回一个空字符串。
例如:销售订单提交到库房发货时,款到发货类型的订单,未收款,款项为 0 元,则不能被提交到库房。 理由是还没有收款。那么,SQL 代码检查业务组件就可以返回“该笔业务未收到款项”的消息。从而不能被提交。
校验业务的时机又分成两种:1,执行动作之前,检查业务;2,执行动作之后,检查业务;
动作执行之前该笔业务数据还没有入库,因此不能获得该笔业务的 数据,但是可以获得尽可能早的触发时机。而动作执行之后,则可以获得该笔业务以及该笔业务所关联的该流 程实例任务、一并计算获得事后的校验结果。
校验的 sql 语句可以有很多条。任意一条 sql 返回字符串表示路由跳转失败。而 sql 的执行顺序则是按照 order 字段从小到大的顺序一次执行。
关于占位符:校验 sql 语句中可以通过占位符的方式获取系统当前的业务数据,以下是 sql 业务检查组件表中字段 sql 值的占位符以及含义:
序 号 | 关于流程节点路由检查表:windowdb.wf_def_node_route_checkscript.sql 字段中占位符的说明 | |
占位符 | 说明 | |
1 | ${my.id} | 当前登录人 id,关联 windowdb.person.id |
2 | ${routeId} | 路由 ID,关联 windowdb.wf_def_node_route.id |
3 | ${ins_id} | 流程实例 ID,关联 windowdb.wf_ins.id |
4 | ${task_insert_time} | 该任务的创建时间,获取 windowdb.wf_ins_task.insert_time |
5 | ${wf_def_id} | 流程定义 ID,关联 windowdb.wf_def.id |
6 | ${from_node_index} | 来源节点的 index,关联 windowdb.wf_def_node.index |
7 | ${from_node_timeliness} | 来源节点的受理时限,关联 windowdb.wf_def_node.timeliness |
8 | ${from_node_type} | 来源节点的类型,关联 windowdb.wf_def_node.node_type |
9 | ${from_node_id} | 来源节点的 ID,关联 windowdb.wf_def_node.id |
10 | ${to_node_index} | 目标节点的 index,关联 windowdb.wf_def_node.index |
11 | ${to_node_type} | 目标节点的类型,关联 windowdb.wf_def_node.node_type |
12 | ${to_node_id} | 目标节点的 ID,关联 windowdb.wf_def_node.id |
表 43
以下是 sql 业务检查组件表(windowdb.wf_def_node_route_checkscript)的字段说明:
序 号 | 流程节点路由表:windowdb.wf_def_node_route_checkscript 字段说明 | |
占位符 | 说明 | |
1 | id | 主键 |
2 | rid | 路由 ID,关联 windowdb.wf_def_node_route.id |
3 | order | SQL 语句执行顺序 |
4 | sql | 待执行的 SQL 语句 |
5 | b_a | before or after ? 0,动作执行前执行检查;1,动作执行后执行检查; |
表 44
sql 代码检查执行业务组件负责检查 A 节点跳转到 B 节点的事后,执行批量 SQL 语句,用于处理具体的 业务表数据。
例如:费用报销财务审批通过时,执行一条 sql 向通知表中写入一行通知信息,通知当事人来财务部门领 款。
关于占位符:执行的 sql 语句中可以通过占位符的方式获取系统当前的业务数据,占位符如表 43a>所示。
以下是 sql 业务执行组件表(windowdb.wf_def_node_route_actionscript)的字段说明:
序 号 | 流程节点路由表:windowdb.wf_def_node_route_actionscript 字段说明 | |
字段名 | 说明 | |
1 | id | 主键 |
2 | rid | 路由 ID,关联 windowdb.wf_def_node_route.id |
3 | order | SQL 语句执行顺序 |
4 | sql | 待执行的 SQL 语句 |
5 | requrnkey | sql 返回值;0,无返回值;1,insert 语句返回主键 id;2,select 语句返回字符串 |
表 45
编写一新的 java 类编译并加载用于处理流程动作扭转发生时的业务。目前已经不建议使用该方法,尽可 能参考本章 9.2 节使用 sql 语句的方式来处理。但是,如果修改数据库中的业务数据已经不能解决问题。例如: 需要调用接口发邮件,调用接口发短信,或者需要调用其它第三方服务、又或者需要调用操作系统底层服务的, 可以考虑阅读本节内容,使用 java 扩展类来处理业务。 代码示例如下所示:
package cn.net.workflow.workflow.route;
import java.util.Map;
import com.windowdb.wms.dao.WfInsTaskDao;
public class RouteManualId{路由ID} extends com.windowdb.wms.service.sup.RouteManual{
@Override
public void go(WfInsTaskDao dao , Object billId, Map<String,Object> wfInfo ) throws Exception{
// FIXME 请此处编写代码处理业务逻辑,可以执行发送短信、邮件以及调用第三方接口或消息。
// dao 提供数据库操作服务。
// billId 单据编号
// wfInfo 流程对象
// 注意类名必须以“RouteManualId”作为前缀,后面紧跟一个数字,数字必须是路由ID,执行该路由跳转时才会被调用。
}
}
注意事项请参考上述代码中的注释内容。