BPM 数据库设计总览
BPM负责把业务变更送入审批流程,保存流程设计、执行轨迹和回调处理记录。它决定“审批走到哪里、最终结果是什么”;任务、launcher、黑名单服务各自决定“审批通过后如何让业务草稿生效”。因此,流程实例、节点任务、业务对象是三个不同层次,不能把它们的ID或状态混用。
本次测试环境实测 56张MySQL表、789列、46项物理外键:9张bpm_*业务扩展表共142列,47张Flowable框架表共647列。9个自定义DO均找到实际表;框架表由Flowable管理,没有要求项目逐表编写DO。完整物理字段、索引、空值和约束见ik_yudao_bpm结 构附录。
数据源与证据边界
| 项目 | 本次确认 |
|---|---|
| MySQL | master → datasource.bpm → ik_yudao_bpm;配置入口doc/数据库设计管理/nacos/bpm-server.yaml:10 |
| 业务Mapper | 9个Mapper使用默认数据源;未发现另一个@DS业务路由 |
| Flowable | RepositoryService、RuntimeService、TaskService、HistoryService管理框架表;依赖声明为7.0.1 |
| Redis | 自定义流程编号计数器bpm:process_id:;本次仅核对源码,未读取Redis |
| TDengine / ES | 当前BPM模块未发现直接实体/Mapper和独立存储对象,不将其他服务的统计索引纳入BPM |
核验日期2026-09-18;依据为当前工作区源码和统一采集的mysql-ik_yudao_bpm.json。未启动流程引擎、未执行编译测试、未读取实例或审批记录,也未验证生产配置。源码默认配置database-schema-update: true、history-level: audit只作为配置证据,不当作当前进程实际生效值或已执行升级证明。
本文Java简称路径均相对ik_project/yudao-cloud/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/;API路径相对ik_project/yudao-cloud/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/。
业务阅读路径
- 表单、模型与部署:设计内容如何变成可发起的版本,为什么需要配置快照。
- 流程实例、节点审批与业务回调:业务ID、流程ID、节点ID和消息ID的不同职责。
- Flowable框架存储分层:47张引擎表的完整归属、生命周期和物理外键。
- 完整源码字段映射与差异:9个DO的全部字段、继承字段、额外列、实现差异与维护边界。
图示是业务流程,不代表每条箭头都有外键或跨服务事务。自定义9张业务表没有物理外键,46项外键都属于引擎表。
BPM 完整源码字段映射与差异
本次对照9个业务DO、对应Mapper、必要Service/监听器及Flowable配置,并与2026-09-18测试库结构快照核对。全部业务表存在,没有发现自定义DO指向缺失表;额外框架对象单列于47张框架表。本页解释字段用途与映射,所有142个业务物理列及647个框架列的类型、长度、默认值和索引见数据库附录。
统一继承与存储方式
9个DO均继承BaseDO:createTime→create_time、updateTime→update_time、creator→creator、updater→updater、deleted→deleted,分别为创建/更新时间、操作者及逻辑删除。实库还各有tenant_id,BaseDO未声明该属性;租户列与公共拦截机制分开解释。业务字段采用下划线列到驼峰属性映射,下表完整列出除这6个公共列外的字段。
BaseDO证据:ik_project/yudao-cloud/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/dataobject/BaseDO.java。@KeySequence是跨数据库注解,不表示本次MySQL库额外存在sequence。未发现本组DO用@TableField(exist=false)排除的业务属性;框架Command类、请求/响应VO不计入实体清单。
全部9个业务模型
DO路径相对Java根的dal/dataobject/,Java根定义见总览。每行字段名均是物理列名,对应同名驼峰Java属性,例外/序列化方式明确标出。
| 实表 / DO证据 | 非公共字段全集 | 业务解释与映射 |
|---|---|---|
bpm_category / definition/BpmCategoryDO.java:17 | id,name,code,description,status,sort | 分类主键、名称、业务编码、说明、状态、排序 |
bpm_form / definition/BpmFormDO.java:22 | id,name,status,conf,fields,remark | 表单标识与状态、设计配置、字段数组及备注;fields→List<String>,经 JacksonTypeHandler |
bpm_process_expression / definition/BpmProcessExpressionDO.java:14 | id,name,status,expression | 表达式模板ID、名称、启停和表达式内容 |
bpm_process_listener / definition/BpmProcessListenerDO.java:20 | id,name,status,type,event,value_type,value | 监听器模板、启停、执行或任务类型、触发事件、实现值类型与实现内容 |
bpm_user_group / definition/BpmUserGroupDO.java:22 | id,name,description,status,user_ids | 用户组配置;user_ids→Set<Long>,经 JacksonTypeHandler,成员逻辑指向 system 用户 |
bpm_oa_leave / oa/BpmOALeaveDO.java:23 | id,user_id,type,reason,start_time,end_time,day,status,process_instance_id | 请假单、申请人、类型、原因、起止时间、天数、流程结果和实例关联 |
bpm_process_instance_copy / task/BpmProcessInstanceCopyDO.java:20 | id,start_user_id,process_instance_name,process_instance_id,process_definition_id,category,activity_id,activity_name,task_id,user_id,reason | 抄送记录、发起人/接收人、流程/活动名称快照、引擎关联及原因 |
bpm_instance_status_message / instancestatusmessage/BpmInstanceStatusMessageDO.java:14 | id,parent_id,message_key,process_instance_id,process_definition_key,process_instance_status,business_key,message,status,retry_count,retry_topic,exception_message,exception_stack_trace | 原始/子消息关联、流程与业务身份、事件JSON、消费结果、补偿次数/主题及错误证据 |
bpm_process_definition_info / definition/BpmProcessDefinitionInfoDO.java:30 | 见下一表 | 27个非公共实库字段,其中25个有当前DO属性,2个未映射 |
定义扩展表完整字段
| 非公共字段 | 当前源码映射与业务含义 |
|---|---|
id,process_definition_id,model_id,model_type | 主键、发布定义、来源模型和设计器类型 |
category,icon,description,visible,sort | 分类及入口展示属性 |
form_type,form_id,form_conf | 表单类型、动态表单来源和发布配置快照 |
form_fields | formFields,Jackson List<String> 字段快照 |
form_custom_create_path,form_custom_view_path | 自定义业务表单的创建/查看路由 |
simple_model | 简易设计器发布内容快照 |
start_user_ids,manager_user_ids | startUserIds/managerUserIds,LongListTypeHandler列表,分别控制发起/管理范围 |
allow_cancel_running_process,auto_approval_type | 撤销控制、自动审批策略 |
process_id_rule,title_setting,summary_setting | 相应Java结构对象经JacksonTypeHandler序列化 |
process_before_trigger_setting,process_after_trigger_setting | 流程前后置通知结构,经JacksonTypeHandler |
task_before_trigger_setting,task_after_trigger_setting | 实库VARCHAR(1024),注释为任务前后置通知;当前DO无属性,本模块未检出对应引用 |
9个Mapper分别为dal/mysql/category/BpmCategoryMapper、definition/BpmFormMapper/BpmProcessDefinitionInfoMapper/BpmProcessExpressionMapper/BpmProcessListenerMapper/BpmUserGroupMapper、oa/BpmOALeaveMapper、task/BpmProcessInstanceCopyMapper、instancestatusmessage/BpmInstanceStatusMessageMapper(均为.java)。全部使用默认master;框架对象经Flowable接口或Command访问,不错误补成业务Mapper。
索引、差异和业务含义
| 核验项 | 已确认事实 | 文档与后续维护边界 |
|---|---|---|
| 自定义表索引 | 9张业务表均仅有PRIMARY(id);没有业务外键 | form_id、process_definition_id、message_key、parent_id、user_id均是逻辑关联/检索字段;不写成数据库唯一或外键 |
| 未映射物理列 | 每张业务表有tenant_id;定义扩展还有2个task通知列 | 租户列保留为公共机制差异,2个通知列保留为当前未确认使用;不补造功能 |
| 消息唯一性 | message_key没有唯一索引,而且同一key可有多个服务子记录 | “消息唯一标识”是事件业务语义;不能对整表加一个想当然的一列唯一约束,也没有验证生成器无碰撞 |
| 消息根状态 | 回执Service先更新根记录,再更新/添加服务子记录 | 根状态不是所有消费者结果聚合;排查时需看retry_topic对应记录 |
| 抄送字段传递 | BpmProcessInstanceCopyServiceImpl.java:56单taskId重载把task.getId(),task.getName()传入下一重载的activityName,taskId位置,:79按入参落相应列 | 静态发现此路径可能将活动名称/任务ID写反;字段业务定义保留,实际历史内容未读取验证,本次不修改代码 |
| 历史级别 | application.yaml实际值为audit,附近注释描述full | 按值说明采集粒度,不承诺保存所有历史细节;运行配置是否覆盖未核验 |
| 业务状态 | PROCESS_STATUS、TASK_STATUS、消息status和外部valid/draft分属不同对象 | 文档按业务层分开解释,不根据字段同名统一状态编码 |
| 引擎身份 | 实库存在act_id_*,当前候选组策略读取bpm_user_group,用户资料经system接口 | 不认定引擎身份表与system用户实时同步;表结构存在不代表已启用 |
源码字段集合已包含继承字段,实际142列中131列可对应DO直接或继承属性,另外9个tenant_id与2个task通知列单列。没有发现业务DO声明列在对应实表中缺失;这里只核对结构,不证明Java类型、JSON历史内容、审批链和数据完整性已运行验证。
本次未调用初始化、部署、发起、审批、重试、忽略、历史删除或引擎迁移接口,也未启动应用。后续业务新增表单字段、修改审批语义、替换回调主题、调整业务ID或升级Flowable时,应同步维护设计页、该差异清单及结构附录。