Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)

时间:2021-10-28 20:00:03

相关代码参考gihub:https://github.com/changwensir/Activiti/tree/master/ActivitiDemo1

一、Activiti 历史任务查询

实际工作流项目中,有一个功能叫做 历史任务查询。某一次流程的执行一共经历了多少个任务.我们其实查询的是历史任务实例表;

Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)

    当然这个表的话,不管是已经完结的任务 还是正在执行的任务,都会记录下这个表里。Activiti给我们提供了一个接口 finished;加了之后 就是查询已经完结的任务; 同理还有一个接口unfinished 顾名思义,就是查询未完结的任务;当然这两个都不加,就是把所有任务都查询出来;

OK我们上代码:

/**
* 历史任务查询
*/
@Test
public void historyTaskList(){
List<HistoricTaskInstance> list=processEngine.getHistoryService() // 历史任务Service
.createHistoricTaskInstanceQuery() // 创建历史任务实例查询
.taskAssignee("java1234_小锋") // 指定办理人
.finished() // 查询已经完成的任务
.list();
for(HistoricTaskInstance hti:list){
System.out.println("任务ID:"+hti.getId());
System.out.println("流程实例ID:"+hti.getProcessInstanceId());
System.out.println("班里人:"+hti.getAssignee());
System.out.println("创建时间:"+hti.getCreateTime());
System.out.println("结束时间:"+hti.getEndTime());
System.out.println("===========================");
}
}

/**查询历史任务*/
@Test
public void findHistoryTask(){
String processInstanceId = "2101";
List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的Service
.createHistoricTaskInstanceQuery()//创建历史任务实例查询
.processInstanceId(processInstanceId)//
.orderByHistoricTaskInstanceStartTime().asc()
.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("################################");
}
}
}

二、Activiti 查询历史流程实例

开发中 有时候我们也需要通过流程实例ID来查询历史流程实例。其实本质就是查询历史流程实例表;

Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)

这里有一点说下 这个表的id和流程实例id始终是一样的。所以Activiti没有提供获取流程实例id的接口;因为直接getId()获取的值和流程实例Id是一样的;

/**
* 查询历史流程实例
*/
@Test
public void getHistoryProcessInstance(){
HistoricProcessInstance hpi= processEngine.getHistoryService() // 历史任务Service
.createHistoricProcessInstanceQuery() // 创建历史流程实例查询
.processInstanceId("2501") // 指定流程实例ID
.singleResult();
System.out.println("流程实例ID:"+hpi.getId());
System.out.println("创建时间:"+hpi.getStartTime());
System.out.println("结束时间:"+hpi.getEndTime());
}

三、Activiti历史活动查询

在流程系统开发中,我们有这样一种需求,当流程实例完成后,我们要查下流程活动具体的执行情况,比如这个流程实例什么时候开始的,什么时候结束的,以及中间具体的执行步骤,这时候,我们需要查询历史流程活动执行表,act_hi_actinst

Activiti基础教程--07流程执行历史记录(历史任务、历史流程实例、历史活动)

比如上面这个流程;Activiti提供了丰富的接口让我们查询历史活动,上代码:

/**
* 历史活动查询
*/
@Test
public void historyActInstanceList(){
List<HistoricActivityInstance> list=processEngine.getHistoryService() // 历史任务Service
.createHistoricActivityInstanceQuery() // 创建历史活动实例查询
.processInstanceId("27501") // 指定流程实例id
.finished() // 查询已经完成的任务
.list();
for(HistoricActivityInstance hai:list){
System.out.println("任务ID:"+hai.getId());
System.out.println("流程实例ID:"+hai.getProcessInstanceId());
System.out.println("活动名称:"+hai.getActivityName());
System.out.println("办理人:"+hai.getAssignee());
System.out.println("开始时间:"+hai.getStartTime());
System.out.println("结束时间:"+hai.getEndTime());
System.out.println("===========================");
}
}
执行结果:
任务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

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

/**查询历史活动-->某一次流程的执行一共经历了多少个活动*/
@Test
public void findHistoryActiviti(){
String processInstanceId = "1701";
List<HistoricActivityInstance> list = processEngine.getHistoryService()//
.createHistoricActivityInstanceQuery()//创建历史活动实例的查询
.processInstanceId(processInstanceId)//
.orderByHistoricActivityInstanceStartTime().asc()//
.list();
if(list!=null && list.size()>0){
for(HistoricActivityInstance hai:list){
System.out.println(hai.getId()+" "+hai.getProcessInstanceId()+" "+hai.getActivityType()+" "+hai.getStartTime()+" "+hai.getEndTime()+" "+hai.getDurationInMillis());
System.out.println("#####################");
}
}
}

四、查询历史流程变量

  某一次流程的执行一共设置的流程变量
/**查询历史流程变量*/
@Test
public void findHistoryProcessVariables(){
String processInstanceId = "2101";
List<HistoricVariableInstance> list = processEngine.getHistoryService()//
.createHistoricVariableInstanceQuery()//创建一个历史的流程变量查询对象
.processInstanceId(processInstanceId)//
.list();
if(list!=null && list.size()>0){
for(HistoricVariableInstance hvi:list){
System.out.println(hvi.getId()+" "+hvi.getProcessInstanceId()+" "+hvi.getVariableName()+" "+hvi.getVariableTypeName()+" "+hvi.getValue());
System.out.println("###############################################");
}
}
}

总结
    由于数据库中保存着历史信息以及正在运行的流程实例信息,在实际项目中对已完成任务的查看频率远不及对代办和可接任务的查看,所以在activiti采用分开管理,把正在运行的交给RuntimeService、TaskService管理,而历史数据交给HistoryService来管理。
    这样做的好处在于,加快流程执行的速度,因为正在执行的流程的表中数据不会很大