From 3e069207503d4685a20ab5c695b1a17993f115ea Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期三, 09 九月 2026 15:56:45 +0800
Subject: [PATCH] fix: 09-09下午第三轮——审核结果默认按企业合并与问题范围语义收敛/导出企业合并问题列按用户4条例文话术、数据查看工具栏整理、报表整本预览分组表格化 + 测试报告与工作日结

---
 traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java |  247 +++++++++++++++++++++++++++++--------------------
 1 files changed, 147 insertions(+), 100 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java b/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
index 75c05b2..63dfe69 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
@@ -1259,19 +1259,17 @@
 
     public List<AuditResult> queryResults(String reportPeriod, String reportType) {
         String type = reportType == null || reportType.trim().isEmpty() ? "H2032" : reportType.trim();
+        List<AuditRule> rules = ruleMapper.selectList(new LambdaQueryWrapper<AuditRule>()
+            .eq(AuditRule::getReportType, type));
+        if (rules.isEmpty()) return new java.util.ArrayList<>();
+        List<Long> ruleIds = new ArrayList<>();
+        for (AuditRule rule : rules) ruleIds.add(rule.getId());
         List<AuditResult> results = resultMapper.selectList(new LambdaQueryWrapper<AuditResult>()
             .eq(AuditResult::getReportPeriod, reportPeriod)
+            .in(AuditResult::getRuleId, ruleIds)
             .orderByAsc(AuditResult::getId));
-        List<Long> ruleIds = new ArrayList<>();
-        for (AuditRule rule : ruleMapper.selectList(null)) {
-            if (type.equals(rule.getReportType())) ruleIds.add(rule.getId());
-        }
-        List<AuditResult> filtered = new ArrayList<>();
-        for (AuditResult result : results) {
-            if (ruleIds.contains(result.getRuleId())) filtered.add(result);
-        }
-        attachInfo(filtered);
-        return filtered;
+        attachInfo(results, type, reportPeriod);
+        return results;
     }
 
     public void reviewResult(Long id, String status, String comment) {
@@ -1283,46 +1281,56 @@
         resultMapper.updateById(result);
     }
 
-    private void attachInfo(List<AuditResult> results) {
+    private void attachInfo(List<AuditResult> results, String type, String period) {
         if (results.isEmpty()) return;
         Map<Long, AuditRule> ruleMap = new HashMap<>();
-        for (AuditRule rule : ruleMapper.selectList(null)) ruleMap.put(rule.getId(), rule);
-        Map<Long, String> h2032Name = new HashMap<>();
-        Map<Long, String> h2032Explain = new HashMap<>();
-        Map<Long, String> passengerName = new HashMap<>();
-        Map<Long, String> passengerExplain = new HashMap<>();
-        Map<Long, String> energyName = new HashMap<>();
-        Map<Long, String> investName = new HashMap<>();
-        Map<Long, String> busName = new HashMap<>();
-        Map<Long, String> busExplain = new HashMap<>();
-        Map<Long, String> taxiName = new HashMap<>();
-        Map<Long, String> taxiExplain = new HashMap<>();
-        for (H2032EnterpriseMonthly r : h2032Mapper.selectList(null)) {
-            h2032Name.putIfAbsent(r.getId(), r.getEnterpriseName());
-            h2032Explain.putIfAbsent(r.getId(), r.getVerifyExplanation());
+        for (AuditRule rule : ruleMapper.selectList(new LambdaQueryWrapper<AuditRule>()
+                .eq(AuditRule::getReportType, type))) {
+            ruleMap.put(rule.getId(), rule);
         }
-        for (PassengerEnterpriseMonthly r : passengerMapper.selectList(null)) {
-            passengerName.putIfAbsent(r.getId(), r.getEnterpriseName());
-            passengerExplain.putIfAbsent(r.getId(), r.getVerifyExplanation());
-        }
-        for (EnergyVehicleQuarterly r : energyMapper.selectList(null)) {
-            energyName.putIfAbsent(r.getId(), r.getEnterpriseName());
-        }
-        for (CityBusMonthly r : cityBusMapper.selectList(null)) {
-            busName.putIfAbsent(r.getId(), r.getEnterpriseName());
-            busExplain.putIfAbsent(r.getId(), r.getVerifyExplanation());
-        }
-        for (CityTaxiMonthly r : cityTaxiMapper.selectList(null)) {
-            taxiName.putIfAbsent(r.getId(), r.getCity());
-            taxiExplain.putIfAbsent(r.getId(), r.getVerifyExplanation());
-        }
-        Map<Long, Long> investProjectId = new HashMap<>();
-        for (InvestmentMonthly r : investMonthlyMapper.selectList(null)) {
-            investProjectId.putIfAbsent(r.getId(), r.getProjectId());
-        }
-        for (InvestmentProject p : investProjectMapper.selectList(null)) {
-            for (Map.Entry<Long, Long> e : investProjectId.entrySet()) {
-                if (e.getValue().equals(p.getId())) investName.putIfAbsent(e.getKey(), p.getProjectName());
+        Map<Long, String> nameMap = new HashMap<>();
+        Map<Long, String> explainMap = new HashMap<>();
+        if ("INVEST".equals(type)) {
+            Map<Long, Long> monthlyProject = new HashMap<>();
+            for (InvestmentMonthly m : investMonthlyMapper.selectList(new LambdaQueryWrapper<InvestmentMonthly>()
+                    .eq(InvestmentMonthly::getReportPeriod, period))) {
+                monthlyProject.put(m.getId(), m.getProjectId());
+            }
+            for (InvestmentProject p : investProjectMapper.selectList(null)) {
+                for (Map.Entry<Long, Long> e : monthlyProject.entrySet()) {
+                    if (e.getValue() != null && e.getValue().equals(p.getId())) {
+                        nameMap.putIfAbsent(e.getKey(), p.getProjectName());
+                    }
+                }
+            }
+        } else if ("H204".equals(type)) {
+            for (EnergyVehicleQuarterly m : energyMapper.selectList(new LambdaQueryWrapper<EnergyVehicleQuarterly>()
+                    .eq(EnergyVehicleQuarterly::getReportPeriod, period))) {
+                nameMap.putIfAbsent(m.getId(), m.getEnterpriseName());
+            }
+        } else if ("H2031".equals(type)) {
+            for (PassengerEnterpriseMonthly m : passengerMapper.selectList(new LambdaQueryWrapper<PassengerEnterpriseMonthly>()
+                    .eq(PassengerEnterpriseMonthly::getReportPeriod, period))) {
+                nameMap.putIfAbsent(m.getId(), m.getEnterpriseName());
+                explainMap.putIfAbsent(m.getId(), m.getVerifyExplanation());
+            }
+        } else if ("CITY_BUS".equals(type)) {
+            for (CityBusMonthly m : cityBusMapper.selectList(new LambdaQueryWrapper<CityBusMonthly>()
+                    .eq(CityBusMonthly::getReportPeriod, period))) {
+                nameMap.putIfAbsent(m.getId(), m.getEnterpriseName());
+                explainMap.putIfAbsent(m.getId(), m.getVerifyExplanation());
+            }
+        } else if ("CITY_TAXI".equals(type)) {
+            for (CityTaxiMonthly m : cityTaxiMapper.selectList(new LambdaQueryWrapper<CityTaxiMonthly>()
+                    .eq(CityTaxiMonthly::getReportPeriod, period))) {
+                nameMap.putIfAbsent(m.getId(), m.getCity());
+                explainMap.putIfAbsent(m.getId(), m.getVerifyExplanation());
+            }
+        } else {
+            for (H2032EnterpriseMonthly m : h2032Mapper.selectList(new LambdaQueryWrapper<H2032EnterpriseMonthly>()
+                    .eq(H2032EnterpriseMonthly::getReportPeriod, period))) {
+                nameMap.putIfAbsent(m.getId(), m.getEnterpriseName());
+                explainMap.putIfAbsent(m.getId(), m.getVerifyExplanation());
             }
         }
         for (AuditResult result : results) {
@@ -1332,69 +1340,49 @@
                 result.setRuleCode(rule.getRuleCode());
                 result.setAlertLevel(rule.getAlertLevel());
             }
-            // 鍚勬姤琛ㄨ〃 id 鍚勮嚜鐙珛鑷锛岄渶鎸夎鍒欐墍灞炴姤琛ㄧ被鍨嬪垎琛ㄥ洖濉紒涓氬悕绉�
-            String type = rule == null ? null : rule.getReportType();
-            Map<Long, String> nameMap = "INVEST".equals(type) ? investName
-                : "H204".equals(type) ? energyName
-                : "H2031".equals(type) ? passengerName
-                : "CITY_BUS".equals(type) ? busName
-                : "CITY_TAXI".equals(type) ? taxiName : h2032Name;
-            Map<Long, String> explainMap = "H2031".equals(type) ? passengerExplain
-                : "CITY_BUS".equals(type) ? busExplain
-                : "CITY_TAXI".equals(type) ? taxiExplain : h2032Explain;
             String enterpriseName = nameMap.get(result.getReportId());
             if (enterpriseName == null) {
-                // 涓婃姤鏁版嵁琚噸鏂板鍏ュ悗鏃у鏍哥粨鏋滃凡澶辨晥锛岀粰鍑烘彁绀鸿�岄潪绌虹櫧
-                enterpriseName = "\uFF08\u539F\u6570\u636E\u5DF2\u91CD\u65B0\u5BFC\u5165\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C\u5BA1\u6838\uFF09";
+                enterpriseName = "锛堝師鏁版嵁宸查噸鏂板鍏ワ紝璇烽噸鏂版墽琛屽鏍革級";
             }
             result.setEnterpriseName(enterpriseName);
             result.setVerifyExplanation(explainMap.get(result.getReportId()));
         }
     }
-
     /** 鏈�杩戞湁鏁版嵁鐨勬姤琛ㄦ湡锛堢敤浜庡墠绔粯璁ら�変腑锛� */
     public String latestPeriod(String reportType) {
         String type = reportType == null || reportType.trim().isEmpty() ? "H2032" : reportType.trim();
-        String max = null;
         switch (type) {
             case "H2031":
-                for (PassengerEnterpriseMonthly m : passengerMapper.selectList(
-                        new LambdaQueryWrapper<PassengerEnterpriseMonthly>().select(PassengerEnterpriseMonthly::getReportPeriod))) {
-                    max = maxPeriod(max, m.getReportPeriod());
-                }
-                break;
+                return firstOf(passengerMapper.selectObjs(new LambdaQueryWrapper<PassengerEnterpriseMonthly>()
+                    .select(PassengerEnterpriseMonthly::getReportPeriod)
+                    .orderByDesc(PassengerEnterpriseMonthly::getReportPeriod).last("LIMIT 1")));
             case "H204":
-                for (EnergyVehicleQuarterly m : energyMapper.selectList(
-                        new LambdaQueryWrapper<EnergyVehicleQuarterly>().select(EnergyVehicleQuarterly::getReportPeriod))) {
-                    max = maxPeriod(max, m.getReportPeriod());
-                }
-                break;
+                return firstOf(energyMapper.selectObjs(new LambdaQueryWrapper<EnergyVehicleQuarterly>()
+                    .select(EnergyVehicleQuarterly::getReportPeriod)
+                    .orderByDesc(EnergyVehicleQuarterly::getReportPeriod).last("LIMIT 1")));
             case "INVEST":
-                for (InvestmentMonthly m : investMonthlyMapper.selectList(
-                        new LambdaQueryWrapper<InvestmentMonthly>().select(InvestmentMonthly::getReportPeriod))) {
-                    max = maxPeriod(max, m.getReportPeriod());
-                }
-                break;
+                return firstOf(investMonthlyMapper.selectObjs(new LambdaQueryWrapper<InvestmentMonthly>()
+                    .select(InvestmentMonthly::getReportPeriod)
+                    .orderByDesc(InvestmentMonthly::getReportPeriod).last("LIMIT 1")));
             case "CITY_BUS":
-                for (CityBusMonthly m : cityBusMapper.selectList(
-                        new LambdaQueryWrapper<CityBusMonthly>().select(CityBusMonthly::getReportPeriod))) {
-                    max = maxPeriod(max, m.getReportPeriod());
-                }
-                break;
+                return firstOf(cityBusMapper.selectObjs(new LambdaQueryWrapper<CityBusMonthly>()
+                    .select(CityBusMonthly::getReportPeriod)
+                    .orderByDesc(CityBusMonthly::getReportPeriod).last("LIMIT 1")));
             case "CITY_TAXI":
-                for (CityTaxiMonthly m : cityTaxiMapper.selectList(
-                        new LambdaQueryWrapper<CityTaxiMonthly>().select(CityTaxiMonthly::getReportPeriod))) {
-                    max = maxPeriod(max, m.getReportPeriod());
-                }
-                break;
+                return firstOf(cityTaxiMapper.selectObjs(new LambdaQueryWrapper<CityTaxiMonthly>()
+                    .select(CityTaxiMonthly::getReportPeriod)
+                    .orderByDesc(CityTaxiMonthly::getReportPeriod).last("LIMIT 1")));
             default:
-                for (H2032EnterpriseMonthly m : h2032Mapper.selectList(
-                        new LambdaQueryWrapper<H2032EnterpriseMonthly>().select(H2032EnterpriseMonthly::getReportPeriod))) {
-                    max = maxPeriod(max, m.getReportPeriod());
-                }
-                break;
+                return firstOf(h2032Mapper.selectObjs(new LambdaQueryWrapper<H2032EnterpriseMonthly>()
+                    .select(H2032EnterpriseMonthly::getReportPeriod)
+                    .orderByDesc(H2032EnterpriseMonthly::getReportPeriod).last("LIMIT 1")));
         }
-        return max;
+    }
+
+    private String firstOf(List<Object> objs) {
+        if (objs == null || objs.isEmpty() || objs.get(0) == null) return null;
+        String v = String.valueOf(objs.get(0));
+        return v.trim().isEmpty() ? null : v.trim();
     }
 
     private String maxPeriod(String a, String b) {
@@ -1512,25 +1500,84 @@
     /** 浼佷笟鍚堝苟鈥滈棶棰樷�濆垪璇濇湳锛氭寜瑙勫垯绫诲瀷鐢熸垚鍙鐨勬牳瀹炴剰瑙� */
     private String issueSentence(AuditResult res) {
         String code = res.getRuleCode();
-        String dev = valueOf(res.getDeviation());
+        String name = valueOf(res.getRuleName());
         String act = valueOf(res.getActualValue());
-        String thr = valueOf(res.getThresholdValue());
         if ("RULE_001".equals(code) || "RULE_002".equals(code)) {
-            return "浼佷笟涓婃姤杞﹁締/鍚ㄤ綅涓庤繍鏀挎暟鎹姣斿瓨鍦ㄥ樊寮傦紙" + dev + "锛夛紝璇锋牳瀹�";
+            return "浼佷笟涓婃姤杞﹁締/鍚ㄤ綅涓庤繍鏀挎暟鎹姣斿瓨鍦ㄥ樊寮傦紙" + act + "锛夛紝璇锋牳瀹�";
         }
         if ("RULE_003".equals(code)) {
-            return "涓婃姤鍛ㄨ浆閲忎笌杞ㄨ抗娴嬬畻鍛ㄨ浆閲忓樊寮傛槑鏄撅紙" + dev + "锛夛紝璇峰弬鑰冭建杩规牳瀹炰紒涓氬懆杞噺";
+            return "涓婃姤鍛ㄨ浆閲忎笌杞ㄨ抗娴嬬畻鍛ㄨ浆閲忓樊寮傛槑鏄撅紙" + act + "锛夛紝璇峰弬鑰冭建杩规牳瀹炰紒涓氬懆杞噺";
         }
         if ("RULE_004".equals(code)) {
-            return "璐ц繍绫诲瀷鐜瘮鍙戠敓鍙樺寲锛岃鏍稿疄";
+            return "璐ц繍绫诲瀷鐜瘮鍙戠敓鍙樺寲" + (act.isEmpty() ? "" : "锛�" + act + "锛�") + "锛岃鍏虫敞鏄惁濉姤姝e父";
         }
         if ("RULE_005".equals(code)) {
-            return "鏃犻泦瑁呯杞︿絾瀛樺湪闆嗚绠辫揣杩愰噺锛岃鏍稿疄杞﹁締绫诲瀷涓庤揣杩愰噺濉姤";
+            return "鏃犻泦瑁呯杞︿絾瀛樺湪闆嗚绠辫揣杩愰噺锛�" + act + "锛夛紝璇锋牳瀹炶溅杈嗙被鍨嬩笌璐ц繍閲忓~鎶�";
         }
         if ("RULE_006".equals(code)) {
-            return "鏁磋溅鍚ㄤ綅瓒呭嚭 4~40 鍚ㄥ悎鐞嗚寖鍥达紝璇锋牳瀹炲钩鍧囧惃浣嶅~鎶�";
+            return "鏁磋溅骞冲潎鍚ㄤ綅瓒呭嚭鍚堢悊鑼冨洿锛�" + act + "锛夛紝璇锋牳瀹炲钩鍧囧惃浣嶅~鎶�";
         }
-        return valueOf(res.getRuleName()) + "寮傚父锛堝疄闄咃細" + act + "锛涘熀鍑嗭細" + thr + "锛�" + dev + "锛夛紝璇锋牳瀹�";
+        if (code != null && code.startsWith("RULE_P")) {
+            String special = passengerIssueSentence(res);
+            if (special != null) return special;
+        }
+        return name + "寮傚父锛�" + act + "锛夛紝璇锋牳瀹�";
+    }
+
+    /** 瀹㈣繍锛圚2031锛夎鍒欓棶棰樿瘽鏈細璐村悎妯℃澘绀轰緥鈥滄牳瀹炲紓甯革紙涓婃湡鎸囨爣=锛屾湰鏈熸寚鏍�=锛夎鏍稿疄鈥� */
+    private String passengerIssueSentence(AuditResult res) {
+        String code = res.getRuleCode();
+        String act = valueOf(res.getActualValue());
+        if ("RULE_P003".equals(code) || "RULE_P004".equals(code)) {
+            boolean turnover = "RULE_P004".equals(code);
+            String inner = act;
+            if (inner.startsWith("鏈湀涓庝笂鏈堢浉鍚�: ")) {
+                inner = inner.substring("鏈湀涓庝笂鏈堢浉鍚�: ".length());
+            }
+            java.util.List<String> clauses = new java.util.ArrayList<>();
+            for (String item : inner.split("銆�")) {
+                int eq = item.indexOf('=');
+                if (eq <= 0) { clauses.add(item); continue; }
+                String label = item.substring(0, eq).trim();
+                String v = item.substring(eq + 1).trim();
+                clauses.add("涓婃湀" + (turnover ? "鍛ㄨ浆閲�" : "瀹㈣繍閲�") + "=" + v + "锛屾湰鏈�" + label + "=" + v);
+            }
+            return valueOf(res.getRuleName()) + "寮傚父锛�" + String.join("锛�", clauses) + "锛夎鏍稿疄";
+        }
+        if ("RULE_P005".equals(code)) {
+            String pct = extractPct(valueOf(res.getThresholdValue()));
+            String prefix = pct.isEmpty() ? "鐝嚎骞冲潎杩愯窛鐜瘮瓒呴檺" : "鐝嚎骞冲潎杩愯窛鐜瘮瓒吢�" + pct + "%";
+            return prefix + "锛屾甯哥彮绾胯繍璺濆湪绾胯矾鏈彂鐢熼噸澶у彉鍖栧墠杈冧负绋冲畾锛�" + act + "锛夛紝璇锋牳瀹�";
+        }
+        if ("RULE_P006".equals(code)) {
+            String inner = act;
+            if (inner.startsWith("绛変簬涓婃湀: ")) {
+                inner = inner.substring("绛変簬涓婃湀: ".length());
+            }
+            java.util.List<String> clauses = new java.util.ArrayList<>();
+            for (String item : inner.split("銆�")) {
+                int eq = item.indexOf('=');
+                if (eq <= 0) { clauses.add(item); continue; }
+                String v = item.substring(eq + 1).trim();
+                clauses.add("涓婃湀杩愯窛=" + v + "锛屾湰鏈堣繍璺�=" + v);
+            }
+            return "鍖呰溅骞冲潎杩愯窛绛変簬涓婃湀锛�" + String.join("锛�", clauses)
+                + "锛夎鏍稿疄浼佷笟鏄惁鏄浐瀹氱嚎璺梾娓告垨鑰呴�氬嫟涓氬姟";
+        }
+        return null;
+    }
+
+    private String extractPct(String thresholdText) {
+        if (thresholdText == null || thresholdText.isEmpty()) return "";
+        int idx = thresholdText.indexOf('\u00b1');
+        if (idx < 0) return "";
+        StringBuilder num = new StringBuilder();
+        for (int i = idx + 1; i < thresholdText.length(); i++) {
+            char c = thresholdText.charAt(i);
+            if (Character.isDigit(c) || c == '.') num.append(c);
+            else if (!Character.isWhitespace(c)) break;
+        }
+        return num.toString();
     }
 
     private String auditStatusCn(String status) {

--
Gitblit v1.9.1