【若依】29、流程历史信息查询
HistoryDemo01.bpmn20.xml
正在执行的流程信息:ACT_RU_
已经执行完的流程信息:ACT_HI_
1 流程历史信息
主要是查询流程层面的信息,对应的表是ACT_HI_PROCINST
。
通过判断 endTime 字段是否为空,就可以判断出一个流程实例是否执行完毕。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@Autowired
HistoryService historyService;
/**
* 查询已经完成的历史流程信息
* 历史表中保存的流程信息,不仅有已经完成的流程信息,也包括正在执行的流程信息
*
* SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ WHERE RES.END_TIME_ is not NULL order by RES.ID_ asc
*/
@Test
void finishedHistoricProcessInstanceQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService
// 查询流程的历史信息
.createHistoricProcessInstanceQuery()
// 查询已经完成的流程
.finished() // RES.END_TIME_ is not NULL
.list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
log.info(")_(" + "name:{},startTime:{},endTime:{}", historicProcessInstance.getName(), historicProcessInstance.getStartTime(), historicProcessInstance.getEndTime());
}
}
/**
* 查询未完成的历史流程信息
* 历史表中保存的流程信息,不仅有已经完成的流程信息,也包括正在执行的流程信息
*
* SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ WHERE RES.END_TIME_ IS NULL order by RES.ID_ asc
*/
@Test
void unfinishedHistoricProcessInstanceQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService
// 查询流程的历史信息
.createHistoricProcessInstanceQuery()
// 查询未完成的流程
.unfinished()
.list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
log.info(")_(" + "name:{},startTime:{},endTime:{}", historicProcessInstance.getName(), historicProcessInstance.getStartTime(), historicProcessInstance.getEndTime());
}
}
/**
* 查询历史流程信息
* 历史表中保存的流程信息,不仅有已经完成的流程信息,也包括正在执行的流程信息
*
* SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ order by RES.ID_ asc
*/
@Test
void historicProcessInstanceQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService
// 查询流程的历史信息
.createHistoricProcessInstanceQuery()
.list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
if (ObjectUtil.isNotNull(historicProcessInstance.getEndTime())) {
// 正在执行的流程
log.info(")_(---正在执行的流程---" + "name:{},startTime:{},endTime:{}", historicProcessInstance.getName(), historicProcessInstance.getStartTime(), historicProcessInstance.getEndTime());
} else {
// 已经完成的流程
log.info(")_(---已经完成的流程---" + "name:{},startTime:{},endTime:{}", historicProcessInstance.getName(), historicProcessInstance.getStartTime(), historicProcessInstance.getEndTime());
}
}
}
2 任务历史信息
对应的表:ACT_HI_TASKINST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 查询任务历史信息
* 查询流程实例(6f4df332-9892-11ed-9cb8-e4fd4528656d)任务处理人(yueyazhui)已经完成的任务
*
* SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? and RES.ASSIGNEE_ = ? and RES.END_TIME_ is not null order by RES.ID_ asc
*/
@Test
void finishedHistoricTaskInstanceByTaskAssigneeAndProcessInstanceIdQuery() {
List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId("6f4df332-9892-11ed-9cb8-e4fd4528656d")
.taskAssignee("yueyazhui")
.finished()
.list();
for (HistoricTaskInstance historicTaskInstance : historicTaskInstanceList) {
log.info(")_(" + "name:{},createTime:{},endTime:{},assignee:{}", historicTaskInstance.getName(), historicTaskInstance.getCreateTime(), historicTaskInstance.getEndTime(), historicTaskInstance.getAssignee());
}
}
3 活动历史信息
对应的表是ACT_HI_ACTINST
活动信息:开始节点、结束节点、连线。
查询已经完成的流程的所有活动信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 查询已经完成的流程的所有活动信息
*
* SELECT RES.* from ACT_HI_ACTINST RES WHERE RES.PROC_INST_ID_ = ? order by START_TIME_ asc
*/
@Test
void historicActivityInstanceQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().finished().list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
.processInstanceId(historicProcessInstance.getId())
// 按照活动的开始时间排序
.orderByHistoricActivityInstanceStartTime()
.asc()
.list();
for (HistoricActivityInstance historicActivityInstance : list) {
log.info(")_(" + "activityName:{},startTime:{},endTime:{},assignee:{},activityType:{}", historicActivityInstance.getActivityName(), historicActivityInstance.getStartTime(), historicActivityInstance.getEndTime(), historicActivityInstance.getAssignee(), historicActivityInstance.getActivityType());
}
}
}
查询已经完成的活动类型为 startEvent 的活动信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 查询已经完成的活动类型为 startEvent 的活动信息
*
* SELECT RES.* from ACT_HI_ACTINST RES WHERE RES.ACT_TYPE_ = ? and RES.END_TIME_ is not null order by RES.ID_ asc
*/
@Test
void historicActivityInstanceByActivityTypeQuery() {
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
// 按照活动类型去查询
.activityType("startEvent")
.finished()
.list();
for (HistoricActivityInstance historicActivityInstance : list) {
log.info(")_(" + "activityName:{},startTime:{},endTime:{},assignee:{},activityType:{}", historicActivityInstance.getActivityName(), historicActivityInstance.getStartTime(), historicActivityInstance.getEndTime(), historicActivityInstance.getAssignee(), historicActivityInstance.getActivityType());
}
}
4 变量历史信息
对应的表:ACT_HI_VARINST
查询已经完成的流程实例的所有历史变量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 查询已经完成的流程实例的所有历史变量
*
* SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc
*/
@Test
void historicVariableInstanceQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().finished().list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
List<HistoricVariableInstance> historicVariableInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list();
for (HistoricVariableInstance historicVariableInstance : historicVariableInstanceList) {
log.info(")_(" + "variableName:{},createTime:{},variableTypeName:{},value:{}", historicVariableInstance.getVariableName(), historicVariableInstance.getCreateTime(), historicVariableInstance.getVariableTypeName(), historicVariableInstance.getValue());
}
}
}
通过变量名(status)查询已经完成的流程实例的历史变量信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 通过变量名(status)查询已经完成的流程实例的历史变量信息
*
* SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? and RES.NAME_ = ? order by RES.ID_ asc
*/
@Test
void historicVariableInstanceByVariableNameQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().finished().list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
List<HistoricVariableInstance> historicVariableInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).variableName("status").list();
for (HistoricVariableInstance historicVariableInstance : historicVariableInstanceList) {
log.info(")_(" + "variableName:{},createTime:{},variableTypeName:{},value:{}", historicVariableInstance.getVariableName(), historicVariableInstance.getCreateTime(), historicVariableInstance.getVariableTypeName(), historicVariableInstance.getValue());
}
}
}
5 日志历史信息
历史日志,一个集大成者,通过历史日志,可以查询到前面四种信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 历史日志信息,集大成者
*/
@Test
void processInstanceHistoryLogQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().finished().list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
ProcessInstanceHistoryLog processInstanceHistoryLog = historyService
// select RES.*, DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ where PROC_INST_ID_ = ?
.createProcessInstanceHistoryLogQuery(historicProcessInstance.getId())
// 增加查询历史任务信息
// SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc
.includeTasks()
// 增加查询历史变量信息
// SELECT RES.* from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc
.includeVariables()
// 增加查询历史活动信息
// SELECT RES.* from ACT_HI_ACTINST RES WHERE RES.PROC_INST_ID_ = ? order by RES.ID_ asc
.includeActivities()
.singleResult();
// 打印历史流程信息
log.info(")_(" + "id:{},startTime:{},endTime:{},startUserId:{}", processInstanceHistoryLog.getId(), processInstanceHistoryLog.getStartTime(), processInstanceHistoryLog.getEndTime(), processInstanceHistoryLog.getStartUserId());
List<HistoricData> historicDataList = processInstanceHistoryLog.getHistoricData();
for (HistoricData historicData : historicDataList) {
if (historicData instanceof HistoricTaskInstance) {
// 历史任务信息
HistoricTaskInstance historicTaskInstance = (HistoricTaskInstance) historicData;
log.info(")_(" + "name:{},createTime:{},endTime:{},assignee:{}", historicTaskInstance.getName(), historicTaskInstance.getCreateTime(), historicTaskInstance.getEndTime(), historicTaskInstance.getAssignee());
} else if (historicData instanceof HistoricVariableInstance) {
// 历史变量信息
HistoricVariableInstance historicVariableInstance = (HistoricVariableInstance) historicData;
log.info(")_(" + "variableName:{},createTime:{},variableTypeName:{},value:{}", historicVariableInstance.getVariableName(), historicVariableInstance.getCreateTime(), historicVariableInstance.getVariableTypeName(), historicVariableInstance.getValue());
} else if (historicData instanceof HistoricActivityInstance) {
// 历史活动信息
HistoricActivityInstance historicActivityInstance = (HistoricActivityInstance) historicData;
log.info(")_(" + "activityName:{},startTime:{},endTime:{},assignee:{},activityType:{}", historicActivityInstance.getActivityName(), historicActivityInstance.getStartTime(), historicActivityInstance.getEndTime(), historicActivityInstance.getAssignee(), historicActivityInstance.getActivityType());
}
}
}
}
6 权限历史查询
根据流程或任务去查询处理人。
对应的表是ACT_HI_IDENTITYLINK
查询某一个流程的处理人:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 查询某一个流程的处理人
*
* select * from ACT_HI_IDENTITYLINK where PROC_INST_ID_ = ?
*/
@Test
void getHistoricIdentityLinksForProcessInstance() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createHistoricProcessInstanceQuery().finished().list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
List<HistoricIdentityLink> historicIdentityLinkList = historyService.getHistoricIdentityLinksForProcessInstance(historicProcessInstance.getId());
for (HistoricIdentityLink historicIdentityLink : historicIdentityLinkList) {
log.info(")_(" + "userId:{}", historicIdentityLink.getUserId());
}
}
}
查询某一个任务的处理人:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 查询某一个任务的处理人
*
* select * from ACT_HI_IDENTITYLINK where TASK_ID_ = ?
*/
@Test
void getHistoricIdentityLinksForTask() {
String taskName = "审批";
HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskName(taskName).singleResult();
List<HistoricIdentityLink> historicIdentityLinkList = historyService.getHistoricIdentityLinksForTask(historicTaskInstance.getId());
for (HistoricIdentityLink historicIdentityLink : historicIdentityLinkList) {
log.info(")_(" + "{}任务的处理人是{}", historicTaskInstance.getName(), historicIdentityLink.getUserId());
}
}
7 自定义查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 自定义查询
*
* 查询一个已经执行完毕的流程的任务信息
*/
@Test
void selfDefinedQuery() {
List<HistoricProcessInstance> historicProcessInstanceList = historyService.createNativeHistoricProcessInstanceQuery()
.sql("SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES left outer join ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ WHERE RES.END_TIME_ is not NULL order by RES.ID_ asc")
.list();
for (HistoricProcessInstance historicProcessInstance : historicProcessInstanceList) {
List<HistoricTaskInstance> historicTaskInstanceList = historyService.createNativeHistoricTaskInstanceQuery()
.sql("SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = #{procInstId} and RES.END_TIME_ is not null order by RES.ID_ asc")
.parameter("procInstId", historicProcessInstance.getId())
.list();
for (HistoricTaskInstance historicTaskInstance : historicTaskInstanceList) {
log.info(")_(" + "name:{},createTime:{},endTime:{},assignee:{}", historicTaskInstance.getName(), historicTaskInstance.getCreateTime(), historicTaskInstance.getEndTime(), historicTaskInstance.getAssignee());
}
}
}
8 历史数据记录级别
这个级别的目的是配置哪些历史信息可以存入到ACT_HI_XXX
表中。
- None:不存储任何历史信息。
- Activity:存储所有的流程实例和活动实例。
- Audit:在 Activity 之上,增加了任务实例的详细信息;默认。
- Full:在 Audit 之上,存储变量的变化信息;流程变量的变化过程,会在 ACT_HI_DETAIL 表中记录下来。
1
flowable.history-level=none
本文由作者按照
CC BY 4.0
进行授权