1. 程式人生 > >【Activiti工作流】8.流程例項,任務,執行物件控制流程的執行

【Activiti工作流】8.流程例項,任務,執行物件控制流程的執行

我們之前講過了流程的定義,啟動,檢視和刪除,以及升級版本,接下來當流程
正式啟動成功之後,我們就要學習流程例項/任務的執行了。

1,流程例項/任務的執行
(1)啟動流程例項
(這裡前提是大家部署好了流程)
/**
 * 啟動流程
 * 當流程到達一個節點時,會在act_ru_execution表中產生1條資料
 * 如果當節點是使用者任務節點,這時會在act_ru_task表中產生1條資料
 * */
@Test
public void startProcess() throws Exception{
	//按照流程定義的id啟動:Helloworld:1:4 (只啟動此版本流程,最高版本是HelloWorld:2:704)
	//runtimeService.startProcessInstanceById(processDefinitionId);
	//使用流程定義的key啟動流程,預設會啟動最高版本的流程
	String processDefinitionkey="HelloWorld";//流程定義的key就是HelloWorld
	RuntimeService runtimeService=processEngine.getRuntimeService();
	//獲取流程例項物件
	ProcessInstance processInstance=runtimeService.startProcessInstanceByKey(processDefinitionkey);
	System.out.println("pid:"+processInstance.getId());
	System.out.println("activitiId::"+processInstance.getActivityId());
	System.out.println("pdid:"+processInstance.getProcessDefinitionId());
}
我們執行一下,結果:



此時資料庫中act_ru_execution表中產生一條新的資料:

act_ru_execution表是正在執行的執行物件表。
其中ID_是執行物件ID,PROC_INST_ID是流程例項ID。


結論:如果是單例流程(沒有分支和聚合),那麼流程例項ID
和執行物件ID是相同的。


有正在執行的,就有之前的歷史,之前流程執行的歷史,
我們在act_hi_procinst表中檢視歷史資料:



可以看到,我們之前有一個走完的流程的資訊在歷史表中儲存,
那是我們Version為1的HelloWorld流程,第二個就是我們現在剛剛
建立的流程,可以看到開始時間和開始節點資訊,由於流程沒有結束,
所以還沒有儲存流程結束時間和流程結束節點的資訊。


結論:一個流程例項只有一個,但是執行物件可以存在多個。
(存在於不是單例流程,而包含分支和聚合的流程)



2.任務資訊
例如張三開始申請請假,那麼張三填寫完請假申請,點選提交之後,
目前此時張三就有一個待辦事項,就是張三向上一級提交請假資訊。
此時我們資料庫中act_ru_task表中就有該資料:



辦過的流程事務是有歷史資訊的,歷史表為act_hi_taskinst:



還有一張表act_hi_actinst,是存放所有活動節點的歷史表,包括任務和節點資訊:



3.查詢個人當前任務
通過上面的講解,我們可以明白之前我們查詢個人待辦事項的程式碼:
/**查詢當前的個人任務(實際就是查詢act_ru_task表)*/
@Test
public void findMyPersonalTask(){
	String assignee="張三";
	//獲取事務Service
	TaskService taskService=processEngine.getTaskService();
	List<Task> taskList=taskService.createTaskQuery()//建立任務查詢物件
			   .taskAssignee(assignee)//指定個人任務查詢,指定辦理人
			   .list();//獲取該辦理人下的事務列表
	
	if(taskList!=null&&taskList.size()>0){
		for(Task task:taskList){
			System.out.println("任務ID:"+task.getId());
			System.out.println("任務名稱:"+task.getName());
			System.out.println("任務的建立時間:"+task.getCreateTime());
			System.out.println("任務辦理人:"+task.getAssignee());
			System.out.println("流程例項ID:"+task.getProcessInstanceId());
			System.out.println("執行物件ID:"+task.getExecutionId());
			System.out.println("流程定義ID:"+task.getProcessDefinitionId());
			System.out.println("#############################################");
		}
	}
}
執行結果:



我們的流程啟動之後,第一個要辦理的業務就是提交申請業務,此時的辦理人就是
張三,所以通過張三去查詢待辦事項的時候,查詢到的就是提交申請的任務資訊。


然後我們分別執行完成任務的程式碼:
/**完成我的任務*/
@Test
public void completeMyPersonalTask(){
	String taskId="804";//上一次我們查詢的任務ID就是804
	TaskService taskService=processEngine.getTaskService();
	taskService.complete(taskId);//完成taskId對應的任務
	System.out.println("完成ID為"+taskId+"的任務");
	
}
執行完804的任務,就完成了張三的任務

此時流程走到了部門經理李四那裡:

執行上面的findMyPersonalTask()方法,將assignee換為李四,此時查詢到:

跟資料庫中的資訊一樣。


此時我們的流程歷史資訊走了三步:

接下來執行李四的任務

任務此時到總經理王五那裡:

執行上面的findMyPersonalTask()方法,將assignee換為王五,此時查詢到:

跟資料庫中的資訊一樣。


接下來執行王五的任務:

此時流程走完,任務表中已經沒有了資訊:



檢視流程資訊表,也有了結束的時間:



檢視任務歷史表,可以看到三個任務的辦理歷史資訊:



我們的流程歷史表中,也存入了所有流程資訊:



總結:
流程例項,執行物件,任務:
act_ru_execution 正在執行的執行物件表
act_hi_procinst 流程例項的歷史表
act_tu_task 正在執行的任務表(只有節點是UserTask的時候,該表粗存在資料)
act_hi_taskinst 任務歷史表(只有節點是UserTask的時候,該表存在資料)

act_hiactinst 所有活動節點的歷史表