其他分享
首页 > 其他分享> > 任务办理人,任务候选人,任务候选组

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

作者:互联网

 本文链接地址

1.定义描述

1.1 任务办理人:assignee

1.2 候选用户:candidateUsers

1.3 候选用户组:candidateGroups

1.4 bpmn文件中描述如下

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

 

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

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

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

 

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

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

  1.   ==========================================================
  2.   第一步:根据当前用户查询作为候选用户的任务
  3.    
  4.   //1.得到ProcessEngine对象
  5.   ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  6.   //2.得到TaskService对象
  7.   TaskService taskService = processEngine.getTaskService();
  8.   //3.设置一些参数,流程定义的key,候选用户
  9.   String key = "holiday5";
  10.   String candidateUsers = "zhangsan";
  11.   ​
  12.   //4.执行查询
  13.   List<Task> list = taskService.createTaskQuery()
  14.   .processDefinitionKey(key)
  15.   .taskCandidateUser(candidateUsers)//设置候选用户
  16.   .list();
  17.    
  18.   //5.输出
  19.   for (Task task : list) {
  20.   System.out.println(task.getProcessInstanceId());
  21.   System.out.println(task.getId());
  22.   System.out.println(task.getName());
  23.   System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
  24.   }
  25.    
  26.   ==========================================================
  27.   第二步:将第一步查询到的任务拾取(领取,签收)操作
  28.    
  29.   Task task = taskService.createTaskQuery()
  30.   .processDefinitionKey(key)
  31.   .taskCandidateUser(candidateUsers)//设置候选用户
  32.   .singleResult();
  33.   if (task != null) {
  34.   taskService.claim(task.getId(), candidateUsers);//第一个参数任务ID,第二个参数为具体的候选用户名 此处可以try catch下,如果该任务已经被其他人拾取,会报异常,此时可以给前端展示任务已被拾取
  35.   System.out.println("任务拾取完毕!");
  36.   }
  37.    
  38.   ==========================================================
  39.   第三步:此时可以查询办理人,完成任务
  40.    
  41.   //设置一些参数,流程定义的key,用户
  42.   String key = "holiday5";
  43.   String assignee = "zhangsan";
  44.   ​
  45.   //执行查询
  46.   Task task = taskService.createTaskQuery()
  47.   .processDefinitionKey(key)
  48.   .taskAssignee(assignee) //设置任务的负责人
  49.   .singleResult();
  50.    
  51.   //执行当前的任务
  52.   if (task != null) {
  53.   taskService.complete(task.getId());
  54.   System.out.println("任务执行完毕!");
  55.   }

 

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

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

  1.   ==========================================================
  2.   第一步:根据当前用户查询作为候选用户的任务
  3.    
  4.   //1.得到ProcessEngine对象
  5.   ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  6.   //2.得到TaskService对象
  7.   TaskService taskService = processEngine.getTaskService();
  8.   //3.设置一些参数,流程定义的key,候选用户
  9.   String key = "holiday5";
  10.   String loginUser = "zhangsan";
  11.   String candidateGroup = "leader";
  12.   ​
  13.   //4.执行查询
  14.   List<Task> list = taskService.createTaskQuery()
  15.   .processDefinitionKey(key)
  16.   .taskCandidateGroup(candidateGroup )//设置候选用户组,如果有个组参数可以是 List<String>
  17.   .list();
  18.    
  19.   //5.输出
  20.   for (Task task : list) {
  21.   System.out.println(task.getProcessInstanceId());
  22.   System.out.println(task.getId());
  23.   System.out.println(task.getName());
  24.   System.out.println(task.getAssignee());//为null,说明当前的zhangsan只是一个候选人,并不是任务的执行人
  25.   }
  26.    
  27.   ==========================================================
  28.   第二步:将第一步查询到的任务拾取(领取,签收)操作
  29.   //设置一些参数,流程定义的key,候选用户
  30.   String key = "holiday5";
  31.   String loginUser = "zhangsan";
  32.   String candidateGroup = "leader";
  33.   Task task = taskService.createTaskQuery()
  34.   .processDefinitionKey(key)
  35.   .taskCandidateGroup(candidateGroup)//设置候选用户组 .singleResult();
  36.   if (task != null) {
  37.   taskService.claim(task.getId(), loginUser );//第一个参数任务ID,第二个参数为具体的候选用户名。此处可以try catch下,如果该任务已经被其他人拾取,会报异常,此时可以给前端展示任务已被拾取
  38.   System.out.println("任务拾取完毕!");
  39.   }
  40.    
  41.   ==========================================================
  42.   第三步:此时可以查询办理人,完成任务
  43.    
  44.   //设置一些参数,流程定义的key,用户
  45.   String key = "holiday5";
  46.   String assignee = "zhangsan";
  47.   ​
  48.   //执行查询
  49.   Task task = taskService.createTaskQuery()
  50.   .processDefinitionKey(key)
  51.   .taskAssignee(assignee) //设置任务的负责人
  52.   .singleResult();
  53.    
  54.   //执行当前的任务
  55.   if (task != null) {
  56.   taskService.complete(task.getId());
  57.   System.out.println("任务执行完毕!");
  58.   }

细节注意:

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

 

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

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

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

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

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

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

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

 

6. 任务的委托,委托人

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

原来表中:ASSIGNEE_=lisi    OWNER_=null

委托后:ASSIGNEE_=zhangsan    OWNER_=lisi

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

 

代码如下:

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

 

参考资料:

 

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

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

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

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

 

标签:候选,task,String,任务,key,taskService,候选人
来源: https://www.cnblogs.com/fanwenyan/p/16650676.html