使用Globa变量控制流程
需求
网络异常,图片无法展示
|
流程定义
首先使用流程设计器画一个流程,做全局测试的流程图
需要注意在不同的流程进行不同的uel表达式处理
网络异常,图片无法展示
|
创建流程变量
上面我们已经创建好了流程定义
接下来我们创建流程变量,基本属性如下
package com.itheima.demo.pojo; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * @program: Activiti01 * @description: 出差申请中的流程变量对象 * @author: 魏一鹤 * @createDate: 2022-07-22 23:27 **/ @Data // 如果不实现序列化就会报错 public class Evection implements Serializable { // 主键id private long id; // 出差天数 private Double num; // 出差单 private String evectionName; // 开始日期 private Date beginDate; // 结束日期 private Date endDate; // 目的地 private String destination; // 出差原因 private String reason; }
流程部署
/** * 流程部署 */ @Test public void testDeployment(){ // 1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 2、获取RepositoryServcie RepositoryService repositoryService = processEngine.getRepositoryService(); // 3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中 Deployment deploy = repositoryService.createDeployment() .name("出差申请流程-variables") .addClasspathResource("bpmn/evection-global.bpmn") .deploy(); // 4、输出部署信息 System.out.println("流程部署id="+deploy.getId()); System.out.println("流程部署名字="+deploy.getName()); }
启动流程部署
网络异常,图片无法展示
|
网络异常,图片无法展示
|
数据库里面也看到部署信息了,说明部署成功率
流程启动时设置变量
/** * 启动流程 的时候设置流程变量 * 设置流程变量num * 设置任务负责人 */ @Test public void testStartProcess(){ // 获取流程引擎 ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine(); // 获取RunTimeService RuntimeService runtimeService = defaultProcessEngine.getRuntimeService(); // 流程定义的key String key="myEvection2"; // 流程变量的map HashMap<String, Object> variables = new HashMap<>(); // 创建流程变量 Evection evection = new Evection(); // 设置出差日期 2天 evection.setNum(2d); // 把流程变量的pojo放入map variables.put("evection",evection); // 设定任务负责人 key要和uel表达式保持一致 variables.put("assignee0","李四"); variables.put("assignee1","王经理"); variables.put("assignee2","杨总经理"); variables.put("assignee3","张财务"); // 启动流程 runtimeService.startProcessInstanceByKey(key,variables); }
运行代码启动流程 在act_ru_variable表里面就可以看到流程的变量了 对应的42501都是他的变量
网络异常,图片无法展示
|
pojo的Serializable序列化接口
前面我们提到流程变量需要实现Serializable接口,那么我们如果不实现会怎么样
先把序列化注释掉
网络异常,图片无法展示
|
启动报错
org.activiti.engine.ActivitiException: couldn't find a variable type that is able to serialize Evection(id=0, num=2.0, evectionName=null, beginDate=null, endDate=null, destination=null, reason=null)
网络异常,图片无法展示
|
然后加回来再次启动
网络异常,图片无法展示
|
启动成功
网络异常,图片无法展示
|
再次验证了pojo必须实现序列化
测试正常(小于3)分支
测试流程变量出差天数小于三天的分支,完成个人任务
因为流程变量在第三部,所以我们需要先完成前两个,也就是运行两次方法,负责人分别是李四和王经理
/** * 完成个人任务 */ @Test public void completTask(){ // 获取流程引擎 ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine(); // 获取taskService TaskService taskService = defaultProcessEngine.getTaskService(); // 流程定于的key String key="myEvection2"; // 当前任务负责人 String assinge="李四"; // 查询李四下的让分无 Task task = taskService.createTaskQuery() .processDefinitionKey(key) .taskAssignee(assinge) .singleResult(); // 判断李四有没有任务 if(task!=null){ // 根据任务ID完成任务 taskService.complete(task.getId()); } }
王经理审批过之后,会到财务,因为我们的流程变量是2,符合逻辑
网络异常,图片无法展示
|
测试大于3的分支
因为前面代码我们都写好了,刚才测试的是正常分支,我们这次复制份代码测试流程变量为3天的分支
首先执行部署方法 在数据库看到了部署的流程
/** * 流程部署 */ @Test public void testDeployment(){ // 1、创建ProcessEngine ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 2、获取RepositoryServcie RepositoryService repositoryService = processEngine.getRepositoryService(); // 3、使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中 Deployment deploy = repositoryService.createDeployment() .name("出差申请流程-variables-day3") .addClasspathResource("bpmn/evection-global.bpmn") .deploy(); // 4、输出部署信息 System.out.println("流程部署id="+deploy.getId()); System.out.println("流程部署名字="+deploy.getName()); }
网络异常,图片无法展示
|
然后是启动流程,为了区分,我们把负责人后面都加了day3
/** * 启动流程 的时候设置流程变量 * 设置流程变量num * 设置任务负责人 */ @Test public void testStartProcess(){ // 获取流程引擎 ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine(); // 获取RunTimeService RuntimeService runtimeService = defaultProcessEngine.getRuntimeService(); // 流程定义的key String key="myEvection2"; // 流程变量的map HashMap<String, Object> variables = new HashMap<>(); // 创建流程变量 Evection evection = new Evection(); // 设置出差日期 3天 evection.setNum(3d); // 把流程变量的pojo放入map variables.put("evection",evection); // 设定任务负责人 key要和uel表达式保持一致 variables.put("assignee0","李四day3"); variables.put("assignee1","王经理day3"); variables.put("assignee2","杨总经理day3"); variables.put("assignee3","张财务day3"); // 启动流程 runtimeService.startProcessInstanceByKey(key,variables); }
网络异常,图片无法展示
|
然后完成前两个人的任务
/** * 完成个人任务 */ @Test public void completTask(){ // 获取流程引擎 ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine(); // 获取taskService TaskService taskService = defaultProcessEngine.getTaskService(); // 流程定于的key String key="myEvection2"; // 当前任务负责人 String assinge="李四day3"; // 查询李四下的让分无 Task task = taskService.createTaskQuery() .processDefinitionKey(key) .taskAssignee(assinge) .singleResult(); // 判断李四有没有任务 if(task!=null){ // 根据任务ID完成任务 taskService.complete(task.getId()); } }
然后查看数据库 当前的负责人是总经理而不是财务了,说明流程变量生效了
网络异常,图片无法展示
|
继续让总经理审批,下一步是财务
没有任何问题