Camunda撤回流程操作

需求是后面节点未审批的可以撤回到上一节点并且上一节点重新开始审批

在这里插入图片描述

private void withdraws(WithdrawRequest request) {
        Task task = this.taskService.createTaskQuery().taskId(request.getTaskId()).singleResult();
        // 获取当前的任务节点
        String activeTaskKey = task.getTaskDefinitionKey();
        // 撤回节点
        String backTask = "xxxx";
        if ("yyyy".equals(activeTaskKey)) {
            backTask = "sssss";
        }
        QueryHistoryTaskListRequest listRequest = new QueryHistoryTaskListRequest();
        listRequest.setProcessInstanceId(request.getProcessInstanceId());
        List<TaskVO> historic = processService.selectTaskInst(listRequest);
        // 退回至上一节点
        if (!"xxxx".equals(activeTaskKey)) {
            ActivityInstance tree = runtimeService.getActivityInstance(request.getProcessInstanceId());
            // 设置变量
            HashMap<String, Object> taskVariables = new HashMap<>(16);
            taskVariables.put("processName", historic.get(0).getName());
            runtimeService.createProcessInstanceModification(request.getProcessInstanceId())
                    .cancelActivityInstance(getInstanceIdForActivity(tree, task.getTaskDefinitionKey()))
                    .cancelAllForActivity(activeTaskKey).setAnnotation("进行了驳回到指定任务节点操作")
                    //启动目标活动节点
                    .startBeforeActivity(backTask)
                    .setVariables(taskVariables)
                    .execute();
            processService.deleteTaskById(historic.get(0).getId());
            processService.deleteRuTaskById(task.getId());
        } else {
            HistoricTaskInstance htisTask = historyService.createHistoricTaskInstanceQuery().taskId(request.getTaskId()).singleResult();
            processService.deleteTaskById(htisTask.getId());
            processService.deleteRuTaskById(htisTask.getId());
        }
    }
    
    private String getInstanceIdForActivity(ActivityInstance activityInstance, String activityId) {
        ActivityInstance instance = getChildInstanceForActivity(activityInstance, activityId);
        if (instance != null) {
            return instance.getId();
        }
        return null;
    }
    
    private ActivityInstance getChildInstanceForActivity(ActivityInstance activityInstance, String activityId) {
        if (activityId.equals(activityInstance.getActivityId())) {
            return activityInstance;
        }
        for (ActivityInstance childInstance : activityInstance.getChildActivityInstances()) {
            ActivityInstance instance = getChildInstanceForActivity(childInstance, activityId);
            if (instance != null) {
                return instance;
            }
        }
        return null;
    }

Mybatis

void deleteTaskById(String id);
    
void deleteRuTaskById(String id);
    
List<TaskVO> selectTaskInst(QueryHistoryTaskListRequest request);
<update id="deleteTaskById">
		UPDATE act_hi_taskinst
		SET DELETE_REASON_ = 'deleted'
		WHERE
			ID_ = #{id}
 </update>
 
<select id="selectTaskInst" resultType="TaskVO">
		select t.ID_           id,
			   t.PROC_DEF_ID_  processDefinitionId,
			   t.TASK_DEF_KEY_ actId,
			   t.PROC_INST_ID_ processInstanceId,
			   t.EXECUTION_ID_ executionId,
			   t.NAME_         `name`,
			   t.DESCRIPTION_  description,
			   t.DUE_DATE_     dueDate,
			   t.START_TIME_   startTime,
			   t.END_TIME_     endTime,
			   t.ASSIGNEE_     assignee
		from act_hi_taskinst t
		where t.PROC_INST_ID_ = #{processInstanceId}
		  and t.DELETE_REASON_ = 'completed'
		order by t.END_TIME_ desc
</select>

<delete id="deleteRuTaskById">
		delete
		from act_ru_task
		where ID_ = #{id}
</delete>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值