本文共 3338 字,大约阅读时间需要 11 分钟。
流程图如下:
问题:填写请假单后,如果请假天数大于3天则经理审批,如果小于3天则主管即可审批。填写请假信息后,下一步节点该如何走,可以通过decision分支节点决定
而decision决策分支节点有两种方式,一种是配置expr表达式方式是,一种是指定Handler类即指定一个java类进行处理。
方式1:通过expr表达式方式
注:表达式的结果不是true或false,而是下一个输出节点的name,如上图的to 主管审批或to 经理审批
配置方式如下:
1.1、发布流程定义
package com.cn.test;import com.cn.util.JbpmUtil;/** * 发布流程定义 * 流程定义processDefinition,流程定义是规则,规则就是没有数据的描述 * * */public class DeployProcessDefinition { public static void main(String[] args) { //发布流程定义 JbpmUtil.delopy("jpdl/qingJia2.jpdl.xml"); }}1.2、启动流程实例
package com.cn.test;import org.jbpm.api.ExecutionService;import com.cn.util.JbpmUtil;/** * 启动流程实例以及流程流转 * */public class startProcessInstance2 { public static void main(String[] args) { ExecutionService executionService=JbpmUtil.getExecutionService(); //1.启动流程实例 executionService.startProcessInstanceById("qingJia2-2"); }}此时流程节点处于:填写请假单节点
1.3、传递流程变量,供决策分支节点decision进行判断
package com.cn.test;import java.util.HashMap;import java.util.Map;import org.jbpm.api.ExecutionService;import com.cn.util.JbpmUtil;/** * 启动流程实例以及流程流转 * */public class startProcessInstance2 { public static void main(String[] args) { ExecutionService executionService=JbpmUtil.getExecutionService(); //1.启动流程实例 //executionService.startProcessInstanceById("qingJia2-2"); Mapmap=new HashMap (); map.put("days", 5); //2.流程流转到decision节点 executionService.signalExecutionById("qingJia2.120001", map); }}
此时,根据decision的expr:#{days>5?'to 经理审批':'to 主管审批'}即传递的流程局部变量days大于5天,则走经理审批,小于等于5天,则走主管审批节点。
查看数据库表结果,显示
方式2:通过decision的handler方式:
上面是通过decision的expr方式,那么如果是下面的这个流程图呢,用三元运算符怎么写,太复杂了,所有实际开发中大多采用handler方式进行。
1、在src下新建包com.cn.handler,并创建类MyHandler,代码如下:
package com.cn.handler;import org.jbpm.api.jpdl.DecisionHandler;import org.jbpm.api.model.OpenExecution;public class MyHandler implements DecisionHandler{ /** * */ private static final long serialVersionUID = 2921491957122619758L; /** * 返回值:当前输出路径的名称 * execution参数:当前正在执行的流程实例 * */ @Override public String decide(OpenExecution execution) { Integer score=(Integer) execution.getVariable("score"); if(score>=90){ return "to 优秀"; }else if(score<90 && score>=70){ return "to 中等"; }else if(score<70 && score>=60){ return "to 及格"; }else{ return "to 不及格"; } }} 2、在流程图decision节点配置Handler,如下图: 3、发布流程定义 package com.cn.test;import com.cn.util.JbpmUtil;/** * 发布流程定义 * 流程定义processDefinition,流程定义是规则,规则就是没有数据的描述 * * */public class DeployProcessDefinition { public static void main(String[] args) { //发布流程定义 JbpmUtil.delopy("jpdl/kaoshi.jpdl.xml"); }} 4、启动流程实例,进行考试 package com.cn.test;import com.cn.util.JbpmUtil;/** * 发布流程定义 * 流程定义processDefinition,流程定义是规则,规则就是没有数据的描述 * * */public class DeployProcessDefinition { public static void main(String[] args) { //发布流程定义 JbpmUtil.delopy("jpdl/kaoshi.jpdl.xml"); }} 会在jbpm4_execution中产生一条数据 5、传递流程局部变量 package com.cn.test;import java.util.HashMap;import java.util.Map;import org.jbpm.api.ExecutionService;import com.cn.util.JbpmUtil;/** * 启动流程实例以及流程流转 * */public class startProcessInstance2 { public static void main(String[] args) { ExecutionService executionService=JbpmUtil.getExecutionService(); //1.启动流程实例 //executionService.startProcessInstanceById("kaoshi-1"); Mapmap=new HashMap (); map.put("score", 85); executionService.signalExecutionById("kaoshi.150001", map); }} 运行完后,85分会进入中等,查看数据库表如下: