[TOC]
# 1. UEL 表達式
UEL 表達式是 java EE6 規范的一部分, UEL(Unified Expression Language)即 統一表達式語言, activiti 支持兩個 UEL 表達式: UEL-value 和 UEL-method。
<br/>
**1. UEL-value**
:-: 
寫法一

寫法二
**2. UEL-method**

<br/>
**3. UEL-value與UEL-method配合使用**

<br/>
**4. 其他**
表達式支持解析基礎類型、 bean、 list、 array 和 map,也可作為條件判斷。
```
${order.price > 100 && order.price < 250}
```
<br/>
>[warning]注意:由于使用了表達式分配,必須保證在任務執行過程表達式執行成功,比如:某個任務使用了表達式`${order.price > 100 && order.price < 250}`,當執行該任務時必須保證 order 在流程變量中存在,否則異常。
****
參考文檔:https://tkjohn.github.io/flowable-userguide/#apiExpressions
<br/>
# 2. 演示UEL-value的使用
下面演示UEL-value的使用,其他的也是一樣的道理,步驟如下:
<br/>
**1. 定義流程變量**
:-: 
`evection-uel.bpmn`
```xml
...
<userTask activiti:assignee="${assignee0}" activiti:exclusive="true" id="_3" name="創建出差申請單" />
<endEvent id="_7" name="EndEvent" />
<sequenceFlow id="_8" sourceRef="_2" targetRef="_3" />
<userTask activiti:assignee="${assignee1}" activiti:exclusive="true" id="_14" name="部門經理審批" />
<sequenceFlow id="_15" sourceRef="_3" targetRef="_14" />
<userTask activiti:assignee="${assignee2}" activiti:exclusive="true" id="_16" name="總經理審批" />
<userTask activiti:assignee="${assignee3}" activiti:exclusive="true" id="_17" name="財務審批" />
...
...
```
**2. 設置流程變量**
```java
public class UelAssigneeDemo {
/**
* 1. 流程部署
*/
@Test
public void testDeployment() {
//1、獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、獲取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、部署流程
Deployment deploy = repositoryService.createDeployment()
.name("出差申請流程") //流程名稱
.addClasspathResource("bpmn/evection-uel.bpmn")
.deploy();
//流程部署id=10001
System.out.println("流程部署id=" + deploy.getId());
//流程部署名字=出差申請流程
System.out.println("流程部署名字=" + deploy.getName());
}
/**
* 2. 啟動流程,并設置流程變量
*/
@Test
public void startAssigneeUel() {
//1、獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、獲取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//3、設定assignee的值,用來替換uel表達式
Map<String, Object> assigneeMap = new HashMap<String, Object>(1);
assigneeMap.put("assignee0", "張三");
assigneeMap.put("assignee1", "李經理");
assigneeMap.put("assignee2", "王總經理");
assigneeMap.put("assignee3", "趙財務");
//4、根據流程key啟動流程實例并設置變量
runtimeService.startProcessInstanceByKey("evection-uel", assigneeMap);
}
}
```
```sql
#設置的流程變量如下
mysql> select * from act_ru_variable;
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
| ID_ | REV_ | TYPE_ | NAME_ | EXECUTION_ID_ | PROC_INST_ID_ | TASK_ID_ | BYTEARRAY_ID_ | DOUBLE_ | LONG_ | TEXT_ | TEXT2_ |
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
| 2502 | 1 | string | assignee3 | 2501 | 2501 | NULL | NULL | NULL | NULL | 趙財務 | NULL |
| 2503 | 1 | string | assignee0 | 2501 | 2501 | NULL | NULL | NULL | NULL | 張三 | NULL |
| 2504 | 1 | string | assignee2 | 2501 | 2501 | NULL | NULL | NULL | NULL | 王總經理 | NULL |
| 2505 | 1 | string | assignee1 | 2501 | 2501 | NULL | NULL | NULL | NULL | 李經理 | NULL |
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
```
- Activiti流程引擎
- 工作流介紹
- Activiti是什么
- Activiti流程處理步驟
- Activiti環境搭建
- 搭建步驟
- 表結構介紹
- ActivitiAPI結構
- 認識流程符號
- 流程設計器的使用
- 流程處理步驟
- 亂碼問題
- 流程實例
- 流程實例是什么
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 個人任務
- 分配任務負責人
- 查詢待辦任務
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 使用流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 4種網關類型
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable與Activiti
- Flowable環境搭建
- FlowableAPI
- 流程引擎API與服務
- 流程處理步驟
- 流程部署
- 流程部署方式
- 流程定義版本
- 刪除已部署的流程
- 下載資源
- 流程實例
- 什么是流程實例
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 分配任務負責人
- 固定分配
- UEL表達式分配
- 監聽器分配
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- 歷史查詢
- 查詢歷史
- Spring整合Flowable
- 配置文件整合
- 配置類整合
- SpringBoot整合Flowable