1. 程式人生 > 其它 >Activiti:繪製審批歷史流程圖實現

Activiti:繪製審批歷史流程圖實現

後臺繪製流程例項審批歷史圖(與流程定義圖類似), 審批歷史圖中會在完成審批的節點使用紅色邊框,正在審批 節點使用綠色邊框。

工具類:

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'
  1. 重新啟動部署的專案