camunda驳回

  驳回操作, 如果任务配置了驳回的话,正常完成任务就行。 没配置的话,驳回到第一个任务节点。 

public void submitTask() {
     if (processService.taskIsConfigReject(processInstanceId, taskId)) {//任务是否配置驳回
         processService.taskComplete(user.getUsername(), taskId, formData);
      } else {
         processService.reject(processInstanceId, taskId);
     }
}

 通过连线名称判断是否配置驳回,如果连线的节点是排它网关,继续判断连线。

    /**
     * 任务是否配置驳回
     *
     * @param processInstanceId
     * @return
     */
    @Override
    public boolean taskIsConfigReject(String processInstanceId, String taskId) {
        HistoricProcessInstance hisProIns = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
        List unfinishedList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).unfinished().list();
        //获取流程定义的bpmn模型
        BpmnModelInstance bpmn = repositoryService.getBpmnModelInstance(hisProIns.getProcessDefinitionId());

        for (HistoricActivityInstance instance : unfinishedList) {
            if (StringUtils.isNotBlank(instance.getTaskId()) && instance.getTaskId().equals(taskId)) {
                ModelElementInstance domElement = bpmn.getModelElementById(instance.getActivityId());
                FlowNode act = (FlowNode) domElement;
                Collection outgoing = act.getOutgoing();
                if (outgoing.size() == 1) {
                    FlowNode target = null;
                    Iterator iterator = outgoing.stream().iterator();
                    while (iterator.hasNext()) {
                        SequenceFlow flow = iterator.next();
                        target = flow.getTarget();
                        break;
                    }
                    //如果是排他网关
                    if ("exclusiveGateway".equals(target.getElementType().getTypeName())) {
                        return isContainReject(target.getOutgoing());
                    } else {
                        return false;
                    }
                } else {
                    return isContainReject(outgoing);
                }
            }
        }
        return false;
    }


    /**
     * 是否包含驳回
     *
     * @param outgoing
     * @return
     */
    public boolean isContainReject(Collection outgoing) {
        return outgoing.stream().filter(o -> StringUtils.isNotBlank(o.getAttributeValue("name"))
                && o.getAttributeValue("name").equals("驳回")).count() > 0 ? true : false;
    }

/**
     * 完成任务
     *
     * @return
     */
    @Override
    public void taskComplete(String auditor, String taskId, Map vars) {
        taskService.claim(taskId, auditor);
        taskService.complete(taskId, vars);
    }

/**
     * 驳回到第一个任务节点
     */
    @Override
    public void reject(String processInstanceId, String taskId) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        ActivityInstance tree = runtimeService.getActivityInstance(processInstanceId);
        List resultList = historyService.createHistoricActivityInstanceQuery()
                .processInstanceId(processInstanceId)
                .activityType("userTask")
                .finished()
                .orderByHistoricActivityInstanceEndTime()
                .asc()
                .list();
        //得到第一个任务节点的id
        HistoricActivityInstance historicActivityInstance = resultList.get(0);
        String toActId = historicActivityInstance.getActivityId();
        runtimeService.createProcessInstanceModification(processInstanceId)
                .cancelActivityInstance(getInstanceIdForActivity(tree, task.getTaskDefinitionKey()))//关闭相关任务
                .setAnnotation("进行了驳回到第一个任务节点操作")
                .startBeforeActivity(toActId)//启动目标活动节点
                .execute();
    }

    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;
    }

你可能感兴趣的:(camunda)