方法一:使用activiti自帶的image畫
此種方法好像使用activiti中5.16以後的版本:
1、controller層編輯
<span style="white-space:pre"> </span>@RequestMapping(value="/queryActivityMap", produces = MediaType.IMAGE_PNG_VALUE)
@ResponseBody
public byte[] queryActivityMap(String processInstanceId, Model model, HttpServletResponse response) {
try {
return orderService.traceProcessImage(processInstanceId);
} catch (Exception e) {
System.err.println("獲取圖片流錯誤!!");
e.printStackTrace();
return null;
}
}
2、service層編輯
<span style="white-space:pre"> </span>/**
* 得到帶有高亮節點的流程圖
* @param processInstanceId 流程實例id
* @return
*/
public byte[] traceProcessImage(String processInstanceId) {
String taskId = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult().getId();
if (StringUtils.isBlank(taskId))
throw new IllegalArgumentException("任務ID不能爲空!");
// 當前任務節點
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task == null)
throw new IllegalArgumentException("任務不存在!");
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
// List<String> activeActivityIds = runtimeService.getActiveActivityIds(task.getExecutionId());
// 必須添加此行才能取到配置文件中的字體,待根本解決問題後刪除
// Context.setProcessEngineConfiguration(processEngineConfiguration);
// return ProcessDiagramGenerator.generateDiagram(bpmnModel, "PNG", activeActivityIds);
// 經過的節點
List<String> activeActivityIds = new ArrayList<>();
List<String> finishedActiveActivityIds = new ArrayList<>();
// 已執行完的任務節點
List<HistoricActivityInstance> finishedInstances = historyService.createHistoricActivityInstanceQuery().processInstanceId(task.getProcessInstanceId()).finished().list();
for (HistoricActivityInstance hai : finishedInstances) {
finishedActiveActivityIds.add(hai.getActivityId());
}
// 已完成的節點+當前節點
activeActivityIds.addAll(finishedActiveActivityIds);
activeActivityIds.addAll(runtimeService.getActiveActivityIds(task.getProcessInstanceId()));
// 經過的流
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService.getProcessDefinition(task.getProcessDefinitionId());
List<String> highLightedFlows = new ArrayList<>();
getHighLightedFlows(processDefinitionEntity.getActivities(), highLightedFlows, activeActivityIds);
ProcessDiagramGenerator pdg = processEngineConfiguration.getProcessDiagramGenerator();
InputStream inputStream = pdg.generateDiagram(bpmnModel, "PNG", finishedActiveActivityIds, highLightedFlows,
processEngineConfiguration.getProcessEngineConfiguration().getActivityFontName(),
processEngineConfiguration.getProcessEngineConfiguration().getLabelFontName(),
processEngineConfiguration.getProcessEngineConfiguration().getProcessEngineConfiguration().getClassLoader(), 1.0);
try {
return IOUtils.toByteArray(inputStream);
} catch (Exception e) {
throw new RuntimeException("生成流程圖異常!", e);
} finally {
IOUtils.closeQuietly(inputStream);
}
}
/*
* 遞歸查詢經過的流
*/
private void getHighLightedFlows(List<ActivityImpl> activityList, List<String> highLightedFlows, List<String> historicActivityInstanceList) {
for (ActivityImpl activity : activityList) {
if (activity.getProperty("type").equals("subProcess")) {
// get flows for the subProcess
getHighLightedFlows(activity.getActivities(), highLightedFlows, historicActivityInstanceList);
}
if (historicActivityInstanceList.contains(activity.getId())) {
List<PvmTransition> pvmTransitionList = activity.getOutgoingTransitions();
for (PvmTransition pvmTransition : pvmTransitionList) {
String destinationFlowId = pvmTransition.getDestination().getId();
if (historicActivityInstanceList.contains(destinationFlowId)) {
highLightedFlows.add(pvmTransition.getId());
}
}
}
}
}
3、顯示結果:
4、activit中所需要的jar包
方法二:定義一個遮罩層在流程圖上
ProcessInstance processInstance = runtimeService
.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
String processDefinitionId = processInstance
.getProcessDefinitionId();
// 當前任務id
String activityId = processInstance.getActivityId();
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity) repositoryService
.getProcessDefinition(processDefinitionId);
ActivityImpl activityImpl = processDefinitionEntity
.findActivity(activityId);
5、從ActivityImpl中取出座標信息.
Map<String, Object> map = new HashMap<String, Object>();
// 使用map存放結點座標
map.put("x", activityImpl.getX());
map.put("y", activityImpl.getY());
map.put("width", activityImpl.getWidth());
map.put("height", activityImpl.getHeight());
6、將座標信息傳到jsp頁面,使用div顯示紅色邊框效果
<span style="white-space:pre"> </span><!-- 流程圖 -->
<img style="position: absolute; top: 0px; left: 0px;"
src="${baseurl}flow/queryResource.action?processDefinitionId=${processDefinitionId}&resourceType=png">
<!-- 流程圖中當前活動框 -->
<div style="position: absolute;border:1px solid red;width: ${map.width }px;height:${map.height }px;top:${map.y }px;left: ${map.x }px;"></div>