当前位置: 首页 > article >正文

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

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负责统一桥接动态表单与节点配置表负责平台化能力如果只记一句话我觉得可以记住这句工作流表设计的关键不是把所有信息塞进一张表里而是让“流程运行”“业务数据”“表单配置”“节点权限”各自归位再通过桥表稳定连接起来。

相关文章:

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

Activiti/Flowable 工作流实战:工作流表怎么设计?结合项目讲清主表、业务表、表单表和节点表 最近我在重新梳理这个项目里的工作流模块时,一个感觉特别强烈:真正决定系统能不能长期维护的,往往不是 Activiti/Flowable …...

软件工业流水线的时代真的来临了

2026 年,Claude Opus 4.7 发布之后,很多事情变了。最明显的一件是——你可以放心地把一个完整需求丢给 Code Agent 去实现了。过去我们担心 AI 把功能写错、接口调坏、测试跑飞,Opus 4.7 之前这些担心都不是多余的;Opus 4.7 之后&…...

别只用来生成大头照了!解锁 GPT Image 2 Web Workflow 的最新设计实战玩法

AI 绘画圈的头把交椅又要换人了。OpenAI 刚刚发布了最新一代生图模型 GPT-Image-2。经过第一时间的上手实测,我们可以明显感受到,它在文本输出的准确性、以及对复杂现实世界知识的理解上,表现得比此前的 Nano Banana 2 更加出色。 一如既往&…...

一颗0.89元的芯片,干翻了Intel和飞利浦,这个“51单片机教父“让全球80%的8051都姓了STC

大家好,我是写代码的篮球球痴。之前聊了 Fabrice Bellard、求伯君和瑞芯微的励民,今天换个画风,聊一个搞嵌入式的同学100%接触过的人物——姚永平,STC单片机的创始人。你可能没听过这个名字,但你一定用过他的芯片。STC…...

Python入门必须知道的11个知识点

Python被誉为全世界高效的编程语言,同时也被称作是“胶水语言”,那它为何能如此受欢迎,下面我们就来说说Python入门学习的必备11个知识点,也就是它为何能够如此受欢迎的原因.Python 简介Python 是一个高层次的结合了解释性、编译性…...

python基本语法练习实例

1、打印九九乘法表1234567891011121314151617181920212223242526272829303132333435363738#只打印结果for i in range(1,10):for j in range(1,i1):print(i*j,end" ")print()#打印算数表达式for i in range(1,10):for j in range(1,i1):print("{0}*{1} {2:2}&q…...

Nordic nRF7001 WiFi 6伴生芯片解析与低功耗IoT应用

1. Nordic nRF7001 WiFi 6伴生芯片深度解析在物联网设备快速普及的当下,如何为低功耗蓝牙和蜂窝IoT设备添加可靠的WiFi连接能力,一直是开发者面临的挑战。Nordic Semiconductor最新推出的nRF7001伴生芯片,正是为解决这一痛点而生。作为nRF70系…...

NotaGen快速部署:一键启动WebUI,5分钟开始音乐创作之旅

NotaGen快速部署:一键启动WebUI,5分钟开始音乐创作之旅 1. 准备工作与环境检查 1.1 系统要求 在开始部署NotaGen之前,请确保您的系统满足以下最低要求: 操作系统:Linux(推荐Ubuntu 20.04)或…...

「智库智能」获数亿元融资,凯傲集团战略入股,苏州国资加持

导语大家好,这里是智能仓储物流技术研习社:专注分享智能制造和智能仓储物流等内容。专业书籍:《智能物流系统构成与技术实践》|《智能仓储项目英语手册》|《智能仓储项目必坑手册》|《智能仓储项目甲方必读》|《12大行业智能仓储实战指南》近…...

避坑指南:Webots仿真中激光雷达(Lidar)和距离传感器的配置、数据读取与可视化(附完整C代码)

Webots激光雷达与距离传感器实战:从参数调试到数据可视化的全流程解析 在机器人仿真开发中,传感器配置不当导致的"数据异常"问题往往消耗开发者大量时间。上周调试一个仓储机器人项目时,激光雷达点云突然消失的问题让我排查到凌晨三…...

嵌入式芯片硬件缺陷的软件绕过机制与实现

1. 嵌入式芯片硬件缺陷的软件绕过机制解析 在嵌入式系统开发领域,硬件芯片的勘误问题(Chip Errata)是工程师们经常需要面对的挑战。当发现芯片存在硬件设计缺陷时,等待芯片厂商推出新版本可能耗时过长,而软件层面的绕过…...

实战 | 解密CUTTag:从抗体选择到数据解读,关键环节逐一击破!

1. CUT&Tag技术原理与优势解析 CUT&Tag(Cleavage Under Targets and Tagmentation)作为研究DNA-蛋白质相互作用的新锐技术,近年来在表观遗传学领域大放异彩。我第一次接触这项技术时,就被它精巧的设计思路所折服——它像一…...

LSTM在多元时间序列预测中的实战应用

1. 理解LSTM在多元时间序列预测中的应用长短期记忆网络(LSTM)作为循环神经网络(RNN)的一种特殊变体,在处理时间序列数据时展现出独特优势。与传统的线性方法相比,LSTM能够自动学习时间序列中的长期依赖关系…...

基于eBPF的容器运行时安全监控:Foniod实战部署与策略指南

1. 项目概述:从容器镜像到安全监控的深度实践最近在梳理云原生环境下的安全监控方案时,我反复遇到了一个名为foniod/foniod的容器镜像。这个名字乍一看有点陌生,不像nginx、redis那样耳熟能详,但在特定的安全运维圈子里&#xff0…...

[特殊字符] JMeter 压测日志指标全解析

一、启动命令 jmeter -n -t aaa.jmx -l result.jtl -e -o reports参数含义: 参数 作用 -n 启用无界面非 GUI 模式运行压测(服务器 / 命令行压测专用,比 GUI 稳定) -t aaa.jmx 指定压测脚本:本次运行的脚本文件名为 aaa.jmx -l result.jtl 把本次所有请求的原始压测数据,…...

你还在手动Step Over?VSCode AI自动路径预测调试法(已通过Linux内核模块实测验证)

更多请点击: https://intelliparadigm.com 第一章:你还在手动Step Over?VSCode AI自动路径预测调试法(已通过Linux内核模块实测验证) 现代内核级调试面临分支爆炸与上下文缺失的双重挑战。传统单步执行(St…...

JMeter InfluxDB 后端监听器 全参数详解

一、顶部全局配置项1. 名称当前这个后端监听器组件的自定义名字,仅 JMeter 内部标识用,不影响数据上报,你填后端监听器只是备注区分。2. 注释自定义备注栏,写测试用途、项目信息,无运行效果。3. 后端监听器实现org.apa…...

保姆级教程:用Anaconda为QMT创建Python 3.6.8虚拟环境,避免版本冲突

量化交易必备:Anaconda虚拟环境精准配置Python 3.6.8全攻略 当你在深夜调试QMT策略时,突然发现因为Python版本冲突导致整个开发环境崩溃——这种经历足以让任何量化开发者抓狂。本文将带你彻底解决这个痛点,不仅教你如何创建完美的Python 3.6…...

不止是补全!用GPT Runner深度解析项目文件:我是如何让它帮我快速理解陌生代码库的

深度解析项目文件的实战指南:用GPT Runner高效理解陌生代码库 接手一个陌生代码库时,面对错综复杂的文件结构和晦涩难懂的代码逻辑,即使是经验丰富的开发者也会感到无从下手。传统方式下,我们需要逐个文件阅读、调试、注释&#x…...

吃透智能体开发 程序员轻松打破35岁职业危机

文章目录前言一、别再自欺欺人了!2026年,CRUD程序员的路已经走到头了1.1 35岁危机的本质,不是年龄,是你的技能已经没有了稀缺性1.2 大厂招聘的潜规则:智能体经验,已经从加分项变成了必填项1.3 程序员的角色…...

GLM-4.7智能体部署实战:从模型选型到性能调优全解析

1. 项目概述:从GLM-4.5到GLM-4.7,一个开源智能体基座的演进之路如果你在过去一年里深度参与过AI智能体或者大语言模型的应用开发,那么“GLM”这个系列对你来说一定不陌生。从GLM-4.5的横空出世,到GLM-4.6的稳步提升,再…...

Flutter状态管理高级技巧与最佳实践

Flutter状态管理高级技巧与最佳实践 引言 状态管理是Flutter应用开发中的核心挑战之一,特别是对于复杂应用。选择合适的状态管理方案并正确实现它,对于构建可维护、可扩展的Flutter应用至关重要。本文将深入探讨Flutter状态管理的高级技巧和最佳实践&…...

终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间

终极指南:如何使用Diablo Edit2暗黑破坏神2角色编辑器解放你的游戏时间 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否厌倦了在暗黑破坏神2中花费数十小时刷装备、反复练级&…...

文泉驿微米黑:轻量级多语言字体解决方案的技术架构与应用实践

文泉驿微米黑:轻量级多语言字体解决方案的技术架构与应用实践 【免费下载链接】fonts-wqy-microhei Debian package for WenQuanYi Micro Hei (mirror of https://anonscm.debian.org/git/pkg-fonts/fonts-wqy-microhei.git) 项目地址: https://gitcode.com/gh_mi…...

机器学习模型可视化工具全解析与应用指南

1. 机器学习模型可视化工具全景解析在机器学习项目实践中,我们常常陷入一个专业困境:当模型准确率达到95%后,如何向非技术背景的决策者解释这个"黑箱"究竟学到了什么?这个问题直接关系到模型能否真正落地应用。传统的数…...

关于监所人员收押一体化整体解决方案的调研

收押流程包括人员的生物信息的采集、人员身份信息核验、人员身体违禁品检测、人员身体健康检查等,其中生物信息采集主要采集人员的基本信息、社会关系、人像信息、指掌纹信息、虹膜信息等。其中身份核验用于对人员的身份进行确认并生成唯一的档案号。其中人员身体违…...

ComfyUI-Manager终极加速指南:5倍提升AI模型下载速度的技术实现

ComfyUI-Manager终极加速指南:5倍提升AI模型下载速度的技术实现 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable vari…...

宏源期货白糖“保险+期货”项目助力罗城蔗农稳收增收

2025年郑商所广西罗城糖业无忧“保险期货”项目已于3月中旬到期,项目正式进入保险理赔阶段。此次项目由宏源期货、申万期货、平安产险等多家机构联合承办,同时获得了申万宏源证券广西分公司及金融创新总部的协同支持,为罗城县小长安镇、黄金镇…...

第二章《目录和文件管理》全套测试题【20260424】002篇

文章目录入门测试题 (考察基础概念与命令格式)进阶测试题 (考察命令组合与综合应用)高级测试题 (考察排错、优化与复杂编辑)韩工给你设计了入门、进阶、高级三套测试题,旨在评估学员对Linux文件查看、检索、压缩备份和vi编辑器等核心技能的掌握程度。入门测试题 (考…...

BrainScaleS-2神经形态计算系统架构与FPGA互连设计

1. BrainScaleS-2多芯片系统概述神经形态计算作为类脑智能研究的重要方向,其核心目标是通过硬件模拟生物神经系统的信息处理机制。与传统冯诺依曼架构相比,神经形态系统在处理时空稀疏信号时展现出显著的能效优势。BrainScaleS-2(BSS-2&#…...