activiti6 高亮跟踪流程图
废话不多说直接上代码
望大佬别喷 谢谢!!!!
Controller
@RequestMapping(“/displayFlowCurrPic”)
@ApiOperation(value = “显示流程图”, httpMethod = “GET”, notes = “显示流程图”)
@ResponseBody
public String displayFlowCurrPicnew(HttpServletRequest request, HttpServletResponse response,String deploymentId) {
return jbpmProcessinstanceService.displayFlowCurr(request,response,deploymentId);
}
Service
/** 显示流程图
* @param
* @author
*/
public String displayFlowCurr(HttpServletRequest request, HttpServletResponse response,String deploymentId){
activitiInstanceService.getProcessImage(request,response,deploymentId);
return null;
}
之所以我没直接写到这个service中因为后续好降或升activiti的版本
直接写到底层ActivitiInstanceService
/** 显示流程图
* @param request
*/
public String getProcessImage(HttpServletRequest request, HttpServletResponse response,String deploymentId){
BufferedImage img = new BufferedImage(300, 150, BufferedImage.TYPE_INT_RGB);
//对byte类型数据进行写入的类
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//String deploymentId=request.getParameter(“deploymentId”);
String imgBase64Str = “”;
try {
ProcessDefinition processDefinition=ProcessEngines.getDefaultProcessEngine()
.getRepositoryService().createProcessDefinitionQuery()
.deploymentId(deploymentId)
.singleResult();
List activeTasks= ProcessEngines.getDefaultProcessEngine().getTaskService().createTaskQuery().processDefinitionId(processDefinition.getId()).list();
// 已执行的线集合
List executedActivityIdList = new ArrayList();
List highLines = new ArrayList();
List highNodes = new ArrayList();
BpmnModel bpmnModel = ProcessEngines.getDefaultProcessEngine().getRepositoryService().getBpmnModel(processDefinition.getId());
for(Task task:activeTasks){
executedActivityIdList.add(task.getTaskDefinitionKey());
highLines.addAll(getHighLines(bpmnModel,task.getTaskDefinitionKey()));
highNodes.addAll(getHighNodes(bpmnModel,task.getTaskDefinitionKey()));
}
// 获取流程图图像字符流
InputStream imageStream = new DefaultProcessDiagramGenerator().generateDiagram(bpmnModel, "png",
highNodes, highLines, "宋体", "宋体", "宋体", null, 2.0);
// 输出资源内容到相应对象
byte[] b = new byte[8092];
int len;
while ((len = imageStream.read(b, 0, 8092)) != -1) {
response.getOutputStream().write(b, 0, len);
}
imgBase64Str = "data:image/png;base64," + Base64.getEncoder().encodeToString(Objects.requireNonNull(outputStream.toByteArray()));
imageStream.close();
} catch (Exception e) {
e.printStackTrace();
}
return imgBase64Str;
}
/**
* 获取高亮的节点
* @param bpmnModel
* @param key
* @return
*/
private Set<String> getHighNodes(BpmnModel bpmnModel, String key) {
FlowNode fl = (FlowNode) bpmnModel.getFlowElement(key);
List<SequenceFlow> sequenceFlows = fl.getIncomingFlows();
Set<String> highNodes = new HashSet<>();
highNodes.add(key);
for (SequenceFlow sf : sequenceFlows) {
if (StringUtils.isNotBlank(sf.getSourceRef())) {
highNodes.addAll(getHighNodes(bpmnModel, sf.getSourceRef()));
}
return highNodes;
}
return highNodes;
}
/**
* 获取高亮的线
* @param bpmnModel
* @param key
* @return
*/
private Set<String> getHighLines(BpmnModel bpmnModel, String key) {
FlowNode fl = (FlowNode) bpmnModel.getFlowElement(key);
List<SequenceFlow> sequenceFlows = fl.getIncomingFlows();
Set<String> getHighLines = new HashSet<>();
getHighLines.add(key);
for (SequenceFlow sf : sequenceFlows) {
if (StringUtils.isNotBlank(sf.getSourceRef())) {
getHighLines.addAll(getHighNodes(bpmnModel, sf.getSourceRef()));
}
return getHighLines;
}
return getHighLines;
}