1, 流程资源文件下载
流程部署之后相关资源文件(bpmn 和
png)已经上传到数据库(act_ge_bytearray表)了,如果其他用户想要查看这些资源文件,可以从数据库中把资源文件下载到本地,其中所用的的查询表是act_re_procdef,字段RESOURCE_NAMED对应的是bpmn文件,
DGRM_RESOURCE_NAME对应的是png图片文件。
流程资源文件的下载,就是下载流程部署时流程定义的bpmn文件和bpmn的png文件。使用activiti的api来实现,实现时需要依赖commons-io的依赖。
/** * 流程资源文件下载 */ @Test public void resourceDownload() throws IOException { //获取processEngine引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取repositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); //通过获取流程定义和流程key查询流程 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("leave").singleResult(); //singleResult() // 获取流程部署ID String deploymentId = processDefinition.getDeploymentId(); // 获取流程图片对应的输入流 InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName()); // 获取流程文件的输入流 InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName()); File filePng = new File("e:/leave.png"); File fileBpmn = new File("e:/leave.bpmn"); FileOutputStream bpmnOut = new FileOutputStream(fileBpmn); FileOutputStream pngOut = new FileOutputStream(filePng); FileCopyUtils.copy(pngInput,pngOut); FileCopyUtils.copy(bpmnInput,bpmnOut); pngOut.close(); bpmnOut.close(); pngInput.close(); bpmnInput.close(); }
注意:保存下来的 png 图片不要使用系统默认名称,最好自己修改名称后再保存到本地进行流程部署,不然可能会导致流程部署后
act_re_procdef 表的DGRM_RESOURCE_NAME(图片名称) 字段为空
2, 流程历史信息查询
删除或执行完的流程定义依然保存在activiti的act_hi_*相关的表中,所以我们还是可以查询流程执行的历史信息,可以通过HistoryService来查看相关的历史记录。
/** * 流程历史信息查询 */ @Test public void selectHistory(){ //获取processEngine引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取historyService HistoryService historyService = processEngine.getHistoryService(); HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery(); // 根据InstanceId(对应PROC_INST_ID_字段)查询act_hi_actinst表 instanceQuery.processInstanceId("15001"); // 根据DefinitionId(对应PROC_DEF_ID_)查询act_hi_actinst表 //instanceQuery.processDefinitionId("evection:1:4"); // 排序-根据开始时间升序 instanceQuery.orderByHistoricActivityInstanceStartTime().asc(); // 查询所有内容 List<HistoricActivityInstance> activityInstanceList = instanceQuery.list(); for (HistoricActivityInstance hi : activityInstanceList) { System.out.println(hi.getActivityId()); System.out.println(hi.getActivityName()); System.out.println(hi.getProcessDefinitionId()); System.out.println(hi.getProcessInstanceId()); System.out.println("<==========================>"); } }
3, 流程删除
根据流程部署id删除这一次部署的所有流程定义,建议一次部署只部署一个流程,根据流程部署id删除一个流程的定义
约束:如果该流程定义没有启动流程实例可以删除,如果该流程定义以及启动流程实例,不允许删除,如果删除就抛出异常
/** * 流程删除 */ @Test public void processDelete() throws IOException { //获取processEngine引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //获取repositoryService RepositoryService repositoryService = processEngine.getRepositoryService(); //通过获取流程定义和流程key查询流程 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("leave").singleResult(); //singleResult() // 获取流程部署ID String deploymentId = processDefinition.getDeploymentId(); //删除部署好的流程时,如果该流程中有未完成的流程实例不能进行删除 repositoryService.deleteDeployment(deploymentId); //如果想强制删除流程时,需要设置为true //repositoryService.deleteDeployment(deploymentId,true); }
采用级联删除,不管流程定义是否启动了实例(是否使用),通过级联删除将该流程定义及相关的信息全部删除;但是一般情况下,不采用级联删除,而是采用对该流程进行暂停操作,特殊情况下需要删除流程定义及相关信息,就要使用级联删除,删除的功能给超级管理员用
//流程定义的删除 @Test public void deleteProcessDefinition(){ //得到repositoryService RepositoryService repositoryService = processEngine .getRepositoryService(); //根据流程定义id查询部署id String processDefinitionId = "purchasingflow:8:1204"; ProcessDefinition processDefinition = repositoryService .createProcessDefinitionQuery() .processDefinitionId(processDefinitionId) .singleResult(); //流程定义所属部署id String deploymentId = processDefinition.getDeploymentId(); //1.根据流程部署id删除这一次部署的所有流程定义 //建议一次部署只部署一个流程,根据流程部署id删除一个流程的定义 //约束:如果该流程定义没有启动流程实例可以删除,如果该流程定义以及启动流程实例,不允许删除,如果删除就抛出异常 repositoryService.deleteDeployment(deploymentId); //2.级联删除:不管该流程定义是否启动流程实例(是否使用),通过级联删除将该流程定义及相关的信息全部删除 //一般情况下不适用级联删除,一般情况下对流程定义执行暂停操作 //特殊情况下需要删除流程定义及相关的信息,就要使用级联删除,删除的功能给超级管理员使用 //repositoryService.deleteDeployment(deploymentId,true); }