啟動流程執行個體
<span style="font-size:12px;"> /**啟動流程執行個體*/
@Test
public void startProcessInstance(){
//流程定義的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService()//與正在執行的流程執行個體和執行對象相關的Service
.startProcessInstanceByKey(processDefinitionKey);//使用流程定義的key啟動流程執行個體,key對應helloworld.bpmn檔案中id的屬性值,使用key值啟動,預設是按照最新版本的流程定義啟動
System.out.println("流程執行個體ID:"+pi.getId());//流程執行個體ID 101
System.out.println("流程定義ID:"+pi.getProcessDefinitionId());//流程定義ID helloworld:1:4
}</span>
代碼說明:
操作資料庫的act_ru_execution表,如果是使用者任務節點,同時也會在act_ru_task添加一條記錄
查詢我的個人任務
/**查詢目前人的個人任務*/
@Test
public void findMyPersonalTask(){
String assignee = "王五";
List<Task> list = processEngine.getTaskService()//與正在執行的任務管理相關的Service
.createTaskQuery()//建立任務查詢對象
/**查詢條件(where部分)*/
.taskAssignee(assignee)//指定個人任務查詢,指定辦理人
// .taskCandidateUser(candidateUser)//組任務的辦理人查詢
// .processDefinitionId(processDefinitionId)//使用流程定義ID查詢
// .processInstanceId(processInstanceId)//使用流程執行個體ID查詢
// .executionId(executionId)//使用執行對象ID查詢
/**排序*/
.orderByTaskCreateTime().asc()//使用建立時間的升序排列
/**傳回結果集*/
// .singleResult()//傳回惟一結果集
// .count()//傳回結果集的數量
// .listPage(firstResult, maxResults);//分頁查詢
.list();//傳回清單
if(list!=null && list.size()>0){
for(Task task:list){
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("########################################################");
}
}
}
代碼說明:
1) 因為是任務查詢,是以從processEngine中應該得到TaskService
2) 使用TaskService擷取到任務查詢對象TaskQuery
3) 為查詢對象添加查詢過濾條件,使用taskAssignee指定任務的辦理者(即查詢指定使用者的代辦任務),同時可以添加分頁排序等過濾條件
4) 調用list方法執行查詢,傳回辦理者為指定使用者的任務清單
5) 任務ID、名稱、辦理人、建立時間可以從act_ru_task表中查到。
6) Execution與ProcessInstance見5.6和5.7章節的介紹。在這種情況下,ProcessInstance相當于Execution
7) 如果assignee屬性為部門經理,結果為空。因為現在流程隻到了”填寫請假申請”階段,後面的任務還沒有執行,即在資料庫中沒有部門經理可以辦理的任務,是以查詢不到。
8) 一個Task節點和Execution節點是1對1的情況,在task對象中使用Execution_來表示他們之間的關系
9) 任務ID在資料庫表act_ru_task中對應“ID_”列
附加:
在activiti任務中,主要分為兩大類查詢任務(個人任務群組任務):
1.确切指定了辦理者的任務,這個任務将成為指定者的私有任務,即個人任務。
2.無法指定具體的某一個人來辦理的任務,可以把任務配置設定給幾個人或者一到 多個小組,讓這個範圍内的使用者可以選擇性(如有空餘時間時)來辦理這類任務,即組任務。
辦理任務
/**辦理我的任務*/
@Test
public void completeMyPersonalTask(){
//任務ID
String taskId = "1202";
processEngine.getTaskService()//與正在執行的任務管理相關的Service
.complete(taskId);
System.out.println("完成任務:任務ID:"+taskId);
}
說明:
1) 是辦理任務,是以從ProcessEngine得到的是TaskService。
2) 當執行完這段代碼,再以員工的身份去執行查詢的時候,會發現這個時候已經沒有資料了,因為正在執行的任務中沒有資料。
3) 對于執行完的任務,activiti将從act_ru_task表中删除該任務,下一個任務會被插入進來。
4) 以”部門經理”的身份進行查詢,可以查到結果。因為流程執行到部門經理審批這個節點了。
5) 再執行辦理任務代碼,執行完以後以”部門經理”身份進行查詢,沒有結果。
重複第3和4步直到流程執行完。
查詢流程狀态
/**查詢流程狀态*/
@Test
public void isProcessEnd(){
String processInstanceId = "1001";
ProcessInstance pi = processEngine.getRuntimeService()//表示正在執行的流程執行個體和執行對象
.createProcessInstanceQuery()//建立流程執行個體查詢
.processInstanceId(processInstanceId)//使用流程執行個體ID查詢
.singleResult();
if(pi==null){
System.out.println("流程已經結束");
}
else{
System.out.println("流程沒有結束");
}
}
在流程執行的過程中,建立的流程執行個體ID在整個過程中都不會變,當流程結束後,流程執行個體将會在正在執行的執行對象表中(act_ru_execution)被删除
說明:
1) 因為是查詢流程執行個體,是以先擷取runtimeService
2) 建立流程執行個體查詢對象,設定執行個體ID過濾參數
3) 由于一個流程執行個體ID隻對應一個執行個體,使用singleResult執行查詢傳回一個唯一的結果,如果結果數量大于1,則抛出異常
4) 判斷指定ID的執行個體是否存在,如果結果為空,則代表流程結束,執行個體在正在執行的執行對象表中已被删除,轉換成曆史資料。
查詢曆史任務
@Test
public void findHistoryTask(){
String taskAssignee = "張三";
List<HistoricTaskInstance> list = processEngine.getHistoryService()//與曆史資料(曆史表)相關的Service
.createHistoricTaskInstanceQuery()//建立曆史任務執行個體查詢
.taskAssignee(taskAssignee)//指定曆史任務的辦理人
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
System.out.println("################################");
}
}
}
查詢曆史流程執行個體
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "1001";
HistoricProcessInstance hpi = processEngine.getHistoryService()//與曆史資料(曆史表)相關的Service
.createHistoricProcessInstanceQuery()//建立曆史流程執行個體查詢
.processInstanceId(processInstanceId)//使用流程執行個體ID查詢
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}