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

这篇博客探讨了如何手动回退一个已经结束的 Activiti 流程。作者通过研究 Activiti 的内部表结构,了解流程变化,并建议在数据库层面进行试验性的回退操作。在了解流程状态变化后,作者提供了在代码中实现回退的思路,并提到了相关资源链接以供参考。
摘要由CSDN通过智能技术生成

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_,
  • 0
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值