xyc
2026-09-21 ceaa5f2895b71b9dedfe543ae3a0927f912556ab
traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
@@ -690,23 +690,30 @@
        if (sys == null) return null; // 缺失由 EXISTENCE_SYS 规则提示
        String field = rule.getCheckField();
        double actual;
        double reference;
        Double referenceObj;
        String fieldName;
        if ("startCum".equals(field)) {
            actual = nvl(monthly.getStartCum());
            reference = nvl(sys.getStartCum());
            referenceObj = sys.getStartCum();
            fieldName = "自开始建设累计";
        } else if ("yearCum".equals(field)) {
            actual = nvl(monthly.getYearCum());
            reference = nvl(sys.getYearCum());
            referenceObj = sys.getYearCum();
            fieldName = "自年初累计";
        } else if ("monthDone".equals(field)) {
            actual = nvl(monthly.getMonthDone());
            reference = nvl(sys.getMonthDone());
            referenceObj = sys.getMonthDone();
            fieldName = "本月完成";
        } else {
            return null;
        }
        // 基准缺失(如新模板《2026年X月投资系统项目明细》没有「自年初累计」列)→ 不具备可比性,跳过并记日志;
        // 不能把 null 当成 0 去比对,否则会成片误报。
        if (referenceObj == null) {
            log.warn("投资比对跳过(投资系统基准缺失):rule={} project={} field={}", rule.getRuleCode(), projectName, fieldName);
            return null;
        }
        double reference = referenceObj;
        String[] parts = rule.getThreshold().split("\\|");
        double absThreshold = parts.length > 0 ? parseDoubleSafe(parts[0], 50) : 50;
        double pctThreshold = parts.length > 1 ? parseDoubleSafe(parts[1], 5) : 5;