user task 是最常用的任务,当流程到达用户任务时,用户任务将会被分配到特定用户或者用户组。
任务候选人是指有权限对该任务进行操作的潜在用户群体,这个群体有权限去处理或完成该任务。
任务受理人指真正执行该任务的人,一个可以有多个任务候选人,但是只能有一个任务受理人。
1.设置任务候选人
代码设置
//设置候选人 taskService.addCandidateUser(...) //设置组别 taskService.addCandidateGroup(...)
xml配置
<userTask id="usertask1" name="Task1"> <potentialOwner> <resourceAssignmentExpression> <formalExpression>
user(angus), group(management), boss <!--不使用user或group时,直接被视作用户组的ID--> </formalExpression> </resourceAssignmentExpression> </potentialOwner> </userTask>
查看:
// 根据用户组查询任务 List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("boss").list(); System.out.println("分配到boss用户组下的任务数量:" + tasks.size()); // 根据用户查询任务 tasks = taskService.createTaskQuery().taskCandidateUser("angus").list(); System.out.println("用户angus下的任务数量为:" + tasks.size());
注:指定的用户组或用户,并不需要一定要在表中存在。
2.设置任务受理人
代码
//对应ACT_RU_TASK的ASSIGNEE_字段 taskService.setAssignee(...)
xml配置
<userTask id="usertask1" name="Task 1"> <humanPerformer> <resourceAssignmentExpression> <formalExpression>user1</formalExpression> </resourceAssignmentExpression> </humanPerformer> </userTask>
查看可用 taskQuery.taskAssignee(...)
3.使用acitivi权限分配扩展(activiti:assignee/activiti:candidateUsers/activiti:candidateGroups)
<userTask id="usertask1" name="Assignee" activiti:assignee="user1"></userTask> <userTask id="usertask2" name="Candidate User" activiti:candidateUsers="user1,user2"></userTask> <userTask id="usertask3" name="Candidate Group" activiti:candidateGroups="group1,group2"></userTask>
4.业务系统中,用户组或用户都有可能发生变化,这时可编写任务监听器进行动态权限分配
4.1实现TaskListener接口
public class UserTaskListener implements TaskListener { public void notify(DelegateTask delegateTask) { System.out.println("使用任务监听器设置任务权限"); delegateTask.setAssignee("user1"); delegateTask.addCandidateGroup("group1"); } }
4.2配置监听
<userTask id="usertask1" name="Assignee"> <extensionElements> <activiti:taskListener event="create" <!--任务创建的时候执行--> class="org.bestmyself.activiti.UserTaskListener"> </activiti:taskListener> </extensionElements> </userTask>
查看:List<Task> tasks = taskService.createTaskQuery().taskAssignee("user1").list();
5.使用JUEL分配权限(activiti默认支持juel)
<userTask id="usertask2" name="Task 1" activiti:assignee="${authService.getUserAssignee()}"> </userTask> <userTask id="usertask3" name="Task 2" activiti:candidateUsers="${authService.getCandidateUsers()}"> </userTask> <userTask id="usertask4" name="Task 3" activiti:candidateGroups="${authService.getCandidateGroups()}"> </userTask> <userTask id="usertask5" name="Task 4" activiti:assignee="${authService.lastUser}"> <!--要有相应的getter/setter方法--> </userTask>
注:authService实例需要设置到流程参数中
Map<String, Object> vars = new HashMap<String, Object>(); vars.put("authService", new AuthService()); // 启动流程,将authservice实例序列化到act_ge_bytearray中 ProcessInstance pi = runtimeService.startProcessInstanceByKey("process1", vars);