- EL为表达式语言(Expression Language)
UEL统一表达式语言(Unified Expression Language)
UEL表达式描述
表达式以“${”开始,以“}”结束,例如${day>100}
- 支持逻辑运算${userName==”bajie”} and pwd==”123”
- 支持变量与实体类赋值
例如一个流程,有两个任务节点,第一个任务节点有一个day变量,day=5,第二个任务节点,day=6,在activiti6之前,后者是可以覆盖前者的,但是在activit7中,后者是不会覆盖前者的,所以建议使用activiti7中,不要使用流程变量覆盖操作
对应Activiti数据表
and | eq | gt |
---|---|---|
instanceof | div | or |
le | false | empty |
not | Lt | ge |
UEL表达式的运算符
运算符 | 功能 | 示例 | 结果 |
---|---|---|---|
+ | 加 | ${1+1} | 2 |
- |
任务发布的时候带参数
activiti:assignee=”${zhiXingRen}” 指定执行人
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="myProcess_UEL_V1" name="processName" isExecutable="true">
<startEvent id="starteventId" name="开始"></startEvent>
<userTask id="usertaskId" name="uel任务节点"
activiti:assignee="${zhiXingRen}"></userTask>
<endEvent id="endeventId" name="End"></endEvent>
<sequenceFlow sourceRef="starteventId" targetRef="usertaskId"/>
<sequenceFlow sourceRef="usertaskId" targetRef="endeventId"/>
</process>
</definitions>
package com.torey.activiti7_workflow;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class Part6_UEL {
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
/**
* 启动流程参数,用参数指定执行人
*/
@Test
public void initProcessInstanceWithArgs(){
//流程变量
Map<String,Object> variables=new HashMap<>();
variables.put("zhiXingRen","wukong");
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myProcess_UEL_V1",
"businessId",variables);
System.out.println("流程实例ID:" + processInstance.getId());
}
}
任务执行的时候带参数
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="myProcess_UEL_V2" name="UEL流程变量V2" isExecutable="true">
<startEvent id="starteventId" name="开始"></startEvent>
<userTask id="usertaskId" name="uel任务节点"
activiti:assignee="bajie"></userTask>
<exclusiveGateway id="exclusiveGatewayId1"></exclusiveGateway>
<userTask id="userTaskId1" activiti:assignee="wuKong" name="悟空审核"/>
<userTask id="userTaskId2" activiti:assignee="tangCeng" name="唐曾审核"/>
<endEvent id="endeventId" name="End"></endEvent>
<sequenceFlow sourceRef="starteventId" targetRef="usertaskId"/>
<sequenceFlow sourceRef="usertaskId" targetRef="exclusiveGatewayId1"/>
<sequenceFlow name="小于等于100" sourceRef="exclusiveGatewayId1" targetRef="userTaskId1">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${pay<=100}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow name="大于100" sourceRef="exclusiveGatewayId1" targetRef="userTaskId2">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${pay>100}]]></conditionExpression>
</sequenceFlow>
<sequenceFlow sourceRef="userTaskId1" targetRef="endeventId"/>
<sequenceFlow sourceRef="userTaskId2" targetRef="endeventId"/>
</process>
</definitions>
/**
* 完成任务带参数
*/
@Test
public void completeTaskWithArgs(){
Map<String,Object> variables=new HashMap<>();
variables.put("pay",99);
String assignee="bajie";
List<Task> taskList = taskService.createTaskQuery()
.taskAssignee(assignee).list();
if (null==taskList ||taskList.size()==0) {
System.out.println("不存在该执行人" + assignee);
return;
}
System.out.println(assignee+"的任务有"+taskList.size()+"个");
for (Task task : taskList) {
taskService.complete(task.getId(),variables);
}
taskList = taskService.createTaskQuery()
.taskAssignee(assignee).list();
System.out.println(assignee+"的任务执行完成,任务有"+taskList.size()+"个");
}
启动流程实例,带实体类
package com.torey.activiti7_workflow;
import java.io.Serializable;
public class UEL_POJO implements Serializable {
//属性必须都要小写,否则访问不了
private String zhixingren;
private String pay;
public String getZhixingren() {
return zhixingren;
}
public void setZhixingren(String zhixingren) {
this.zhixingren = zhixingren;
}
public String getPay() {
return pay;
}
public void setPay(String pay) {
this.pay = pay;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="myProcess" name="My process" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<userTask id="usertask1" name="实体类任务" activiti:assignee="${uelpojo.zhixingren}"></userTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
<userTask id="usertask2" name="候选人任务" activiti:candidateUsers="${houxuanren}"></userTask>
<sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
<endEvent id="endevent1" name="End"></endEvent>
<sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
</process>
</definitions>
/**
* 启动流程参数,使用实体类
*/
public void initProcessInstanceWithClassArgs(){
//流程变量
Map<String,Object> variables=new HashMap<>();
UEL_POJO uel_pojo=new UEL_POJO();
uel_pojo.setZhixingren("张三");
variables.put("uelpojo",uel_pojo);
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("myProcess",
"businessId",variables);
System.out.println("流程实例ID:" + processInstance.getId());
}
任务完成环节带参数,指定多个候选人
/**
* 任务完成环节带参数,指定多个候选人
*/
@Test
public void initProcessInstanceWithCandiDateArgs(){
String assignee="张三";
Map<String,Object> variables=new HashMap<>();
variables.put("houxuanren","wukong,tangceng");
List<Task> taskList = taskService.createTaskQuery()
.taskAssignee(assignee).list();
if (null==taskList ||taskList.size()==0) {
System.out.println("不存在该执行人" + assignee);
return;
}
System.out.println(assignee+"的任务有"+taskList.size()+"个");
for (Task task : taskList) {
taskService.complete(task.getId(),variables);
}
taskList = taskService.createTaskQuery()
.taskAssignee(assignee).list();
System.out.println(assignee+"的任务执行完成,任务有"+taskList.size()+"个");
}
直接指定变量
/**
* 直接指定流程变量
* 流程变量分为:全局变量和局部变量
*/
public void otherArgs(){
runtimeService.setVariable("","","");
runtimeService.setVariables("",null);
taskService.setVariable("","","");
taskService.setVariables("",null);
}
/**
* 局部变量,只在当前节点有用,能找到,在其他节点,找不到
*/
public void otherLocalArgs(){
runtimeService.setVariableLocal("","","");
runtimeService.setVariablesLocal("",null);
taskService.setVariableLocal("","","");
taskService.setVariablesLocal("",null);
}