activiti学习笔记

时间:2023-03-09 14:40:39
activiti学习笔记

activiti入门

  1. activiti官网
  2. pom.xml文件
    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图
    activiti学习笔记
    1.开始点
    2.结束点
    3.任务
    4.执行人
    5.流程id,流程名
  5. 部署流程
    ```java
    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. 启动流程
    ```java
    /**
    • 启动流程实例
      */
      @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. 查询任务
    ```java
    /**
    • 查询任务
      */
      @org.junit.Test
      public void task() {
      // 通过执行人进行查询
      List 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. 完成任务
    java /** * 完成任务 */ @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. 查询所有部署
    java /** * 查询所有部署 */ @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());
      }

    activiti学习笔记

    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. 流程图
      activiti学习笔记
      activiti学习笔记
    2. 代码:
      ```java
      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. 排他网关
    activiti学习笔记

    • 代码:
      ```java
      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. 接收任务
    activiti学习笔记
    • 代码:
      ```java
      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图
        activiti学习笔记

      • 代码
        java /** * 通过流程变量指定办理人 * * @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的类
          ```java
          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图绑定监听
          activiti学习笔记
        3. 测试代码
          ```java
          /**
          * 通过类指定办理人
          *
          * @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. 使用类

    • activiti学习笔记
    • 代码
      ```java
      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图activiti学习笔记
    • 代码:
      ```java
      /**
      * 分配任务负责的组

      * 可以分配给多个角色

      * 三种方式都可
      *
      * @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点必须创建角色,执行人是角色中的任意一个,以角色为单位,都可以进行任务转让,添加删除