| docs/功能测试报告/功能测试报告_中口径排名左块删除与7月回归收口及8月扩列_2026-09-08.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-08.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/2026年7月道路运输量汇总表.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/2026年7月道路运输量汇总表_7月清空测试版.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/2026年7月道路运输量汇总表_7月清空测试版v2.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/2026年8月道路运输量汇总表.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/确认回执汇总与剩余疑问_汇总大表数据驱动改造_2026-09-07.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Öпھ¶ÅÅÃû×ó¿éɾ³ýÓë7Ô»عéÊÕ¿Ú¼°8ÔÂÀ©ÁÐ_2026-09-08.md
New file @@ -0,0 +1,32 @@ # åè½æµè¯æ¥å_ä¸å£å¾æåå·¦åå é¤ä¸7æå彿¶å£å8ææ©å_2026-09-08 ## ä¸ãåè½è¯´æ 1. æ 2026-09-08 ä¸å¡ææ¿ï¼ãç¡®è®¤åæ§æ±æ»â¦ã第å è第 6 æ¡ï¼ï¼å 餿±æ»å¤§è¡¨ `ä¸å£å¾æå` 页 r1-20 **å·¦å**ï¼A..Hï¼éæ§å½ææ°æ®ï¼A=2026-01 客è¿éãE=2026-02 å¨è½¬éï¼æ ææ¬¡æ é¢ï¼ï¼é¡µå ä» ä¿çä¸¤å¼ å¯è§è¡¨ï¼r1-20ã1-7 æç´¯è®¡ãä¸ r22-41ã7 æå½æãï¼åå¨ J..Rï¼ã 2. ç¨åºä¾§åæ¥ï¼`ReportExportService.restoreSummaryMonthlyBlocks` 对 `ä¸å£å¾æå` 页 A..Hï¼0-based 0-7 åï¼**æ°¸ä¸ä»å¤ä»½æ¯çåå¡«**ï¼æç»âæ¯çå äºãä¸çæå夿´»âã 3. 7 æå彿¶å£ï¼å«æå页左åå é¤ä¸èµ·éªï¼ï¼éè¿ååæ© 8 ææ¯çï¼M0 çå¼éå»ºå¨ v4ï¼ã ## äºãæµè¯ç¯å¢ - æ¯çï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼æ¸ çå骨æ¶ï¼ä¸ `_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx`ï¼å®æ´ 7 æï¼è¿åæºï¼ã - çæé¾è·¯ï¼å端 `mvn spring-boot:run`ï¼8090ï¼ï¼æ¥å£ `GET /api/report/export/summaryWorkbook?period=2026-07|2026-08&mode=month`ã - æ ¡éªå·¥å ·ï¼openpyxl å 容级 diffï¼data_only=False å读ï¼ã`mvn -DskipTests compile`ã ## ä¸ãç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥/æä½ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | æ¯çå é¤å·¦å | 7 ææ¯ç `ä¸å£å¾æå` A1:H20 æ¸ ç©º + ç§»é¤ A1:H1/A22:H22 åå¹¶ | ä» J1:R1ãJ22:R22 ä¿çåå¹¶ï¼A..H r1-20 æ å 容 | æ¸ 148 æ ¼ï¼åå¹¶ä» å© J1:R1/J22:R22ï¼æ´ç°¿ diff ä» æ¤åº | éè¿ | | 2 | ç¨åºä¸åå¡«å·¦å | åç«¯çæ 2026-07 æ±æ»è¡¨ï¼èµ°è¿åé»è¾ï¼ | çæç©æå页æ A..H éæ§å | çæç© vs å¤ä»½æ¯ç diff=179ï¼å ¶ä¸ 148=å·¦åå é¤ï¼é¢æï¼ã31=æ¥æå int/float åæ³ï¼æ¾ç¤ºç¸åï¼ | éè¿ | | 3 | 7 æ M1 æ°å¼åå½ | è´§è¿/å ¬äº¤åºç§è½¨é/ç½çº¦/å叿±æ»/ç线å è½¦èæ¬å¤è·ï¼åº 2026-01~07ï¼ | å页䏿¯çç¼å 0 å·®å¼ | freight/pax/wyc/urban/mid å ¨ diffs=0 | éè¿ | | 4 | Java ç¼è¯ | `mvn -q -DskipTests compile` | æ é误 | exit=0 | éè¿ | | 5 | 8 ææ©åï¼v4ï¼ | ä¿®æ£å 7 ææ´æ¬ â 8 ææ¯ç `2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` | 8 个å°è´¦/åæé¡µ +2 åï¼2026å¹´8æ/8æåæ¯ï¼ï¼ç´¯è®¡æ»å¨ï¼2025 åç §å³ç§» | 8 页 maxCol +2ï¼ç´¯è®¡ +Qã忝忝 +AJï¼7â8 ææ°å¼æ ¼ 2387 个 0 å·®å¼ | éè¿ | | 6 | æ©åçå¼ç»è | æ° 8 æä¸¤å表头ãéèåãæå页 | 两è¡çºµåå并表头ï¼éèå平移ä¿çï¼æå页æ å·¦å | Q/R è¡¨å¤´ä¸ 15/16 å忬¾åå¹¶ï¼å页è¡ä½æ£ç¡®ï¼ï¼éèåæ >=17 +2 ä¿çï¼æåé¡µä» J ç³»åå¹¶ | éè¿ | | 7 | ç¨åºè¯»æ° 8 ææ¯ç | åç«¯çæ 2026-08ï¼POI 读æ¯çï¼ | 䏿¥ Zip-bombãè¾åº=æ¯ç | styles.xml æ¯å¼ 0.0099 触å POI 误æ¥â`ZipSecureFile.setMinInflateRatio(0.0001)` åä¿®å¤ï¼çæç©ä¸ 8 ææ¯çå 容 diff=0 | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. POI Zip-bomb 误æ¥ï¼openpyxl éåå styles.xml åç¼©æ¯ 0.009988 < 0.01ï¼POI æè¯»æ°ç 8 ææ¯çãå¤ç½®ï¼`exportSummaryWorkbook` 读æ¯çå临æ¶è°ä½éå¼ï¼0.0001ï¼å¹¶å¨ finally è¿åï¼ä» å½±åæ¬æ¹æ³è¯»åå 鍿¨¡æ¿ã 2. åå²éçï¼8 æçå¼ååï¼v3 产åºï¼çæ° 8 æåæ 两è¡åå¹¶ãéèåæ è®°ä¸¢å¤±ãä»¥âæ¸ çåå¤ä»½â为æºä¼å¸¦åæåå·¦åï¼v4 ä¿®æ£æºä¸ºâå·²å å·¦åç 7 æçæç©â并补两è¡åå¹¶ä¸éèå平移ã 3. æ¬ç 8 ææ¯ç 2026 ç»ç´¯è®¡å ¬å¼å·²æ»å¨è³ 1-8 æï¼+Q/+AJï¼ï¼ä½ 8 æå½æå¼ä»ä¸ºç©ºï¼å¾ 8 ææ°æ®å¯¼å ¥åç± M2/M3 å¡«å¼ã ## äºãç»è®º - ä¸å£å¾æåå·¦åå é¤å¨æ¯çä¸ç¨åºçæé¾è·¯åçæï¼7 æå彿¶å£éè¿ï¼æå页éåéªè¯æ å·¦åãå ¶ä½é¡µä¸åº 0 å·®å¼ï¼ã - 8 ææ©åæ¯çå·²çæå¹¶éè¿ç¨åºç«¯å°ç«¯è¯»åéªè¯ï¼å¯ä½ä¸ºåç» 8 ææ°æ®å¡«å çæ¯çã - éçï¼M2 SummaryFiller / M3 8 æå®å¼¹ï¼å¯¼æ°åå¡« 2026-08 彿å¼ï¼ãæ¯çç¼åæ ¡éªèµ° Q1 å£å¾ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-08.md
@@ -29,3 +29,20 @@ - M2ï¼SummaryFiller ååå°è´¦é¡µ+æå页ï¼éæ ¼ diffï¼å«æå页左忹â彿 2026-07âçä¿®æ£éªè¯ï¼ï¼ - M3ï¼8 æå®å¼¹ï¼å æ©å 2026-08ï¼åå¯¼å ¥ 8 ææ°æ®çæï¼ï¼ - M4ï¼å°è¡¨å端éè + å¤ä»½è¿å/æ¸ çã --- ## è¡¥å ï¼2026-09-08 ä¸åï¼åä¸ä¼è¯ç»ï¼ï¼ä¸å£å¾æåå·¦åå é¤ â 7 æå彿¶å£ â 8 ææ©å ### 仿¥æ°å¢ 1. **ææ¿ç»è®°**ï¼ãç¡®è®¤åæ§æ±æ»â¦ã第å è第 6 æ¡ââä¸å£å¾æå页 r1-20 A..H 鿧左忴åå é¤ï¼ç¨åºæ°¸ä¸åå¡«ï¼é 7 ææ¶å£éªè¯åæ© 8 æã 2. **æ¯çå é¤**ï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` ç `ä¸å£å¾æå` A1:H20 æ¸ ç©º 148 æ ¼ï¼ç§»é¤ A1:H1/A22:H22 空åå¹¶åºï¼æ´ç°¿ diff ä» æ¤åºï¼æ¹å¨å坿¬ `_test_tmp/rankleft_before_202607_mother.xlsx`ï¼ã 3. **ç¨åºé²å¤æ´»**ï¼`ReportExportService.restoreSummaryMonthlyBlocks` 对 `ä¸å£å¾æå` 页 A..Hï¼å 0-7ï¼æ°¸ä¸ä»å¤ä»½æ¯çåå¡«ï¼å¦ä¿®å¤ POI Zip-bomb 误读ï¼è¯»æ¯çåä¸´æ¶æ¾ä½å缩æ¯éå¼å¹¶ finally è¿åï¼ã 4. **7 æå彿¶å£**ï¼M1 äºåèæ¬å¤è· diffs=0ï¼ç¨åºçæ 2026-07 ä¸å®æ´ 7 æåºå diff ä» å©å·¦åå é¤ 148 æ ¼ + 31 夿¥æ int/float åæ³ï¼æ¾ç¤ºç¸åï¼ã 5. **8 ææ©åï¼M0 v4ï¼**ï¼äº§åºæ°æ¯ç `docs/çææ±æ»å¤§è¡¨/2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼8 个å°è´¦/åæé¡µ +2 åã累计æ»å¨ +Qã忝忝 +AJã2025 åç §å³ç§»ã两è¡å并表头ãéèå平移ä¿çãæå页æ å·¦åï¼ï¼ç¨åºçæ 2026-08 = æ°æ¯ç 0 å·®å¼ã ### æµè¯ç»ææè¦ - å ¨é¨ç¨ä¾è§ãåè½æµè¯æ¥å_ä¸å£å¾æåå·¦åå é¤ä¸7æå彿¶å£å8ææ©å_2026-09-08.mdãã - 7â8 ææ°å¼æ ¼ 2387 个 0 å·®å¼ï¼ç¼è¯ exit=0ã ### éçä¸ä¸ä¸æ¥ - M2 SummaryFillerãM3 8 æå®å¼¹ï¼8 ææ°æ®å¯¼å ¥å填彿å¼ä¸æåï¼ãå°è¡¨å端éèï¼M4ï¼ã - 8 ææ°æ¯çç 8 æå½æå¼åä»ä¸ºç©ºï¼çå¾ æ°æ®å¯¼å ¥ä¸å¡«å¼éªè¯ã docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí_7ÔÂÇå¿Õ²âÊÔ°æ.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí_7ÔÂÇå¿Õ²âÊÔ°æv2.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê8ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/È·ÈÏ»ØÖ´»ã×ÜÓëÊ£ÓàÒÉÎÊ_»ã×Ü´ó±íÊý¾ÝÇý¶¯¸ÄÔì_2026-09-07.md
@@ -67,6 +67,9 @@ 4. **8 ææ©åæ é¢æ ¼å¼**ï¼æ°å¢â彿å¼ââ忝âä¸¤ç»æ 颿¯**两è¡çºµååå¹¶çåå æ ¼**ï¼å¦â2026å¹´8æâä¸â8æä¸å»å¹´åæ¯âï¼ï¼æåº¦çå¼é建å¨/æ©åå®ç°é¡»ä¿ç该两è¡åå¹¶æ 颿 ·å¼ï¼ä» æå ¥æ°æ®åä¸åæ¯åãæ é¢éå平移ã 5. **å®ç°æ³¨æäºé¡¹ï¼9/8 宿µï¼**ï¼æ¯çå°è´¦é¡µé¨åæä»½åå æ ¼ä»¥**ææ¬æ°å**åå¨ï¼å¦å ¬äº¤é¡µ 2026-06 M å '4970.63'ï¼ï¼ç¨åºè¯»æ¯çç¼åæ¶é¡»ç»ä¸åâææ¬âæ°å¼âå½ä¸ï¼å¦å伿¼ç®/æ¼æ¯å¯¹ã 6. **ä¸å£å¾æå页âå·¦åâå é¤ï¼9/9 ææ¿ï¼**ï¼`ä¸å£å¾æå` 页 r1-20 ç A..H 鿧彿åï¼A=2026-01 客è¿éãE=2026-02 å¨è½¬éï¼æ ææ¬¡æ é¢ï¼**æ´åå é¤**ï¼ä¸åæ M2âæ¹å½æ 2026-07 éç®ä¿®æ£âå¤çï¼é¡µå ä» ä¿çä¸¤å¼ å¯è§è¡¨ï¼r1-20ã1-7 æç´¯è®¡ãä¸ r22-41ã7 æå½æãï¼åå¨ J..Rï¼å«å¸å·åï¼ãåæ¶ç§»é¤ A1:H1ãA22:H22 两个空æ 颿®çåå¹¶åºï¼A..I ä»ä¸ºéè空åãç¨åºä¾§ï¼`restoreSummaryMonthlyBlocks` 对 `ä¸å£å¾æå` 页 **A..Hï¼0-based 0-7 åï¼æ°¸ä¸ä»å¤ä»½æ¯çåå¡«**ï¼é¿å âæ¯çå äºãä¸çæå夿´»âã该å é¤é **7 æå彿¶å£ä¸å¹¶éªè¯**ï¼å«æå页/åæé¡µ/å°è´¦é¡µä¸åº 0 å·®å¼ï¼ï¼éè¿ååæ© 8 æã ï¼2026-09-08 å·²æ§è¡å¹¶éªè¯ï¼æ¯çå é¤+ç¨åºæé¤+7 ææ¶å£+8 ææ©åæ¯çï¼è¯¦è§ãåè½æµè¯æ¥å_ä¸å£å¾æåå·¦åå é¤ä¸7æå彿¶å£å8ææ©å_2026-09-08.mdãï¼ ## ä¸ãå·¥ä½çºªå¾ï¼èª 2026-09-08 èµ·ï¼ - 以æ¬ãç¡®è®¤åæ§æ±æ»â¦ãææ¡£ä¸ºå¯ä¸å³çåºçº¿ï¼å¡å·²å¨ A1-E3 / Q1-Q3 / æ¬è¡¨ç¡®è®¤è¿çå£å¾ï¼ç´æ¥æ§è¡ï¼ä¸åé夿é®ã - åªå°±ææ¡£æªè¦ççæ°å³çåç¨æ·æé®ã traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -44,6 +44,7 @@ import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.openxml4j.util.ZipSecureFile; import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -3213,6 +3214,8 @@ if (template == null) { throw new RuntimeException("æªæ¾å°æ±æ»è¡¨æ¯çã" + year + "å¹´" + month + "æéè·¯è¿è¾éæ±æ»è¡¨.xlsxãï¼docs/çææ±æ»å¤§è¡¨ï¼"); } double savedZipRatio = ZipSecureFile.getMinInflateRatio(); ZipSecureFile.setMinInflateRatio(0.0001); // æ°çæ¯ç styles.xml ç± openpyxl é«å缩ï¼0.0099<0.01ï¼è§¦å POI Zip-bomb 误æ¥ï¼è¯»ååè¿å try (InputStream in = new FileInputStream(template); XSSFWorkbook wb = new XSSFWorkbook(in)) { File donor = resolveSummaryDonor(year, month); @@ -3233,6 +3236,8 @@ if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr(); wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿å/æ¹åå ¬å¼åæå¼å³éç® return toBytes(wb); } finally { ZipSecureFile.setMinInflateRatio(savedZipRatio); } } @@ -3526,12 +3531,15 @@ if (ds == null) continue; Sheet bs = wb.getSheet(ds.getSheetName()); if (bs == null) continue; // ä¸å£å¾æå页 A..H éæ§å·¦åå·²äº 2026-09-09 ææ¿æ´åå é¤ï¼è¯¥åºåæ°¸ä¸ä»å¤ä»½æ¯çåå¡«ï¼é¿å âçæå夿´»â boolean skipMidRankLeftBlock = "ä¸å£å¾æå".equals(ds.getSheetName()); for (int r = ds.getFirstRowNum(); r <= ds.getLastRowNum(); r++) { Row dr = ds.getRow(r); if (dr == null) continue; Row br = bs.getRow(r); for (Cell dc : dr) { if (dc == null) continue; if (skipMidRankLeftBlock && dc.getColumnIndex() < 8) continue; CellType t = dc.getCellType(); if (t == CellType.BLANK) continue; String dtx = summaryCellText(dc);