记录activiti手动回退上一节点方法
开发背景
项目中出现了节点操作同意时,节点没有走到下一节点,反而回到了上一节点生成了任务。所以需要手动回滚至上一节点,并清除审批轨迹的日志。
因为不存在多任务情况,以及实例都是未完成情况,所以代码较为简单。
public Task errorHistoryData(String processInstanceId) throws Exception{
List<HistoricTaskInstance> historicTaskInstanceList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricTaskInstanceEndTime().desc()
.list();
//找到历史最新的历史任务
if(CollectionUtils.isEmpty(historicTaskInstanceList)){
throw new Exception("未找到任务");
}else{
if(historicTaskInstanceList.size() < 2){
throw new Exception("任务数量异常");
}
}
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//判断实例是否结束
if(null == historicProcessInstance){
throw new Exception("未找到实例");
}else{
if(null != historicProcessInstance.getEndTime()){
throw new Exception("实例已结束");
}
}
//删除当前任务和历史任务
taskMapper.deleteTask(historicTaskInstanceList.get(historicTaskInstanceList.size()-1).getId());
taskMapper.deleteHisTask(historicTaskInstanceList.get(historicTaskInstanceList.size()-1).getId());
//execution替换act_id字段为当前任务act_id
taskMapper.updateExecutionActId(historicTaskInstanceList.get(historicTaskInstanceList.size()-1).getTaskDefinitionKey(),historicTaskInstanceList.get(0).getTaskDefinitionKey(),historicTaskInstanceList.get(historicTaskInstanceList.size()-1).getExecutionId());
//删除当前任务实例参数
taskMapper.deleteHisVarinst(historicTaskInstanceList.get(historicTaskInstanceList.size()-1).getId());
//新增历史任务为当前任务,调用完成方法生成代办任务
Map<String, Object> taskMap = new HashMap<>();
taskMap.put("id", historicTaskInstanceList.get(0).getId());
taskMap.put("rev",1);
taskMap.put("executionId",historicTaskInstanceList.get(0).getExecutionId());
taskMap.put("procInstId",historicTaskInstanceList.get(0).getProcessInstanceId());
taskMap.put("procDefId",historicTaskInstanceList.get(0).getProcessDefinitionId());
taskMap.put("name",historicTaskInstanceList.get(0).getName());
taskMap.put("taskDefKey",historicTaskInstanceList.get(0).getTaskDefinitionKey());
taskMap.put("assignee",SecurityUtils.getLoginUser().getUserName());
taskMap.put("priority",historicTaskInstanceList.get(0).getPriority());
taskMap.put("createTime",historicTaskInstanceList.get(0).getCreateTime());
taskMap.put("suspensionState",1);
taskMap.put("tenantId",historicTaskInstanceList.get(0).getTenantId());
taskMap.put("formKey",historicTaskInstanceList.get(0).getFormKey());
taskMap.put("businessKey",historicTaskInstanceList.get(0).getBusinessKey());
taskMapper.insertRunTask(taskMap);
//删除日志
taskMapper.deleteComment(historicTaskInstanceList.get(historicTaskInstanceList.size()-1).getId());
//完成任务
TaskResultDTO data = new TaskResultDTO();
HashMap<String, Object> variable = new HashMap<>();
variable.put("approvalStatus", "0");
data.setVariable(variable);
Task task = this.completeByTask(historicTaskInstanceList.get(0).getId(), data);
return task;
}