Activiti学习笔记
activiti入门
- activiti官网
- 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结束 -->
- 安装activiti插件
CSDN教程 - 创建bpm图
1.开始点
2.结束点
3.任务
4.执行人
5.流程id,流程名 -
部署流程
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()); } }
-
启动流程
/** * 启动流程实例 */ @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()); }
-
查询任务
/** * 查询任务 */ @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()); } }
- 完成任务
/** * 完成任务 */ @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()); } }
- 查询所有部署
/** * 查询所有部署 */ @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()); } }
-
删除流程定义
/** * 删除部署 */ @org.junit.Test public void deleteDeploy() { String deployString = "20001"; // 部署表,流程定义表,资源表内容删除 // 普通删除:如果本流程定义正在运行会抛出异常 // 多级删除: 删除与本流程定义所关联的所有信息 processEngine.getRepositoryService().deleteDeployment(deployString); System.out.println("删除部署成功"); }
-
获得部署资源文件
/** * 获得部署的资源文件 * * @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); }
- 获得最新版本的流程定义
/** * 查询最新坂本流程定义 */ @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()); } }
- 查询流程状态
/** * 查询流程状态 */ @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("流程结束"); } }
- 查询历史任务
/** * 查询历史任务 */ @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()); } }
-
查询历史流程定义
/** * 查询历史流程实例 */ @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()); } }
-
设置与获取流程变量
/** * 设置获取流程变量 */ @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()); }
- RuntimeService对象可以设置流程变量和获取流程变量
- TaskService对象可以设置流程变量和获取流程变量
- 流程实例启动的时候可以设置流程变量
- 任务办理完成的时候可以设置流程变量
- 流程变量可以通过名称/值的形式设置单个流程变量
- 流程变量可以通过名称/值的形式设置单个流程变量
- Map集合的key表示流程变量的名称
- Map集合的value表示流程变量的值
-
查询历史流程变量
/** * 查询历史流程变量 */ @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.根据流程变量走不同的流程
- 流程图
-
代码:
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("结束"); } } }
- 流程图
-
排他网关
-
代码:
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("赵六没有任务"); } } }
-
-
接收任务
-
代码:
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()); } }
-
通过类指定办理人
-
创建一个实现了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); } }
- bpmn图绑定监听
-
测试代码
/** * 通过类指定办理人 * * @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()); }
-
-
-
组任务
-
直接指定
-
使用流程变量
-
使用类
-
代码
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); } }
-
-
分配任务给一个角色
- 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());
- bpmn图
- 总结:
- 流程步骤
- bpmn
- 使用bpmn图或zip部署
- 启动流程
- 查询个人任务或组任务
- 实现办理人的三种方式:
- 直接指定
- 使用流程变量,启动时指定
- 使用监听器
- 21点与22点: 21点是指定多人,可以是任意一个人,以人为单位,22点必须创建角色,执行人是角色中的任意一个,以角色为单位,都可以进行任务转让,添加删除
- 流程步骤
作者: JaminYe
版权声明:本文原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。