文章

【若依】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 进行授权