流程表单设计
不写业务 DO、不写 list/info,用设计器拖控件,把表单挂到模型并发布,大厅就能填。formType = 10。要台账、附件、审批后回写,走 业务表单开发。四步向导见 流程配置。
默认端口 48080,前缀 /admin-api。定义在 bpm_form,接口 @RequestMapping("/bpm/form"),前端 ruoyi-office-vben/apps/web-antd/src/views/bpm/form/。
示意图:定义在 bpm_form;运行时按分类分流存储。
案例:物品申领
演示库已有「通用表单」(模型 key common-form,绑 leave-form),可先打开对照。下面按「物品申领」教新建一笔。名称和字段以你当时库为准,不要编控件 id。不要用 BPM 模块里的硬编码演示 oa_leave(那是 Vue 页,不是 form-create)。
设计表单
菜单 流程中心 → 流程设置 → 流程表单,官方菜单 id 1187,路由 /bpm/manager/form。
- 新建,进设计器
fc-designer-pro。 - 拖:单行文本(物品名称)、数字(数量)、多行文本(用途)、附件。
- 保存:名称「物品申领」,单据类型编码如
OA199,分类选normal(只要变量、不要物理表)。bound再落到指定表,方便 SQL。
按钮权限:bpm:form:create、bpm:form:update、bpm:form:delete。

本系统截图:流程表单定义。操作列是复制、修改、详情、删除。

本系统截图:左侧组件,中间画布,右侧表单配置。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
conf | form-create 表单配置 JSON | BpmFormDO#conf |
fields | 每个控件一条 JSON | BpmFormDO#fields |
billCodePrefix | 单据号前缀 | 发起时生成 |
category | normal 或 bound | 保存弹窗 |
| 设计器 | BpmFormEditor | .../views/bpm/form/designer/index.vue |
业务侧补了 UserSelect、DeptSelect、DictSelect、FileUpload 等,注册在 src/components/form-create/helpers.ts。控件 field 不要撞流程状态、发起人这类保留键。
BpmFormServiceImpl#updateForm 会按 formId 把最新 conf / fields 写回已发布定义。只改控件不必再发一版流程;改节点和审批人必须再发布。
挂到模型
流程中心 → 流程设置 → 流程模型,新建:
- 名称「物品申领」,标识自定且不与已有 key 冲突,流程类型 SIMPLE。
- 表单类型选流程表单,下拉选刚保存的表单。父菜单选业务目录,勿挂「发起流程」。
- 流程设计:发起人 → 部门负责人 → 结束。
- 保存并发布。
到角色「菜单权限」勾上同步出来的列表和创建按钮。打开 发起流程,点卡片本页填写,提交走 POST /admin-api/bpm/process-instance/create。

本系统截图:通用表单第二步。表单类型锁定为流程表单,下拉为已设计的 leave-form。

本系统截图:大厅里流程表单本页填写。用车、用印是业务表单,不要和这类卡片搞混。
bound 提交走 POST /bpm/form-data/v2/save-and-start,索引在 bpm_form_data。
表单类型会锁定
首次发布成功后 formTypeLocked 为真,不能改成业务表单。
表与关键类
CREATE TABLE `bpm_form` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(64) NOT NULL COMMENT '表单名',
`status` tinyint NOT NULL COMMENT '开启状态',
`conf` text NOT NULL COMMENT '表单的配置',
`fields` text NOT NULL COMMENT '表单项的数组',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
`bill_code_prefix` varchar(32) DEFAULT NULL COMMENT '单据类型编码(作为单据编号前缀)',
`category` varchar(32) NOT NULL DEFAULT 'normal' COMMENT '表单分类:normal / bound',
PRIMARY KEY (`id`)
) COMMENT='BPM 表单定义表';发布后 formConf / formFields 冗余到 bpm_process_definition_info,避免改库后老实例找不到当时的字段。bound 绑定在 bpm_form_table_binding。
| 名称 | 说明 | 仓库路径 |
|---|---|---|
| Controller | @RequestMapping("/bpm/form") | ruoyi-office/yudao-module-bpm/.../controller/admin/definition/BpmFormController.java |
| 发起页 | formType === NORMAL 时 setConfAndFields2 | .../processInstance/create/modules/form.vue |
| 菜单同步 | NORMAL 发布时 upsert | BpmProcessFormMenuSyncService |
节点上的字段显隐、只读,流程表单走 BpmFormFieldPermissionController。
怎么选
| 名称 | 适用 | 限制 |
|---|---|---|
流程表单 normal | 临时申请、没有独立台账 | 查询、报表、回写都弱 |
流程表单 bound | 还想用 SQL 查主表 / 明细 | 要维护绑定和字段映射 |
| 业务表单 | 用印、用车等有单据状态和台账 | 按规范写 list / info |
配置与操作
管理员先在 流程表单 画控件并保存,再到模型选流程表单、绑 formId、配菜单后发布。员工从发起大厅填同一套控件。开启见 流程功能设计。
