我在项目里是怎么设计工作流表的:不是只看引擎表就够了

news2026/4/30 12:49:53
Activiti/Flowable 工作流实战工作流表怎么设计结合项目讲清主表、业务表、表单表和节点表最近我在重新梳理这个项目里的工作流模块时一个感觉特别强烈真正决定系统能不能长期维护的往往不是 Activiti/Flowable 的 API 会不会调而是表到底怎么拆。这个项目实际使用的是 Activiti 5.22.0模块里能看到project-key-module-activiti、act_z_business、sn_flow_formmanager、sn_flow_formfield这些关键结构。但如果你后面换成 Flowable这套设计思路其实仍然成立因为真正稳定的不是“引擎名字”而是“业务表、流程表、表单表、节点配置表之间的关系”。文章目录Activiti/Flowable 工作流实战工作流表怎么设计结合项目讲清主表、业务表、表单表和节点表一、先说结论审批系统的表不能只盯着 act_ 系统表二、为什么我特别重视 act_z_business三、业务表应该预留哪些流程字段四、保存一张业务单据时流程数据是怎么挂上去的4.1 先有业务再挂流程4.2 流程桥接信息要反写回业务表五、动态表单为什么还要单独一套表六、做工作流表设计时我建议你优先守住这几个原则6.1 引擎表只做引擎该做的事6.2 业务表要有最小流程字段6.3 一定要有统一桥表6.4 节点权限不要混在业务表里6.5 父子流程关系要提前设计七、如果让我基于这个项目再优化一次我会怎么做7.1 给桥表补齐更明确的索引7.2 统一业务表的状态字段命名7.3 把桥表和业务表的同步动作做成公共能力7.4 给流程-表单绑定增加版本维度八、总结一、先说结论审批系统的表不能只盯着act_系统表很多人一做工作流就先去背act_re_*是流程定义act_ru_*是运行时act_hi_*是历史表这当然没错但如果你真要做企业审批系统只靠这三类表远远不够。因为引擎表解决的是“流程怎么跑”不是业务数据存哪里表单长什么样当前节点哪些字段可见、可编辑、只读我发起的、我待办的、我已办的怎么统一查询子流程、组合表单、多表单绑定怎么落地结合这个项目我更建议把工作流表结构理解成 4 层。层级代表表作用引擎层act_re_*、act_ru_*、act_hi_*负责流程定义、运行时任务、历史记录业务桥接层act_z_business把“流程实例”和“业务数据”连接起来业务实例层cc_dckd、cc_drkd这类业务表真正存业务字段表单配置层sn_flow_formmanager、sn_flow_formfield、sn_flow_node_procdef_relation等存动态表单、节点绑定、字段权限、节点事件真正能支撑项目落地的不是某一张表而是这 4 层一起工作。二、为什么我特别重视act_z_business这个项目里最关键的一张“桥表”其实不是 Activiti 自带表而是act_z_business。从实体ActBusiness可以看到它至少承担了下面几件事记录流程定义 IDprocDefId记录流程实例 IDprocInstId记录业务表主键tableId记录业务表名tableName记录当前节点nodeId记录当前任务名currTaskName记录流程状态status记录流程结果result记录标题、申请人、申请时间title、userId、applyTime记录父子流程关系parentTableId这张表本质上解决了一个特别现实的问题引擎知道“流程实例是谁”业务表知道“单据是谁”但系统首页、待办中心、我发起的列表、移动端审批入口需要的是“把这两边串起来的一条统一数据”。如果没有这张桥表后面你会非常痛苦查待办时要反查业务表查已发起时要拼流程实例和业务主键子流程挂父流程时很难追踪一个系统里有几十张业务表时查询入口会越来越乱所以我现在做工作流系统几乎都会保留一张类似act_z_business的流程业务桥接表。三、业务表应该预留哪些流程字段这套项目其实已经把这个规范做得很明显了。在CommonUtils.tableColumns里系统统一约定了业务表的标准字段idcreate_bycreate_timeupdate_byupdate_timenode_idprocess_idbusiness_idtrade_noversion_num这说明它不是把流程信息完全压在act_z_business里而是同时在业务表里保留最小必要字段。以cc_dckd这张待出库单为例实体里能直接看到nodeIdprocessIdbusinessIdversionNum这套设计我非常认同因为它兼顾了两件事业务表本身具备最基础的流程关联能力比如你在业务详情页里直接根据processId、nodeId做当前节点展示不需要每次都跳到引擎表或桥表里兜一圈。流程中心仍然有统一桥接层真正做待办、我发起、审批记录、子流程关联时还是以act_z_business为中心更稳。也就是说业务表保存“最小流程引用”act_z_business保存“统一流程视图”这比“所有状态都只放业务表里”要清晰得多。四、保存一张业务单据时流程数据是怎么挂上去的这个项目里有一类生成出来的服务代码非常典型比如FlowCcDckdIServiceImpl。它的保存流程大致是这样的先保存业务表数据比如先把cc_dckd保存成功拿到业务主键bussid再组装ActBusiness把tableId、tableName、procDefId、nodeId、title、parentTableId这些信息塞进去把ActBusiness落到act_z_business再反写回业务表把businessId、processId、nodeId更新回cc_dckd这套顺序看起来普通但它特别重要因为它避免了两个常见坑。4.1 先有业务再挂流程很多人会想着“先发起流程再存业务”但只要业务保存失败、主键没拿到、子表校验不过、编码回滚异常你的数据就会变得很难收拾。这个项目的思路更稳先把业务数据写完整再把流程桥接数据补齐如果中间失败就事务回滚4.2 流程桥接信息要反写回业务表如果你只把关联关系存在act_z_business业务表完全不知道自己挂了哪个流程那后面做单据详情展示流程状态业务导出专项统计移动端列表跳转都会比较绕。所以这套代码里把businessId、processId、nodeId再更新回业务表是对的。五、动态表单为什么还要单独一套表如果你的系统是固定表单那到这里其实已经能跑起来了。但这个项目明显不是只做固定审批它还有低代码/动态表单能力所以就不能只有引擎表业务表业务桥表它还需要一套表单与节点配置体系。这一层在项目里主要有几张表sn_flow_formmanager表单主表管表单名、真实表名、整体 JSON、布局、版本、组合表单标识sn_flow_formfield字段元数据管字段类型、数据类型、长度、规则、optionsJSON、页面按钮配置sn_flow_node_procdef_relation把表单和流程节点绑定起来sn_flow_node_procdef_promission配置某节点下某字段是隐藏、可写还是只读sn_flow_node_procdef_event配置节点事件、跨表写入、条件动作这意味着在这个项目里“表单”不是页面模板而已而是一套完整的元数据模型。这样做的好处非常直接同一个流程不同节点可以挂不同表单同一个表单可以反向绑定不同流程字段权限不需要写死在前端页面里节点事件不需要全部 if/else 写死在业务代码里从架构角度看这才是真正的“工作流平台化”。六、做工作流表设计时我建议你优先守住这几个原则6.1 引擎表只做引擎该做的事不要试图把所有业务字段都塞进流程变量里也不要拿act_ru_*直接当业务表用。引擎负责定义运行历史业务负责单据内容业务状态业务约束桥接层负责统一视图列表查询流程与业务关联6.2 业务表要有最小流程字段最少我会保留process_idbusiness_idnode_idversion_num如果系统要求更强的一致性我还会保留一个业务语义状态字段比如bpm_statusbiz_statusapprove_status这个项目里DataBaseConstant里也能看到标准字段bpm_status的约定。6.3 一定要有统一桥表如果一个系统里只有一两张审批单很多团队会偷懒不建桥表。但只要后面业务越来越多合同审批入库审批出库审批借用审批盘点审批没有统一桥表后面“我的待办”“我的申请”“移动端审批中心”一定会越来越难做。6.4 节点权限不要混在业务表里字段是否隐藏、是否只读、是否可写这种配置属于“节点视角”。所以它应该跟flow_idflow_node_idfield_id放在一起而不是直接拼在业务表字段注释里更不是写死在前端页面逻辑里。6.5 父子流程关系要提前设计这个项目里act_z_business有parentTableId实际上就是在为调用活动子流程组合审批做准备。很多系统一开始不考虑这个后面一做“主流程里拉起子流程”表关系就会变得很乱。七、如果让我基于这个项目再优化一次我会怎么做如果是继续往工程化方向优化我会重点做 4 件事。7.1 给桥表补齐更明确的索引像这些字段都很值得单独建索引proc_inst_idtable_nametable_iduser_idstatusresult因为待办、我发起、按业务表跳流程详情都会高频用到。7.2 统一业务表的状态字段命名项目里不同业务表会有自己的业务状态字段比如某些表叫plan_staus有些场景又会用bpm_status。如果后面要继续平台化我会推动流程统一状态字段命名业务统一状态字段命名统一枚举字典这样报表和查询条件会干净很多。7.3 把桥表和业务表的同步动作做成公共能力现在项目里很多FlowXXXServiceImpl都在做类似的事保存业务保存ActBusiness回写业务表流程字段这类代码后面很适合继续抽象成统一模板降低重复。7.4 给流程-表单绑定增加版本维度项目里已经有版本信息但如果后面要做更强的表单演进我会进一步明确表单版本流程版本绑定版本这样能更稳地处理“旧流程跑旧表单新流程跑新表单”的场景。八、总结很多人问我Activiti/Flowable 工作流表设计最容易犯的错是什么。我的回答一直是不是表太多而是表太少。只盯着引擎表你能把流程跑起来。但你做不出真正能落地、能扩展、能长期维护的业务系统。结合这个项目我更认可的一套拆法是引擎表负责流程运行业务表负责真实单据act_z_business负责统一桥接动态表单与节点配置表负责平台化能力如果只记一句话我觉得可以记住这句工作流表设计的关键不是把所有信息塞进一张表里而是让“流程运行”“业务数据”“表单配置”“节点权限”各自归位再通过桥表稳定连接起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2552057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…