Flowable7.x學習筆記(十三)查看部署流程圖

前言

????????Flowable 的流程圖是 Flowable Modeler 或 Process Editor 中,使用拖拽和屬性面板基于 BPMN 2.0 元素(如任務、網關、事件、序列流等)渲染出的業務流程圖形界面?。

一、將圖形導出可查看的作用

① 可視化建模

????????幫助業務分析師和開發者共同設計復雜流程,免去了理解純 XML 定義的障礙?。

②?流程部署與運行

????????確保流程結構符合預期,再由 Flowable 引擎解析 XML 并生成執行計劃。

③?增強透明度與協作

????????可視化流程圖讓技術、業務和管理層共同站在“同一頁面”審視流程邏輯,減少溝通歧義并加快決策速度?。

④?標準化與合規審計

????????BPMN 強制流程設計者將隱含或未文檔化的業務規則以圖形化符號和屬性形式顯式化,有助于流程審計與合規檢查?。

⑤?培訓與知識沉淀

????????流程圖與文字說明協同構成易于理解的知識庫,新成員可通過圖示快速上手,減少培訓成本并提升團隊整體效率?。

二、后端:創建請求對象

這里的請求是表明需要查看具體哪一個部署流程定義

package com.ceair.entity.request;import lombok.Data;import java.io.Serial;
import java.io.Serializable;/*** @author wangbaohai* @ClassName QueryImageOrXmlReq* @description: 查詢部署流程定義的圖片或xml文件請求對象* @date 2025年04月22日* @version: 1.0.0*/
@Data
public class QueryImageOrXmlReq implements Serializable {@Serialprivate static final long serialVersionUID = 1L;/*** 流程定義ID*/private String processDefinitionId;}

三、后端:創建服務接口

/*** 查詢圖片信息的函數。* <p>* 根據傳入的查詢請求對象,返回對應的圖片信息字符串。** @param queryImageOrXmlReq 查詢請求對象,包含查詢圖片所需的相關參數。*                           該對象的具體結構和內容需符合業務邏輯要求。* @return 返回一個字符串,表示查詢到的圖片信息。* 如果查詢失敗或無結果,返回值的具體含義需根據業務邏輯定義。*/
String queryImage(QueryImageOrXmlReq queryImageOrXmlReq);

四、后端:實現服務接口

此實現是本文重點部分:

????????該方法 queryImage(QueryImageOrXmlReq queryImageOrXmlReq) 的主要功能是根據前端傳入的流程定義 ID,調用流程引擎(如 Activiti 或 Flowable)持久化服務,獲取對應的流程圖資源,并將其以 Base64 編碼的字符串形式返回給調用方。核心流程如下:

參數校驗:保證輸入對象和流程定義 ID 有效;

查詢流程定義:通過 getById 方法確認流程定義是否存在;

讀取流程圖資源流:調用 repositoryService.getResourceAsStream 獲取流程圖文件的字節流;

轉換并編碼:將字節流讀入內存,通過 Base64 編碼輸出;

異常處理:對空流、IO 異常及其他未知異常分別捕獲并封裝業務異常。

/*** 查詢流程圖的Base64編碼字符串。** @param queryImageOrXmlReq 請求對象,包含查詢流程圖所需的參數。*                           - 不能為空。*                           - 必須包含有效的流程定義ID(processDefinitionId)。* @return 返回流程圖的Base64編碼字符串。* - 如果流程定義不存在或資源流為空,則拋出異常。* @throws IllegalArgumentException 如果請求對象為空或流程定義ID無效。* @throws BusinessException        如果流程定義不存在、資源流為空或發生IO異常。*/
@Override
public String queryImage(QueryImageOrXmlReq queryImageOrXmlReq) {// 參數校驗:確保請求對象不為空if (queryImageOrXmlReq == null) {log.error("獲取流程圖失敗,原因:請求對象不能為空");throw new IllegalArgumentException("獲取流程圖失敗,原因:請求對象不能為空");}String processDefinitionId = queryImageOrXmlReq.getProcessDefinitionId();// 參數校驗:確保流程定義ID不為空或空字符串if (processDefinitionId == null || processDefinitionId.trim().isEmpty()) {log.error("獲取流程圖失敗,原因:流程定義ID不能為空或空字符串");throw new IllegalArgumentException("獲取流程圖失敗,原因:流程定義ID不能為空或空字符串");}// 根據流程定義ID查詢流程定義ActReProcdef actReProcdef = getById(processDefinitionId);if (actReProcdef == null) {log.error("獲取流程圖失敗,原因:流程定義不存在,流程定義ID:{}", processDefinitionId);throw new BusinessException("獲取流程圖失敗,原因:流程定義不存在,流程定義ID:" + processDefinitionId);}// 獲取流程圖資源流try (InputStream imageStream = repositoryService.getResourceAsStream(actReProcdef.getDeploymentId(),actReProcdef.getDgrmResourceName())) {if (imageStream == null) {log.error("獲取流程圖失敗,原因:資源流為空,流程定義ID:{}", processDefinitionId);throw new BusinessException("獲取流程圖失敗,原因:資源流為空,流程定義ID:" + processDefinitionId);}// 將資源流內容讀取為字節數組并進行Base64編碼ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = imageStream.read(buffer)) != -1) {outputStream.write(buffer, 0, bytesRead);}return Base64.getEncoder().encodeToString(outputStream.toByteArray());} catch (IOException e) {// 捕獲IO異常并記錄日志log.error("獲取流程圖失敗,原因:IO異常,流程定義ID:{}", processDefinitionId, e);throw new BusinessException("獲取流程圖失敗,原因:IO異常", e);} catch (Exception e) {// 捕獲其他未知異常并記錄日志log.error("獲取流程圖失敗,原因:未知異常,流程定義ID:{}", processDefinitionId, e);throw new BusinessException("獲取流程圖失敗,原因:未知異常", e);}
}

五、后端:創建功能接口

提供接口以供前端調用

// 使用Spring Security的注解進行權限控制,確保只有擁有特定權限的用戶才能訪問此方法
@PreAuthorize("hasAnyAuthority('/api/v1/actReProcdef/queryImage')")
// 定義參數對象的元數據,用于API文檔生成
@Parameter(name = "queryImageOrXmlReq", description = "查詢流程定義圖片請求對象", required = true)
// 定義操作的元數據,用于API文檔生成
@Operation(summary = "查詢流程定義圖片")
// 聲明這是一個POST請求的處理方法
@PostMapping("/queryImage")
public Result<String> queryImage(@RequestBody QueryImageOrXmlReq queryImageOrXmlReq) {try {// 調用服務層方法執行流程定義操作,傳入請求對象并獲取操作結果String image = actReProcdefService.queryImage(queryImageOrXmlReq);// 返回操作成功的響應結果return Result.success(image);} catch (Exception e) {// 捕獲異常,記錄詳細的錯誤日志,并返回包含失敗原因的響應結果log.error("查詢流程定義圖片失敗 具體原因為 : {}", e.getMessage());return Result.error("查詢流程定義圖片失敗,失敗原因:" + e.getMessage());}
}

六、前端:創建請求參數

與后臺接口保持一致

// 查詢流程圖或者流程XML請求對象

export interface QueryImageOrXmlReq {

? processDefinitionId: string // 流程定義ID

}

七、前端:封裝請求接口

調用后臺提供的接口

// 查詢流程圖
export function queryImage(data: QueryImageOrXmlReq) {return request.post<any>({url: '/pm-process/api/v1/actReProcdef/queryImage',data,})
}

八、前端:增加功能方法

// 定義響應式數據 showImage 表示是否顯示流程定義的圖片對話框
const showImage = ref(false)// 定義響應式數據 imageData 表示流程定義的圖片數據
const imageData = ref('')/*** 異步函數:用于顯示流程定義的圖片* @param data ActReProcdefVO 類型的對象,包含流程定義的相關信息*/
async function onShowImage(data: ActReProcdefVO) {try {// 組裝查詢參數,包括流程定義 IDconst param: QueryImageOrXmlReq = {processDefinitionId: data.id,}// 調用后端接口獲取流程定義的圖片數據const result: any = await queryImage(param)// 判斷查詢結果是否成功if (result.success && result.code === 200) {// 如果成功,則更新流程定義的圖片數據imageData.value = result.data// 打開圖片對話框showImage.value = true}else {// 提示操作失敗的錯誤提示信息ElMessage({message: `查詢失敗原因:${result.message}`,type: 'error',})}}catch (error) {// 捕獲異常并提取錯誤信息let errorMessage = '未知錯誤'if (error instanceof Error) {errorMessage = error.message}// 顯示操作失敗的錯誤提示信息ElMessage({message: `查詢失敗: ${errorMessage || '未知錯誤'}`,type: 'error',})}
}

九、前端:增加界面

<el-button v-hasButton="`btn.actReProcdef.queryImage`" type="primary" @click="onShowImage(scope.row)">
? 查看流程圖
</el-button>

此處需注意,直接使用img標簽的base64解碼,將圖片文件的字符串轉碼成圖片?

<!-- 流程圖展示彈出框 -->
<el-dialog v-model="showImage" title="流程圖展示" width="80%">
? <div class="image-container">
? ? <img :src="`data:image/jpeg;base64,${imageData}`" alt="流程圖">
? </div>
</el-dialog>

.image-container {

? display: flex;

? justify-content: center;

? align-items: center;

? height: 100%;

}

.image-container img {

? max-width: 100%;

? max-height: 100%;

}

十、添加按鈕&分配權限

這一步是添加按鈕

這一步是把按鈕權限給到當前操作員的角色【超級管理員】

十一、結果查詢

十二、后記?

本篇文章的前后端倉庫地址請查詢專欄第一篇文章,后續打算把xml和流程圖片展示出來

本文的后端分支是 process-7

本文的前端分支是 process-9

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903363.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903363.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903363.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bootstrap 模態框

Bootstrap 模態框 Bootstrap 模態框&#xff08;Modal&#xff09;是 Bootstrap 框架中的一個組件&#xff0c;它允許你在一個頁面中創建一個模態對話框&#xff0c;用于顯示內容、表單、圖像或其他信息。模態框通常覆蓋在當前頁面上&#xff0c;提供了一種不離開當前頁面的交…

python-69-基于graphviz可視化軟件生成流程圖

文章目錄 1 Graphviz可視化軟件1.1 graphviz簡介1.2 安裝部署2 基于python示例應用2.1 基本示例2.2 解決中文顯示亂碼2.3 顯示多個輸出邊2.4 顯示輸出引腳名稱2.5 從左至右顯示布局2.6 設置節點為方形3 參考附錄1 Graphviz可視化軟件 1.1 graphviz簡介 Graphviz(Graph Visua…

AJAX 介紹

一、什么是AJAX ? AJAX 是 異步的 JavaScript 和 XML&#xff08;Asynchronous JavaScript And XML&#xff09; 的縮寫&#xff0c;是一種實現瀏覽器與服務器進行數據通信的技術。其核心是通過 XMLHttpRequest 對象在不重新刷新頁面的前提下&#xff0c;與服務器交換數據并更…

新ubuntu物理機開啟ipv6讓外網訪問

Ubuntu 物理機 SSH 遠程連接與 IPv6 外網訪問測試指南 1. 通過 SSH 遠程連接 Ubuntu 物理機 1.1 安裝 SSH 服務 sudo apt update sudo apt install openssh-server1.2 檢查 SSH 服務狀態 sudo systemctl status ssh確認出現 active (running)。 1.3 獲取物理機 IP 地址 i…

linux系統上使用nginx訪問php文件返回File not found錯誤處理方案

linux系統上使用nginx訪問php文件返回File not found錯誤處理方案 第一種情況第二種情況 第一種情況 可以在你的location php 里面添加當文件不存在時返回404而不是交給php-fpm進行處理 location ~ \.php$ { ... #文件不存在轉404 try_files $uri 404; ... }然后&#xff0c…

基于 SpringBoot 與 Redis 的緩存預熱案例

文章目錄 “緩存預熱” 是什么&#xff1f;項目環境搭建創建數據訪問層預熱數據到 Redis 中創建緩存服務類測試緩存預熱 “緩存預熱” 是什么&#xff1f; 緩存預熱是一種優化策略&#xff0c;在系統啟動或者流量高峰來臨之前&#xff0c;將一些經常訪問的數據提前加載到緩存中…

java—11 Redis

目錄 一、Redis概述 二、Redis類型及編碼 三、Redis對象的編碼 1. 類型&編碼的對應關系 2. string類型常用命令 &#xff08;1&#xff09;string類型內部實現——int編碼 &#xff08;2&#xff09;string類型內部實現——embstr編碼 ?編輯 &#xff08;3&#x…

分布式鏈路追蹤理論

基本概念 分布式調用鏈標準-openTracing Span-節點組成跟蹤樹結構 有一些特定的變量&#xff0c;SpanName SpanId traceId spanParentId Trace&#xff08;追蹤&#xff09;&#xff1a;代表一個完整的請求流程&#xff08;如用戶下單&#xff09;&#xff0c;由多個Span組成…

err: Error: Request failed with status code 400

好的&#xff0c;今天學習ai的時候從前端發送請求&#xff0c;實在是想不通為啥會啥是一個壞請求&#xff0c;后來從前端方法一個一個找參數&#xff0c;傳遞的值都有&#xff0c;然后想到我這邊需要傳遞的是一個對象&#xff0c;那么后端使用的RequestParam就接收不到json對象…

開發小程序后端用PHP好還是Java哪個好?

在開發后端時&#xff0c;是選擇PHP還是Java主要取決于你的項目需求、團隊技術棧、性能要求以及維護成本等因素。下面我將從幾個關鍵方面對兩者進行簡要對比&#xff0c;以幫助你做出更明智的選擇。 PHP 優點&#xff1a; 簡單易學&#xff1a;PHP語法簡單&#xff0c;上手快&a…

麒麟V10 aarch64 qt 安裝

在麒麟V10(aarch64架構)中安裝Qt,需根據具體需求選擇合適的方法。以下是綜合多個搜索結果的安裝方案及注意事項: 一、安裝方法 1. 在線安裝默認版本 適用于對Qt版本無特殊要求的情況。通過APT包管理器安裝系統默認提供的Qt版本(如Qt 5.12.12): sudo apt-get update s…

pdf.js移動端預覽PDF文件時,支持雙指縮放

在viewer.html中添加手勢縮放代碼 <script>// alert("Hello World");let agent navigator.userAgent.toLowerCase();// if (!agent.includes("iphone")) {let pinchZoomEnabled false;function enablePinchZoom(pdfViewer) {let startX 0, start…

算法筆記.kruskal算法求最小生成樹

題目&#xff1a;&#xff08;來源&#xff1a;AcWing&#xff09; 給定一個 n 個點 m 條邊的無向圖&#xff0c;圖中可能存在重邊和自環&#xff0c;邊權可能為負數。 求最小生成樹的樹邊權重之和&#xff0c;如果最小生成樹不存在則輸出 impossible。 給定一張邊帶權的無向…

C#開發的自定義Panel滾動分頁控件 - 開源研究系列文章

前些時候因為想擁有一個自己的軟件快捷打開軟件&#xff0c;于是參考Windows 11的開始菜單&#xff0c;進行了編寫這個應用軟件&#xff0c;里面有一個功能就是對顯示的Panel里的應用對象的分頁功能&#xff0c;于是就想寫一個對Panel的自定義滾動條控件。 下面開始介紹此控件的…

【基礎篇】prometheus命令行參數詳解

文章目錄 本篇內容講解命令行參數詳解 本篇內容講解 prometheus高頻修改命令行參數詳解 命令行參數詳解 在頁面的/頁面上能看到所有的命令行參數&#xff0c;如圖所示&#xff1a; 使用shell命令查看 # ./prometheus --help usage: prometheus [<flags>]The Promethe…

深入理解CSS3:Flex/Grid布局、動畫與媒體查詢實戰指南

引言 在現代Web開發中&#xff0c;CSS3已經成為構建響應式、美觀且高性能網站的核心技術。它不僅提供了更強大的布局系統&#xff08;Flexbox和Grid&#xff09;&#xff0c;還引入了令人驚艷的動畫效果和精準的媒體查詢能力。本文將深入探討這些關鍵技術&#xff0c;幫助您提…

從線性到非線性:簡單聊聊神經網絡的常見三大激活函數

大家好&#xff0c;我是沛哥兒&#xff0c;我們今天一起來學習下神經網絡的三個常用的激活函數。 引言&#xff1a;什么是激活函數 激活函數是神經網絡中非常重要的組成部分&#xff0c;它引入了非線性因素&#xff0c;使得神經網絡能夠學習和表示復雜的函數關系。 在神經網絡…

2025上海車展 | 移遠通信重磅發布AR腳踢毫米波雷達,重新定義“無接觸交互”尾門

4月25日&#xff0c;在2025上海國際汽車工業展覽會期間&#xff0c;全球領先的物聯網和車聯網整體解決方案供應商移遠通信宣布&#xff0c;其全新AR腳踢毫米波雷達RD7702AC正式發布。 該產品專為汽車尾門“無接觸交互”設計&#xff0c;基于先進的毫米波技術&#xff0c;融合AR…

深度學習:遷移學習

遷移學習 標題1.什么是遷移學習 遷移學習(Transfer Learning)是一種機器學習方法&#xff0c;就是把為任務 A 開發 的模型作為初始點&#xff0c;重新使用在為任務 B 開發模型的過程中。遷移學習是通過 從已學習的相關任務中轉移知識來改進學習的新任務&#xff0c;雖然大多數…

Rabbitmq下載和安裝(Windows系統,百度網盤)

一.下載安裝Erlang 1.百度云下載 鏈接&#xff1a;https://pan.baidu.com/s/1k_U25KKngEf1iXWD1ANOeg 提取碼&#xff1a;8ilc 2.安裝 傻瓜式安裝 直接下一步 選擇自己要安裝的路徑 3.配置環境變量 增加變量名為&#xff1a;ERLANG_HOME 變量值填寫自己的安裝路徑&#x…