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

今天我们就来看看 HistoryService 的使用。

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

1. 查询历史流程

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

@SpringBootTest
public class HiTest {

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

@Test
void test01(){
List<HistoricProcessInstance> list = 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_orderby RES.ID_asc
==> Parameters:
<== Total:1
Flushing dbSqlSession
flush summary:0insert,0update,0delete.
now executing flush...
--- HistoricProcessInstanceQueryImpl finished --------------------------------------------------------
===a3786614-38eb-11ed-afc8-acde48001122,null,startEvent1,Tue Sep 2021: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(){
List<HistoricProcessInstance> list = 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(){
List<HistoricActivityInstance> list = 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(){
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery().orderByHistoricTaskInstanceStartTime().asc().list();
for (HistoricTaskInstance hti : list){
logger.info("流程ID:{},Task 开始时间:{},Task 结束时间:{},Task 处理人:{}",hti.getProcessInstanceId(),hti.getCreateTime(),hti.getEndTime(),hti.getAssignee());
}
}

查询结果如下:

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

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/307652.html<

(0)
运维的头像运维
上一篇2025-05-27 05:32
下一篇 2025-05-27 05:33

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注