基于 Activiti 6.0
獲取流程定義圖片:1.流程定義;2.任務(wù)實(shí)例
1. 獲取流程定義圖
Controller 方法
@GetMapping("processDefinitionImage")
public void processDefinitionImage(String processDefinitionId, HttpServletResponse response) throws IOException {
if (StringUtils.isBlank(processDefinitionId)) {
throw new FormValidException("processDefinitionId 不能為空!");
}
InputStream inputStream = processService.getDefinitionImage(processDefinitionId);
OutputStream outputStream = response.getOutputStream();
HttpUtils.copyImageStream(inputStream, outputStream);
}
方法:processService.getDefinitionImage
/**
* 獲取流程定義圖片
*
* @param processDefinitionId
* @return
*/
public InputStream getDefinitionImage(String processDefinitionId) {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
InputStream inputStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getDiagramResourceName());
return inputStream;
}
使用 apache common-io包進(jìn)行流操作
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
通用流處理類
package com.oldguy.example.modules.workflow.utils;
import org.apache.commons.io.IOUtils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* @author huangrenhao
* @date 2019/1/22
*/
public class HttpUtils {
public static void copyImageStream(InputStream inputStream,OutputStream outputStream){
try {
IOUtils.copy(inputStream,outputStream);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
流程定義圖

processDefinitionImage.png
1. 獲取任務(wù)圖
取任務(wù)圖的時(shí)候,需要涉及動(dòng)態(tài)節(jié)點(diǎn),而流程定義圖是靜態(tài)的,所以需要涉及動(dòng)態(tài)流程圖創(chuàng)建。其中Activiti 提供了流程圖創(chuàng)建類。
- Activiti 是基于BPMN流程圖的,所以在Activiti中會(huì)有一個(gè)類: org.activiti.bpmn.model.BpmnModel ,l來描述 BPMN.xml 的信息。
- 由BpmnModel可以獲取流程定義類: org.activiti.bpmn.model.Process,用于描述流程各個(gè)節(jié)點(diǎn)與信息
- 通過當(dāng)前任務(wù)節(jié)點(diǎn)的Key,來獲取流程信息流程節(jié)點(diǎn)類: org.activiti.bpmn.model.FlowElement,到此就可以獲取到流程信息
- 通過Activiti 提供到圖片渲染類:org.activiti.image.impl.DefaultProcessDiagramGenerator,根據(jù)BpmnModel對(duì)象,動(dòng)態(tài)生成流程圖。
Controller 方法
@GetMapping("ProcessInstanceImage/{taskId}")
public void currentProcessInstanceImage(@PathVariable("taskId") String taskId, HttpServletResponse response) throws IOException {
InputStream inputStream = userTaskService.currentProcessInstanceImage(taskId);
OutputStream outputStream = response.getOutputStream();
HttpUtils.copyImageStream(inputStream, outputStream);
}
userTaskService.currentProcessInstanceImage(taskId); 獲取當(dāng)前節(jié)點(diǎn)流程任務(wù)圖
/**
* 獲取當(dāng)前任務(wù)流程圖
*
* @param taskId
* @return
*/
public InputStream currentProcessInstanceImage(String taskId) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
ProcessDefinition processDefinition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// ID 為 流程定義Key
Process process = bpmnModel.getProcessById(processDefinition.getKey());
// UserTask userTask = (UserTask) process.getFlowElement(task.getTaskDefinitionKey());
// 流程節(jié)點(diǎn)ID
FlowElement flowElement = process.getFlowElement(task.getTaskDefinitionKey());
DefaultProcessDiagramGenerator generator = new DefaultProcessDiagramGenerator();
List<String> highLightedActivities = new ArrayList<>();
highLightedActivities.add(flowElement.getId());
// 生成流程圖
// InputStream inputStream = generator.generateJpgDiagram(bpmnModel);
// InputStream inputStream = generator.generatePngDiagram(bpmnModel);
// InputStream inputStream = generator.generateDiagram(bpmnModel, "jpg", highLightedActivities);
// 生成圖片
InputStream inputStream = generator.generateDiagram(bpmnModel, "jpg", highLightedActivities, Collections.emptyList(), "宋體", "宋體", "宋體", null, 2.0);
return inputStream;
}
當(dāng)前任務(wù)流程圖

taskDefinitionImage.jpg
到此完成了流程圖獲取。