一、绘制流程图页面配置
1、指定固定审批角色+组织的实现
如上图红框部分,需要修改此处为需求对应。比如此时红框不支持指定某个部门下的指定角色这种组合判断的审批人。则需要修改页面变成选完角色同时也选择上部门统一生成一个group标识。
修改完后,生成类似 ROLE001DEPT130000 的group标识。
在xml中设置 CandidateGroup时,设置为固定值就可以。
2、指定审批人为发起人所在部门的指定角色
此时,用方式1显然不支持,因为发起人是变化的,dept也会跟着变,只能在发起审批流程时读取到传入发起人信息后进行设置。
在xml中设置 CandidateGroup时,需要指定为可变参数,类似下图这种
设置这个参数有几种方式:
2.1直接基于框架进行表单设置
2.2 在后端代码中发起流程这个步骤时,通过setVariable()的方式设置deptId这个参数
二、流程查询时找到对应审批人
我们设置好对应审批人后,还需要在该查到的时候查到,比如 有一个部门d1,里面有 张三-员工 李四-部门领导 两个人。张三发起了一个审批,审批人设置的是本部门领导角色。此时,在李四登录时应该在待办列表里看到这条审批。
查询这块包含了发起中所有情况,因为查的时候要遵循宁可把可能的群组都查,也不能漏掉。
直接上代码吧:
// 定义的一些标识
public class TaskConstants {
/**
* 流程发起人
*/
public static final String PROCESS_INITIATOR = "initiator";
/**
* 角色候选组前缀
*/
public static final String ROLE_GROUP_PREFIX = "ROLE";
/**
* 部门候选组前缀
*/
public static final String DEPT_GROUP_PREFIX = "DEPT";
/**
* 分割符
*/
public static final String SPLIT = "-";
}
/**
* 获取用户组信息,包含了当前所有组合:role、dept、role+dept作为群组
*
* @return candidateGroup
*/
public static List<String> getCandidateGroup() {
List<String> list = new ArrayList<>();
// 获取当前登录人信息,不同框架有不同的获取方法,适当修改
LoginUser user = LoginHelper.getLoginUser();
if (ObjectUtil.isNotNull(user)) {
if (ObjectUtil.isNotEmpty(user.getRoles())) {
user.getRoles().forEach(role -> {
list.add(TaskConstants.ROLE_GROUP_PREFIX + role.getRoleId());
list.add(TaskConstants.ROLE_GROUP_PREFIX + role.getRoleId() + TaskConstants.SPLIT
+ TaskConstants.DEPT_GROUP_PREFIX + user.getDeptId());
});
}
if (ObjectUtil.isNotNull(user.getDeptId())) {
list.add(TaskConstants.DEPT_GROUP_PREFIX + user.getDeptId());
}
}
return list;
}
// 查询待办事项列表
TaskQuery taskQuery = taskService.createTaskQuery()
.active()
.includeProcessVariables()
.taskCandidateOrAssigned(TaskUtils.getUserId())
.taskCandidateGroupIn(TaskUtils.getCandidateGroup())
.orderByTaskCreateTime().desc();