activiti 當前任務的下一個節點


/** * * @Description (下一個任務節點信息) * @author feizhou * @Date 2018年4月13日下午5:40:23 * @version 1.0.0 * @param activityImpl * 流程節點信息 * @param activityId * 當前流程節點Id信息 * @param variables * 流程變量 * @param processInstanceId * 流程實例ID * @return */
    public TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId,
            Map<String, Object> variables, String processInstanceId) {

        PvmActivity ac = null;

        // 如果遍歷節點為用戶任務並且節點不是當前節點信息
        if ("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())) {
            // 獲取該節點下一個節點信息
            TaskDefinition taskDefinition = ((UserTaskActivityBehavior) activityImpl.getActivityBehavior())
                    .getTaskDefinition();
            return taskDefinition;

        } else if (!"endEvent".equals(activityImpl.getProperty("type"))) {
            // 當前節點是不結束節點的情況

            // 獲取節點所有流向線路信息
            List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
            List<PvmTransition> outTransitionsTemp = null;
            for (PvmTransition tr : outTransitions) {
                // 這里遍歷的當然節點所有流程線的的終點節點
                ac = tr.getDestination(); // 獲取線路的終點節點
                // 如果流向線路為排他網關
                if ("exclusiveGateway".equals(ac.getProperty("type"))) {
                    outTransitionsTemp = ac.getOutgoingTransitions();

                    // 如果排他網關只有一條線路信息
                    if (outTransitionsTemp.size() == 1) {
                        return nextTaskDefinition((ActivityImpl) outTransitionsTemp.get(0).getDestination(), activityId,
                                variables, processInstanceId);
                    } else if (outTransitionsTemp.size() > 1) { // 如果排他網關有多條線路信息

                        ActivityImpl nextActivityImpl = getNextActivityImplByLineCondition(outTransitionsTemp,
                                variables);
                        return nextTaskDefinition(nextActivityImpl, activityId, variables, processInstanceId);

                    }
                } else if ("userTask".equals(ac.getProperty("type"))) {// 下一個節點是用戶任務
                    Boolean currenLineConditionResule = getCurrenLineConditionResule(tr, variables);
                    if (currenLineConditionResule) {
                        return ((UserTaskActivityBehavior) ((ActivityImpl) ac).getActivityBehavior())
                                .getTaskDefinition();
                    }
                }

            }
        }
        return null;
    }
/** * * @Description (判斷當前流程線是否滿足流程參數條件) * @author feizhou * @Date 2018年4月13日下午6:32:16 * @version 1.0.0 * @param outTransition * @param variables * @return */
    public Boolean getCurrenLineConditionResule(PvmTransition outTransition, Map<String, Object> variables) {

        boolean stringtoBoolean = true;
        Object conStr = outTransition.getProperty("conditionText"); // 獲取線路判斷條件信息
        // s: ${money>1000 or price >12}
        // variables (money=1100)
        // variables (price=100)
        // 去掉${和}
        String ElStr = "";
        if (conStr != null) {// 有條件
            ElStr = String.valueOf(conStr);
            ElStr = ElStr.substring(2, ElStr.length() - 1);
            try {
                stringtoBoolean = StringUtil.StringtoBoolean(ElStr, variables);
            } catch (ScriptException e) {
                e.printStackTrace();
            }
            return stringtoBoolean;
        } else {// 沒有條件
            return stringtoBoolean;
        }
    }
/** * * @Description (如果是排他網關判斷,獲取排他網關對應的用戶任務節點) * @author feizhou * @Date 2018年4月13日下午4:41:55 * @version 1.0.0 * @param outTransitionsTemp * @param variables * @return */
    public ActivityImpl getNextActivityImplByLineCondition(List<PvmTransition> outTransitionsTemp,
            Map<String, Object> variables) {

        for (PvmTransition tr1 : outTransitionsTemp) {
            Object conStr = tr1.getProperty("conditionText"); // 獲取線路判斷條件信息
            // s: ${money>1000 or price >12}
            // variables (money=1100)
            // variables (price=100)
            // 去掉${和}
            String ElStr = "";
            if (conStr != null) {// 有條件
                ElStr = String.valueOf(conStr);
                ElStr = ElStr.substring(2, ElStr.length() - 1);
                try {
                    boolean stringtoBoolean = StringUtil.StringtoBoolean(ElStr, variables);
                    if (stringtoBoolean) {
                        return (ActivityImpl) tr1.getDestination();
                    }
                } catch (ScriptException e) {
                    continue;
                }
            } else {// 沒有條件
                return (ActivityImpl) tr1.getDestination();
            }
        }
        return null;
    }
/** * * @Description (字符串表達式計算邏輯值) * @author feizhou * @Date 2018年4月13日下午2:30:28 * @version 1.0.0 * @param str * @param var * @return * @throws ScriptException */
public static boolean StringtoBoolean(String str, Map<String,Object> var) throws ScriptException {
     ScriptEngineManager manager = new ScriptEngineManager();
     ScriptEngine engine = manager.getEngineByName("js");
     Set<String> keys = var.keySet();
     for (String key : keys) {
         engine.put(key,var.get(key));
    }
     str= str.replaceAll(" or ", " || ").replaceAll(" and ", " && ");
     Object result = engine.eval(str);
    return Boolean.parseBoolean(String.valueOf(result));

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM