Activiti:繪製審批歷史流程圖實現
阿新 • • 發佈:2022-05-13
後臺繪製流程例項審批歷史圖(與流程定義圖類似), 審批歷史圖中會在完成審批的節點使用紅色邊框,正在審批 節點使用綠色邊框。
工具類:
CustomProcessDiagramCanvas.java:https://gitee.com/wj204811/wj204811/raw/master/activiti/CustomProcessDiagramCanvas.java
CustomProcessDiagramGenerator.java:https://gitee.com/wj204811/wj204811/raw/master/activiti/CustomProcessDiagramGenerator.java
controller:
@ApiOperation("獲取流程例項審批歷史圖")
@GetMapping("/history/image")
public void getHistoryProcessImage(@RequestParam String procInstId, HttpServletResponse response){
processInstanceService.getHistoryProcessImage(procInstId, response);
}
Service:
@Override public void getHistoryProcessImage(String procInstId, HttpServletResponse response) { InputStream imageStream = null; try { // 通過流程例項ID獲取歷史流程例項 HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(procInstId).singleResult(); // 通過流程例項ID獲取流程中已經執行的節點,按照執行先後順序排序 List<HistoricActivityInstance> historicActivityInstanceList = historyService.createHistoricActivityInstanceQuery() .processInstanceId(procInstId) .orderByHistoricActivityInstanceStartTime().desc() .list(); // 將已經執行的節點id放入高亮顯示節點集合 List<String> highLightedActivityIdList = historicActivityInstanceList.stream() .map(HistoricActivityInstance::getActivityId) .collect(Collectors.toList()); // 通過流程例項ID獲取流程中正在執行的節點 List<Execution> runningActivityInstanceList = runtimeService.createExecutionQuery() .processInstanceId(procInstId) .list(); List<String> runningActivityIdList = new ArrayList<>(); for (Execution execution : runningActivityInstanceList) { if (!StringUtils.isEmpty(execution.getActivityId())) { runningActivityIdList.add(execution.getActivityId()); } } // 獲取流程定義Model物件 BpmnModel bpmnModel = repositoryService.getBpmnModel(historicProcessInstance.getProcessDefinitionId()); // 建立流程圖生成器 CustomProcessDiagramGenerator generator = new CustomProcessDiagramGenerator(); // 獲取已經流經的流程線,需要高亮顯示流程已經發生流轉的線id集合 List<String> highLightedFlowsIds = generator.getHighLightedFlows(bpmnModel, historicActivityInstanceList); // 使用自定義配置獲得流程圖表生成器,並生成追蹤圖片字元流 imageStream = generator.generateDiagramCustom(bpmnModel, highLightedActivityIdList, runningActivityIdList, highLightedFlowsIds, "宋體", "微軟雅黑", "黑體"); // 輸出資源內容到相應物件 response.setContentType("image/svg+xml"); byte[] bytes = IOUtils.toByteArray(imageStream); OutputStream outputStream = response.getOutputStream(); outputStream.write(bytes); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); }finally { if (imageStream != null) { try { imageStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
訪問介面,最後會返回一個svg圖片
Linux部署activiti專案流程圖中文亂碼問題:
問題:當專案如果部署到 Linux 環境,歷史流程圖中文可能亂碼
原因:Linux 伺服器沒有安裝中文字型,歷史流程圖是通過後端服務程式碼生成的,並且指定了字型,在伺服器上找不到對 應字型,所以在生成圖片時出現亂碼。
解決方法:
1.安裝中文字型
yum groupinstall 'fonts' -y
2.安裝好後,再檢視安裝好後的中文字型(上面一定要安裝,沒有執行安裝命令可能也可以看下圖效果)
locale -a |grep 'zh_CN'
- 重新啟動部署的專案