Activiti 流程啟動
流程定義部署後,就可以通過工作流管理業務流程了,也就是說前文部署的出差申請流程可以使用了。針對該流程,啟動一個流程表示發起一個新的出差申請單,這就相當於 java 類與 java 物件的關係,類定義好後需要建立一個物件使用,也可以建立多個物件。對於出差申請流程,張三發起一個出差申請單需要啟動一個流程例項,李四發起一個出差申請單也需要啟動一個流程例項
Activiti 流程啟動主要有兩種方式,分別是根據 processDefinitionKey 啟動和根據 processDefinitionId 啟動
1. 根據 processDefinitionKey 啟動
processDefinitionKey 就是 act_re_procdef 表的 KEY_ 欄位的值,是對應的流程定義的 key
@Test
public void testStartProcess() {
// 1. 建立 ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 獲取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3. 根據 processDefinitionKey 啟動流程
ProcessInstance instance = runtimeService.startProcessInstanceByKey("evection");
}
2. 根據 processDefinitionId 啟動
processDefinitionId 就是 act_re_procdef 的主鍵 ID 例如 evection:1:22503
@Test
public void testStartProcess() {
// 1. 建立 ProcessEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 獲取 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3. 根據 processDefinitionKey 啟動流程
ProcessInstance instance = runtimeService.startProcessInstanceById("evection:1:22503");
}
Activiti 個人任務查詢
流程啟動後,任務的負責人就可以查詢自己當前需要處理的任務,查詢出來的任務都是該使用者的待辦任務
public void testFindPersonTaskList() {
// 1. 獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 獲取 taskService
TaskService taskService = processEngine.getTaskService();
// 3. 獲取流程 key 和任務的負責人,查詢任務
List<Task> taskList = taskService.createTaskQuery()
.processDefinitionKey("evection") // 流程key
.taskAssignee("zhangsan") // 要查詢的負責人
.list();
// 4. 輸出
for (Task task : taskList) {
System.out.println("流程例項 id = " + task.getProcessInstanceId());
System.out.println("任務 id = " + task.getId());
System.out.println("任務負責人 = " + task.getAssignee());
System.out.println("任務名稱 = " + task.getName());
}
}
Activiti 完成個人任務
根據任務 id,也就是 查詢任務並處理
public void completeTask() {
// 1. 獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 獲取 TaskService
TaskService taskService = processEngine.getTaskService();
// 3. 根據任務id 完成任務
taskService.complete("25005");
}
每次都要查詢任務 id 很麻煩,一般來說,是任務負責人查詢待辦任務,選擇任務進行處理,完成任務,那我們就能根據任務負責人和任務 key 來查詢任務並完成
public void completeTask() {
// 1. 獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 獲取 TaskService
TaskService taskService = processEngine.getTaskService();
// 3. 獲取 jerry - evection 對應的任務
Task task = taskService.createTaskQuery()
.processDefinitionKey("evection")
.taskAssignee("jerry")
.singleResult();
// 4. 根據任務 id 完成任務
taskService.complete(task.getId());
}
以此類推,直至整個出差流程完成