gaoluyang
5 天以前 8c65f898ed6e5b0c7a94c792c4562f6ec831dccd
yudao-module-qcreport/src/main/java/cn/iocoder/yudao/module/qcreport/engine/rule/RuleEvaluator.java
@@ -71,6 +71,15 @@
        return asText(left).compareTo(asText(right));
    }
    private static int compareNumbers(Object left, Object right) {
        double leftNumber = Paths.toNumber(left);
        double rightNumber = Paths.toNumber(right);
        if (!Double.isFinite(leftNumber) || !Double.isFinite(rightNumber)) {
            throw new RuleRuntimeException("数值比较缺少有效实测值或规格限值");
        }
        return Double.compare(leftNumber, rightNumber);
    }
    /** 判定结果类取值统一成 PASS / FAIL,识别不出返回空串 */
    public static String normalizeResultToken(Object value) {
        if (value instanceof Boolean bool) {
@@ -259,8 +268,8 @@
    private static Object evaluateBetween(RuleNode.Between between, Object context) {
        Object value = evaluateNode(between.value(), context);
        boolean hit = compare(value, evaluateNode(between.lower(), context)) >= 0
                && compare(value, evaluateNode(between.upper(), context)) <= 0;
        boolean hit = compareNumbers(value, evaluateNode(between.lower(), context)) >= 0
                && compareNumbers(value, evaluateNode(between.upper(), context)) <= 0;
        return between.negated() != hit;
    }
@@ -290,10 +299,10 @@
        return switch (binary.operator()) {
            case "=" -> compare(left, right) == 0;
            case "!=" -> compare(left, right) != 0;
            case ">" -> compare(left, right) > 0;
            case ">=" -> compare(left, right) >= 0;
            case "<" -> compare(left, right) < 0;
            case "<=" -> compare(left, right) <= 0;
            case ">" -> compareNumbers(left, right) > 0;
            case ">=" -> compareNumbers(left, right) >= 0;
            case "<" -> compareNumbers(left, right) < 0;
            case "<=" -> compareNumbers(left, right) <= 0;
            case "+" -> add(left, right);
            case "-" -> Paths.toNumber(left) - Paths.toNumber(right);
            case "*" -> Paths.toNumber(left) * Paths.toNumber(right);
@@ -412,4 +421,4 @@
    }
}
}