給一個任務分配負責人可以采用如下3種方式進行分配。
[TOC]
# 1. 固定分配

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

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

**3. UEL-value與UEL-method配合使用**

**4. 其他**
表達式支持解析基礎類型、 bean、 list、 array 和 map,也可作為條件判斷。
```
${order.price > 100 && order.price < 250}
```
<br/>
需要注意:由于使用了表達式分配,必須保證在任務執行過程表達式執行成功,比如:某個任務使用了表達式`${order.price > 100 && order.price < 250}`,當執行該任務時必須保證 order 在流程變量中存在,否則 activiti 異常。
<br/>
下面演示UEL-value的使用,其他的也是一樣的道理,步驟如下:
**1. 定義流程變量**

**2. 設置流程變量**
```java
/**
* 測試 使用uel 設置負責人
*/
public class TestAssigneeUel {
/**
* 流程部署
*/
@Test
public void testDeployment() {
//1、創建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、獲取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用service進行流程的部署,定義一個流程的名字,把bpmn和png部署到數據中
Deployment deploy = repositoryService.createDeployment()
.name("出差申請流程")
.addClasspathResource("bpmn-02/evection.bpmn")
.addClasspathResource("bpmn-02/image/evection.png")
.deploy();
//4、輸出部署信息
System.out.println("流程部署id=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
//啟動流程創建流程實例
@Test
public void startAssigneeUel() {
//獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//設定assignee的值,用來替換uel表達式
Map<String, Object> assigneeMap = new HashMap<String, Object>();
assigneeMap.put("assignee0", "張三");
assigneeMap.put("assignee1", "李經理");
assigneeMap.put("assignee2", "王總經理");
assigneeMap.put("assignee3", "趙財務");
//啟動流程實例
runtimeService.startProcessInstanceByKey("myEvection", 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 |
+------+------+--------+-----------+---------------+---------------+----------+---------------+---------+-------+----------+--------+
```
# 3. 監聽器分配
使用監聽器的方式來指定負責人,那么在流程設計時就不需要指定assignee。
任務監聽器是發生對應的任務相關事件時執行自定義 java 邏輯或表達式。
<br/>
使用監聽器分配負責人的步驟如下:
**1. 指定監聽器屬性**
:-: 

```
Event可選值:
Create:任務創建后觸發
Assignment:任務分配后觸發
Delete:任務完成后觸發
All:所有事件發生都觸發
Type可選值:
Class
Expression
Delegate Expression
```
我就不用上面的圖形化操作了,直接在XML中指定。
```xml
...
<userTask activiti:exclusive="true" id="_4" name="創建出差申請單">
<extensionElements>
<!-- event=all,class就是指定的監聽器 -->
<activiti:taskListener class="com.itheima.demo.listener.MyTaskListener" event="all" />
</extensionElements>
</userTask>
<userTask activiti:exclusive="true" id="_5" name="總經理審批">
<extensionElements>
<activiti:taskListener class="com.itheima.demo.listener.MyTaskListener" event="all" />
</extensionElements>
</userTask>
...
```
**2. 定義監聽器**
```java
public class MyTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
//判斷當前的任務 是 創建出差申請單 并且 是 create事件
if ("創建出差申請單".equals(delegateTask.getName()) &&
"create".equals(delegateTask.getEventName())) {
delegateTask.setAssignee("張三");
}
}
}
```
**3. 測試**
```java
public class TestListener {
/**
* 1. 先進行流程部署
*/
@Test
public void testDeployment() {
//1、創建ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2、獲取RepositoryServcie
RepositoryService repositoryService = processEngine.getRepositoryService();
//3、使用service進行流程的部署,定義一個流程的名字,把bpmn和png部署到數據中
Deployment deploy = repositoryService.createDeployment()
.name("測試監聽器")
.addClasspathResource("bpmn/demo-listen.bpmn")
.deploy();
//4、輸出部署信息
System.out.println("流程部署id=" + deploy.getId());
System.out.println("流程部署名字=" + deploy.getName());
}
/**
* 2. 啟動流程,創建流程實例
*/
@Test
public void startDemoListener() {
//獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RunTimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//啟動流程實例
runtimeService.startProcessInstanceByKey("testListener");
}
}
```
```sql
# 創建出差申請單這個節點就會分配一個負責人為張三
mysql> select * from act_ru_task;
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
| ID_ | REV_ | EXECUTION_ID_ | PROC_INST_ID_ | PROC_DEF_ID_ | NAME_ | PARENT_TASK_ID_ | DESCRIPTION_ | TASK_D...
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
| 5005 | 1 | 5002 | 5001 | testListener:1:3 | 創建出差申請單 | NULL | NULL | _4 | NULL | 張三 | ...
+------+------+---------------+---------------+------------------+----------------+-----------------+--------------+-----------...
```
- Activiti流程引擎
- 工作流介紹
- Activiti是什么
- Activiti流程處理步驟
- Activiti環境搭建
- 搭建步驟
- 表結構介紹
- ActivitiAPI結構
- 認識流程符號
- 流程設計器的使用
- 流程處理步驟
- 亂碼問題
- 流程實例
- 流程實例是什么
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 個人任務
- 分配任務負責人
- 查詢待辦任務
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 使用流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 4種網關類型
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable與Activiti
- Flowable環境搭建
- FlowableAPI
- 流程引擎API與服務
- 流程處理步驟
- 流程部署
- 流程部署方式
- 流程定義版本
- 刪除已部署的流程
- 下載資源
- 流程實例
- 什么是流程實例
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 分配任務負責人
- 固定分配
- UEL表達式分配
- 監聽器分配
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- 歷史查詢
- 查詢歷史
- Spring整合Flowable
- 配置文件整合
- 配置類整合
- SpringBoot整合Flowable