From 697891d3718a7461c00a334a988cee576d4180e0 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 13 十月 2026 20:10:53 +0800
Subject: [PATCH] fix(汇总大表): 《货运周转量排名》按「全省」行锚点对齐并加全省行自检(待验收)
---
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