Candidate-users 候选人
在流程定义中在任务结点的 assignee 固定设置任务负责人,在流程定义时将参与者固定设置在.bpmn 文件中,如果临时任务负责人变更则需要修改流程定义,系统可扩展性差。
针对这种情况可以给任务设置多个候选人,可以从候选人中选择参与者来完成任务
设置任务候选人
在流程图中任务节点的配置中设置candidate-users(候选人),多个候选人之间用逗号分开。
改成xml形式查看
可以看到总经理的审核人已经设置为 wangwu,qingqi这样的一组候选人,可以使用
activiti:candiateUsers=”用户1,用户 2,用户 3”的这种方式来实现设置一组候选人。
组任务办理流程
- 第一步:查询组任务
- 指定候选人,查询该候选人当前的待办任务。候选人不能办理任务。
- 第二步:拾取(claim)任务
- 该组任务的所有候选人都能拾取。
- 将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
- 如果拾取后不想办理该任务?
- 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
- 第三步:查询个人任务第四步:办理个人任务
- 查询方式同个人任务部分,根据assignee 查询用户负责的个人任务。
用户查询组任务
根据候选人查询组任务,前提是你到这一步了,如我的到‘总经理审批’这一步才能查到
1 @Test
2 public void findGroupTaskList() {
3
4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
5 // 流程定义key
6 String processDefinitionKey = "groupTask";
7 // 任务候选人
8 String candidateUser = "wangwu";
9 // 创建TaskService
10 TaskService taskService = processEngine.getTaskService();
11 //查询组任务
12 List<Task> list = taskService.createTaskQuery()//
13 .processDefinitionKey(processDefinitionKey)//
14 .taskCandidateUser(candidateUser)//根据候选人查询
15 .list();
16 for (Task task : list) {
17 System.out.println(" ");
18 System.out.println("流程实例id:" + task.getProcessInstanceId()); System.out.println(" 任 务 id:" + task.getId()); System.out.println(" 任 务 负 责 人 :" + task.getAssignee()); System.out.println("任务名称:" + task.getName());
19
20 }
21 }
用户拾取组任务
候选人员拾取组任务后该任务变为自己的个人任务。
1 @Test
2 public void claimTask(){
3 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
4 TaskService taskService = processEngine.getTaskService();
5 //要拾取的任务id
6 String taskId = "5002";
7 //任务候选人id
8 String userId = "qingqi";
9 //拾取任务
10 //即使该用户不是候选人也能拾取(建议拾取时校验是否有资格)
11
12 //校验该用户有没有拾取任务的资格
13 Task task = taskService.createTaskQuery()//
14 .taskId(taskId)
15 .taskCandidateUser(userId)//根据候选人查询
16 .singleResult();
17 if(task!=null){ taskService.claim(taskId, userId); System.out.println("任务拾取成功");
18 }
19 }
查看数据库的任务,可以看到总经理审批这个任务的负责人就是qingqi了
说明:即使该用户不是候选人也能拾取,建议拾取时校验是否有资格组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务
用户查询个人待办任务
查询方式同个人任务查询
1 @Test
2 public void findPersonalTaskList() {
3 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
4 // 流程定义key
5 String processDefinitionKey = "groupTask";
6 // 任务负责人
7 String assignee = "qingqi";
8 // 创建TaskService
9 TaskService taskService = processEngine.getTaskService();
10 List<Task> list = taskService.createTaskQuery()//
11 .processDefinitionKey(processDefinitionKey)//
12 .taskAssignee(assignee).list();
13
14 for (Task task : list) {
15 System.out.println("--------------");
16 System.out.println("流程实例ID:"+task.getProcessInstanceId());
17 System.out.println("任务id:" + task.getId());
18 System.out.println("任务负责人:" + task.getAssignee()); System.out.println("任务名称:" + task.getName());
19 }
20 }
查询可以看到总经理审批这个任务的负责人是qingqi
用户办理个人任务
1 /**完成任务*/
2 @Test
3 public void completeTask(){
4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();;
5 //任务ID
6 String taskId = "5002";
7 processEngine.getTaskService().complete(taskId); System.out.println("完成任务:"+taskId);
8 }
说明:建议完成任务前校验该用户是否是该任务的负责人。
归还组任务
如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人
1 // 归还组任务,由个人任务变为组任务,还可以进行任务交接
2 @Test
3 public void setAssigneeToGroupTask() {
4 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
5 // 查询任务使用TaskService
6 TaskService taskService = processEngine.getTaskService();
7 // 当前待办任务
8 String taskId = "5002";
9 // 任务负责人
10 String userId = "qingqi";
11
12 // 校验userId是否是taskId的负责人,如果是负责人才可以归还组任务
13 Task task = taskService.createTaskQuery().taskId(taskId)
14 .taskAssignee(userId).singleResult();
15
16 if (task != null) {
17 // 如果设置为null,归还组任务,该 任务没有负责人
18 taskService.setAssignee(taskId, null);
19
20 }
21
22 }
程序没有报错
查看数据库的总经理审批的负责人还是不是qingqi
可以看到总经理审批的负责人已经变为空了,说明归还任务成功,这个时候就可以从新选择负责人
任务交接
任务交接,任务负责人将任务交给其它候选人办理该任务
可以看到现在是qingqi,我现在想把这个任务交接个wangwu
1 /** 2 * 任务交接 3 */ 4 @Test 5 public void taskReturn(){ 6 //获取ProcessEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取TaskService对象 9 TaskService taskService = processEngine.getTaskService(); 10 //查询到自己的任务,然后通过任务ID进行提交 11 Task task = taskService.createTaskQuery().processDefinitionKey("groupTask").taskAssignee("qingqi").singleResult(); 12 13 if(task!=null){ 14 //任务退回 任务ID null代表没有处理人执行,需要后续再次拾取任务 15 //任务交接 任务ID 如果第二个参数,处理人不为空代表将该任务交给次处理人 16 taskService.setAssignee(task.getId(),"wangnan"); 17 System.out.println("任务退回"); 18 } 19 }