Flowable 處理一個流程的步驟如下:
<br/>
**1. 定義流程**

**2. 部署流程**
```java
@Test
public void deploymentProcess() {
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//部署流程
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("bpmn/evectionProcess.bpmn") //部署資源
.name("出差申請流程") //部署名稱
.deploy();
log.info("部署名:{}", deployment.getName()); //部署名:出差申請流程
log.info("部署id:{}", deployment.getId()); //部署id:1
}
```
完成上面的部署后相關數據保存到如下3張表中:
```sql
-- 流程部署表:每部署一次增加一條記錄
mysql> select * from act_re_deployment;
+-----+--------------+-----------+------+------------+---------------------+---------------+--------------------+-----------------+
| ID_ | NAME_ | CATEGORY_ | KEY_ | TENANT_ID_ | DEPLOY_TIME_ | DERIVED_FROM_ | DERIVED_FROM_ROOT_ | ENGINE_VERSION_ |
+-----+--------------+-----------+------+------------+---------------------+---------------+--------------------+-----------------+
| 1 | 出差申請流程 | NULL | NULL | | 2021-10-28 17:09:50 | NULL | NULL | NULL |
+-----+--------------+-----------+------+------------+---------------------+---------------+--------------------+-----------------+
-- 流程定義表:部署每個新的流程就會在這張表中增加一條記錄
-- 注意,KEY_ 這個字段是用來唯一識別不同流程的關鍵字
mysql> select * from act_re_procdef;
+---------------------+------+------------------------------+--------------+-----------------+----------+----------------+---------------------------+---------------------------------------...
| ID_ | REV_ | CATEGORY_ | NAME_ | KEY_ | VERSION_ | DEPLOYMENT_ID_ | RESOURCE_NAME_ | DGRM_RESOURCE_NAME_ | DESCRI...
+---------------------+------+------------------------------+--------------+-----------------+----------+----------------+---------------------------+---------------------------------------...
| evectionProcess:1:4 | 1 | http://www.activiti.org/test | 出差申請流程 | evectionProcess | 1 | 1 | bpmn/evectionProcess.bpmn | bpmn/evectionProcess.evectionProcess.png | ...
+---------------------+------+------------------------------+--------------+-----------------+----------+----------------+---------------------------+---------------------------------------...
-- 流程資源表
mysql> select id_, rev_, name_, deployment_id_, left(bytes_, 30) as bytes_, generated_ from act_ge_bytearray;
+-----+------+------------------------------------------+----------------+--------------------------------+------------+
| id_ | rev_ | name_ | deployment_id_ | bytes_ | generated_ |
+-----+------+------------------------------------------+----------------+--------------------------------+------------+
| 2 | 1 | bpmn/evectionProcess.bpmn | 1 | <?xml version="1.0" encoding=" | 0 |
| 3 | 1 | bpmn/evectionProcess.evectionProcess.png | 1 | Binary/Image | 1 |
+-----+------+------------------------------------------+----------------+--------------------------------+------------+
act_re_deployment和act_re_procdef一對多關系,一次部署在流程部署表生成一條記錄,
但一次部署可以部署多個流程定義,每個流程定義在流程定義表生成一條記錄。
每一個流程定義在act_ge_bytearray會存在兩個資源記錄,bpmn和png。
建議:一次部署一個流程,這樣部署表和流程定義表是一對一有關系,方便讀取流程部署及流程定義信息。
```
**3. 啟動流程**
```java
@Test
public void runtimeProcess() {
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//根據流程key啟動對應的流程,創建流程實例
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("evectionProcess");
//流程部署id:1
log.info("流程部署id:{}", processInstance.getDeploymentId());
//流程定義id:evectionProcess:1:4
log.info("流程定義id:{}", processInstance.getProcessDefinitionId());
//流程實例id:2501
log.info("流程實例id:{}", processInstance.getId());
}
```
完成上面的啟動流程后相關數據保存到如下7張表中:
```sql
act_hi_actinst 流程實例執行歷史信息
act_hi_identitylink 流程參與用戶的歷史信息
act_hi_procinst 流程實例的歷史信息
act_hi_taskinst 流程任務的歷史信息
act_ru_execution 流程執行信息
act_ru_identitylink 流程的正在參與用戶信息
act_ru_task 流程當前任務信息
```
**4. 查詢個人待辦任務**
```java
@Test
public void queryTask() {
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService
TaskService taskService = processEngine.getTaskService();
//根據流程Key與負責人查詢
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("evectionProcess")
.taskAssignee("張三")
.list();
taskList.forEach(task -> {
log.info("任務id:{}", task.getId());
log.info("任務負責人:{}", task.getAssignee());
log.info("任務名稱:{}", task.getName());
log.info("流程定義Id:{}", task.getProcessDefinitionId());
log.info("流程實例Id:{}", task.getProcessInstanceId());
log.info("任務節點Id:{}", task.getTaskDefinitionKey());
});
//任務id:2505
//任務負責人:張三
//任務名稱:創建出差申請
//流程定義Id:evectionProcess:1:4
//流程實例Id:2501
//任務節點Id:_3
}
```
**5. 完成個人待辦任務**
```java
@Test
public void completeTask() {
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取TaskService
TaskService taskService = processEngine.getTaskService();
//根據流程key與負責人查詢待辦任務
Task task = taskService.createTaskQuery()
.processDefinitionKey("evectionProcess")
.taskAssignee("張三")
.singleResult();
//根據任務id完成對應的任務
taskService.complete(task.getId());
log.info("任務負責人:{}", task.getAssignee()); //任務負責人:張三
log.info("任務Id:{}", task.getId()); //任務Id:2505
log.info("任務名稱:{}", task.getName()); //任務名稱:創建出差申請
log.info("流程實例Id:{}", task.getProcessInstanceId()); //流程實例Id:2501
log.info("流程定義Id:{}", task.getProcessDefinitionId()); //流程定義Id:evectionProcess:1:4
log.info("任務節點Id:{}", task.getTaskDefinitionKey()); //任務節點Id:_3
}
```
完成對應的任務后,該任務從表`act_ru_task`中刪除,并在如下表中插入下一個任務的相關數據:
```sql
act_ru_task
act_hi_taskinst
act_hi_actinst
act_hi_identitylink
act_ru_identitylink
```
**6. 流程結束,后期的歷史追蹤與維護**
```java
@Test
public void queryHistory() {
//獲取ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取HistoryService
HistoryService historyService = processEngine.getHistoryService();
List<HistoricActivityInstance> activities =
historyService.createHistoricActivityInstanceQuery()
.processInstanceId("2501") //根據流程實例id查詢
.finished() //查詢是已經完成的任務
.orderByHistoricActivityInstanceEndTime().asc()
.list();
activities.forEach(activity -> {
log.info("任務節點Id:{}", activity.getActivityId());
log.info("完成任務所花的時間:{}ms", activity.getDurationInMillis());
log.info("任務負責人:{}", activity.getAssignee());
log.info("流程定義Id:{}", activity.getProcessDefinitionId());
log.info("流程實例Id:{}", activity.getProcessInstanceId());
log.info("任務節點名稱:{}", activity.getActivityName());
log.info("任務節點類型:{}", activity.getActivityType());
log.info("任務Id:{}\n", activity.getTaskId());
});
//任務節點Id:_2
//完成任務所花的時間:2ms
//任務負責人:null
//流程定義Id:evectionProcess:1:4
//流程實例Id:2501
//任務節點名稱:StartEvent
//任務節點類型:startEvent
//任務Id:null
//任務節點Id:_3
//完成任務所花的時間:1044753ms
//任務負責人:張三
//流程定義Id:evectionProcess:1:4
//流程實例Id:2501
//任務節點名稱:創建出差申請
//任務節點類型:userTask
//任務Id:2505
}
```
- Activiti流程引擎
- 工作流介紹
- Activiti是什么
- Activiti流程處理步驟
- Activiti環境搭建
- 搭建步驟
- 表結構介紹
- ActivitiAPI結構
- 認識流程符號
- 流程設計器的使用
- 流程處理步驟
- 亂碼問題
- 流程實例
- 流程實例是什么
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 個人任務
- 分配任務負責人
- 查詢待辦任務
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 使用流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 4種網關類型
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- Spring整合Activiti
- SpringBoot整合Activiti
- Flowable流程引擎
- Flowable是什么
- Flowable與Activiti
- Flowable環境搭建
- FlowableAPI
- 流程引擎API與服務
- 流程處理步驟
- 流程部署
- 流程部署方式
- 流程定義版本
- 刪除已部署的流程
- 下載資源
- 流程實例
- 什么是流程實例
- 業務標識
- 查詢流程實例
- 掛起/激活流程實例
- 分配任務負責人
- 固定分配
- UEL表達式分配
- 監聽器分配
- 辦理權限
- 流程變量
- 流程變量類型
- 流程變量作用域
- 流程變量控制流程
- 組任務
- 設置任務候選人
- 組任務辦理流程
- 網關
- 排他網關
- 并行網關
- 包含網關
- 事件網關
- 歷史查詢
- 查詢歷史
- Spring整合Flowable
- 配置文件整合
- 配置類整合
- SpringBoot整合Flowable