From 465879cec6931baa8dacc94c7107ebe591f76b2b Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期三, 14 十月 2026 08:37:33 +0800
Subject: [PATCH] docs(交接): 记录10-14重启后端加载合并后新代码并核验生效

---
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java |   78 +++++++++++++++++++++++++++++++++++---
 1 files changed, 71 insertions(+), 7 deletions(-)

diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
index 1b9671a..c4476dd 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3770,7 +3770,7 @@
             // 2026-10-13锛氱疮璁″垪 / 绱鍚屾瘮鍒嗘瘝鎸夎〃澶撮噸寤猴紙鏍规不鎵╁垪鍣ㄦ棭鏈熲�滅疮璁℃紡鏈堚�濈殑鍘嗗彶娆犺处锛�
             int cumRebuilt = summaryWorkbookFiller.repairCumulativeFormulas(wb, year, effMonth);
             reportProgress(progress, 45, "鍒锋柊鎺掑悕椤典笌璺ㄩ〉鍚堟垚椤�");
-            int rankRefreshed = refreshSummaryRankSheets(wb, effPeriod, "month");
+            int rankRefreshed = refreshSummaryRankSheets(wb, effPeriod, "month", dbProblems);
             int cumulativeRefreshed = refreshSummaryCumulativeSheets(wb, year, effMonth); // 鍥涘紶璺ㄩ〉鍚堟垚椤甸殢鎶ヨ〃鏈熷埛鏂�
             // 2026-10-12锛氬仠鐢ㄣ�屽鐢ㄥ閮ㄥ弬鐓т欢銆婄敓鎴恄閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx銆嬪垪瀹姐�嶁�斺�旂増寮忎竴寰嬩互褰撴湡姣嶇増涓哄噯锛�
             // 閬垮厤姣嶇増涓庡弬鐓т欢涓ゅ缁存姢锛堟瘝鐗堝凡骞跺叆鍙傜収浠剁殑鍒楀/闅愯棌锛夈��
@@ -4250,11 +4250,11 @@
      * 鐨勭粨鏋滃埛鏂版暟鍊硷紝閬垮厤姹囨�昏〃閲岀殑鎺掑悕椤靛仠鐣欏湪鏃ф湀浠姐��
      * 鏁板�兼牸鎼�笺�佸叕寮忔牸鎸夊亸绉诲钩绉诲叕寮忓悗鍐欏叆锛涚洰鏍囨牸鏈韩宸叉槸鍏紡鐨勶紙SUM/RANK/鍗犳瘮/琛ユ暟锛変繚鐣欎笉鍔紝鎵撳紑鏃舵寜鏂版暟鎹噸绠椼��
      */
-    private int refreshSummaryRankSheets(XSSFWorkbook wb, String period, String mode) throws Exception {
+    private int refreshSummaryRankSheets(XSSFWorkbook wb, String period, String mode, List<String> problems) throws Exception {
         int n = 0;
-        n += copyRankValues(wb, "璐ц繍閲忔帓鍚�", exportFreightRank(period, mode), new int[][]{{0, 0}, {22, 0}});
-        n += copyRankValues(wb, "璐ц繍鍛ㄨ浆閲忔帓鍚�", exportTurnoverRank(period, mode), new int[][]{{0, 0}, {22, 0}});
-        n += copyRankValues(wb, "涓彛寰勬帓鍚�", exportPassengerMidRank(period, mode, wb), new int[][]{{0, 0}, {0, 10}});
+        n += copyRankValues(wb, "璐ц繍閲忔帓鍚�", exportFreightRank(period, mode), new int[][]{{0, 0}, {22, 0}}, problems);
+        n += copyRankValues(wb, "璐ц繍鍛ㄨ浆閲忔帓鍚�", exportTurnoverRank(period, mode), new int[][]{{0, 0}, {22, 0}}, problems);
+        n += copyRankValues(wb, "涓彛寰勬帓鍚�", exportPassengerMidRank(period, mode, wb), new int[][]{{0, 0}, {0, 10}}, problems);
         return n;
     }
 
@@ -4263,13 +4263,15 @@
      * srcBlocks[i] = 婧愬潡 i 鐨勮捣濮� {琛�, 鍒梷锛�0 鍩猴級锛涚洰鏍囧潡鎸夋爣棰橀『搴忥紙绱鍧楀湪鍓嶃�佸綋鏈堝潡鍦ㄥ悗锛夊搴斻��
      * 鏁板�兼牸鐩存帴鎼�硷紱婧愪晶鏄叕寮忕殑锛堟帓鍚�/鍗犳瘮绛夛級鎸夌洰鏍囧潡鍋忕Щ鏁翠綋骞崇Щ鍚庡啓鍏ュ叕寮忥紝鎵撳紑鏃舵寜姹囨�昏〃鑷韩鏁版嵁閲嶇畻銆�
      */
-    private int copyRankValues(XSSFWorkbook dstWb, String dstSheetName, byte[] srcBytes, int[][] srcBlocks) throws Exception {
+    private int copyRankValues(XSSFWorkbook dstWb, String dstSheetName, byte[] srcBytes, int[][] srcBlocks,
+                              List<String> problems) throws Exception {
         XSSFSheet dst = dstWb.getSheet(dstSheetName);
         if (dst == null) return 0;
         List<XSSFCell> dstTitles = rankTitleCells(dst);
         if (dstTitles.isEmpty()) return 0;
         int copied = 0;
         FormulaEvaluator dstEv = dstWb.getCreationHelper().createFormulaEvaluator();
+        List<int[]> anchors = new ArrayList<>(); // {婧愬叏鐪佽, 鐩爣鍏ㄧ渷琛�, 鍧楅鍒�, 鍒楀亸绉�, 鍧楀}
         try (InputStream sin = new ByteArrayInputStream(srcBytes);
              XSSFWorkbook srcWb = new XSSFWorkbook(sin)) {
             XSSFSheet src = srcWb.getSheetAt(0);
@@ -4279,10 +4281,27 @@
                 int sr0 = srcBlocks[b][0];
                 int sc0 = srcBlocks[b][1];
                 XSSFCell dstTitle = dstTitles.get(b);
-                int rowOff = dstTitle.getRowIndex() - sr0;
                 int colOff = dstTitle.getColumnIndex() - sc0;
+                int rowOff = dstTitle.getRowIndex() - sr0;
+                // 2026-10-13锛氥�婅揣杩愬懆杞噺鎺掑悕銆嬫瘝鐗堝潡鏍囬鏇惧崰涓よ锛堝悎骞讹級锛�"鏍囬琛�+鍥哄畾鍋忕Щ"浼氭妸婧愯
+                // 鏁翠綋鍐欓敊浣嶄竴琛岋紙鍏ㄧ渷鍊艰惤鍒拌〃澶磋銆佸競宸炲�间笌甯傚窞鍚嶉敊寮�锛夈�傛敼涓虹敤銆屽叏鐪併�嶈鍋氶敋鐐瑰榻愶細
+                // rowOff = 鐩爣鍏ㄧ渷琛� - 婧愬叏鐪佽锛涜瘑鍒笉鍒伴敋鐐瑰啀鍥為��鏍囬琛屽亸绉诲苟鍛婅銆�
+                Integer srcAnchor = rankAnchorRow(src, sr0, sc0);
+                Integer dstAnchor = rankAnchorRow(dst, dstTitle.getRowIndex(), dstTitle.getColumnIndex());
+                if (srcAnchor != null && dstAnchor != null) {
+                    int anchored = dstAnchor - srcAnchor;
+                    if (anchored != rowOff) {
+                        log.info("鎺掑悕椤点�妠}銆嬬 {} 鍧楋細鏍囬琛屽亸绉� {} 涓庛�屽叏鐪併�嶉敋鐐瑰亸绉� {} 涓嶄竴鑷达紝鎸夐敋鐐瑰榻愶紙婧愬叏鐪佽={}锛岀洰鏍囧叏鐪佽={}锛�",
+                                dstSheetName, b + 1, rowOff, anchored, srcAnchor + 1, dstAnchor + 1);
+                    }
+                    rowOff = anchored;
+                } else {
+                    log.warn("鎺掑悕椤点�妠}銆嬬 {} 鍧楋細鏈瘑鍒埌銆屽叏鐪併�嶉敋鐐癸紙婧�={}锛岀洰鏍�={}锛夛紝鍥為��鎸夋爣棰樿鍋忕Щ {} 瀵归綈",
+                            dstSheetName, b + 1, srcAnchor, dstAnchor, rowOff);
+                }
                 int h = rankBlockHeight(src, sr0, sc0);
                 int w = rankBlockWidth(src, sr0, sc0);
+                anchors.add(new int[]{srcAnchor == null ? -1 : srcAnchor, dstAnchor == null ? -1 : dstAnchor, sc0, colOff, w});
                 // 2026-10-12锛氭暣鍧楃己鏁帮紙婧愪晶涓�涓暟鍊奸兘娌℃湁锛屽 9 鏈堢己鈶♀憿鏃剁殑鍛ㄨ浆閲忔帓鍚嶏級鈫� 鐩爣鍧楀彧鐣欐爣棰樹笌鏍囩锛�
                 // 鏁版嵁/鎺掑悕/鍗犳瘮涓�寰嬬暀绌猴紱鍚﹀垯姣嶇増鐨� RANK/鍗犳瘮鍏紡浼氬湪绌哄潡涓婄畻鍑恒�屽叏 1 + #DIV/0!銆嶃��
                 boolean blockHasData = false;
@@ -4361,6 +4380,34 @@
                     }
                 }
             }
+        // 2026-10-13 鑷锛氱洰鏍囥�屽叏鐪併�嶈搴斾笌婧愪晶涓�鑷达紙鍋忕Щ閿欎綅銆佹眹鎬诲尯闂翠笉瀵规椂鎶ヨ骞跺啓杩涚己鏁版竻鍗曪級
+        for (int[] an : anchors) {
+            if (an[0] < 0 || an[1] < 0) continue;
+            Row srr = src.getRow(an[0]);
+            Row drr = dst.getRow(an[1]);
+            if (srr == null || drr == null) continue;
+            int badCols = 0;
+            StringBuilder ex = new StringBuilder();
+            for (int c = 0; c < an[4]; c++) {
+                Cell sCell = srr.getCell(an[2] + c);
+                Cell dCell = drr.getCell(an[2] + c + an[3]);
+                Double sv = sCell == null ? null : rankNumeric(sCell, ev);
+                Double dv = dCell == null ? null : rankNumeric(dCell, dstEv);
+                if (sv == null && dv == null) continue;
+                if (sv == null || dv == null || Math.abs(sv - dv) > Math.max(1.0, Math.abs(sv) * 1e-4)) {
+                    badCols++;
+                    if (badCols <= 3) {
+                        if (ex.length() > 0) ex.append("锛�");
+                        ex.append(colLetter(an[2] + c)).append(" 婧�=").append(sv).append(" 鐩爣=").append(dv);
+                    }
+                }
+            }
+            if (badCols >= 2) {
+                String msg = "鎺掑悕椤点��" + dstSheetName + "銆嬨�屽叏鐪併�嶈涓庢簮渚т笉涓�鑷达紙" + badCols + " 鍒楋級锛�" + ex;
+                log.warn(msg);
+                if (problems != null) problems.add("鐢熸垚鏍¢獙锛�" + msg);
+            }
+        }
         }
         return copied;
     }
@@ -4427,6 +4474,23 @@
     }
 
     /** 鎺掑悕椤甸噷鐨勨�滃潡鏍囬鈥濆崟鍏冩牸锛堝惈鈥滃叏鐪佸垎甯傚窞鈥濈殑璇存槑鏂囧瓧锛夛紝鎸夎銆佸垪椤哄簭杩斿洖 */
+    /** 鍦� [fromRow, fromRow+40) 鑼冨洿鍐呫�佸潡璧峰涓ゅ垪閲屾壘鏁存牸鏂囨湰涓恒�屽叏鐪併�嶇殑琛屽彿锛�0 鍩猴級锛涙壘涓嶅埌杩斿洖 null銆�
+     *  2026-10-13锛氭帓鍚嶉〉鍧楃粨鏋勫彲鑳藉洜姣嶇増鐗堝紡涓嶅悓鑰屾暣浣撲笂/涓嬬Щ涓�琛岋紝鐢ㄣ�屽叏鐪併�嶈鍋氶敋鐐瑰彲鑷姩瀵归綈銆� */
+    private Integer rankAnchorRow(Sheet sh, int fromRow, int col0) {
+        int last = Math.min(sh.getLastRowNum(), fromRow + 40);
+        for (int r = fromRow; r <= last; r++) {
+            Row row = sh.getRow(r);
+            if (row == null) continue;
+            for (int c = Math.max(0, col0); c <= col0 + 1; c++) {
+                Cell cell = row.getCell(c);
+                if (cell == null || cell.getCellType() != CellType.STRING) continue;
+                String v = cell.getStringCellValue();
+                if (v != null && v.replace(" ", "").equals("鍏ㄧ渷")) return r;
+            }
+        }
+        return null;
+    }
+
     private List<XSSFCell> rankTitleCells(Sheet sh) {
         List<XSSFCell> out = new ArrayList<>();
         for (int r = sh.getFirstRowNum(); r <= sh.getLastRowNum(); r++) {

--
Gitblit v1.9.1