Bootstrap

【Activiti】activiti 手动回退一个结束的流程

1. 引言

最近有一个流程回退的任务,于是就上网搜,发现流程回退大都是针对没有结束的流程回退到上一步,而且给出的方法大都如吻末给出的相关链接中操作方式,试了试好像都不太好使。
于是就参照着网上的方法,顺带看接口看源码,试了试感觉总是不够灵活,还容易出错。
后来想了想,其实他流程所有的信息都存在了23张表中,每一步,无非就是改这些表信息,我抹清每一个审批动作他到底改变了那些表,我把这些表数据回滚不就好了。

2. 准备

  1. 首先我们需要先了解一下这23张表到底都是干什么的
  2. 我们要知道这些表是怎么变化的
    关于表变化,要把过程记录下来太麻烦了,我就不一一走了,给出一个参考链接https://blog.csdn.net/ccdust/article/details/52600804
ACT_EVT_LOG
-- ACT_GE_* 通用数据, 用于不同场景下
ACT_GE_BYTEARRAY
ACT_GE_PROPERTY
-- ACT_HI_* history 历史数据,每一步操作,都会在这些相关表记录
ACT_HI_ACTINST
ACT_HI_ATTACHMENT
ACT_HI_COMMENT
ACT_HI_DETAIL
ACT_HI_IDENTITYLINK
ACT_HI_PROCINST
ACT_HI_TASKINST
ACT_HI_VARINST

--ACT_ID_* identity 身份信息
ACT_ID_GROUP
ACT_ID_INFO
ACT_ID_MEMBERSHIP
ACT_ID_USER

ACT_PROCDEF_INFO

--ACT_RE_* repository 流程相关表(流程部署、流程模型、流程定义)
ACT_RE_DEPLOYMENT
ACT_RE_MODEL
ACT_RE_PROCDEF

--ACT_RU_* runtime 流程运行时表,流程结束,这些表数据清空
ACT_RU_EVENT_SUBSCR
ACT_RU_EXECUTION
ACT_RU_IDENTITYLINK
ACT_RU_JOB
ACT_RU_TASK
ACT_RU_VARIABLE
-- 可能我们业务结合,还会自定义一些表,保存重要信息

3. 回退

建议先找一个备份库,直接用sql操作回退流程,找到每一步都的变化,直到成功,然后再在代码中实现。

我这里记录的是一个结束的流程回退,所以运行时表中已经没有数据了,得从历史表走起

3.1 先用sql试验回退activiti表

-- 1. 查询ACT_HI_TASKINST,返回历史中task数据
select * from ACT_HI_TASKINST where ID_=#{taskId};
--2. 创建一个ACT_RU_EXECUTION记录,每一个流程都有一个记录,流程结束清除,但EXECUTION没有历史表,所以自己创建
# 参照插入 select * from ACT_RU_EXECUTION;
insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_, SUSPENSION_STATE_, CACHED_ENT_STATE_, TENANT_ID_, NAME_)
values (...);

-- 3. 将历史数据task添加至ACT_RU_TASK
# 参照插入 select * from ACT_RU_TASK;
insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, CATEGORY_, SUSPENSION_STATE_, TENANT_ID_, FORM_KEY_)
values ();

-- 4. 恢复当前任务相关处理人到ACT_RUN_IDENTITYLINK
select * from ACT_HI_IDENTITYLINK WHERE PROC_INST_ID_={} OR TASK_ID_={};
# 这里会返回一个list
# 参照插入 select * from ACT_RU_IDENTITYLINK;
insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_, GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_)
values ();

-- 5. 添加运行时变量 ACT_RUN_VARIABLE
select * from ACT_HI_VARINST where EXECUTION_ID_={};
# 这里会返回一个list
# 参照插入 select * from ACT_RUN_VARIABLE;
insert into ACT_RU_VARIABLE (ID_, REV_, TYPE_, NAME_, PROC_INST_ID_,
;