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>