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

     

  • 相关阅读:
    扫面线模板
    (动态规划、栈)leetcode 84. Largest Rectangle in Histogram, 85. Maximal Rectangle
    tmux 常见命令汇总
    leetcode 221
    leetcode 319 29
    (贪心)leetcode 392. Is Subsequence, 771. Jewels and Stones, 463. Island Perimeter
    leetcode 982 668
    Python import 同文件夹下的py文件的函数,pycharm报错
    Windows里Anaconda-Navigator无法打开的解决方案
    Windows下 gpu版 Tensorflow 安装
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12652361.html
Copyright © 2020-2023  润新知