跳到主要内容

BPM 数据库设计总览

BPM负责把业务变更送入审批流程,保存流程设计、执行轨迹和回调处理记录。它决定“审批走到哪里、最终结果是什么”;任务、launcher、黑名单服务各自决定“审批通过后如何让业务草稿生效”。因此,流程实例、节点任务、业务对象是三个不同层次,不能把它们的ID或状态混用。

本次测试环境实测 56张MySQL表、789列、46项物理外键:9张bpm_*业务扩展表共142列,47张Flowable框架表共647列。9个自定义DO均找到实际表;框架表由Flowable管理,没有要求项目逐表编写DO。完整物理字段、索引、空值和约束见ik_yudao_bpm结构附录。

数据源与证据边界​

项目本次确认
MySQLmaster → datasource.bpm → ik_yudao_bpm;配置入口doc/数据库设计管理/nacos/bpm-server.yaml:10
业务Mapper9个Mapper使用默认数据源;未发现另一个@DS业务路由
FlowableRepositoryService、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/。

业务阅读路径​

  1. 表单、模型与部署:设计内容如何变成可发起的版本,为什么需要配置快照。
  2. 流程实例、节点审批与业务回调:业务ID、流程ID、节点ID和消息ID的不同职责。
  3. Flowable框架存储分层:47张引擎表的完整归属、生命周期和物理外键。
  4. 完整源码字段映射与差异:9个DO的全部字段、继承字段、额外列、实现差异与维护边界。

Mermaid Diagram Code:

flowchart LR
  F[bpm_form 表单设计] --> M[act_re_model 流程模型]
  M --> D[部署与流程定义]
  D --> S[bpm_process_definition_info 配置快照]
  D --> I[流程实例与节点任务]
  B[task / launcher / blacklist 业务申请] -->|businessKey| I
  I --> H[历史轨迹与审批意见]
  I --> E[bpm_instance_status_message 回调记录]
  E --> K[Kafka 状态事件]
  K --> V[业务服务更新自己的草稿与有效态]
  V -->|结果回执| E

图示是业务流程,不代表每条箭头都有外键或跨服务事务。自定义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:17id,name,code,description,status,sort分类主键、名称、业务编码、说明、状态、排序
bpm_form / definition/BpmFormDO.java:22id,name,status,conf,fields,remark表单标识与状态、设计配置、字段数组及备注;fields→List<String>,经 JacksonTypeHandler
bpm_process_expression / definition/BpmProcessExpressionDO.java:14id,name,status,expression表达式模板ID、名称、启停和表达式内容
bpm_process_listener / definition/BpmProcessListenerDO.java:20id,name,status,type,event,value_type,value监听器模板、启停、执行或任务类型、触发事件、实现值类型与实现内容
bpm_user_group / definition/BpmUserGroupDO.java:22id,name,description,status,user_ids用户组配置;user_ids→Set<Long>,经 JacksonTypeHandler,成员逻辑指向 system 用户
bpm_oa_leave / oa/BpmOALeaveDO.java:23id,user_id,type,reason,start_time,end_time,day,status,process_instance_id请假单、申请人、类型、原因、起止时间、天数、流程结果和实例关联
bpm_process_instance_copy / task/BpmProcessInstanceCopyDO.java:20id,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:14id,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_fieldsformFields,Jackson List<String> 字段快照
form_custom_create_path,form_custom_view_path自定义业务表单的创建/查看路由
simple_model简易设计器发布内容快照
start_user_ids,manager_user_idsstartUserIds/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时,应同步维护设计页、该差异清单及结构附录。

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答