Activiti7之组任务


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

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM