Skip to content

业务表单字段权限

RuoYi Office 扩展功能:支持在流程设计器中按审批节点动态配置业务表单字段的只读、编辑、隐藏权限,无需修改代码。

1. 功能概述

业务表单(CUSTOM 类型)字段权限配置是 RuoYi Office 对工作流引擎的重要扩展。

1.1 解决的问题

原始方案中,业务表单的字段权限需要在代码中硬编码 nodeKeyName 来区分不同审批节点的显示逻辑:

  • 每个新流程节点都需要修改前端代码
  • 字段权限与代码耦合,维护成本高
  • 流程调整后需要重新部署
  • 不支持在设计器中可视化配置

1.2 新方案优势

  • 零代码配置:在流程设计器中拖拽配置,无需写代码
  • 按节点独立控制:每个审批节点可以有不同的字段权限
  • 实时生效:配置发布后即时生效,无需重新部署
  • 支持主表和明细表:主表字段和 VxeTable 明细表字段均可配置

1.3 权限类型

权限类型效果
只读字段可见但不可编辑(灰色禁用状态)
可编辑字段可见且可编辑(审批人可修改数据)
隐藏字段完全不显示(从页面移除)

2. 配置步骤

第一步:导入数据模型

进入「基础设施 → 代码生成」页面,确认业务表单对应的数据库表已导入。

说明

  • 数据模型是字段权限配置的基础,系统通过它获取字段列表
  • 每个业务表单对应一个主表
  • 如有明细表,也需一并导入

第二步:关联数据模型到流程

在「流程中心 → 流程模型」中编辑流程,在「表单设计」步骤:

  1. 表单类型选择「业务表单」
  2. 在「关联数据模型」中选择对应的数据表

第三步:配置各节点的字段权限

切换到「流程设计」步骤,点击审批节点,在右侧面板的「表单字段权限」Tab 中配置:

需要配置的节点

  • 发起人节点:控制制单人看到的字段
  • 每个审批节点:控制审批人看到的字段
  • 查看节点:控制流程结束后查看人看到的字段

第四步:发布流程

配置完成后发布流程,字段权限立即生效。

3. 技术架构

3.1 整体架构

流程设计器 → 配置字段权限 → 保存到 bpm_process_definition_info.form_field_permission_snapshots

运行时 → 前端请求权限配置 → 后端返回当前节点的字段权限 → 前端动态渲染

3.2 数据存储

字段说明
bpm_process_definition_infoform_field_permission_snapshots字段权限快照(JSON)
bpm_process_definition_infocodegen_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 定义
});

工作原理:

  1. 从后端获取当前节点的字段权限配置
  2. BasicForm 的 schema 合并
  3. 根据权限类型动态调整字段的 disabled(只读)或 v-if(隐藏)
  4. 返回处理后的 resolvedSchema

3.4 后端 API

接口说明
GET /admin-api/bpm/process-definition/field-permission获取当前节点的字段权限配置
PUT /admin-api/bpm/model/update-field-permission更新字段权限配置(设计时)

4. 常见场景

场景一:审批人回填数据

审批人需要在审批时补填某些字段(如审批金额、审批意见):

  • 发起人节点:该字段设为「隐藏」
  • 审批节点:该字段设为「可编辑」

场景二:隐藏敏感信息

某些字段(如金额、个人信息)只对特定节点可见:

  • 需要查看的节点:设为「只读」
  • 不需要的节点:设为「隐藏」

场景三:精简制单表单

创建单据时只显示必填字段:

  • 发起人节点:非必填字段设为「隐藏」
  • 审批节点:显示完整信息(设为「只读」)

5. 历史单据迁移

对于已有的硬编码 nodeKeyName 方案的业务表单,可以逐步迁移到动态字段权限方案。

迁移步骤

  1. 确认流程 Key:找到表单对应的 processDefinitionKey
  2. 修改 index.vue(约 6 处改动):
    • 引入 useBusinessFieldPermission
    • 替换硬编码的权限逻辑
    • 使用 resolvedSchema 替代原有 schema
  3. 在设计器中配置:为每个节点配置字段权限
  4. 发布并验证:测试制单、审批、查看三个场景

工作量评估

每个表单迁移约需修改 ~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: 未配置的字段默认显示为「只读」。