activiti之并行网关,驳回

activiti之并行网关,驳回_第1张图片
并行网关官方并不支持实现驳回功能
但是有方法
思路:先将所有并行的任务-1直接走到end状态,然后留一条驳回,即可
主要代码,将任务走到end状态

ActivityImpl endActivity = findActivitiImpl(taskId, "end");
        commitProcess(taskId, null, endActivity.getId());
/**
     * 根据任务ID和节点ID获取活动节点
     * 
     * @param taskId
     *            任务ID
     * @param activityId
     *            活动节点ID 如果为null或"",则默认查询当前活动节点 如果为"end",则查询结束节点
     * 
     * @return
     * @throws Exception
     */
    private ActivityImpl findActivitiImpl(String taskId, String activityId) throws Exception {
        // 取得流程定义
        ProcessDefinitionEntity processDefinition = findProcessDefinitionEntityByTaskId(taskId);
        // 获取当前活动节点ID
        if (activityId == null) {
            activityId = findTaskById(taskId).getTaskDefinitionKey();
        }
        // 根据流程定义,获取该流程实例的结束节点
        if (activityId.toUpperCase().equals("END")) {
            for (ActivityImpl activityImpl : processDefinition.getActivities()) {
                List pvmTransitionList = activityImpl.getOutgoingTransitions();
                if (pvmTransitionList.isEmpty()) {
                    return activityImpl;
                }
            }
        }
        // 根据节点ID,获取对应的活动节点
        ActivityImpl activityImpl = ((ProcessDefinitionImpl) processDefinition).findActivity(activityId);
        return activityImpl;
    }
/**
     * @param taskId
     *            当前任务ID
     * @param variables
     *            流程变量
     * @param activityId
     *            流程转向执行任务节点ID 此参数为空,默认为提交操作
     * @throws Exception
     */
    private void commitProcess(String taskId, Map variables, String activityId) throws Exception {
        if (variables == null) {
            variables = new HashMap();
        }
        // 跳转节点为空,默认提交操作
        if (activityId == null) {
            engine.getTaskService().complete(taskId, variables);
        } else {// 流程转向操作
            turnTransition(taskId, activityId, variables);
        }
    }
/**
     * 流程转向操作
     * 
     * @param taskId
     *            当前任务ID
     * @param activityId
     *            目标节点任务ID
     * @param variables
     *            流程变量
     * @throws Exception
     */
    private void turnTransition(String taskId, String activityId, Map variables) throws Exception {
        // 当前节点
        ActivityImpl currActivity = findActivitiImpl(taskId, null);
        // 清空当前流向
        List oriPvmTransitionList = clearTransition(currActivity);
        // 创建新流向
        TransitionImpl newTransition = currActivity.createOutgoingTransition();
        // 目标节点
        ActivityImpl pointActivity = findActivitiImpl(taskId, activityId);
        // 设置新流向的目标节点
        newTransition.setDestination(pointActivity);
        // 执行转向任务
        engine.getTaskService().complete(taskId, variables);
        // 删除目标节点新流入
        pointActivity.getIncomingTransitions().remove(newTransition);
        // 还原以前流向
        restoreTransition(currActivity, oriPvmTransitionList);
    }

你可能感兴趣的:(ERP,activiti)