办理人变更
办理人变更
提示
- 审批任务的办理人,通常是在流程设计器中预先设定好办理人,那如果想要在办理过程中修改办理人呢?
1、概念模型
办理人变更分两维:改下个任务 还是 改当前任务。
修改下个任务的办理人
| 方式 | 说明 |
|---|---|
| 动态指定办理人 | 办理人表达式 或 分派监听器,动态修改下个任务的办理人 |
| 角色|部门 id 转用户 id | 办理人权限处理器 转换接口,把角色 / 部门 id 转成用户 id |
流程操作命令设置 nextHandlers | StartCommand、CompleteCommand、RejectCommand、JumpCommand 的 nextHandlers、nextHandlerAppend,指定下个任务的办理人 |
修改当前任务的办理人
| 方式 | 说明 |
|---|---|
| 转办 | 任务转给其他人办理 |
| 委派 | 求助其他人审批,然后参照他的意见决定是否审批通过 |
| 加签 | 办理中途,希望其他人一起参与办理 |
| 减签 | 办理中途,希望某些人不参与办理 |
2、修改下个任务的办理人
2.1、动态指定办理人
流程设计时还不确定谁来办,可以先挂办理人表达式,在本节点之前办理时再传入变量。
- 流程设计时,需要动态指定办理人的节点,配置办理人表达式
${handler1} - 本节点前任意节点办理时,在流程变量中传入
${handler1}的值 - 办理完成会生成本节点任务,并且替换
flow_user表中的表达式

指定一人
// 流程变量
Map<String, Object> variable = new HashMap<>();
variable.put("handler1", "100");
CompleteCommand command = new CompleteCommand();
command.setTaskId(taskId);
command.setVariables(variable);
FlowEngine.workflow().complete(command);指定一群人
// 流程变量
Map<String, Object> variable = new HashMap<>();
variable.put("handler1", Arrays.asList(4, "5", 100L));
CompleteCommand command = new CompleteCommand();
command.setTaskId(taskId);
command.setVariables(variable);
FlowEngine.workflow().complete(command);SpEL 表达式
/**
* 用户类
*/
@Component("user")
public class User {
/**
* spel办理人表达式
* @param handler2 办理人
* @return String
*/
public String evalVar(String handler2) {
return handler2;
}
}
// 流程变量
Map<String, Object> variable = new HashMap<>();
variable.put("handler2", "101");
CompleteCommand command = new CompleteCommand();
command.setTaskId(taskId);
command.setVariables(variable);
FlowEngine.workflow().complete(command);2.2、角色|部门 id 转用户 id
/**
* 办理人权限处理器(可通过配置文件注入,也可用@Bean/@Component方式)
*
* @author shadow
*/
@Component
public class CustomPermissionHandler implements PermissionHandler {
/**
* 转换办理人,比如设计器中预设了能办理的人,如果其中包含角色或者部门id等,可以通过此接口进行转换成用户id
* permissions:{role:1,dept:1}
*/
@Override
public List<String> convertPermissions(List<String> permissions) {
// 把角色、部门转换成用户
// permissions:{role:1, dept:1} ---> {1, 2, 100}
......
return Arrays.asList("1", "2", "100");
}
}完整接口说明见 办理人权限处理器。
2.3、流程操作命令设置 nextHandlers
StartCommand、CompleteCommand、RejectCommand、JumpCommand 都有 nextHandlers、nextHandlerAppend。它只指定下一个任务的办理人,不会改变跳转目标。
引擎生成下个任务办理人时的顺序:先替换办理人表达式,再走 PermissionHandler.convertPermissions,最后应用 nextHandlers。nextHandlerAppend 为 false(默认)时覆盖前面算出的办理人,为 true 时追加。
跳转目标节点用 JumpCommand.targetNodeCode(必传),退回目标用 RejectCommand.targetNodeCode(按需)。完整字段见 接口文档。
CompleteCommand command = new CompleteCommand();
command.setTaskId(taskId);
command.setNextHandlers(Arrays.asList("100"));
command.setNextHandlerAppend(false);
FlowEngine.workflow().complete(command);CompleteCommand 字段:
| 字段 | 说明 |
|---|---|
operator | 操作者 OperatorContext(handler / ignorePermission / ignore)[按需传输];办理人权限标识 permissions 由 办理人权限处理器 提供,实现了它则可不传 |
taskId | 流程任务 id [必传] |
message | 审批意见 [按需传输] |
variables | 流程变量 [按需传输] |
flowStatus | 流程实例状态 [按需传输] |
taskStatus | 历史任务状态 [按需传输] |
nextHandlers | 下个任务的办理人 [按需传输] |
nextHandlerAppend | true 追加,false 覆盖,默认 false |
3、修改当前任务的办理人
接口描述见 转办。
注意事项
转办和委派会删除当前办理人。如果节点配置的是角色,这种情况删除不了,当前办理人还能办理。要解决这种问题,请把角色全部转成用户 id,见 转换办理人。
转办
public void transfer() {
TransferCommand command = new TransferCommand();
command.setOperator(new OperatorContext("1"));
command.setTaskId(getTaskId());
// 转办只能指定一个办理人
command.setTargetHandler("2");
command.setMessage("转办");
FlowEngine.workflow().transfer(command);
}委派
public void delegate() {
DelegateCommand command = new DelegateCommand();
command.setOperator(new OperatorContext("1"));
command.setTaskId(getTaskId());
// 委派只能指定一个办理人
command.setTargetHandler("2");
command.setMessage("委派");
FlowEngine.workflow().delegate(command);
}加签
public void addSigner() {
AddSignerCommand command = new AddSignerCommand();
command.setOperator(new OperatorContext("1"));
command.setTaskId(getTaskId());
command.setTargetHandlers(Arrays.asList("1", "2"));
command.setMessage("加签");
FlowEngine.workflow().addSigner(command);
}减签
public void removeSigner() {
RemoveSignerCommand command = new RemoveSignerCommand();
command.setOperator(new OperatorContext("1"));
command.setTaskId(getTaskId());
command.setTargetHandlers(Arrays.asList("1", "2"));
command.setMessage("减签");
FlowEngine.workflow().removeSigner(command);
}