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     }
任务交接

 

 

 

 

posted on 2020-04-07 20:36  wishsaber  阅读(3300)  评论(1编辑  收藏  举报