activiti入门

274 阅读9分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路

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. 代码: ```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. 排他网关 排他网关图

- 代码:
	```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. 接收任务 接收任务 - 代码: ```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图 通过流程变量指定办理人

	- 代码
  	```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());
            }
	        }
	  ```

	3. 通过类指定办理人 
		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图绑定监听
			![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9zMi5heDF4LmNvbS8yMDE5LzA3LzE3L1pMMGE2Zy5wbmc)
		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());

              }
        ```

21. 组任务 1. 直接指定

2. 使用流程变量

3. 使用类

  - ![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/20c0067f18864b18acdfad9afdeaef1e~tplv-k3u1fbpfcp-zoom-1.image)
  - 代码
		```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);

          }
        }
     ```

22. 分配任务给一个角色 - bpmn图 - 代码: ```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点必须创建角色,执行人是角色中的任意一个,以角色为单位,都可以进行任务转让,添加删除