Activiti基礎教程--07流程執行歷史記錄(歷史任務、歷史流程實例、歷史活動)

相關代碼參考gihub:https://github.com/changwensir/Activiti/tree/master/ActivitiDemo1java

1、Activiti 歷史任務查詢

 

實際工做流項目中,有一個功能叫作 歷史任務查詢。某一次流程的執行一共經歷了多少個任務.咱們其實查詢的是歷史任務實例表;git

bb.jpg

    固然這個表的話,無論是已經完結的任務 仍是正在執行的任務,都會記錄下這個表裏。Activiti給咱們提供了一個接口 finished;加了以後 就是查詢已經完結的任務; 同理還有一個接口unfinished 顧名思義,就是查詢未完結的任務;固然這兩個都不加,就是把全部任務都查詢出來;github

OK咱們上代碼:數據庫

[java] view plain copyapp

 在CODE上查看代碼片派生到個人代碼片

  1. /** 
  2.  * 歷史任務查詢 
  3.  */  
  4. @Test  
  5. public void historyTaskList(){  
  6.     List<HistoricTaskInstance> list=processEngine.getHistoryService() // 歷史任務Service  
  7.             .createHistoricTaskInstanceQuery() // 建立歷史任務實例查詢  
  8.             .taskAssignee("java1234_小鋒") // 指定辦理人  
  9.             .finished() // 查詢已經完成的任務    
  10.             .list();  
  11.     for(HistoricTaskInstance hti:list){  
  12.         System.out.println("任務ID:"+hti.getId());  
  13.         System.out.println("流程實例ID:"+hti.getProcessInstanceId());  
  14.         System.out.println("班裏人:"+hti.getAssignee());  
  15.         System.out.println("建立時間:"+hti.getCreateTime());  
  16.         System.out.println("結束時間:"+hti.getEndTime());  
  17.         System.out.println("===========================");  
  18.     }  
  19. }  

 

[java] view plain copyspa

 在CODE上查看代碼片派生到個人代碼片

  1. /**查詢歷史任務*/  
  2. @Test  
  3. public void findHistoryTask(){  
  4.     String processInstanceId = "2101";  
  5.     List<HistoricTaskInstance> list = processEngine.getHistoryService()//與歷史數據(歷史表)相關的Service  
  6.                     .createHistoricTaskInstanceQuery()//建立歷史任務實例查詢  
  7.                     .processInstanceId(processInstanceId)//  
  8.                     .orderByHistoricTaskInstanceStartTime().asc()  
  9.                     .list();  
  10.     if(list!=null && list.size()>0){  
  11.         for(HistoricTaskInstance hti:list){  
  12.             System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());  
  13.             System.out.println("################################");  
  14.         }  
  15.     }  
  16. }  

 

2、Activiti 查詢歷史流程實例

 

開發中 有時候咱們也須要經過流程實例ID來查詢歷史流程實例。其實本質就是查詢歷史流程實例表;.net

cc.jpg

這裏有一點說下 這個表的id和流程實例id始終是同樣的。因此Activiti沒有提供獲取流程實例id的接口;由於直接getId()獲取的值和流程實例Id是同樣的;code

[java] view plain copy對象

 在CODE上查看代碼片派生到個人代碼片

  1. /** 
  2.  * 查詢歷史流程實例 
  3.  */  
  4. @Test  
  5. public void getHistoryProcessInstance(){  
  6.     HistoricProcessInstance hpi= processEngine.getHistoryService() // 歷史任務Service  
  7.         .createHistoricProcessInstanceQuery() // 建立歷史流程實例查詢  
  8.         .processInstanceId("2501") // 指定流程實例ID  
  9.         .singleResult();  
  10.     System.out.println("流程實例ID:"+hpi.getId());  
  11.     System.out.println("建立時間:"+hpi.getStartTime());  
  12.     System.out.println("結束時間:"+hpi.getEndTime());  
  13. }  

3、Activiti歷史活動查詢

 

在流程系統開發中,咱們有這樣一種需求,當流程實例完成後,咱們要查下流程活動具體的執行狀況,好比這個流程實例何時開始的,何時結束的,以及中間具體的執行步驟,這時候,咱們須要查詢歷史流程活動執行表,act_hi_actinstblog

QQ鎴浘20160630103307.jpg

好比上面這個流程;Activiti提供了豐富的接口讓咱們查詢歷史活動,上代碼:

 

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. /** 
  2.      * 歷史活動查詢 
  3.      */  
  4.     @Test  
  5.     public void historyActInstanceList(){  
  6.         List<HistoricActivityInstance> list=processEngine.getHistoryService() // 歷史任務Service  
  7.                 .createHistoricActivityInstanceQuery() // 建立歷史活動實例查詢  
  8.                 .processInstanceId("27501") // 指定流程實例id  
  9.                 .finished() // 查詢已經完成的任務    
  10.                 .list();  
  11.         for(HistoricActivityInstance hai:list){  
  12.             System.out.println("任務ID:"+hai.getId());  
  13.             System.out.println("流程實例ID:"+hai.getProcessInstanceId());  
  14.             System.out.println("活動名稱:"+hai.getActivityName());  
  15.             System.out.println("辦理人:"+hai.getAssignee());  
  16.             System.out.println("開始時間:"+hai.getStartTime());  
  17.             System.out.println("結束時間:"+hai.getEndTime());  
  18.             System.out.println("===========================");  
  19.         }  
  20.     }  
執行結果:
任務ID:27502
流程實例ID:27501
活動名稱:Start
辦理人:null
開始時間:Thu Jun 30 10:13:20 CST 2016
結束時間:Thu Jun 30 10:13:20 CST 2016

===========================

任務ID:27503
流程實例ID:27501
活動名稱:學生請假申請
辦理人:張三
開始時間:Thu Jun 30 10:13:20 CST 2016
結束時間:Thu Jun 30 10:16:13 CST 2016

===========================

任務ID:30001
流程實例ID:27501
活動名稱:班長審批
辦理人:李四
開始時間:Thu Jun 30 10:16:13 CST 2016
結束時間:Thu Jun 30 10:16:36 CST 2016

===========================

任務ID:32501
流程實例ID:27501
活動名稱:班主任審批
辦理人:王五
開始時間:Thu Jun 30 10:16:36 CST 2016
結束時間:Thu Jun 30 10:16:57 CST 2016

===========================

任務ID:35001
流程實例ID:27501
活動名稱:End
辦理人:null
開始時間:Thu Jun 30 10:16:57 CST 2016
結束時間:Thu Jun 30 10:16:57 CST 2016
 

===========================

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. /**查詢歷史活動-->某一次流程的執行一共經歷了多少個活動*/  
  2. @Test  
  3. public void findHistoryActiviti(){  
  4.     String processInstanceId = "1701";  
  5.     List<HistoricActivityInstance> list = processEngine.getHistoryService()//  
  6.                     .createHistoricActivityInstanceQuery()//建立歷史活動實例的查詢  
  7.                     .processInstanceId(processInstanceId)//  
  8.                     .orderByHistoricActivityInstanceStartTime().asc()//  
  9.                     .list();  
  10.     if(list!=null && list.size()>0){  
  11.         for(HistoricActivityInstance hai:list){  
  12.             System.out.println(hai.getId()+"   "+hai.getProcessInstanceId()+"   "+hai.getActivityType()+"  "+hai.getStartTime()+"   "+hai.getEndTime()+"   "+hai.getDurationInMillis());  
  13.             System.out.println("#####################");  
  14.         }  
  15.     }  
  16. }  

4、查詢歷史流程變量

  某一次流程的執行一共設置的流程變量

[java] view plain copy

 在CODE上查看代碼片派生到個人代碼片

  1. /**查詢歷史流程變量*/  
  2. @Test  
  3. public void findHistoryProcessVariables(){  
  4.     String processInstanceId = "2101";  
  5.     List<HistoricVariableInstance> list = processEngine.getHistoryService()//  
  6.                     .createHistoricVariableInstanceQuery()//建立一個歷史的流程變量查詢對象  
  7.                     .processInstanceId(processInstanceId)//  
  8.                     .list();  
  9.     if(list!=null && list.size()>0){  
  10.         for(HistoricVariableInstance hvi:list){  
  11.             System.out.println(hvi.getId()+"   "+hvi.getProcessInstanceId()+"   "+hvi.getVariableName()+"   "+hvi.getVariableTypeName()+"    "+hvi.getValue());  
  12.             System.out.println("###############################################");  
  13.         }  
  14.     }  
  15. }  


總結
    因爲數據庫中保存着歷史信息以及正在運行的流程實例信息,在實際項目中對已完成任務的查看頻率遠不及對代辦和可接任務的查看,因此在activiti採用分開管理,把正在運行的交給RuntimeService、TaskService管理,而歷史數據交給HistoryService來管理。
    這樣作的好處在於,加快流程執行的速度,由於正在執行的流程的表中數據不會很大

 

 

 

文章轉自《http://blog.csdn.net/ochangwen/article/details/51910695》,感謝做者分享!

相關文章
相關標籤/搜索