Activiti学习笔记

activiti入门

  1. activiti官网
  2. pom.xml文件
    <!-- activiti -->
     <dependency>
       <groupId>org.activiti</groupId>
       <artifactId>activiti-engine</artifactId>
       <version>5.18.0</version>
     </dependency>
     <dependency>
       <groupId>org.activiti</groupId>
       <artifactId>activiti-spring</artifactId>
       <version>5.18.0</version>
     </dependency>
     <!-- activiti结束 -->
    
  3. 安装activiti插件
    CSDN教程
  4. 创建bpm图
    bpmn图
    1.开始点
    2.结束点
    3.任务
    4.执行人
    5.流程id,流程名
  5. 部署流程

     public class Test {
         // getDefaultProcessEngine会读取activiti.cfg.xml
         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    
         /**
          * 部署流程
          */
         @org.junit.Test
         public void deploy() {
             //读取资源文件部署
             Deployment deploy = processEngine.getRepositoryService().createDeployment()
                     .addClasspathResource("bpmn/helloWorld.bpmn").addClasspathResource("bpmn/helloWorld.png").deploy();
             // act_re_deployment部署对象表
       // act_re_procdef 流程定义表
       // act_ge_bytearray 资源文件表
             System.out.println(deploy.getId());
             System.out.println(deploy.getName());
         }
     }
    
  6. 启动流程

    /**
    * 启动流程实例
    */
    @org.junit.Test
    public void run() {
     // key值对应bpmn中流程的id 默认按最新版本启动
     ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("helloWorld");
     // 流程实例id
     System.out.println(pi.getId());
     // 流程定义id
     System.out.println(pi.getProcessDefinitionId());
    
    }
    
  7. 查询任务

    /**
    * 查询任务
    */
    @org.junit.Test
    public void task() {
     // 通过执行人进行查询
     List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee("李四").list();
     for (Task task : list) {
       // 任务id
       System.out.println(task.getId());
       // 任务名
       System.out.println(task.getName());
       // 任务创建时间
       System.out.println(task.getCreateTime());
       // 流程实例id
       System.out.println(task.getProcessInstanceId());
       // 流程定义id
       System.out.println(task.getProcessDefinitionId());
    
     }
    
    }
    
  8. 完成任务
    /**
    * 完成任务
    */
    @org.junit.Test
    public void complete() {
     // 查询李四的所有任务
     List<Task> list = processEngine.getTaskService().createTaskQuery().taskAssignee("李四").list();
     for (Task task : list) {
       System.out.println(task.getId());
       // 通过任务id进行完成
       processEngine.getTaskService().complete(task.getId());
     }
    }
    
  9. 查询所有部署
       /**
        * 查询所有部署
        */
       @org.junit.Test
       public void findDeploy() {
         List<Deployment> deploymentList =
             processEngine.getRepositoryService().createDeploymentQuery().list();
         for (Deployment deployment : deploymentList) {
           System.out.println(deployment.getId());
           System.out.println(deployment.getName());
         }
       }
    
  10. 删除流程定义

     /**
       * 删除部署
       */
    
      @org.junit.Test
      public void deleteDeploy() {
        String deployString = "20001";
        // 部署表,流程定义表,资源表内容删除
        // 普通删除:如果本流程定义正在运行会抛出异常
        // 多级删除: 删除与本流程定义所关联的所有信息
        processEngine.getRepositoryService().deleteDeployment(deployString);
        System.out.println("删除部署成功");
    
      }
    
  11. 获得部署资源文件

      /**
       * 获得部署的资源文件
       * 
       * @throws IOException
       */
      @org.junit.Test
      public void getResources() throws IOException {
        // 部署对象id
        String id = "7501";
        // 查询出当前部署的所有资源文件png+bpm
        List<String> deploymentResourceNames =
            processEngine.getRepositoryService().getDeploymentResourceNames(id);
        String png = null;
        for (String name : deploymentResourceNames) {
          // 获得png文件名
          if (name.indexOf(".png") >= 0) {
            png = name;
          }
        }
        System.out.println(png);
        // 获得当前文件流
        InputStream resourceAsStream =
            processEngine.getRepositoryService().getResourceAsStream(id, png);
        File file = new File("d:/" + png);
        FileUtils.copyToFile(resourceAsStream, file);
    
      }
    
  12. 获得最新版本的流程定义
      /**
       * 查询最新坂本流程定义
       */
      @org.junit.Test
      public void queryLatestVersion() {
        // 查询流程定义按版本排序
        List<ProcessDefinition> list = processEngine.getRepositoryService()
            .createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc().list();
        // 创建一个map用于存放最新版本的流程定义
        Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
        // 遍历流程定义集合
        for (ProcessDefinition processDefinition : list) {
          map.put(processDefinition.getKey(), processDefinition);
        }
        // 遍历最新版本流程定义获得信息
        for (ProcessDefinition processDefinition : map.values()) {
          System.out.println("id:" + processDefinition.getId());
          System.out.println("name:" + processDefinition.getName());
          System.out.println("key:" + processDefinition.getKey());
          System.out.println("version:" + processDefinition.getVersion());
        }
      }
    
  13. 查询流程状态
      /**
       * 查询流程状态
       */
      @org.junit.Test
      public void processState() {
        // 流程实例
        String pid = "47501";
        // 通过流程实例id进行查询返回唯一结果
        ProcessInstance singleResult = processEngine.getRuntimeService().createProcessInstanceQuery()
            .processInstanceId(pid).singleResult();
        // 判断结果不为空
        if (singleResult != null) {
          System.out.println("未完成");
          System.out.println(singleResult.getActivityId());
        } else {
          System.out.println("流程结束");
        }
      }
    
  14. 查询历史任务
      /**
       * 查询历史任务
       */
      @org.junit.Test
      public void getHistoryTasks() {
        // 历史任务办理人
        String assignee = "张三";
        // 通过历史任务办理人进行查询
        List<HistoricTaskInstance> list = processEngine.getHistoryService()
            .createHistoricTaskInstanceQuery().taskAssignee(assignee).list();
        // 遍历历史任务
        for (HistoricTaskInstance historicTaskInstance : list) {
          // 任务id
          System.out.println(historicTaskInstance.getId());
          // 任务办理人
          System.out.println(historicTaskInstance.getAssignee());
          // 任务名
          System.out.println(historicTaskInstance.getName());
          // 任务流程实例
          System.out.println(historicTaskInstance.getProcessInstanceId());
        }
      }
    
  15. 查询历史流程定义

      /**
       * 查询历史流程实例
       */
      @org.junit.Test
      public void historyProcessInstance() {
        // 通过流程定义key进行查询
        List<HistoricProcessInstance> list = processEngine.getHistoryService()
            .createHistoricProcessInstanceQuery().processDefinitionKey("helloWorld").list();
        // 遍历结果集
        for (HistoricProcessInstance historicProcessInstance : list) {
          System.out.println(historicProcessInstance.getId());
          // 启动时间
          System.out.println(historicProcessInstance.getStartTime());
          // 结束时间
          System.out.println(historicProcessInstance.getEndTime());
          // 持续时间
      System.out.println(historicProcessInstance.getDurationInMillis());
          System.out.println(historicProcessInstance.getName());
          System.out.println(historicProcessInstance.getProcessDefinitionKey());
        }
    
      }
    
  16. 设置与获取流程变量

      /**
       * 设置获取流程变量
       */
      @org.junit.Test
      public void setGetVariables() {
        String pi = "47501";
        String person = "李四";
        TaskService taskService = processEngine.getTaskService();
        Task task =
            taskService.createTaskQuery().processInstanceId(pi).taskAssignee(person).singleResult();
        String taskId = task.getId();
        // 设置流程变量
        taskService.setVariable(taskId, "审核意见", "同意");
        taskService.setVariable(taskId, "备注", "路上注意安全");
          /**
        * setVariable和setVariableLocal的区别
        * setVariable:流程变量名称相同的时候,后一次的值替换前一次的值,而且可以看到TASK_ID的字段不会存放任务ID的值
        * setVariableLocal:一个流程中存在2个活动节点,流程变量的名称相同,后一次的版本的值也不会替换前一次版本的值
        * 使用setVariableLocal说明流程变量绑定了当前的任务,当流程继续执行时,下个任务获取不到这个流程变量
        */
        // 变量存在javaBean前提要让javaBean实现序列化
        LeaveInfo leaveInfo = new LeaveInfo();
        leaveInfo.setId("1");
        leaveInfo.setLeaveMsg("test");
        taskService.setVariable(taskId, "javaBean", leaveInfo);
        // 获取流程变量
        String shyj = (String) taskService.getVariable(taskId, "审核意见");
        String bz = (String) taskService.getVariable(taskId, "备注");
        System.out.println(shyj);
        System.out.println(bz);
        // 同时要求流程变量对象的属性不能发生发生变化,否则抛出异常
        LeaveInfo javaBean = (LeaveInfo) taskService.getVariable(taskId, "javaBean");
        System.out.println(javaBean.getId());
        System.out.println(javaBean.getLeaveMsg());
      }
    

    流程变量

    1. RuntimeService对象可以设置流程变量和获取流程变量
    2. TaskService对象可以设置流程变量和获取流程变量
    3. 流程实例启动的时候可以设置流程变量
    4. 任务办理完成的时候可以设置流程变量
    5. 流程变量可以通过名称/值的形式设置单个流程变量
    6. 流程变量可以通过名称/值的形式设置单个流程变量
    • Map集合的key表示流程变量的名称
    • Map集合的value表示流程变量的值
  17. 查询历史流程变量

      /**
       * 查询历史流程变量
       */
      @org.junit.Test
      public void historyVariable() {
        HistoricVariableInstance variable =
            processEngine.getHistoryService().createHistoricVariableInstanceQuery().variableName("审核意见")
                .processInstanceId("47501").singleResult();
        // 流程变量名
        System.out.println(variable.getVariableName());
        // 流程变量的值
        System.out.println(variable.getValue());
      }
    

    17.根据流程变量走不同的流程

    1. 流程图
      重要的
      不重要的
    2. 代码:

       package com.cjrj.bootactividemo;
      
       import java.util.HashMap;
       import java.util.Map;
       import org.activiti.engine.ProcessEngine;
       import org.activiti.engine.ProcessEngines;
       import org.activiti.engine.repository.Deployment;
       import org.activiti.engine.runtime.ProcessInstance;
       import org.activiti.engine.task.Task;
       import org.junit.Test;
      
       /**
        * 
        * 审核附加流程变量
        * 
        * @author Jamin
        *
        */
       public class Test2 {
         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      
         @Test
         public void test() {
           // 部署
           Deployment deploy = processEngine.getRepositoryService().createDeployment()
               .addClasspathResource("bpm/test.bpmn").addClasspathResource("bpm/test.png").name("test")
               .deploy();
           // 启动
           ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");
           Task task = processEngine.getTaskService().createTaskQuery().taskAssignee("张三")
               .processInstanceId(pi.getId()).singleResult();
           // 审批附加流程变量
           Map<String, Object> map = new HashMap<String, Object>();
           map.put("message", "重要");
           processEngine.getTaskService().complete(task.getId(), map);
           // 查询李四的任务
           Task task1 = processEngine.getTaskService().createTaskQuery().taskAssignee("李四")
               .processInstanceId(pi.getId()).singleResult();
           // 如果message是重要task1不为空,如果message是不重要的task为空
           if (task1 != null) {
             System.out.println(task1.getName());
           } else {
             System.out.println("结束");
           }
         }
       }
      
  18. 排他网关
    排他网关图

    • 代码:

        package com.cjrj.bootactividemo;
        import java.util.HashMap;
        import java.util.Map;
        import org.activiti.engine.ProcessEngine;
        import org.activiti.engine.ProcessEngines;
        import org.activiti.engine.repository.Deployment;
        import org.activiti.engine.runtime.ProcessInstance;
      import org.activiti.engine.task.Task;
      
        /**
         * 排他网关
         * 
         * @author Jamin
         * 
         */
        public class Test3 {
      ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      
          @org.junit.Test
          public void test() {
            // 部署
            Deployment deployment = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("reimburse/MyProcess.bpmn")
                .addClasspathResource("reimburse/MyProcess.png").deploy();
            // 启动
            ProcessInstance processInstance =
                processEngine.getRuntimeService().startProcessInstanceByKey("reimburse");
            // 查询任务
            Task task = processEngine.getTaskService().createTaskQuery().taskAssignee("张三")
                .processInstanceId(processInstance.getId()).singleResult();
            System.out.println("------------------------------------------------");
            System.out.println(task.getId());
            System.out.println("-------------------------------------------------");
            // 完成任务,附带流程定义
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("money", 10000);
            processEngine.getTaskService().complete(task.getId(), map);
            // 李四的任务
            Task lisi = processEngine.getTaskService().createTaskQuery().taskAssignee("李四")
                .processInstanceId(processInstance.getId()).singleResult();
            Task wangwu = processEngine.getTaskService().createTaskQuery().taskAssignee("王五")
                .processInstanceId(processInstance.getId()).singleResult();
            Task zhaoliu = processEngine.getTaskService().createTaskQuery().taskAssignee("赵六")
                .processInstanceId(processInstance.getId()).singleResult();
            if (lisi == null) {
              System.out.println("李四没有任务");
            }
            if (wangwu == null) {
              System.out.println("王五没有任务");
            }
            if (zhaoliu == null) {
              System.out.println("赵六没有任务");
            }
          }
      }
      
  19. 接收任务
    接收任务

    • 代码:

        package com.cjrj.bootactividemo;
      
        import org.activiti.engine.ProcessEngine;
        import org.activiti.engine.ProcessEngines;
        import org.activiti.engine.repository.Deployment;
        import org.activiti.engine.runtime.Execution;
        import org.activiti.engine.runtime.ProcessInstance;
      
        /**
         * 接受任务(启动流程实例 执行查询执行对象 查询不到第一个)
         *
         * @author Jamin
         * @date 2019年7月16日 下午8:08:15
         * 
         */
        public class Task5 {
          ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
      
          @org.junit.Test
          public void test() {
            // 部署
            Deployment deploy = processEngine.getRepositoryService().createDeployment()
                .addClasspathResource("message/message.bpmn").addClasspathResource("message/message.png")
                .deploy();
            // 启动
            ProcessInstance processInstance =
                processEngine.getRuntimeService().startProcessInstanceByKey("message");
            System.out.println(processInstance.getId());
            // 查询执行对象
            Execution execution = processEngine.getRuntimeService().createExecutionQuery()
                .processInstanceId(processInstance.getId()).activityId("receivetask1").singleResult();
            System.out.println("当前执行对象");
            System.out.println(execution.getActivityId());
            System.out.println("end当前执行对象");
            processEngine.getRuntimeService().signal(execution.getId());
            ProcessInstance pi = processEngine.getRuntimeService().createProcessInstanceQuery()
                .processInstanceId(processInstance.getId()).singleResult();
            System.out.println("查询实例是否结束");
            System.out.println(pi);
            // 查询执行对象
            Execution execution2 = processEngine.getRuntimeService().createExecutionQuery()
                .processInstanceId(processInstance.getId()).activityId("receivetask2").singleResult();
            System.out.println("当前执行对象");
            System.out.println(execution2.getActivityId());
            System.out.println("end当前执行对象");
            processEngine.getRuntimeService().signal(execution2.getId());
            ProcessInstance pi2 = processEngine.getRuntimeService().createProcessInstanceQuery()
                .processInstanceId(processInstance.getId()).singleResult();
            System.out.println("查询实例是否结束");
            System.out.println(pi2);
          }
        }
      

      20.个人任务
      1.直接指定办理人
      2.通过流程变量指定办理人

    • bpmn图
      通过流程变量指定办理人

    • 代码

            /**
               * 通过流程变量指定办理人
               * 
               * @author Jamin
               * @date 2019年7月17日下午4:18:30
               * @return void
               */
              @org.junit.Test
              public void test() {
                // 部署
                Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("personVariables/personVariables.bpmn")
                    .addClasspathResource("personVariables/personVariables.png").deploy();
                // 启动并设定流程变量,指定组办理人
                HashMap<String, Object> map = new HashMap<String, Object>();
                map.put("userId", "张三");
                ProcessInstance processInstance =
                    runtimeService.startProcessInstanceByKey("personVariables", map);
                System.out.println("流程实例:" + processInstance.getId());
                // 查询个人任务
                List<Task> list = taskService.createTaskQuery().taskAssignee("张三").list();
                for (Task task : list) {
                  System.out.println(task.getId());
                  System.out.println(task.getName());
                  System.out.println(task.getExecutionId());
                  System.out.println(task.getAssignee());
                }
            }
      
    1. 通过类指定办理人

      1. 创建一个实现了TaskListener的类

            package com.cjrj.bootactividemo;
        
                  import org.activiti.engine.delegate.DelegateTask;
            import org.activiti.engine.delegate.TaskListener;
        
                  /**
                   * 实现TaskListener接口完成指定办理人
                   * 
                   * @author Jamin
                   * @date 2019年7月17日 下午4:23:30
                   * 
                   */
            public class TaskListenerImpl implements TaskListener {
        
                    @Override
                    public void notify(DelegateTask delegateTask) {
                      // 指定办理人
                      String person = "张三";
                      // 设置办理人
                      delegateTask.setAssignee(person);
              }
        
                  }
        
      2. bpmn图绑定监听
      3. 测试代码

                /**
                 * 通过类指定办理人
                 * 
                 * @author Jamin
                 * @date 2019年7月17日下午4:20:31
                 * @return void
                 */
                @org.junit.Test
                public void test2() {
                  TaskListenerImpl taskListenerImpl = new TaskListenerImpl();
                  // 部署
                  Deployment deploy = repositoryService.createDeployment()
                      .addClasspathResource("personVariables/personClass.bpmn")
                      .addClasspathResource("personVariables/personClass.png").deploy();
                  // 启动并设定流程变量,指定组办理人
                  HashMap<String, Object> map = new HashMap<String, Object>();
                  map.put("userId", "张三");
                  ProcessInstance processInstance =
                      runtimeService.startProcessInstanceByKey("personVariables", map);
                  System.out.println("流程实例:" + processInstance.getId());
                  // 查询个人任务
                  Task task = taskService.createTaskQuery().taskAssignee("张三")
                      .processInstanceId(processInstance.getId()).singleResult();
                  System.out.println("张三任务:" + task.getName());
                  // 转交任务
                  taskService.setAssignee(task.getId(), "李四");
                  Task task1 = taskService.createTaskQuery().taskAssignee("李四")
                      .processInstanceId(processInstance.getId()).singleResult();
                  System.out.println("李四的任务:" + task1.getName());
        
                }
        
  20. 组任务

    1. 直接指定

    2. 使用流程变量

    3. 使用类

    • 代码

            package com.cjrj.bootactividemo;
      
            import java.util.List;
            import org.activiti.engine.ProcessEngine;
            import org.activiti.engine.ProcessEngines;
            import org.activiti.engine.RepositoryService;
            import org.activiti.engine.RuntimeService;
            import org.activiti.engine.TaskService;
            import org.activiti.engine.history.HistoricIdentityLink;
            import org.activiti.engine.repository.Deployment;
            import org.activiti.engine.runtime.ProcessInstance;
            import org.activiti.engine.task.IdentityLink;
            import org.activiti.engine.task.Task;
      
            /**
             * 组任务
             * 
             * @author Jamin
             * @date 2019年7月17日 下午5:12:21
             * 
             */
            public class Test7 {
              ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
              RepositoryService repositoryService = processEngine.getRepositoryService();
              RuntimeService runtimeService = processEngine.getRuntimeService();
              TaskService taskService = processEngine.getTaskService();
      
              /**
               * 直接指定
               * 
               * @author Jamin
               * @date 2019年7月17日下午5:13:02
               * @return void
               */
              @org.junit.Test
              public void test() {
                // 第一种
                /*
                 * // 部署 repositoryService.createDeployment().addClasspathResource("group/first.bpmn")
                 * .addClasspathResource("group/first.png").deploy(); // 启动 ProcessInstance processInstance =
                 * runtimeService.startProcessInstanceByKey("first"); System.out.println("流程实例id:" +
                 * processInstance.getId());
                 */
                // 第二种
      
                /*
                 * Deployment deploy =
                 * repositoryService.createDeployment().addClasspathResource("group/second.bpmn")
                 * .addClasspathResource("group/second.png").deploy(); HashMap<String, Object> map = new
                 * HashMap<String, Object>(); map.put("userId", "张三,李四,王五"); ProcessInstance processInstance =
                 * runtimeService.startProcessInstanceByKey("second", map);
                 */
                // 第三种
                Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("group/third.bpmn").addClasspathResource("group/third.png").deploy();
                ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("third");
                System.out.println("流程实例id" + processInstance.getId());
                // 查询组任务
                List<Task> list = taskService.createTaskQuery().processInstanceId(processInstance.getId())
                    .taskCandidateUser("张三").list();
                System.out.println("组任务:" + list);
                String taskId = null;
                for (Task task : list) {
                  System.out.println(task.getName());
                  System.out.println(task.getAssignee());
                  System.out.println(task.getId());
                  taskId = task.getId();
                }
                // 查询组成员
                List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(taskId);
                for (IdentityLink identityLink : identityLinksForTask) {
                  System.out.println(identityLink.getGroupId());
                  System.out.println(identityLink.getUserId());
                } // 查询历史组成员列表
                List<HistoricIdentityLink> historicIdentityLinksForTask =
                    processEngine.getHistoryService().getHistoricIdentityLinksForTask(taskId);
                for (HistoricIdentityLink historicIdentityLink : historicIdentityLinksForTask) {
                  System.out.println(historicIdentityLink.getUserId());
                  System.out.println(historicIdentityLink.getGroupId());
                }
                // 组任务转个人可以是任何人
                taskService.claim(taskId, "张11");
                Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId())
                    .taskAssignee("张11").singleResult();
                System.out.println("组任务转个人任务名:" + task.getName());
                // 个人任务转组(必须任务以前是组任务)
                taskService.setAssignee(task.getId(), null);
                // 检测是否转组任务成功,
                List<Task> list1 = taskService.createTaskQuery().processInstanceId(processInstance.getId())
                    .taskCandidateUser("张三").list();
                String taskId1 = null;
                for (Task task1 : list) {
      
                  System.out.println("转组任务:" + task1.getName());
                  System.out.println("转组任务:" + task1.getAssignee());
                  System.out.println("转组任务:" + task1.getId());
                  taskId1 = task.getId();
                }
                // 添加人员
                taskService.addCandidateUser(taskId1, "qiqi");
                // 查询参与人员
                List<IdentityLink> identityLinksForTask2 = taskService.getIdentityLinksForTask(taskId1);
                for (IdentityLink identityLink : identityLinksForTask2) {
                  System.out.println("添加人员后" + identityLink.getUserId());
                }
      
                // 删除人员张三
                taskService.deleteCandidateUser(taskId1, "张三");
                List<IdentityLink> identityLinksForTask3 = taskService.getIdentityLinksForTask(taskId1);
                for (IdentityLink identityLink : identityLinksForTask3) {
                  System.out.println("删除人员后:" + identityLink.getUserId());
                }
                // 完成任务
                taskService.complete(taskId);
      
              }
            }
      
  21. 分配任务给一个角色

    • bpmn图
    • 代码:

        /**
           * 分配任务负责的组<br>
           * 可以分配给多个角色<br>
           * 三种方式都可
           * 
           * @author Jamin
           * @date 2019年7月18日上午8:28:12
           * @return void
           */
          @org.junit.Test
          public void four() {
            // 部署
            Deployment deploy = repositoryService.createDeployment().addClasspathResource("group/four.bpmn")
                .addClasspathResource("group/four.png").deploy();
            IdentityService identityService = processEngine.getIdentityService();
            // 创建组与用户并关联
            /*
             * identityService.saveGroup(new GroupEntity("部门经理")); identityService.saveGroup(new
             * GroupEntity("总经理")); identityService.saveUser(new UserEntity("张三"));
             * identityService.saveUser(new UserEntity("李四")); identityService.createMembership("张三",
             * "部门经理"); identityService.createMembership("李四", "总经理");
             */
            // 使用流程变量设置角色
            /*
             * HashMap<String, Object> map = new HashMap<String, Object>(); map.put("group", "部门经理,总经理");
             */
      
            // 启动
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("four");
            // 查询个人任务
            Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId())
                .taskCandidateUser("李四").singleResult();
            System.out.println(task.getName());
          }
          // 查询执行任务的组
        List<IdentityLink> identityLinksForTask = taskService.getIdentityLinksForTask(task.getId());
        for (IdentityLink identityLink : identityLinksForTask) {
      System.out.println(identityLink.getGroupId());
      
  • 总结:
    • 流程步骤
      1. bpmn
      2. 使用bpmn图或zip部署
      3. 启动流程
      4. 查询个人任务或组任务
    • 实现办理人的三种方式:
      1. 直接指定
      2. 使用流程变量,启动时指定
      3. 使用监听器
    • 21点与22点: 21点是指定多人,可以是任意一个人,以人为单位,22点必须创建角色,执行人是角色中的任意一个,以角色为单位,都可以进行任务转让,添加删除
作者: JaminYe
版权声明:本文原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文地址:https://www.cnblogs.com/JaminYe/p/11205171.html