业务表单字段权限
RuoYi Office 扩展功能:支持在流程设计器中按审批节点动态配置业务表单字段的只读、编辑、隐藏权限,无需修改代码。
1. 功能概述
业务表单(CUSTOM 类型)字段权限配置是 RuoYi Office 对工作流引擎的重要扩展。
1.1 解决的问题
原始方案中,业务表单的字段权限需要在代码中硬编码 nodeKeyName 来区分不同审批节点的显示逻辑:
- 每个新流程节点都需要修改前端代码
- 字段权限与代码耦合,维护成本高
- 流程调整后需要重新部署
- 不支持在设计器中可视化配置
1.2 新方案优势
- 零代码配置:在流程设计器中拖拽配置,无需写代码
- 按节点独立控制:每个审批节点可以有不同的字段权限
- 实时生效:配置发布后即时生效,无需重新部署
- 支持主表和明细表:主表字段和 VxeTable 明细表字段均可配置
1.3 权限类型
| 权限类型 | 效果 |
|---|---|
| 只读 | 字段可见但不可编辑(灰色禁用状态) |
| 可编辑 | 字段可见且可编辑(审批人可修改数据) |
| 隐藏 | 字段完全不显示(从页面移除) |
2. 配置步骤
第一步:导入数据模型
进入「基础设施 → 代码生成」页面,确认业务表单对应的数据库表已导入。
说明:
- 数据模型是字段权限配置的基础,系统通过它获取字段列表
- 每个业务表单对应一个主表
- 如有明细表,也需一并导入
第二步:关联数据模型到流程
在「流程中心 → 流程模型」中编辑流程,在「表单设计」步骤:
- 表单类型选择「业务表单」
- 在「关联数据模型」中选择对应的数据表
第三步:配置各节点的字段权限
切换到「流程设计」步骤,点击审批节点,在右侧面板的「表单字段权限」Tab 中配置:
需要配置的节点:
- 发起人节点:控制制单人看到的字段
- 每个审批节点:控制审批人看到的字段
- 查看节点:控制流程结束后查看人看到的字段
第四步:发布流程
配置完成后发布流程,字段权限立即生效。
3. 技术架构
3.1 整体架构
流程设计器 → 配置字段权限 → 保存到 bpm_process_definition_info.form_field_permission_snapshots
↓
运行时 → 前端请求权限配置 → 后端返回当前节点的字段权限 → 前端动态渲染3.2 数据存储
| 表 | 字段 | 说明 |
|---|---|---|
| bpm_process_definition_info | form_field_permission_snapshots | 字段权限快照(JSON) |
| bpm_process_definition_info | codegen_table_id | 关联的代码生成表 ID |
3.3 前端实现
核心 composable:useBusinessFieldPermission
typescript
// 使用方式
import { useBusinessFieldPermission } from '@/views/bpm/composables/useBusinessFieldPermission';
const { resolvedSchema, fieldsPermissionReady } = useBusinessFieldPermission({
processInstanceId,
taskId,
activityId,
formSchemas, // BasicForm 的 schema 定义
});工作原理:
- 从后端获取当前节点的字段权限配置
- 与
BasicForm的 schema 合并 - 根据权限类型动态调整字段的
disabled(只读)或v-if(隐藏) - 返回处理后的
resolvedSchema
3.4 后端 API
| 接口 | 说明 |
|---|---|
GET /admin-api/bpm/process-definition/field-permission | 获取当前节点的字段权限配置 |
PUT /admin-api/bpm/model/update-field-permission | 更新字段权限配置(设计时) |
4. 常见场景
场景一:审批人回填数据
审批人需要在审批时补填某些字段(如审批金额、审批意见):
- 发起人节点:该字段设为「隐藏」
- 审批节点:该字段设为「可编辑」
场景二:隐藏敏感信息
某些字段(如金额、个人信息)只对特定节点可见:
- 需要查看的节点:设为「只读」
- 不需要的节点:设为「隐藏」
场景三:精简制单表单
创建单据时只显示必填字段:
- 发起人节点:非必填字段设为「隐藏」
- 审批节点:显示完整信息(设为「只读」)
5. 历史单据迁移
对于已有的硬编码 nodeKeyName 方案的业务表单,可以逐步迁移到动态字段权限方案。
迁移步骤
- 确认流程 Key:找到表单对应的
processDefinitionKey - 修改
index.vue(约 6 处改动):- 引入
useBusinessFieldPermission - 替换硬编码的权限逻辑
- 使用
resolvedSchema替代原有 schema
- 引入
- 在设计器中配置:为每个节点配置字段权限
- 发布并验证:测试制单、审批、查看三个场景
工作量评估
每个表单迁移约需修改 ~30 行代码,主要集中在 index.vue 中。
6. 二次开发指南
前端接入核心代码
vue
<script setup lang="ts">
import { useBusinessFieldPermission } from '@/views/bpm/composables/useBusinessFieldPermission';
const { resolvedSchema, fieldsPermissionReady } = useBusinessFieldPermission({
processInstanceId: props.id,
taskId: props.taskId,
activityId: props.activityId,
formSchemas: myFormSchemas,
});
</script>
<template>
<BasicForm v-if="fieldsPermissionReady" :schemas="resolvedSchema" />
</template>明细表(VxeTable)支持
明细表字段同样支持权限控制,通过 resolvedSchema 中的 vxeColumns 部分实现。
7. FAQ
Q: 为什么配置后字段权限没有生效? A: 确认已发布流程。配置修改后需要重新发布才能生效。
Q: 旧流程实例是否受影响? A: 不受影响。权限快照在流程发布时生成,已运行的流程使用发布时的快照。
Q: 是否支持条件字段权限? A: 当前版本为静态配置(按节点),不支持基于条件的动态权限。
Q: 如何处理「未配置」的字段? A: 未配置的字段默认显示为「只读」。