activiti 任务在已办中,扯回至当前人

由于产品提出不通过网关进行审批驳回操作,进而有发起人主动召回。

@Transactional
@Override
public void recall(String processInstanceId, String taskId) {
    logger.debug("召回目标任务id:{}",taskId);
    if (iProcessService.ended(processInstanceId)) {
        throw new TaskOperationException("召回失败,流程已完结!");
    }
    //召回目标任务
    HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskId(taskId).singleResult();
    if (ObjectUtils.isEmpty(historicTaskInstance)) {
        throw new TaskOperationException("召回失败,未找到对应的流程实例!");
    }

    //当前任务
    TaskEntity activeTask = taskNodeUtil.getActiveTask(processInstanceId);
    if (historicTaskInstance.getTaskDefinitionKey().equalsIgnoreCase(activeTask.getTaskDefinitionKey())) {
        throw new TaskOperationException("召回失败,该任务已被召回!");
    }
    logger.debug("当前任务名称:{},id:{}",activeTask.getName(),activeTask.getId());
    //获取召回目标任务的下级任务列表
    List<String> nextTaskDefinitionKeys = taskNodeUtil.getNextTaskDefinitionKeys(taskId);
    logger.debug("召回目标任务的下一步任务定义key:{}",nextTaskDefinitionKeys);
    String taskDefinitionKey = activeTask.getTaskDefinitionKey();
    logger.debug("当前任务定义key:{}",taskDefinitionKey);

    //如果召回目标任务的下级任务不为被召回的任务
    if (!nextTaskDefinitionKeys.contains(taskDefinitionKey)) {
        throw new TaskOperationException("召回失败,下一环节已处理!");
    }
    String assignee = activeTask.getAssignee();
    logger.debug("当前任务申领人:{}",assignee);
    if (ObjectUtils.isNotEmpty(assignee)) {
        throw new TaskOperationException("召回失败,下一环节已锁定!");
    }
    //召回目标任务申领人与召回操作人是否一致
    if (!historicTaskInstance.getAssignee().equalsIgnoreCase(processUserUtils.getUserCode())) {
        throw new TaskOperationException("召回失败,无召回权限!");
    }
    taskRollBack(activeTask.getId(),taskId);
}
/**
 * 任务召回
 * @param activeTaskId 当前激活任务id
 * @param rollBackTaskId 回滚目标任务id
 */
@Transactional
public void taskRollBack(String activeTaskId,String rollBackTaskId) {
    try {
        logger.debug("回滚任务id:{}",activeTaskId);
        //获取回滚目标任务信息
        HistoricTaskInstance rollBackTaskInstance = historyService.createHistoricTaskInstanceQuery().taskId(rollBackTaskId).singleResult();
        String assignee = rollBackTaskInstance.getAssignee();
        String processInstanceId = rollBackTaskInstance.getProcessInstanceId();
        Map<String, Object> variables;
        // 取得当前任务
        HistoricTaskInstance currTask = historyService
                .createHistoricTaskInstanceQuery().taskId(activeTaskId)
                .singleResult();
        // 取得流程实例
        ProcessInstance instance = runtimeService
                .createProcessInstanceQuery()
                .processInstanceId(currTask.getProcessInstanceId())
                .singleResult();
        if (instance == null) {
            throw new TaskOperationException("流程已经结束!");
            //流程结束
        }
        variables = instance.getProcessVariables();
        // 取得流程定义
        ProcessDefinitionEntity definition = (ProcessDefinitionEntity) (processEngine.getRepositoryService().getProcessDefinition(currTask
                .getProcessDefinitionId()));

        if (definition == null) {
            log.error("未找到对应的流程定义");
            throw new ProcessDefinitionException("未找到对应的流程定义!");
            
        }
        // 取得上一步活动
        ActivityImpl currActivity = ((ProcessDefinitionImpl) definition)
                .findActivity(currTask.getTaskDefinitionKey());
        List<PvmTransition> nextTransitionList = currActivity
                .getIncomingTransitions();
        // 清除当前活动的出口
        List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
        List<PvmTransition> pvmTransitionList = currActivity
                .getOutgoingTransitions();
        for (PvmTransition pvmTransition : pvmTransitionList) {
            oriPvmTransitionList.add(pvmTransition);
        }
        pvmTransitionList.clear();

        // 建立新出口
        List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>();
        for (PvmTransition nextTransition : nextTransitionList) {
            PvmActivity nextActivity = nextTransition.getSource();
            ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition)
                    .findActivity(nextActivity.getId());
            TransitionImpl newTransition = currActivity
                    .createOutgoingTransition();
            newTransition.setDestination(nextActivityImpl);
            newTransitions.add(newTransition);
        }
        // 完成任务
        List<Task> tasks = taskService.createTaskQuery()
                .processInstanceId(instance.getId())
                .taskDefinitionKey(currTask.getTaskDefinitionKey()).list();
        for (Task task : tasks) {
            taskService.complete(task.getId(), variables);
            historyService.deleteHistoricTaskInstance(task.getId());
        }
        // 恢复方向
        for (TransitionImpl transitionImpl : newTransitions) {
            currActivity.getOutgoingTransitions().remove(transitionImpl);
        }
        for (PvmTransition pvmTransition : oriPvmTransitionList) {
            pvmTransitionList.add(pvmTransition);
        }

        actInstDao.delete(activeTaskId);
        if (ObjectUtils.isNotEmpty(assignee)) {
            TaskEntity activeTask = getActiveTask(processInstanceId);
            //指定回归目标任务申领人
            taskService.claim(activeTask.getId(), assignee);
        }
        return;
    } catch (Exception e) {
        logger.error("流程召回异常",e);
        throw new ProcessInstanceException("流程召回异常!");
    }
}

猜你喜欢

转载自blog.csdn.net/u012272367/article/details/82869684