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.mzph.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…