朋也的博客 » 首页 » 文章
作者:朋也
日期:2019-04-24
类别:activiti学习笔记
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
将代理人配置活了, 就可以在程序里动态的指定了, 比如: 今天部门经理是user1, 明天这个部门经理离职了, 又来了个部门经理是 user11 , 那么流程图中的代理人就要更改了, 如果有配置成活的, 就没问题了
动态指定代理人有两种方式
修改流程图
写一个监听类, 实现 TaskListener
接口里的 notify
方法, 在这个方法里可以设置下一个代理人是谁
// 处理提交请假的代理人设置
public class Task1Listener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("user1");
}
}
// 处理部门经理审批的代理人设置
public class Task2Listener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("user2");
}
}
// 处理总经理审批的代理人设置
public class Task3Listener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.setAssignee("user3");
}
}
将 assignee 里的固定值去掉, 然后在Listeners里配置监听类, 三个都要配置上
这样配置好之后, 代码都不用变的, 流程继续执行, 但代理人已经配活了, 我这写了三个监听类来设置代理人, 实际业务中员工一般都有直接领导, 领导也会有上级, 所以这里就不用这样写了, 可以从登录的用户对象里拿到他的上级领导, 然后将上级领导的用户名设置成下一个代理人即可
更改流程图
activiti里支持表达式 ${}
来传入一些变量, 先把所有的 UserTask
的代理人都改成 ${username}
别忘了把监听配置去掉
原链接文:https://atjiu.github.io/2019/04/24/activiti-assignee/
修改代理人处理任务的代码
@Test
public void startProcess() { // 启动流程也要指定一下下一个代理人是谁
// 创建一个Map存放变量
Map<String, Object> variables = new HashMap<>();
// 设置这个流程的下一个代理人是 user1
variables.put("username", "user1");
// 这次调用的方法是三个参数的, 最后一个是放变量的
ProcessInstance instance = runtimeService.startProcessInstanceByKey("AskLeave", "1", variables);
System.out.println("Id: " + instance.getId());
}
查询个人任务还是之间那个方法
用户处理任务的时候也要指定一下下一个代理人是谁, 代码如下
@Test
public void completeTask() {
// 通过查询可以拿到user2的任务id是7502
String taskId = "2505";
// 选通过taskId查询任务
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
// 从任务里拿到流程实例id
String processInstanceId = task.getProcessInstanceId();
// 批注信息
String message = "同意";
Authentication.setAuthenticatedUserId("user1"); // 当前处理任务的用户的userId, 也可以放用户名
// 给任务添加批注
taskService.addComment(taskId, processInstanceId, message);
// 创建一个Map存放变量
Map<String, Object> variables = new HashMap<>();
// 设置这个流程的下一个代理人是 user2
variables.put("username", "user2");
// 处理任务
taskService.complete(taskId, variables);
}
业务简单的话, 变量的方式就够用了
业务复杂的话, 监听的方式更灵活些
写博客不易,转载请保留原文链接,谢谢!