Activiti——组任务

1.组任务

            同一个任务,一组人都可以查看,其中只有一个人可以申请到该任务进行处理(其他人员看不到该任务),如果过程中不想处理了,
            可以将任务退回,这样组内其他人员可再次看到该任务,进行任务申请
            
            在流程图当中,每一个任务环节都有一个Candidate users任务候选人属性,在此属性内,指定执行该任务的一组人,每一个人用 "," 号分割


          

 

流程部署

启动流程实例

 

 

 

2.组任务代办任务流程:

  2.1 查询组任务,但是不能执行

  

 

 

复制代码
    /**
     * 查询组任务
     */
    @Test
    public void getGroupTask() {
        //获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //查询组任务
        List<Task> list = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser("lisi").list();
        for (Task task : list) {
            System.out.println("任务ID:" + task.getId());
            //如果当前不是此任务处理人则处理不了该任务
            /*taskService.complete(task.getId());*/
            System.out.println("任务名称:" + task.getName());
            System.out.println("任务处理人:" + task.getAssignee());    //Null代表 没有处理人说明当前任务没有人拾取
        }
    }
复制代码

没有人拾取时的执行效果:

 

 



  2.2 拾取(claim)任务

  一旦其中一个人拾取了任务,其他人就看不到该任务了

复制代码
    /**
     * 拾取任务
     */
    @Test
    public void claimTask() {
        //获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //获取组任务
        String candidateUser="huaixin";
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskCandidateUser(candidateUser).singleResult();
        //不等于Null代表能够获取到该任务
        if(task!=null){
            //拾取任务   任务ID,任务执行人
            taskService.claim(task.getId(),candidateUser);
            System.out.println("任务被:"+candidateUser+"拾取~");
        }
    }
复制代码

 

 

 

 说明:即使该用户不是候选人也能拾取,建议拾取时校验是否有资格组任务拾取后,该任务已有负责人,通过候选人将查询不到该任务

 

  2.3 查询个人任务并执行

复制代码
    /**
     * 查看任务
     */
    @Test
    public void getTask() {
        //获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //查询到自己的任务,然后通过任务ID进行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("huaixin").singleResult();
        //处理任务
        if(task!=null){
            taskService.complete(task.getId());
            System.out.println("任务处理完毕");
        }
    }
复制代码

 

  2.4 任务退回/交接

    如果个人不想办理该组任务,可以归还组任务,归还后该用户不再是该任务的负责人

复制代码
   /**
     * 任务退回/交接
     */
    @Test
    public void taskReturn(){
        //获取ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //查询到自己的任务,然后通过任务ID进行提交
        Task task = taskService.createTaskQuery().processDefinitionKey("holidayGroup").taskAssignee("huaixin").singleResult();

        if(task!=null){
            //任务退回  任务ID    null代表没有处理人执行,需要后续再次拾取任务
            //任务交接 任务ID     如果第二个参数,处理人不为空代表将该任务交给次处理人
            taskService.setAssignee(task.getId(),null);
            System.out.println("任务退回");
            /*taskService.setAssignee(task.getId(),"lisi");
            System.out.println("任务交接");*/
        }
    }
复制代码

 

 

     退回后再次查询组任务,执行人就都可以看到此任务了

 

说明:建议归还任务前校验该用户是否是该任务的负责人

也可以通过setAssignee   方法将任务委托给其它用户负责,注意被委托的用户可以不是候选人(建议不要这样使用)

 

posted @ 2020-04-07 13:51  怀鑫  阅读(1125)  评论(0编辑  收藏  举报