如何查询已经执行过的流程信息?

上篇文章和小伙伴们分享的流程操作主要是正在执行的流程,我们有一个非常常见的场景是查询执行过的流程信息,在上篇文章中,小伙伴们已经知道,对于正在执行的流程,会在 ACT_RU_EXECUTION 表中保存一条对应的记录,不过流程执行结束之后,ACT_RU_EXECUTION 表中的记录会被删除掉,此时要是想查询已经执行过的流程信息,去哪里查询呢?今天我们就来看看 HistoryService 的使用。

本文使用的流程图依然是上篇文章中使用过的,如下:

1. 查询历史流程

查询历史流程的方式很简答,如下:

@SpringBootTest
public class HiTest {

    @Autowired
    HistoryService historyService;
    private static final Logger logger = LoggerFactory.getLogger(HiTest.class);

    @Test
    void test01() {
        Listlist = historyService.createHistoricProcessInstanceQuery().list();
        for (HistoricProcessInstance hi : list) {
            logger.info("==={},{},{},{},{},{}",hi.getId(),hi.getName(),hi.getStartActivityId(),hi.getStartTime(),hi.getEndActivityId(),hi.getEndTime());
        }
    }
}

由于我们这是 Spring Boot 项目,所以基本上不需要什么额外的配置,直接注入 HistoryService 实例即可。

test01 方法中的代码就是查询出来目前所有的流程实例,包括正在执行的和已经执行完毕的都可以查询到。查询之后,控制台打印结果如下:

==>  Preparing: 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
==> Parameters: 
<==      Total: 1
Flushing dbSqlSession
flush summary: 0 insert, 0 update, 0 delete.
now executing flush...
--- HistoricProcessInstanceQueryImpl finished --------------------------------------------------------
===a3786614-38eb-11ed-afc8-acde48001122,null,startEvent1,Tue Sep 20 21:53:42 CST 2022,null,null

首先大家看到,这里查询的 SQL,查询的表是 ACT_HI_PROCINST,简单截个图大家看下:

大家看到,这张表中记录了流程实例 ID,流程定义 ID,流程开始的时间,流程结束的时间,流程执行耗时,流程开始的节点,流程发起人,流程结束的节点等等。

同时大家也可以看到,在打印出来的查询结果中,getEndActivityId 和 getEndTime 这两个字段的值都为 null,这就说明这个流程目前还在执行中,还没执行完毕,当一个流程执行完毕的时候,这两个字段就不会为 null 了,小伙伴们可以根据这个特点去判断一个流程是否执行完毕。

现在根据我们上篇文章中介绍的知识点,我将流程这个流程中的任务都执行完毕,执行完毕之后,ACT_RU_EXECUTION 表中关于流程的记录就会被删除掉,也就是执行如下代码现在是查询不到上面这个流程了:

@Autowired
RuntimeService runtimeService;
@Test
void test02() {
    ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId("a3786614-38eb-11ed-afc8-acde48001122").singleResult();
    logger.info("pi:{}",pi);
}

这个方法执行返回的 pi 对象现在为 null。

现在我们想查询刚刚执行的流程,得去查询历史流程,也就是去 ACT_HI_PROCINST 表中去查询,执行我们最上面那个方法:

@Test
void test01() {
    Listlist = historyService.createHistoricProcessInstanceQuery().list();
    for (HistoricProcessInstance hi : list) {
        logger.info("==={},{},{},{},{},{}",hi.getId(),hi.getName(),hi.getStartActivityId(),hi.getStartTime(),hi.getEndActivityId(),hi.getEndTime());
    }
}

现在去查询,返回的结果中就可以看到 EndActivityId 以及 EndTime 这两个字段了,因为流程已经执行结束了。

通过上面的介绍,大家应该也发现了,在流程执行的过程中,ACT_HI_PROCINST 表中的流程记录和 ACT_RU_EXECUTION 表中的流程记录是一一对应的。

2. 查询历史活动

一个流程中的每一个节点都是一个活动,当一个流程执行结束的时候,如果我们还想查看每一个活动执行的细节,就得通过查询历史活动来实现了。

在查询之前,小伙伴们先来了解下跟历史活动相关的两张表。

ACT_HI_ACTINST

这张表中保存一个流程中的所有活动细节。包括流程的启动节点、结束节点、各种 Task 甚至节点之间的连线,大家来看下这张表中的信息:

大家看到,这刚好是一个流程的完整记录,从上往下,分别是:

  1. 启动流程。
  2. 连线
  3. 提交请假申请这个 UserTask
  4. 连线
  5. 主管审批这个 UserTask
  6. 连线
  7. 经理审批这个 UserTask
  8. 连线
  9. 结束

事无巨细,全部都记录下来了。

ACT_HI_TASKINST

这个表看名字就知道只记录下来了 Task 的信息,我截个图大家来看下:

小伙伴们看下,这张表记录下来了每一个 Task 的具体信息,包括这个 Task 是由谁处理的,Task 的名字,开始时间、结束时间、耗时等信息。

那么针对这两张表,也有不同的查询方式。

首先来看查询历史活动:

@Test
void test03() {
    Listlist = historyService.createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceStartTime().asc().list();
    for (HistoricActivityInstance hai : list) {
        logger.info("流程ID:{},活动名称:{},活动ID:{},活动处理人:{}",hai.getProcessInstanceId(),hai.getActivityName(),hai.getActivityId(),hai.getAssignee());
    }
}

查询结果如下图:

小伙伴们看查询 SQL 也印证我们说的没有问题。由于我这里目前只执行了一个流程,所以这里就只显示了一个流程的所有活动,大家看打印出来的流程 ID 都是一样的。

再来看查询历史 Task:

@Test
void test04() {
    Listlist = historyService.createHistoricTaskInstanceQuery().orderByHistoricTaskInstanceStartTime().asc().list();
    for (HistoricTaskInstance hti : list) {
        logger.info("流程ID:{},Task 开始时间:{},Task 结束时间:{},Task 处理人:{}",hti.getProcessInstanceId(),hti.getCreateTime(),hti.getEndTime(),hti.getAssignee());
    }
}

查询结果如下:

查询 SQL 也如我们所预料的。

(0)

相关推荐

  • 微信网页版查询不到别人发的信息原因分析解决方法

    先来看看微信网页版有什么功能? 当然首先微信网页版肯定是有聊天的功能。除了聊天之外,微信网页版的功能还包括:手机和电脑之间的文件传输,可以将手机视频、图片通过电脑微信网页版下载到电脑本地硬盘。类似的功 ...

  • 微信网页版查询不到别人发的信息怎么办?

    先来看看微信网页版有什么功能? 当然首先微信网页版肯定是有聊天的功能。除了聊天之外,微信网页版的功能还包括:手机和电脑之间的文件传输,可以将手机视频、图片通过电脑微信网页版下载到电脑本地硬盘。类似的功 ...

  • 在中国建设银行app中该如何查询社保及公积金的相关信息

    很多朋友还不懂在中国建设银行app中查询社保及公积金的相关信息的方法,所以老要跑到当地银行去查询,这样很费时费力,今天小编就来跟大家分享一下线上查询的方法.具体如下:1. 首先,我们先登陆中国建设银行 ...

  • 怎么在淘宝中查询绑定的支付宝帐号信息

    手机淘宝软件被很多人使用,用来购物,为了方便查看自己的支付宝账号的信息,因此想要使用淘宝来查看,但是却不知道如何查看,那么小编就来为大家介绍一下吧.具体如下:1. 第一步,点击并打开支付宝软件,接着点 ...

  • 如何查询电脑上的声音设备信息

    有的小伙伴在使用电脑过程中,想要知道电脑上的声音设备信息,但是却不知道如何查询,那么小编就来为大家介绍一下吧.具体如下:1.第一步,点击桌面左下角箭头所指的开始图标.2. 第二步,来到下图所示的开始菜 ...

  • 如何查询华硕笔记本电脑中的显卡信息

    使用华硕笔记本电脑的用户,想要查询电脑中的显卡信息,来查看显存的大小,因为显存的大小会影响电脑的显示效果,那么如何查询呢?小编就来为大家介绍一下吧.方法/步骤11. 第一步,右击桌面空白处,接着点击弹 ...

  • 如何查询高考录取通知书运单信息

    最近全国高校都开始陆续发放录取通知书,有些用户想知道如何查询高考录取通知书运单信息,接下来小编就给大家介绍一下具体的操作步骤.具体如下:1. 首先第一步先打开手机微信,接着根据下图箭头所指,点击[搜索 ...

  • linux查看历史指令(查询sql执行过的历史命令)

    请关注本头条号,每天坚持更新原创干货技术文章.如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习前言使用Linux系统时,我们经常使用history来查询曾经执行过的 ...

  • 如何查询淘宝的订单详细信息?怎么找淘宝订单号

    如何查询淘宝的订单详细信息?下面小编来告诉大家. 操作方法 01 首先,我们打开我们的手机,然后我们点击手机桌面上的手机淘宝: 02 进入手机淘宝后,我们点击右下角我的淘宝: 03 然后我们点击待评价 ...