1.4 流程任务处理
任务负责人查询出来了待办的人,选择任务进行处理,完成任务
/** * 流程任务的处理 */ @Test public void test07(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); TaskService taskService = engine.getTaskService(); Task task = taskService.createTaskQuery() .processDefinitionKey("evection") .taskAssignee("zhansan") .singleResult(); // 完成任务 taskService.complete(task.getId()); } 复制代码
zhangsan处理了这个操作后,流程就流转到了 lisi处
然后就是不同的用户登录,然后查询任务处理任务,直到任务流程走完。
1.5 流程定义的查询
查询流程相关的信息,包括流程的定义,流程的部署,流程定义的版本
/** * 查询流程的定义 */ @Test public void test08(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = engine.getRepositoryService(); // 获取一个 ProcessDefinitionQuery对象 用来查询操作 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey("evection") .orderByProcessDefinitionVersion() // 安装版本排序 .desc() // 倒序 .list(); // 输出流程定义的信息 for (ProcessDefinition processDefinition : list) { System.out.println("流程定义的ID:" + processDefinition.getId()); System.out.println("流程定义的name:" + processDefinition.getName()); System.out.println("流程定义的key:" + processDefinition.getKey()); System.out.println("流程定义的version:" + processDefinition.getVersion()); System.out.println("流程部署的id:" + processDefinition.getDeploymentId()); } } 复制代码
输出结果
流程定义的ID:evection:1:12504 流程定义的name:出差申请单 流程定义的key:evection 流程定义的version:1 流程部署的id:12501 复制代码
1.6 流程的删除
/** * 删除流程 */ @Test public void test09(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = engine.getRepositoryService(); // 删除流程定义,如果该流程定义已经有了流程实例启动则删除时报错 repositoryService.deleteDeployment("12501"); // 设置为TRUE 级联删除流程定义,及时流程有实例启动,也可以删除,设置为false 非级联删除操作。 //repositoryService.deleteDeployment("12501",true); } 复制代码
注意:项目开发中级联删除操作的权限一般只开发给超级管理员使用。
1.7 流程资源的下载
现在我们的流程资源文件已经上传到了数据库中,如果其他用户想要查看这些资源,可以从数据库中把这些资源下载到本地。
解决方案:
- jdbc对blob类型处理clob类型数据读取出来就可以了。
- 使用activiti的api来实现操作。
使用activiti的api来操作我们需要添加commons-io的依赖
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> 复制代码
实现代码
/** * 读取数据库中的资源文件 */ @Test public void test10() throws Exception{ // 1.得到ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RepositoryService对象 RepositoryService repositoryService = engine.getRepositoryService(); // 3.得到查询器 ProcessDefinition definition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("evection") .singleResult(); // 4.获取流程部署的id String deploymentId = definition.getDeploymentId(); // 5.通过repositoryService对象的相关方法 来获取图片信息和bpmn信息 // png图片 InputStream pngInput = repositoryService .getResourceAsStream(deploymentId, definition.getDiagramResourceName()); // bpmn 文件的流 InputStream bpmnInput = repositoryService .getResourceAsStream(deploymentId, definition.getResourceName()); // 6.文件的保存 File filePng = new File("d:/evection.png"); File fileBpmn = new File("d:/evection.bpmn"); OutputStream pngOut = new FileOutputStream(filePng); OutputStream bpmnOut = new FileOutputStream(fileBpmn); IOUtils.copy(pngInput,pngOut); IOUtils.copy(bpmnInput,bpmnOut); pngInput.close(); pngOut.close(); bpmnInput.close(); bpmnOut.close(); } 复制代码
1.8 流程历史信息查看
即使流程定义已经被删除了,流程执行的实例信息通过前面的分析,依然保存在Activiti的act_hi_* 的相关表结构中,所以我们还是可以查询流程的执行的历史信息,可以通过HistoryService来查看
/** * 流程历史信息查看 */ @Test public void test11(){ ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 查看历史信息我们需要通过 HistoryService来实现 HistoryService historyService = engine.getHistoryService(); // 获取 actinst 表的查询对象 HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery(); instanceQuery.processDefinitionId("evection:1:12504"); instanceQuery.orderByHistoricActivityInstanceStartTime().desc(); List<HistoricActivityInstance> list = instanceQuery.list(); // 输出查询的结果 for (HistoricActivityInstance hi : list) { System.out.println(hi.getActivityId()); System.out.println(hi.getActivityName()); System.out.println(hi.getActivityType()); System.out.println(hi.getAssignee()); System.out.println(hi.getProcessDefinitionId()); System.out.println(hi.getProcessInstanceId()); System.out.println("-----------------------"); } } 复制代码
输出结果
usertask3 总经理审批 userTask wangwu evection:1:12504 15001 ----------------------- usertask2 经理审批 userTask lisi evection:1:12504 15001 ----------------------- usertask1 创建请假单 userTask zhansan evection:1:12504 15001 ----------------------- startevent1 Start startEvent null evection:1:12504 15001 -----------------------