挂起就是流程虽然已经发起了,但是无法进行下面的审批
激活就是流程被激活了,才能继续往下进行,和挂起是反义词
1代表激活 2代表挂起
网络异常,图片无法展示
|
代码实现流程定义的挂起和激活
上面已经介绍了挂起和激活,下面我们就用代码实现
注意:挂起和激活往往是大部分情况下针对全部的实例,总不能同一个流程把你的挂起,他的不挂起,多个人的流程都要被挂起
其实就是修改状态 1代表激活 2代表挂起
全部流程实例的挂起和激活
也就是根据id去批量处理,修改多个数据的挂起状态,代码如下
// 全部流程实例的挂起和激活 @Test public void suspendAllProcessInstance(){ // 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取service RepositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); // 查询流程定义信息 获取流程定义查询对象 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("myEvection") .singleResult(); // 获取当前流程定义的实例是否都是挂起的状态 boolean suspended = processDefinition.isSuspended(); // 获取流程定义的id String processDefinitionId = processDefinition.getId(); // 如果是挂起状态,那么改为激活状态 if(suspended){ //如果挂起,执行激活操作,参数1:流程定义ID,参数2:流程是否激活,参数3:激活时间(暂时不传) repositoryService.activateProcessDefinitionById(processDefinitionId,true,null); System.out.println("流程定义ID:"+processDefinitionId+"已激活"); }else{ // 如果是激活状态,那么改为挂起状态 参数1:流程定义ID,参数2:流程是否挂起,参数3:挂起时间(暂时不传) repositoryService.suspendProcessDefinitionById(processDefinitionId,true,null); System.out.println("流程定义ID:"+processDefinitionId+"已挂起"); } }
首先第一次执行,一开始是激活的,所以会执行挂起操作
网络异常,图片无法展示
|
数据库act_ru_task表的挂起状态为2,也就是挂起了
网络异常,图片无法展示
|
然后第二次执行,刚才已经被挂起了,所以会执行激活操作
网络异常,图片无法展示
|
再次观察数据库act_ru_task表的挂起状态为1,也就是激活了
网络异常,图片无法展示
|
单个流程实例的挂起和激活
这个业务就好比张三的出差流程需要被挂起,但是李四的不需要,这个时候就需要进行单个的处理了
这个时候就不能使用流程定义的id操作了,要用流程实例的id去操作,根据一个流程对应一个实例,单个流程共享一个流程定义的id
// 挂起或者挂起单个流程实例 @Test public void suspendSingleProcessInstance(){ // 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 获取service RuntimeService RuntimeService runtimeService = processEngine.getRuntimeService(); // 通过RuntimeService获取流程实例对象 ProcessInstance instance = runtimeService.createProcessInstanceQuery() .processInstanceId("17501") .singleResult(); // 得到当前流程实例的状态 true=挂起 false=激活 boolean suspended = instance.isSuspended(); // 获取流程实例的id String instanceId= instance.getId(); // 判断是否挂起,如果挂起就执行激活 // 判断是否激活,如果挂起就执行挂起 if(suspended){ //如果挂起,执行激活操作 runtimeService.activateProcessInstanceById(instanceId); System.out.println("流程定义ID:"+instanceId+"已激活"); }else{ // 如果是激活状态,那么改为挂起状态 runtimeService.suspendProcessInstanceById(instanceId); System.out.println("流程定义ID:"+instanceId+"已挂起"); } }
开始执行 当前是激活的,所以会做挂起操作 当前数据库的挂起状态为1,也就是挂起
网络异常,图片无法展示
|
再次执行 因为是当前是挂起状态 所以执行激活操作 当前数据库的挂起状态为2,也就是激活
网络异常,图片无法展示
|
流程实例挂起后的流程执行测试
测试目前挂起的流程是否能够被审批,目前轮到zhangsan了
网络异常,图片无法展示
|
审批代码如下
// 根据任务id完成个人任务 @Test public void completTask() { // 1 获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); // 2 获取service TaskService taskService = processEngine.getTaskService(); // 3 获取zhangsan在myEvection中对应的任务 我们已知只有一个任务 可使用singleResult获取一个结果集 Task task = taskService.createTaskQuery() .processInstanceId("17501") // 流程的key .taskAssignee("zhangsan") // 要查询的负责人 .singleResult();// 因为可能有多个待办 所以是一个集合 System.out.println("流程实例ID:"+task.getProcessInstanceId()); System.out.println("任务ID:"+task.getId()); System.out.println("任务负责人:"+task.getAssignee()); System.out.println("任务名称:"+task.getName()); // 4 根据任务的id完成任务 taskService.complete(task.getId()); }
执行代码测试报错 提示,不能完成被挂起的任务,很明显被挂起的任务是不能被执行的
网络异常,图片无法展示
|
然后我们执行方法,让这个流程实例变成激活状态
网络异常,图片无法展示
|
再次执行审批代码 没有问题执行成功了
网络异常,图片无法展示
|
数据库里面下一个审批人和挂起状态都改变了
网络异常,图片无法展示
|