目录
1、流程变量(设置、获取)
1.1、设置流程变量的方式
1.2、获取流程变量的方式
2、组任务操作(候选人、候选组)
2.1、候选人的组任务(了解)
2.2、候选组的组任务(重点)
3、排他网关的使用(常用)
4、spring 整合 activiti框架
5、将activiti框架应用到bos项目中
5.1、查询流程定义
5.2、部署流程定义(即发布新流程)
5.3、查看png图片
5.4、删除流程定义
今天内容安排:
1、流程变量(设置、获取)
2、组任务操作(候选人、候选组)
3、排他网关的使用
4、spring 整合 activiti框架
5、将activiti框架应用到bos项目中
6、在bos项目中实现流程定义管理(部署、查询、查看png、删除)
回到顶部
1、流程变量(设置、获取)
之前的请假流程,是没有实际意义的,我们要使得我们流程变得有意义(有实际意义),需要在流程向下推进的过程中带着数据推进才有意义。如下图所示:
1.1、设置流程变量的方式
准备工作:重新新建一个数据库,名为activiti_day02,使用框架提供的sql文件建表,今天我们执行Windows批处理文件建表,再使用插件设计一个报销流程图。之后我们部署流程定义。
批处理文件内容如下:
ActivitiAcutoCreateTable.bat
@echo off
title Activiti5-CreateTableProcess
color b
@echo activiti_day02数据库导入中...
mysql -uroot -proot activiti_day02 < activiti.mysql.create.engine.sql
mysql -uroot -proot activiti_day02 < activiti.mysql.create.history.sql
mysql -uroot -proot activiti_day02 < activiti.mysql.create.identity.sql
@rem pause
if "%OS%"=="Windows_NT" ENDLOCAL
一共有4种设置流程变量方式,实际开发中都会用到。
方式一:启动流程实例时设置流程变量
/**
* 方式一:启动流程实例时设置流程变量
*/
@Test
public void test2() {
String processDefinitionKey = "baoxiaoliucheng"; // 流程定义id
Map
variables = new HashMap<>(); // 注意:第二个参数是一个HashMap
// 设置流程变量
variables.put("key1", "value1");
variables.put("key2", 100);
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println(processInstance.getId());
}
方式二:办理任务时设置流程变量
/**
* 方式二:办理任务时设置流程变量
*/
@Test
public void test3() {
String taskId = "106";
Map variables = new HashMap<>(); // 注意:第二个参数是也一个HashMap
// 设置流程变量
variables.put("reason", "差旅费用");
variables.put("money", 500);
processEngine.getTaskService().complete(taskId, variables);
}
就我们当前的报销场景来说,方式二:办理任务时设置流程变量更合理,因为我们在办报销任务的时候,浏览器端会给用户提供一个用户页面,在页面上有一个表单,在表单上可以填写报销原因、报销金额等信息。填写完表单后,一点击提交按钮,这个任务就办理了。所以方式二:办理任务时设置流程变量更合理。在服务器端会将表单提交过来的数据保存至数据库中。
方式三:使用RuntimeService的set方法时设置流程变量
/**
* 方式三:使用RuntimeService的set方法时设置流程变量
*/
@Test
public void test4() {
String executionId = "101"; // 流程实例id
Map variables = new HashMap<>(); // 注意:第二个参数是也一个HashMap集合
// 设置流程变量
variables.put("审批意见", "报销原因不够详细");
variables.put("user", new User(10, 25, "北京市朝阳区")); // 设置的是自定义的类型
processEngine.getRuntimeService().setVariables(executionId, variables);
// processEngine.getRuntimeService().setVariable(executionId, variableName, value); // 一个一个的设置
}
注意:如果设置的是自定义的类型,如User,需要该类实现序列化接口。
方式四:使用TaskService的set方法时设置流程变量
/**
* 方式四:使用TaskService的set方法时设置流程变量
*/
@Test
public void test5() {
String taskId = "204"; // 任务id
String variableName = "审批意见"; // 注意:在同一个流程实例里面,流程变量的key是不能重复的,若出现重复,会覆盖
String value = "不批,需要详细写清楚报销原因";
processEngine.getTaskService().setVariable(taskId, variableName, value);
}
1.2、获取流程变量的方式
方式一:使用RuntimeService的get方法时获取流程变量
/**
* 方式一:使用RuntimeService的get方法获取流程变量
*/
@Test
public void test6() {
String executionId = "101"; // 流程实例id
Map variables = processEngine.getRuntimeService().getVariables(executionId);
System.out.println(variables); // Map集合的toString()方法比较友好,还可以看
// 如果我们自己遍历Map:通过键找值
Set keySet = variables.keySet(); // 先获得键集合
for (String key : keySet) {
Object value = variables.get(key); // 通过键找值
System.out.println(key + " = " + value);
// 注意:为了使得自定义的类型User打印出来的结果好看些,我们需要在User类中重写User的toString()方法,但是需要重新进行序列化,不然反序列化的时候会报错
}
}
方式二:使用TaskService的get方法时获取流程变量
/**
* 方式二:使用TaskService的get方法时获取流程变量
*/
@Test
public void test7() {
String taskId = "204"; // 任务id
Object value = processEngine.getTaskService().getVariable(taskId , "user");
System.out.println(value);
}
方式三:使用框架提供的表达式获取流程变量
示例演示的是:当创建任务的时候(即启动流程实例时),${variableName}表示activiti框架会拿着variableName(流程变量的name,即键key)到流程变量表中去找对应的name。其他的同理。
相应的代码截图:
相应的流程图截图:
相应的数据库表截图:
回到顶部
2、组任务操作(候选人、候选组)
2.1、候选人的组任务(了解)
示例代码如下:
package com.itheima.activiti.grouptask;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Test;
/**
* 组任务测试(候选人)
* @author Bruce
*
*/
public class GroupTaskTest {
// 获取默认流程引擎(全局变量)
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void test1() {
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("com/itheima/activiti/grouptask/baoxiaoliucheng.bpmn");
deploymentBuilder.addClasspathResource("com/itheima/activiti/variable/baoxiaoliucheng.png");
deploymentBuilder.deploy();
}
/**
* 启动流程实例时设置流程变量
*/
@Test
public void test2() {
String processDefinitionKey = "baoxiaoliucheng"; // 流程定义id
Map variables = new HashMap<>(); // 注意:第二个参数是一个HashMap集合
// 设置流程变量
variables.put("loginUser", "熊五");
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println(processInstance.getId());
}
/**
* 办理任务
*/
@Test
public void test3() {
String taskId = "1002"; // 任务id
processEngine.getTaskService().complete(taskId);
}
/**
* 查询组任务
* 如果财务二拾取了组任务,财务三就查询不到组任务了。
*/
@Test
public void test4() {
TaskQuery query = processEngine.getTaskService().createTaskQuery();
String candidateUser = "财务三";
query.taskCandidateUser(candidateUser); // 使用候选人过滤
List list = query.list();
for (Task task : list) {
System.out.println(task.getId());
}
}
/**
* 拾取组任务,即将组任务变为个人任务
* 不能两个人拾取同一组任务,若拾取,框架会抛异常
*/
@Test
public void test5() {
String taskId = "902";
processEngine.getTaskService().claim(taskId , "财务二");
}
}
候选人的组任务相对于个人任务来说,先进了一些,但是还不够灵活,虽然写了3个具体的人,但是一旦3个人中有人离职了,那么这个流程就不能正常运行了。于是,有个更加灵活的候选组的组任务。
2.2、候选组的组任务(重点)
示例代码如下:
package com.itheima.activiti.grouptask;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.identity.Group;
import org.activiti.engine.identity.User;
import org.activiti.engine.impl.persistence.entity.GroupEntity;
import org.activiti.engine.impl.persistence.entity.UserEntity;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Test;
/**
* 组任务测试(候选组)
* @author Bruce
*
*/
public class GroupTaskTest2 {
// 获取默认流程引擎(全局变量)
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void test1() {
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("com/itheima/activiti/grouptask/baoxiaoliucheng2.bpmn");
deploymentBuilder.addClasspathResource("com/itheima/activiti/grouptask/baoxiaoliucheng2.png");
deploymentBuilder.deploy();
}
/**
* 创建组
*/
@Test
public void test2() {
Group group = new GroupEntity(); // 注意:后期框架act_id_group表与BOS项目的auth_role同步
group.setId("财务组"); // 与流程图的一致
group.setName("管理财务");
processEngine.getIdentityService().saveGroup(group);
}
/**
* 创建用户
*/
@Test
public void test3() {
User user = new UserEntity(); // 注意:后期框架act_id_user表与BOS项目的t_user同步
user.setId("2");
processEngine.getIdentityService().saveUser(user);
}
/**
* 建立用户和组的关系
*/
@Test
public void test4() {
processEngine.getIdentityService().createMembership("2", "财务组");
}
/**
* 启动流程实例时设置流程变量
*/
@Test
public void test5() {
String processDefinitionKey = "baoxiaoliucheng"; // 流程定义key
Map variables = new HashMap();
variables.put("loginUser", "晓艺");
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println(pi.getId());
}
/**
* 办理任务
*/
@Test
public void test6() {
String taskId = "1605";
processEngine.getTaskService().complete(taskId);
}
/**
* 查询组任务
*/
@Test
public void test7() {
TaskQuery query = processEngine.getTaskService().createTaskQuery();
String candidateUser = "2";
query.taskCandidateUser(candidateUser); // 使用候选人过滤,更实用直接,因为User是从session中取过来
// query.taskCandidateGroup("财务组"); // 使用候选组过滤,Group是从角色中取过来,稍微麻烦些
List list = query.list();
for (Task task : list) {
System.out.println(task.getId());
}
}
/**
* 拾取组任务,将组任务变为个人任务
*/
@Test
public void test8() {
String taskId = "1702";
processEngine.getTaskService().claim(taskId , "1");
}
/**
* 删除 所有部署流程定义数据(带级联删除)
*/
@Test
public void test9() {
List list = processEngine.getRepositoryService().createDeploymentQuery().list();
for (Deployment deployment : list) {
processEngine.getRepositoryService().deleteDeployment(deployment.getId(), true);
}
}
}
回到顶部
3、排他网关的使用(常用)
示例代码如下:
package com.itheima.activiti.gateway;
import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
/**
* 排他网关的测试
* @author Bruce
*
*/
public class GatewayTest {
// 获取默认流程引擎(全局变量)
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void test1() {
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
deploymentBuilder.addClasspathResource("com/itheima/activiti/gateway/qingjialiucheng.bpmn");
deploymentBuilder.addClasspathResource("com/itheima/activiti/gateway/qingjialiucheng.png");
deploymentBuilder.deploy();
}
/**
* 方式一:启动流程实例时设置流程变量
*/
@Test
public void test2() {
String processDefinitionKey = "qingjialiucheng"; // 流程定义id
Map variables = new HashMap<>(); // 注意:第二个参数是一个HashMap集合
// 设置流程变量
variables.put("qjts", 2);
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println(processInstance.getId());
}
/**
* 方式二:办理任务时设置流程变量
*/
@Test
public void test3() {
String taskId = "2005"; // 任务id
Map variables = new HashMap<>(); // 注意:第二个参数是也一个HashMap集合
// 设置流程变量
variables.put("qjts", 5);
processEngine.getTaskService().complete(taskId, variables);
}
}
回到顶部
4、spring 整合 activiti框架
步骤一:读取(加载)spring配置文件,使用spring提供的流程引擎配置对象
步骤二:提供数据源和事务管理器
步骤三:使用spring提供的流程引擎工厂bean创建流程引擎对象
示例代码如下:
applicationContext.xml