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》,感谢做者分享!

相关文章
相关标签/搜索