Activity 工作流任务回退、切换流程定义

Activity 工作流任务回退sql

 

 

1、回退任务涉及的表

# 历史运行实例表
SELECT * FROM act_hi_procinst WHERE BUSINESS_KEY_ = ?
# 历史审批节点(包含当前正在执行的节点数据)
SELECT ID_,PROC_DEF_ID_,TASK_DEF_KEY_,NAME_,ASSIGNEE_ 
    FROM act_hi_taskinst
    where PROC_INST_ID_ = ? and TASK_DEF_KEY_ is not null

# 数据来源参考 act_hi_taskinst
SELECT * FROM act_ru_task WHERE PROC_INST_ID_ = ?
    
# 数据来源 参考 act_hi_procinst    表数据
SELECT * FROM act_ru_execution WHERE  PROC_INST_ID_ = ? 
# 历史变量表
select * from act_hi_varinst where PROC_INST_ID_ = ?

# 运行时变量表
select * from act_ru_variable where EXECUTION_ID_= ?
# 历史用户信息
select * from act_hi_identitylink WHERE PROC_INST_ID_ = ?;
# 运行时用户信息
select * from act_ru_identitylink WHERE PROC_INST_ID_ = ?;

 

2、回退的存储过程

2.1、任务已经结束回退

# 工作流已经结束, 回退到上一个节点,参数为:BUSINESS_KEY_(业务唯一Key), 下面的sql中的 "usertask6"、 "复核中" 为工作流中的节点信息可以按需求修改
CREATE PROCEDURE workflow_end_go_back(IN business_key VARCHAR(64))
BEGIN
    DECLARE v_id_ VARCHAR(64);
    DECLARE v_proc_def_id_ VARCHAR(64);
    DECLARE v_task_def_key_ VARCHAR(255);
    DECLARE v_name_ VARCHAR(255);
    DECLARE v_assignee_ VARCHAR(255);
    DECLARE v_proc_inst_id_ VARCHAR(64);
    DECLARE cur_act_hi_taskinst CURSOR FOR SELECT ID_,PROC_DEF_ID_,TASK_DEF_KEY_,NAME_,ASSIGNEE_ 
    FROM act_hi_taskinst
    where PROC_INST_ID_ = (SELECT PROC_INST_ID_ FROM act_hi_procinst WHERE BUSINESS_KEY_ = business_key) and TASK_DEF_KEY_ is not null
    order by START_TIME_ desc ;
    select PROC_INST_ID_ into v_proc_inst_id_ from act_hi_procinst WHERE BUSINESS_KEY_ = business_key;
OPEN cur_act_hi_taskinst;
        set @i = 0;
        label: LOOP
        SET @i = @i + 1;
        FETCH cur_act_hi_taskinst INTO v_id_, v_proc_def_id_, v_task_def_key_, v_name_, v_assignee_;
        IF @i = 1 THEN
        -- 1、处理历史任务 将当前任务设置为完成状态
        UPDATE ACT_HI_TASKINST SET END_TIME_ = now(),duration_ = 1 ,DELETE_REASON_ = 'completed' where id_ = v_id_;
        ELSEIF @i = 2 THEN
        -- 2、处理历史任务 添加当前新任务
        INSERT INTO ACT_HI_TASKINST (id_    ,proc_def_id_    ,task_def_key_,proc_inst_id_,execution_id_
        ,name_,assignee_,start_time_,priority_) 
        values     (uuid(),v_proc_def_id_,v_task_def_key_,v_proc_inst_id_,v_proc_inst_id_
        ,v_name_,v_assignee_,now(),50);
        LEAVE label;
        ELSE
        LEAVE label;
        END IF;
        END LOOP label;
CLOSE cur_act_hi_taskinst;
-- 3、修改当前执行信息
UPDATE ACT_RU_EXECUTION SET rev_ = rev_ + 1 , ACT_ID_ = v_task_def_key_   where  PROC_INST_ID_ = v_proc_inst_id_;
-- 4、修改当前任务信息    
UPDATE act_ru_task SET name_ = v_name_,TASK_DEF_KEY_ = v_task_def_key_,ASSIGNEE_ = v_assignee_ where PROC_INST_ID_ = v_proc_inst_id_;

# 回退运行实例
INSERT INTO `xcx_workorder`.`act_ru_execution`(`ID_`, `REV_`, `PROC_INST_ID_`, `BUSINESS_KEY_`, `PARENT_ID_`, `PROC_DEF_ID_`, `SUPER_EXEC_`, `ROOT_PROC_INST_ID_`, `ACT_ID_`, `IS_ACTIVE_`, `IS_CONCURRENT_`, `IS_SCOPE_`, `IS_EVENT_SCOPE_`, `IS_MI_ROOT_`, `SUSPENSION_STATE_`, `CACHED_ENT_STATE_`, `TENANT_ID_`, `NAME_`, `START_TIME_`, `START_USER_ID_`, `LOCK_TIME_`, `IS_COUNT_ENABLED_`, `EVT_SUBSCR_COUNT_`, `TASK_COUNT_`, `JOB_COUNT_`, `TIMER_JOB_COUNT_`, `SUSP_JOB_COUNT_`, `DEADLETTER_JOB_COUNT_`, `VAR_COUNT_`, `ID_LINK_COUNT_`) 
SELECT PROC_INST_ID_, 1, PROC_INST_ID_, BUSINESS_KEY_, NULL, PROC_DEF_ID_, NULL,  PROC_INST_ID_, NULL, 1, 0,1,0,0,1,NULL,NULL,NULL, START_TIME_, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0  FROM act_hi_procinst WHERE BUSINESS_KEY_ = business_key;

INSERT INTO `xcx_workorder`.`act_ru_execution`(`ID_`, `REV_`, `PROC_INST_ID_`, `BUSINESS_KEY_`, `PARENT_ID_`, `PROC_DEF_ID_`, `SUPER_EXEC_`, `ROOT_PROC_INST_ID_`, `ACT_ID_`, `IS_ACTIVE_`, `IS_CONCURRENT_`, `IS_SCOPE_`, `IS_EVENT_SCOPE_`, `IS_MI_ROOT_`, `SUSPENSION_STATE_`, `CACHED_ENT_STATE_`, `TENANT_ID_`, `NAME_`, `START_TIME_`, `START_USER_ID_`, `LOCK_TIME_`, `IS_COUNT_ENABLED_`, `EVT_SUBSCR_COUNT_`, `TASK_COUNT_`, `JOB_COUNT_`, `TIMER_JOB_COUNT_`, `SUSP_JOB_COUNT_`, `DEADLETTER_JOB_COUNT_`, `VAR_COUNT_`, `ID_LINK_COUNT_`) 
SELECT CONCAT(PROC_INST_ID_, 1) , 6, PROC_INST_ID_, NULL, PROC_INST_ID_, PROC_DEF_ID_, NULL,  PROC_INST_ID_, 'usertask6', 1, 0, 0,0,0,1,NULL,NULL,NULL, START_TIME_, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0  FROM act_hi_procinst WHERE BUSINESS_KEY_ = business_key;

# 回退运行时任务
INSERT INTO `xcx_workorder`.`act_ru_task`(`ID_`, `REV_`, `EXECUTION_ID_`, `PROC_INST_ID_`, `PROC_DEF_ID_`, `NAME_`, `PARENT_TASK_ID_`, `DESCRIPTION_`, `TASK_DEF_KEY_`, `OWNER_`, `ASSIGNEE_`, `DELEGATION_`, `PRIORITY_`, `CREATE_TIME_`, `DUE_DATE_`, `CATEGORY_`, `SUSPENSION_STATE_`, `TENANT_ID_`, `FORM_KEY_`, `CLAIM_TIME_`) 
SELECT ID_, 1, CONCAT(v_proc_inst_id_, 1), v_proc_inst_id_, PROC_DEF_ID_, NAME_, NULL, NULL, TASK_DEF_KEY_, NULL, ASSIGNEE_, NULL, 50, NOW(), NULL, NULL, 1, NULL, NULL, NULL FROM act_hi_taskinst where PROC_INST_ID_ = v_proc_inst_id_ AND NAME_ = '复核中' and TASK_DEF_KEY_ is not null ORDER BY ID_ DESC LIMIT 1;

# 回退运行时变量
INSERT INTO `xcx_workorder`.`act_ru_variable`(`ID_`, `REV_`, `TYPE_`, `NAME_`, `EXECUTION_ID_`, `PROC_INST_ID_`, `TASK_ID_`, `BYTEARRAY_ID_`, `DOUBLE_`, `LONG_`, `TEXT_`, `TEXT2_`) SELECT ID_, 1, VAR_TYPE_, NAME_, EXECUTION_ID_, PROC_INST_ID_, TASK_ID_, BYTEARRAY_ID_, DOUBLE_, LONG_, TEXT_, TEXT2_ FROM act_hi_varinst WHERE PROC_INST_ID_ = v_proc_inst_id_;
# 回退运行时用户信息
INSERT INTO `xcx_workorder`.`act_ru_identitylink`(`ID_`, `REV_`, `GROUP_ID_`, `TYPE_`, `USER_ID_`, `TASK_ID_`, `PROC_INST_ID_`, `PROC_DEF_ID_`) SELECT ID_, 1, NULL, TYPE_, USER_ID_, TASK_ID_, PROC_INST_ID_, NULL FROM act_hi_identitylink WHERE PROC_INST_ID_ = v_proc_inst_id_;

END

 

2.2、工作流未结束回退任务

CREATE PROCEDURE workflow_end_go_back(IN business_key VARCHAR(64))
BEGIN
    DECLARE v_id_ VARCHAR(64);
    DECLARE v_proc_def_id_ VARCHAR(64);
    DECLARE v_task_def_key_ VARCHAR(255);
    DECLARE v_name_ VARCHAR(255);
    DECLARE v_assignee_ VARCHAR(255);
    DECLARE v_proc_inst_id_ VARCHAR(64);
    DECLARE cur_act_hi_taskinst CURSOR FOR SELECT ID_,PROC_DEF_ID_,TASK_DEF_KEY_,NAME_,ASSIGNEE_ 
    FROM act_hi_taskinst
    where PROC_INST_ID_ = (SELECT PROC_INST_ID_ FROM act_hi_procinst WHERE BUSINESS_KEY_ = business_key) and TASK_DEF_KEY_ is not null
    order by START_TIME_ desc ;
    select PROC_INST_ID_ into v_proc_inst_id_ from act_hi_procinst WHERE BUSINESS_KEY_ = business_key;
OPEN cur_act_hi_taskinst;
        set @i = 0;
        label: LOOP
        SET @i = @i + 1;
        FETCH cur_act_hi_taskinst INTO v_id_, v_proc_def_id_, v_task_def_key_, v_name_, v_assignee_;
        IF @i = 1 THEN
        -- 1、处理历史任务 将当前任务设置为完成状态
        UPDATE ACT_HI_TASKINST SET END_TIME_ = now(),duration_ = 1 ,DELETE_REASON_ = 'completed' where id_ = v_id_;
        ELSEIF @i = 2 THEN
        -- 2、处理历史任务 添加当前新任务
        INSERT INTO ACT_HI_TASKINST (id_    ,proc_def_id_    ,task_def_key_,proc_inst_id_,execution_id_
        ,name_,assignee_,start_time_,priority_) 
        values     (uuid(),v_proc_def_id_,v_task_def_key_,v_proc_inst_id_,v_proc_inst_id_
        ,v_name_,v_assignee_,now(),50);
        LEAVE label;
        ELSE
        LEAVE label;
        END IF;
        END LOOP label;
CLOSE cur_act_hi_taskinst;
-- 3、修改当前执行信息
UPDATE ACT_RU_EXECUTION SET rev_ = rev_ + 1 , ACT_ID_ = v_task_def_key_   where  PROC_INST_ID_ = v_proc_inst_id_;
-- 4、修改当前任务信息    
UPDATE act_ru_task SET name_ = v_name_,TASK_DEF_KEY_ = v_task_def_key_,ASSIGNEE_ = v_assignee_ where PROC_INST_ID_ = v_proc_inst_id_;

END

 

3、调用示例

CALL workflow_end_go_back(677813249634205732);

 

4、切换流程定义

# 运行中的工作流数据,切换其他的流程定义

#根据流程定义Key查询流程的部署时间和,流程定义ID
select a.DEPLOY_TIME_, b.ID_ from act_re_deployment a, ACT_RE_PROCDEF b where a.ID_ = b.DEPLOYMENT_ID_ and b.KEY_ = 'workorderOfUninstallProcess'

# 根据业务KEY, 修改流程定义ID
update ACT_RU_EXECUTION set PROC_DEF_ID_ = 'workorderOfUninstallProcess:8:8330022' where BUSINESS_KEY_ IN (
"898482888129908828"
); 

# ACT_RU_EXECUTION 中的BUSINESS_KEY_只有第一次启动的时候会存,后面每个节点流转的时候为空,需要根据启动的流程实例ID去清洗。ACT_ID_为流程定义文件中定义的节点ID
UPDATE ACT_RU_EXECUTION SET PROC_DEF_ID_ = 'workorderOfUninstallProcess:8:8330022', ACT_ID_ = 'Activity_03o5dt1' WHERE PROC_INST_ID_ IN (
SELECT * FROM (select PROC_INST_ID_ from ACT_RU_EXECUTION where BUSINESS_KEY_ IN (
"898482888129908828"
)) a
);

update ACT_RU_TASK a set PROC_DEF_ID_ = 'workorderOfUninstallProcess:8:8330022', NAME_ = '待排期' where a.PROC_INST_ID_ IN (
 select PROC_INST_ID_ from ACT_RU_EXECUTION where BUSINESS_KEY_ IN(
 "898482888129908828"
 )
);

update act_hi_procinst set PROC_DEF_ID_ = 'workorderOfUninstallProcess:8:8330022' where BUSINESS_KEY_ IN(
"898482888129908828"
);

update act_hi_taskinst a set PROC_DEF_ID_ = 'workorderOfUninstallProcess:8:8330022', NAME_ = '待排期' where a.PROC_INST_ID_ IN (
 select PROC_INST_ID_ from ACT_RU_EXECUTION where BUSINESS_KEY_ IN(
 "898482888129908828"
 )
);

 

posted @ 2023-02-24 17:08  邓维-java  阅读(940)  评论(0)    收藏  举报