流程节点字段权限配置及业务实现

配置

控制台 > 应用 > 套件配置 > 流程配置

勾选需要控制的节点权限(编辑、隐藏),注:隐藏配置大于编辑配置,即同一字段同一节点同时配置编辑、隐藏权限,则以隐藏配置为准

编辑:多选,在流程审批流转到指定节点时,可编辑选择的字段内容
隐藏:多选,在流程审批流转到指定节点时,隐藏选择的字段内容

勾选完成后,点击【保存并发布】以便流程配置生效

业务实现

前端

流程传递参数data对象将添加两个属性:procDefIdtaskIdedithide

procDefId:流程定义ID
taskId:流程节点定义ID
edit:当前流程节点可编辑字段
hide:当前流程节点隐藏信息字段

 {
    "procDefId": "P_xxx:xxx",
    "taskId": "sid-xxx",
    "edit": [ //当前流程节点可编辑字段
      "name",
      "days",
      "start_time",
      "startTime",    //数据字段驼峰兼容
      "end_time",
      "endTime",
      "reason"
    ],
    "hide": [ //当前流程节点隐藏内容字段
      "tenant_id",
      "tenantId"
    ]
  }

通过传递参数edit属性设置字段对应控件的编辑/只读状态,以及字段必填检验

data() {
    return {
      ...
      rulesTemplate: {    //必填检验模板
        name: [{
          required: true,
          message: '请输入姓名',
          trigger: 'blur'
        }],
        days: [{
          required: true,
          message: '请输入请假天数',
          trigger: 'blur'
        }],
        startTime: [{
          required: true,
          message: '请选择开始时间',
          trigger: 'change'
        }],
        endTime: [{
          required: true,
          message: '请选择结束时间',
          trigger: 'change'
        }],
        reason: [{
          required: true,
          message: '请输入请假原因',
          trigger: 'blur'
        }],
      },
      rules:{}    //真正用于必填检验的规则对象
    }
  },
  computed: {
    editFields () {
      let edit = this.data.edit || []
      this.rules = {}
      edit.forEach((field) => {
        let rule = this.rulesTemplate[field]
        if (rule) {
            this.rules[field] = rule
        }
      })
      return edit
    },
    hideFields () {
      return this.data.hide || []
    }
  },

可编辑控件控制:

<el-form-item label="姓名" prop="name">
  <el-input v-model="form.name" placeholder="请输入姓名" :maxlength="50" clearable v-if="editFields.includes('name')" :style="{width: '100%'}"></el-input>
  <div v-else v-text="form.name"></div>
</el-form-item>

为了杜绝接口返回数据中显式展示了hide中配置隐藏内容信息,应在后端源头进行内容隐藏处理
改造前端获取表单详情接口,添加procDefIdtaskId参数的传递

// params中添加参数传递:procDefId: this.data.procDefId, taskId: this.data.taskId
this.$REQUEST({
    url: `/xxx-api/xxx`,
    method: "GET",
    params: {
        id: this.data.id,
        procDefId: this.data.procDefId,
        taskId: this.data.taskId,
    },
}).then((res) => {
    // TODO:填充表单数据
    this.form = res.data
    this.hideFields.forEach((field) => this.form[field] = "***")
    // 返回数据给流程中心
    this.$emit("form", this.form)
    this.loading = false
})

注意:this.hideFields.forEach((field) => this.form[field] = "***"),因后端除了字符类型是无法设置***值,所以需要到前端进行设置,***值可根据项目需求自定义;相应的,在保存时要使用this.hideFields.forEach((field) => this.form[field] = null)设置隐藏字段值,避免后端错误将***值保存到业务数据。
此处仅提供参考,在实际中可更严谨对待,例如后端保存时再次获取可编辑、隐藏字段,对只读、隐藏字段进行屏蔽更新等

后端

pom.xml中引入流程处理common包

<dependency>
    <groupId>cn.flyrise</groupId>
    <artifactId>pai-api-flow</artifactId>
</dependency>

接收改造

@ApiOperation("获取单条记录")
@GetMapping
// 仅作演示用,可自行创建实体对象,以@RequestBody的方式接收;修改原有流程时建议设置`procDefId`、`taskId`为非必填,兼容旧流程
public Reply<BizVO> query(@RequestParam("id") String id, @RequestParam(value = "procDefId", required = false) String procDefId, @RequestParam(value = "taskId", required = false) String taskId) {
  return Reply.success(this.bizService.findById(id, procDefId, taskId));
}

隐藏字段内容

// 引入流程服务类
@Resource
private IFlowService flowService;

// 隐藏字段内容,BizVO.class为业务数据对象类型, biz为业务数据对象,设置为null的原因是非字符类型无法设置【***】值

// 方式一,直接调用`hideFields`方法, 设置隐藏内容字段的值为null:

flowService.hideFields(procDefId, taskId, BizVO.class, biz);

// 方式二,可调用`getTaskPermission`获取隐藏内容字段配置,进行某些自定义设置:
if (CharSequenceUtil.isNotBlank(procDefId)) {
    TaskPermission permission = FeignUtil.get(flowService.getTaskPermission(procDefId, taskId, FROM_IN));
    for (String field : permission.getHide()) {
        // 自定义设置
    }
}

以tenantId为例,其值原为13xxxxxxxxx,通过设置后值为null,即从源头上保证了字段内容隐藏

{
  "code": "200",
  "data": {
    "id": "1673211184362086401",
    "name": "张三",
    "days": 2,
    "startTime": "2023-06-25T16:00:00.000+00:00",
    "endTime": "2023-06-27T16:00:00.000+00:00",
    "reason": "办理证件",
    "tenantId": null,
    "parkId": "1309331342667943937",
    "isDeleted": 0,
    "status": null,
    "createBy": "1309373096079265792",
    "createTime": "2023-06-26T06:06:48.000+00:00",
    "updateBy": "1309373096079265792",
    "updateTime": "2023-06-26T06:06:48.000+00:00"
  },
  "time": 1687771172439,
  "msg": "操作成功",
  "annex": null,
  "success": true,
  "ok": true
}
文档更新时间: 2023-06-30 10:34   作者:陆鸿睿