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

     

  • 相关阅读:
    vue-org-tree 组织结构树插件
    vue-pdf 插件预览
    element upload 上传报错 Uncaught TypeError: Cannot set property 'status' of undefined
    element 表格回显默认选中的一行在第一行显示
    swiper轮播图(中间大,两侧小)
    elementui 树控件默认隐藏第三级菜单
    Echarts配置项详解
    elementui禁用树形结构全部复选框
    layui下拉多选formSelects使用方法
    R语言 expression函数
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12652361.html
Copyright © 2020-2023  润新知