4.1 任务办理人,任务候选人,任务候选组

1.定义描述

1.1 任务办理人:assignee

  • 办理人只能指定一个人,不能使用逗号分隔。
  • 默认执行签收操作taskService.claim(taskId, currentUserId); 
  • 在ACT_HI_TASKINST和ACT_RU_TASK会产生数据,这两个表里面的Assignee_字段就是设置的办理人姓名或者对象的ID

1.2 候选用户:candidateUsers

  • 可以使用activiti:candiateUsers=”用户 1,用户 2,用户 3”的这种方式来实现设置一组候选人。
  • 候选用户设置办理人不是很多的情况下使用,而且需要签收,
  •  也就是说我们常说的抢件模式,设置候选组的前提是没有指定Assignee,(即没有执行签收操作)。
  • 设置候选用户需要主动签收taskService.claim(taskId, currentUserId);

1.3 候选用户组:candidateGroups

  • 可以使用activiti:candidateGroups=”用户组1,用户组2,用户组3”的这种方式来实现设置一组候选人。
  • 候选组,这个就是这只办理角色或者办理岗位,适合使用在办理人比较多的情况下,而且涉及到几个部门的情形。
  • 候选组与候选用户类似,只是要获取候选用户,需要根据候选组找到对应的用户
  • 设置候选组需要主动签收taskService.claim(taskId, currentUserId);

1.4 bpmn文件中描述如下

<process id="prjAuditeProcess" name="项目审批模型" isExecutable="true">   
    <userTask id="streeAudite" name="办事处审批" activiti:assignee="zhangsan"></userTask>    
    <userTask id="areaAudite" name="县区审批" activiti:candidateUsers="zhangsan,lisi"></userTask>
    <userTask id="cityAudite" name="市审批" activiti:candidateGroups="leader,shuji"></userTask>
  </process>

2. 如何办理办理人assignee的任务

根据代理人assignee的名称,流程定义的key查询代理人任务列表(无并发的情况下,只有一条)


        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.查询当前用户xiaozhang的任务(单条任务,不考虑并发)
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("holiday5")
                .taskAssignee("xiaozhang")
                .singleResult();
​
        //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("用户任务执行完毕...");
        }
​
        //5.输出任务的id
        System.out.println(task.getId());

3. 如何办理候选用户candidateUsers的任务

先根据候选用户查询任务,然后该用户拾取(也叫签收)任务,最后办理任务

==========================================================
第一步:根据当前用户查询作为候选用户的任务

    //1.得到ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //2.得到TaskService对象
    TaskService taskService = processEngine.getTaskService();
    //3.设置一些参数,流程定义的key,候选用户
    String key = "holiday5";
    String candidateUsers = "zhangsan";
​
    //4.执行查询
    List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateUser(candidateUsers)//设置候选用户
                .list();
        
    //5.输出
    for (Task task : list) {
        System.out.println(task.getProcessInstanceId());
        System.out.println(task.getId());
        System.out.println(task.getName());
        System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
    }

==========================================================
第二步:将第一步查询到的任务拾取(领取,签收)操作

    Task task = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskCandidateUser(candidateUsers)//设置候选用户
                    .singleResult();
    if (task != null) {
        taskService.claim(task.getId(), candidateUsers);//第一个参数任务ID,第二个参数为具体的候选用户名   此处可以try catch下,如果该任务已经被其他人拾取,会报异常,此时可以给前端展示任务已被拾取
        System.out.println("任务拾取完毕!");
    }

==========================================================
第三步:此时可以查询办理人,完成任务

       //设置一些参数,流程定义的key,用户
        String key = "holiday5";
        String assignee = "zhangsan";
​
        //执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        
        //执行当前的任务
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("任务执行完毕!");
        }

4. 如何办理候选组candidateGroups的任务

候选组任务的办理和候选人的用户办理一样。只是在查询的时候,当前用户所在的组先通过业务系统查询出来。查询任务的时候,指定查询条件为组:

==========================================================
第一步:根据当前用户查询作为候选用户的任务

    //1.得到ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //2.得到TaskService对象
    TaskService taskService = processEngine.getTaskService();
    //3.设置一些参数,流程定义的key,候选用户
    String key = "holiday5";
    String loginUser = "zhangsan";
    String candidateGroup = "leader";
​
    //4.执行查询
    List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskCandidateGroup(candidateGroup )//设置候选用户组,如果有个组参数可以是 List<String>
                .list();
        
    //5.输出
    for (Task task : list) {
        System.out.println(task.getProcessInstanceId());
        System.out.println(task.getId());
        System.out.println(task.getName());
        System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
    }

==========================================================
第二步:将第一步查询到的任务拾取(领取,签收)操作
   //设置一些参数,流程定义的key,候选用户
    String key = "holiday5";
    String loginUser = "zhangsan";
    String candidateGroup = "leader";
    Task task = taskService.createTaskQuery()
                    .processDefinitionKey(key)
                    .taskCandidateGroup(candidateGroup)//设置候选用户组                    .singleResult();
    if (task != null) {
        taskService.claim(task.getId(), loginUser );//第一个参数任务ID,第二个参数为具体的候选用户名。此处可以try catch下,如果该任务已经被其他人拾取,会报异常,此时可以给前端展示任务已被拾取
        System.out.println("任务拾取完毕!");
    }

==========================================================
第三步:此时可以查询办理人,完成任务

       //设置一些参数,流程定义的key,用户
        String key = "holiday5";
        String assignee = "zhangsan";
​
        //执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        
        //执行当前的任务
        if (task != null) {
            taskService.complete(task.getId());
            System.out.println("任务执行完毕!");
        }
 

细节注意:

    taskService.claim(String taskId,String userId);
    taskService.setAssignee(String taskId, String userId);
都可以实现对任务的认领。两个方法的区别在于执行 claim 方法时会检查该任务是否已被签收,如果已被签收,则会抛出 ActivitiTaskAlreadyClaimedException 异常,其他方面两个方法效果一致。

5. 如何归还组任务,如何交接任务

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

交接:任务负责人将任务交给其它候选人办理该任务

我们可以重新依次执行上面的流程,然后在zhangsan拾取完任务后,可以去选择归还任务或者交接任务。

归还任务后,回到拾取任务之前的状态,zhangsan和lisi都可以去重新拾取这一工单。

交接可以交接给该流程的其它候选人,该实例中这一流程的候选人为zhangsan和lisi,所以可以选择交接给lisi。交接给lisi后,lisi可以去直接执行任务而不需要去拾取。

    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
​
        //3.设置一些参数,流程定义的key,用户
        String key = "holiday5";
        String assignee = "zhangsan";
​
        //4.执行查询
        Task task = taskService.createTaskQuery()
                .processDefinitionKey(key)
                .taskAssignee(assignee)  //设置任务的负责人
                .singleResult();
        
        //5.判断是否有这个任务
        if (task != null) {
            //如果设置为null,归还组任务,该任务没有负责人
//            taskService.setAssignee(task.getId(), null);
            //交接任务为lisi  ,交接任务就是一个候选人拾取用户的过程
            taskService.setAssignee(task.getId(), "lisi");
            System.out.println("交接任务完成~!");
        }
    }

6. 任务的委托,委托人

在act_ru_task表中OWNER_(委托人),ASSIGNEE_(办理人)两个字段。任务委托一定是任务的代理人assignee如lisi将自己的任务委托给用户zhangsan。

原来表中:ASSIGNEE_=lisi    OWNER_=null

委托后:ASSIGNEE_=zhangsan    OWNER_=lisi

务必理解:OWNER_是委托前的办理人

 

代码如下:

    /**
     * @param taskId 需要被委托的任务id
     * @param userId 需要设为新的受理人的用户id
     */
    void delegateTask(String taskId,String userId)

参考资料:

activiti自定义代理人、候选人、候选组选择_jrn1012的专栏-CSDN博客_activiti代理人候选人候选组作用

Activiti工作流之设置任务候选人_yfy的博客-CSDN博客_activiti 设置候选人

Activiti工作流之设置任务候选人_yfy的博客-CSDN博客_activiti 设置候选人

activiti 中的签收与委托 操作_小虾记事-CSDN博客_activiti claim

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青苔猿猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值