流程节点字段权限配置及业务实现
配置
控制台 > 应用 > 套件配置 > 流程配置
勾选需要控制的节点权限(编辑、隐藏),注:隐藏配置大于编辑配置,即同一字段同一节点同时配置编辑、隐藏权限,则以隐藏配置为准
编辑:多选,在流程审批流转到指定节点时,可编辑选择的字段内容
隐藏:多选,在流程审批流转到指定节点时,隐藏选择的字段内容
勾选完成后,点击【保存并发布】以便流程配置生效
业务实现
前端
流程传递参数data
对象将添加两个属性:procDefId
、taskId
、edit
、hide
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
中配置隐藏内容信息,应在后端源头进行内容隐藏处理
改造前端获取表单详情接口,添加procDefId
、taskId
参数的传递
// 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
}