流程变量
流程变量就是在流程流转过程中使用到的变量,比如在出差申请过程中,大于3天的由总经理审批,否则人事直接审批。将出差天数设置流程的变量,在流程流转时使用。
流程变量的类型
如果将pojo当作流程变量使用时,必须要实现序列化接口serialzable,为防止由于新增字段无法序列化,需要生成serialsionUID。
流程变量的类型有:
String、Integer、short、long、double、boolean、date、binary、serializable
流程变量的作用域
流程变量的作用域可以是一个流程实例(processInstance),或是一个任务(task),或是一个执行的实例(execution)
global变量
流程变量的默认作用域是流程实例,当一个流程变量是流程实例时,可以称为global变量。
如:global变量userId,zhangsan
global变量中的变量名不允许重复,设置同样名称的变量,后设置的值会覆盖前设置的变量值。
local变量
任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,成为local变量。
local变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名想吐没有影响。local变量名也可以和global变量名相同,没有影响。
流程变量的使用方法
在属性上使用UEL表达式
可以在assignee处设置UEL表达式,表达式的值为任务的负责人,比如:${assignee},assignee就是一个流程变量名称。Activiti获取UEL表达式的值,即流程变量assignee的值,将assignee的值作为任务的负责人进行任务分配。
在连线上使用UEL表达式
可以在连线上设置UEL表达式,决定流程走向。
比如:${price<10000}。price就是一个流程变量名称,uel表达式结果类型为布尔类型。
如果UEL表达式是true,要决定流程执行走向。
应用
设计带有变量的流程实例
画图中需要设置流程引擎,不然的话在assginee中会没有用户显示
这里设置的却别在于bpmn中文件的区别如下:
全局变量在开启实例时注入代码
@Test
public void test03(){
ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
RuntimeService service = engine.getRuntimeService();
Evection evection = new Evection();
evection.setNum(3);
Map<String, Object> map = new HashMap<>();
map.put("evection",evection);
ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655017372539",map);
// ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655006033525");
// ProcessInstance evection = service.startProcessInstanceById("27501");
System.out.println(evectionInstance.getProcessDefinitionId());
System.out.println(evectionInstance.getProcessDefinitionName());
System.out.println(evectionInstance.getId());
System.out.println(evectionInstance.getName());
}
局部变量注入代码,局部变量在任务执行任务的时候,该变量在该任务结束时失效。以下代码不适用于上面的流程,上面的流程会报错,只是展示怎么注入
/**
* 查询任务,处理任务
*/
@Test
public void test04(){
ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
TaskService service = engine.getTaskService();
//查询任务
Task task = service.createTaskQuery()
.taskAssignee("user2")
.processDefinitionKey("Process_1655017372539")
.singleResult();
//处理任务
Evection evection = new Evection();
evection.setNum(2);
Map<String, Object> map = new HashMap<>();
map.put("evection",evection);
service.setVariablesLocal(task.getId(),map);
service.complete(task.getId());
}
如果执行该代码于上面流程会报一下错误:
15:39:00.589 [main] ERROR org.activiti.engine.impl.interceptor.CommandContext - Error while closing command context
org.activiti.engine.ActivitiException: Unknown property used in expression: ${evection.num>=3}
所示缺少表达式,因为这个表达式是写在了连接上边
完整代码:
public class Test02 {
//部署流程,创建默认数据库表
@Test
public void test01(){
//默认加载resource路径下的activiti.cfg.xml
ProcessEngine engin= ProcessEngines.getDefaultProcessEngine();
System.out.println(engin);
}
/**
* 部署流程
*/
@Test
public void test02(){
//获取引擎
ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
//获取资源服务
RepositoryService service = engine.getRepositoryService();
Deployment deploy = service.createDeployment()
.addClasspathResource("bpmn/evection_num.bpmn")
.addClasspathResource("bpmn/evection_num.svg")
.name("流程变量测试")
.deploy();
System.out.println("部署的id:"+deploy.getId());
System.out.println("部署的key:"+deploy.getKey());
System.out.println("部署的名称:"+deploy.getName());
System.out.println("部署的时间:"+deploy.getDeploymentTime());
// 部署的id:27501
// 部署的key:evection
// 部署的名称:出差申请流程
// 部署的时间:Sun Jun 12 00:48:46 CST 2022
}
/**
* 开启一个实例
*/
@Test
public void test03(){
ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
RuntimeService service = engine.getRuntimeService();
Evection evection = new Evection();
evection.setNum(3);
Map<String, Object> map = new HashMap<>();
map.put("evection",evection);
// ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655017372539",map);
ProcessInstance evectionInstance = service.startProcessInstanceByKey("Process_1655017372539");
// ProcessInstance evection = service.startProcessInstanceById("27501");
System.out.println(evectionInstance.getProcessDefinitionId());
System.out.println(evectionInstance.getProcessDefinitionName());
System.out.println(evectionInstance.getId());
System.out.println(evectionInstance.getName());
}
/**
* 查询任务,处理任务
*/
@Test
public void test04(){
ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();
TaskService service = engine.getTaskService();
//查询任务
Task task = service.createTaskQuery()
.taskAssignee("user2")
.processDefinitionKey("Process_1655017372539")
.singleResult();
//处理任务
Evection evection = new Evection();
evection.setNum(2);
Map<String, Object> map = new HashMap<>();
map.put("evection",evection);
service.setVariablesLocal(task.getId(),map);
service.complete(task.getId());
}
}
pojoEvection需要实现序列化
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
public class Evection implements Serializable {
private long id; private String evectionName;
/** * 出差的天数 */
private double num;
private Date beginDate;
private Date endDate;
private String destination;
private String reson;
}