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 }