| docs/功能测试报告/功能测试报告_汇总大表1-6月生成与1-7月扩列验证_2026-09-04.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-04.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/输出/道路运输量汇总表_2026-06.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/生成汇总大表/输出/道路运输量汇总表_2026-07.xlsx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×Ü´ó±í1-6ÔÂÉú³ÉÓë1-7ÔÂÀ©ÁÐÑéÖ¤_2026-09-04.md
New file @@ -0,0 +1,46 @@ # åè½æµè¯æ¥åï¼æ±æ»å¤§è¡¨ 1-6 æçæ + 1-7 ææ©åï¼2026-09-04ï¼ ## ä¸ãåè½è¯´æ - ç®æ ï¼éªè¯ãéè·¯è¿è¾éæ±æ»è¡¨ãçæç¨åºå¯äº§åºä¸¤æ¬äº§ç©ââ 1. **1-7 ææ©å**ï¼`period=2026-07`ï¼ï¼ä»¥â1-4 æéª¨æ¶âæ¯ç为åºãæåæå¤ä»½æ¯çè¿åæåº¦åï¼å¾å° 1-7 æå®æ´å·¥ä½ç°¿ï¼ 2. **1-6 æçæ**ï¼`period=2026-07&toMonth=6`ï¼ï¼å¨ä¸è¿° 1-7 å 容åºç¡ä¸ï¼æ 8 个å°è´¦/åæé¡µè£åªå° 6 æââ - 7 æå½æå¼åï¼Oï¼ã7 æåæ¯åï¼Pï¼ç**æ°æ®æ ¼æ¸ 空ï¼è¡¨å¤´ä¿ç**ï¼ç¨æ·ææ¿å£å¾ â ï¼ï¼ - ç´¯è®¡å ¬å¼ï¼Qï¼å»æ 7 æé¡¹ï¼ç´¯è®¡åæ¯å ¬å¼ï¼Rï¼åæ¯å»æ 2025 å¹´ 7 æåï¼=2025 å¹´ 1-6 æï¼ç¨æ·ææ¿å£å¾ â¡ï¼ã - ä»£ç æ¹å¨ï¼ - `ReportExportService.exportSummaryWorkbook(period, mode, toMonth)`ï¼æ°å¢å¯é `toMonth` è£åªï¼ - æ°å¢ `trimSummaryMonthlySheets(wb, keepMonths)`ï¼åªå¤ç 8 个å°è´¦/åæé¡µï¼` è´§è¿`ãç线å 车ãåå¸å®¢è¿ãå ¬äº¤ãåºç§ãç½çº¦è½¦ã轨éã轮渡ãä¸å£å¾æç»ï¼ï¼æâå«ç´¯è®¡å ¬å¼ä¸ä»»ä¸ 2026 æåº¦å¼åé空âè¯å«æ°æ®è¡ï¼ - `ReportExportController /export/summaryWorkbook` å¢å å¯éåæ° `toMonth`ã - 产ç©ï¼ç¨åºå®é HTTP çæï¼éæå·¥æ¹è¡¨ï¼ï¼ - `docs/çææ±æ»å¤§è¡¨/è¾åº/éè·¯è¿è¾éæ±æ»è¡¨_2026-07.xlsx`ï¼921,070 Bï¼ - `docs/çææ±æ»å¤§è¡¨/è¾åº/éè·¯è¿è¾éæ±æ»è¡¨_2026-06.xlsx`ï¼912,980 Bï¼ ## äºãæµè¯ç¯å¢ - å端 Spring Boot 8090ï¼`mvn spring-boot:run` å®è·ï¼æ¬æº MySQL 127.0.0.1:3308/traffic_auditï¼ï¼ - æ¯çï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼1-4 æéª¨æ¶ï¼å·¥ä½åºæªæäº¤çï¼ï¼ - å¤ä»½æ¯çï¼éæ ¼å¯¹ç §åºåï¼ï¼`docs/çææ±æ»å¤§è¡¨/_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx`ï¼ - æ ¡éªèæ¬ï¼éæ ¼æ¯è¾åå æ ¼åæï¼å ¬å¼å« `=`ãå¼ãææ¬ï¼ï¼æ°å¼æ int/float çä»·å½ä¸åã ## ä¸ãç¨ä¾ä¸ç»æ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | 1-7 ææ©å | GET `/api/report/export/summaryWorkbook?period=2026-07&mode=month` | ä¸å¤ä»½æ¯çå ¨ç°¿éæ ¼ä¸è´ | çå·®å¼=0 | éè¿ | | 2 | 1-6 æçæï¼æ£åï¼ | åä¸è¿½å `&toMonth=6` | éè£åªèå´ï¼é 8 å°è´¦é¡µ + 8 å°è´¦é¡µ A..N çï¼ä¸å¤ä»½ä¸è´ï¼ä» O/P/Q/R æè§ååå | éç½ååçå·®å¼=0 | éè¿ | | 3 | 7 æä¸¤åæ¸ ç©º/表头ä¿ç | 8 å°è´¦é¡µæ°æ®è¡ O/P | æ°æ®æ ¼ç©ºãè¡¨å¤´è¡ O/P ä¿ç | æ°æ®æ ¼æ¸ 空 1132ï¼è¡¨å¤´ä¿ç 24ï¼è¡¨å¤´å¼å¸¸ 0 | éè¿ | | 4 | 累计æ 1-6 æ | æ°æ®è¡ Q åå ¬å¼ | 廿 `+O{è¡}` | æ¹å 566 å¤ï¼ä¾ï¼`=C5+E5+...+O5`â`=C5+...+M5` | éè¿ | | 5 | ç´¯è®¡åæ¯åæ¯=2025 1-6 æ | æ°æ®è¡ R åå ¬å¼ | 廿 `,AF{è¡}`/`+AF{è¡}` | æ¹å 566 å¤ï¼ä¾ï¼`=Q5/SUM(T5..AF5)-1`â`=Q5/SUM(T5..AD5)-1` | éè¿ | | 6 | æ½æ¥å ³é®æ ¼ | è´§è¿/ä¸å£å¾æç» O/P/Q/R | è¡¨å¤´è§æãæ°æ®è¡ O/P 空 | 07 æ°æ®è¡ O=3754.7823ï¼7 æå¼ï¼ï¼06 åæ ¼ä¸ºç©ºï¼è¡¨å¤´ä¸è´ | éè¿ | | 7 | è´å/è¾¹ç | `toMonth` ç¼ºçæ â¥7 | è¡ä¸ºä¸æ§çä¸è´ï¼å ¨ç°¿è¿åï¼ | åç¨ä¾ 1ï¼çå·®å¼ 0 | éè¿ | ## åãå®ç°ä¸åç°å¹¶å¤ç½®çé®é¢ 1. **POI è¡å· 0-based vs å ¬å¼ 1-based**ï¼åçæè¡ç´¢å¼æ¼æ¥ `+O4`ï¼å¹é ä¸ä¸å ¬å¼éç `O5`ï¼å¯¼è´ Q/R æªæ¹åï¼ä» æ¸ ç©ºçæï¼ãå¤ç½®ï¼token è¡å·æ¹ `excelRow = r + 1`ã 2. **2025 åæå 0-based ç´¢å¼é 1**ï¼åæ¯å T..AF ç 0-based èµ·ç¹æ¯ 19ï¼Tï¼ï¼è¯¯ç¨ 20 ä¼ç®åº AGï¼åå·è¶ 1 åï¼ï¼R å ¬å¼å¹é ä¸å°ãå¤ç½®ï¼`lastCol = 19 + 2*(m-1)`ã 3. 两å¤ä¿®å¤ååéæ° `mvn compile` + éå¯åç«¯å¤æµéè¿ï¼æç»äº§ç©ä¸ºä¿®å¤å代ç çæï¼ã ## äºãè¾¹çä¸å·²ç¥é¡¹ï¼æ¬æ¬¡æªçº³å ¥ï¼ - **æåèå页**ï¼è´§è¿éæåãè´§è¿å¨è½¬éæåãä¸å£å¾æåãä¸å£å¾åæãå叿±æ»ãåå¸åå¸å·ãéè·¯è¿è¾å¨è½¬éï¼çåå æ ¼ä¸º**人工æ¯çéæå¼ï¼1-7 æç´¯è®¡å£å¾ï¼**ï¼æ¬æ¬¡è£åªä¸è§¦åï¼è¦éâ1-6 æâèªå¨éç®éèµ° P2-P5 æ°æ®é©±å¨å¡«å ï¼å¦ææï¼ã - 2025/2024 åèåä¿çæ¯çç¼åå¼ï¼æªæ¹ï¼å·²ç¡®è®¤å£å¾ï¼ã - éè页ï¼å ¬è·¯æ»å®¢è¿ã2025å¹´åå¸å®¢è¿éãä¸å£å¾å®¢è¿éãä¸å£å¾è®¡ç®è¿ç¨ï¼æªçº³å ¥è£åªï¼ä¿æåæ ·ã ## å ãç»è®º âå çæ 1-6 æã1-7 ææ©åâ两æ¬äº§ç©ç»ç¨åºå®é çæå¹¶éè¿éæ ¼å¯¹ç §ï¼1-7 æäº§ç©ä¸å¤ä»½æ¯çé¶å·®å¼ï¼1-6 æäº§ç©å¨ 8 个å°è´¦/åæé¡µæ£ç¡®æ§è¡â7 æä¸¤åç空ï¼è¡¨å¤´ä¿çï¼ã累计/忝æ 1-6 æâçå£å¾ï¼å ¶ä½èå´é¶å·®å¼ãP0 项å¯å ³éï¼å©ä½æåèåé¡µæ°æ®é©±å¨éç®ï¼P2-P5ï¼ååè·è¿ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-04.md
@@ -13,7 +13,7 @@ 3. ææ¡£ï¼æ°æ®å¯¼å ¥ç°ç¶ä¸ç¼ºå£æ¸ åãæ¯ç使£æ¸ åè¿½å ææ¿è®°å½ãåè½æµè¯æ¥åÃ3ã ## éçé®é¢ä¸å¾ åï¼ææ©ä¼å ï¼ - P0 æ±æ»å¤§è¡¨â1-6 æçæ + 1-7 ææ©åâç¨åºæ¹é ä¸å¯¹ç §éªè¯ï¼ç¨æ·å·²ç¡®è®¤ ⡠累计/忝æ 1-6 æã忝 2025 1-6 æï¼â 7 æä¸¤åä¿çè¡¨å¤´ãæ°æ®ç空ï¼å¦ææä¸ä½³åæ¹æ´å廿ï¼ã - ~~P0 æ±æ»å¤§è¡¨â1-6 æçæ + 1-7 ææ©åâç¨åºæ¹é ä¸å¯¹ç §éªè¯~~ï¼å·²å®æï¼è§ææ«âæé´è¿½å âï¼2026-09-04 å¤ï¼ã - P1 åå¸å®¢è¿å ¬äº¤/åºç§âåäºç模æ¿âåä½å ¼å®¹ï¼çåäºæä»¶æè¡¨å¤´ï¼ã - P1 æ¯çä¿®æ£ï¼æ¹æ¡ Aï¼å½æåéç¨ç´¯è®¡å¼ãå³ä¾§ #REF! æ¸ çï¼ååä½ä¸ºæ¯çï¼docs/çææ±æ»å¤§è¡¨ 䏿ªæäº¤ç xlsx æ¹å¨å¾ ä¸å¹¶å¤çã - P2 ç½çº¦è½¦æå/æ±æ»å·¥ä½ç°¿çææ¥å ¥å端é项ï¼å¦å°æªå®æï¼ï¼çæäº§ç©å½åä¸è¾åºç®å½ç¡®è®¤ã @@ -22,3 +22,12 @@ ## 夿³¨ - å®¡æ ¸ç»æå·²ææ°å£å¾éç®ï¼2026-07 H2032ï¼ï¼å¦ä¹åç»§ç»é导 07 æå/å ¨å£å¾ï¼éåç¹ä¸æ¬¡âå®¡æ ¸âå·æ°ã - 仿¥æªå®æé¡¹ä¸å ç¨æ·ä¸´æ¶æä»¶ï¼ä¸´æ¶èæ¬çå¨ä»åºæ ¹ç®å½ï¼_*.py/_*.sql çï¼æªæ¸ çã ## æé´è¿½å ï¼2026-09-04 20:3xï¼å ç宿 P0ï¼ - P0ã1-6 æçæ + 1-7 ææ©åãç¨åºæ¹é ä¸å¯¹ç §éªè¯å·²å®æï¼ - 代ç ï¼`ReportExportService.exportSummaryWorkbook` å¢å å¯é `toMonth` è£åª + `trimSummaryMonthlySheets`ï¼8 å°è´¦/åæé¡µï¼7 æå½æå¼/åæ¯æ°æ®æ ¼æ¸ 空ã表头ä¿çï¼Q ç´¯è®¡å» 7 æé¡¹ãR ç´¯è®¡åæ¯åæ¯å» 2025 å¹´ 7 æåï¼ï¼æ§å¶å¨ `/export/summaryWorkbook` å¢å `toMonth` åæ°ã - 产ç©ï¼ç¨åº HTTP å®è·çæï¼å·²è½çï¼ï¼`docs/çææ±æ»å¤§è¡¨/è¾åº/éè·¯è¿è¾éæ±æ»è¡¨_2026-07.xlsx`ã`_2026-06.xlsx`ã - éªè¯ï¼07 ä¸å¤ä»½æ¯çå ¨ç°¿éæ ¼ 0 å·®å¼ï¼06 éç½åå 0 å·®å¼ãO/P æ°æ®æ¸ 空 1132 æ ¼ãQ/R å ¬å¼åæ¹å 566 å¤ã表头ä¿ç 24 æ ¼å ¨å¯¹ãæ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æ±æ»å¤§è¡¨1-6æçæä¸1-7ææ©åéªè¯_2026-09-04.md`ã - éçï¼æ°ï¼ï¼æåèåé¡µï¼æå/æ±æ»/åæ/æ»å¨è½¬éï¼ä¸ºæ¯çéæ 1-7 å£å¾ï¼é P2-P5 æ°æ®é©±å¨å¡«å ååçº³å ¥ 1-6 éªæ¶ã - ææ¥å¾ åæ´æ°ï¼P0 已仿¸ åç§»é¤ï¼P1ï¼åäºçå ¬äº¤/åºç§æ¨¡æ¿åä½å ¼å®¹ãæ¯çæ¹æ¡ A ä¿®æ£åæäº¤éª¨æ¶æ¯çä¸ä¸¤æ¬ xlsx åæ´ï¼ä¿æï¼P2ï¼æåèå页éç®ãæ±æ»å·¥ä½ç°¿å端æ¥å ¥ï¼è·è¿ã docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-06.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07.xlsxBinary files differ
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
@@ -87,9 +87,10 @@ /** çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼æ±æ»å·¥ä½ç°¿ P0-P1 骨æ¶ï¼æ´æ¬å¤å¶æ¯çï¼é¡µç¾/å ¬å¼/2025 ç¼åä¿çï¼ */ @GetMapping("/export/summaryWorkbook") public ResponseEntity<byte[]> exportSummaryWorkbook(@RequestParam("period") String period, @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception { @RequestParam(value = "mode", defaultValue = "month") String mode, @RequestParam(value = "toMonth", required = false) Integer toMonth) throws Exception { logExport("éè·¯è¿è¾éæ±æ»è¡¨.xlsx", period); return buildResponse(reportService.exportSummaryWorkbook(period, mode), String.format("çæ_éè·¯è¿è¾éæ±æ»è¡¨_%s.xlsx", period)); return buildResponse(reportService.exportSummaryWorkbook(period, mode, toMonth), String.format("çæ_éè·¯è¿è¾éæ±æ»è¡¨_%s.xlsx", period)); } /** çæ_ç½çº¦è½¦å®¢è¿éæå表.xlsxï¼æåº¦ï¼è®¢åéä»¶1 + å ¨ç pin + 巡游åºç§ææ¥ï¼ */ traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3199,6 +3199,14 @@ * ä¿çå ¨é¨é¡µç¾/çå¼/å ¬å¼/2025 å¹´ç¼åå¼ï¼ä» æè¡¨å¤´å¹´ä»½å¨æåä¸ºç®æ å¹´ï¼æ°æ®å¡«å æ P2 èµ·éæ¥æ¥å ¥ã */ public byte[] exportSummaryWorkbook(String period, String mode) throws Exception { return exportSummaryWorkbook(period, mode, null); } /** çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼P0-P1 骨æ¶ï¼æ¯æ toMonth è£åªï¼ï¼ * 以ãYYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsxãï¼M ç± period å³å®ï¼ä¸ºæ¯çï¼æåæå¤ä»½æ¯çè¿åæåº¦åï¼ * toMonth é空ä¸å°äº M æ¶ï¼æ 8 个å°è´¦/åæé¡µè£å° toMonth æï¼toMonth+1..M ç彿å¼/忝忏 空ãä¿çè¡¨å¤´ï¼ * 累计ä¸ç´¯è®¡åæ¯å ¬å¼æ¹ä¸ºæ toMonth æéç®ï¼ï¼ç¨äºâå çæ 1-6 æã1-7 ææ©åâéªè¯ã */ public byte[] exportSummaryWorkbook(String period, String mode, Integer toMonth) throws Exception { int year = Integer.parseInt(period.contains("-") ? period.split("-")[0] : period); int month = period.contains("-") ? monthOf(period, mode) : 12; File template = resolveSummaryMother(period, mode); @@ -3215,6 +3223,10 @@ } } else { log.warn("æ±æ»å·¥ä½ç°¿æªæ¾å°åæå¤ä»½æ¯çï¼_å¤ä»½_{}å¹´{}æâ¦ï¼ï¼è¾åºå°ä¿ææ¯çç°ç¶ï¼å¯è½ä¸º 1-4 æéª¨æ¶ï¼", year, month); } if (toMonth != null && toMonth > 0 && toMonth < month) { int trimmed = trimSummaryMonthlySheets(wb, toMonth); log.info("æ±æ»å·¥ä½ç°¿è£åªè³ {} æå®æï¼æ¸ 空/æ¹ååå æ ¼æ°={}", toMonth, trimmed); } dynamicSummaryYear(wb, year); applyTwoDecimalFormat(wb); // æ±æ»å¤§è¡¨ä¿ç人工æ¯çå宽/çå¼ï¼ä¸å autoFitï¼é¿å ¬å¼ä¼æå宽顶çï¼ @@ -3566,6 +3578,73 @@ return ""; } } /** æ 8 个å°è´¦/åæé¡µè£åªå° keepMonths æï¼ * æåº¦å¼å 2026 å¹´ m æ = 第 3+2*(m-1) åï¼C/E/G/I/K/M/Oï¼ï¼åæ¯åä¸ºå ¶åä¸åï¼ * 累计 Q å = C+E+...+Oï¼ç´¯è®¡åæ¯ R å忝 = 2025 å¹´åæå T/V/X/Z/AB/AD/AFã * è£åª = æ°æ®è¡ï¼å«ç´¯è®¡å ¬å¼ä¸ä»»ä¸ 2026 æåº¦åæå 容ï¼ä¸ keepMonths+1..7 æç彿å¼/忝åå æ ¼æ¸ 空ï¼è¡¨å¤´ä¿çï¼ï¼ * å¹¶æè¯¥è¡ç´¯è®¡å ¬å¼å»æå¯¹åº +åï¼ç´¯è®¡åæ¯åæ¯å»æå¯¹åº 2025 åã */ private int trimSummaryMonthlySheets(XSSFWorkbook wb, int keepMonths) { String[] scope = {" è´§è¿", "ç线å 车", "åå¸å®¢è¿", "å ¬äº¤", "åºç§", "ç½çº¦è½¦", "轨éã轮渡", "ä¸å£å¾æç»"}; java.util.Set<String> scopeSet = new java.util.HashSet<>(); for (String s : scope) scopeSet.add(s); int touched = 0; for (int i = 0; i < wb.getNumberOfSheets(); i++) { Sheet sh = wb.getSheetAt(i); if (sh == null || !scopeSet.contains(sh.getSheetName())) continue; for (int r = sh.getFirstRowNum(); r <= sh.getLastRowNum(); r++) { Row row = sh.getRow(r); if (row == null) continue; Cell q = row.getCell(16); // Q å = 累计 if (q == null || q.getCellType() != CellType.FORMULA) continue; boolean hasMonthly = false; for (int m = 1; m <= 7 && !hasMonthly; m++) { Cell v = row.getCell(2 + 2 * (m - 1)); // C,E,G,I,K,M,O if (v != null && v.getCellType() != CellType.BLANK) hasMonthly = true; } if (!hasMonthly) continue; // æé¤é¡µé¦/页ä¸è·¨é¡µç¾æ ¡éªå ¬å¼è¡ï¼æ æåº¦å¼ï¼ int excelRow = r + 1; // å ¬å¼å å¼ç¨ä¸º Excel 1-based è¡å· for (int m = keepMonths + 1; m <= 7; m++) { int valueCol = 2 + 2 * (m - 1); // 2026 彿å¼å int yoyCol = valueCol + 1; // 彿忝å String vLetter = colLetter(valueCol); Cell vc = row.getCell(valueCol); if (vc != null) { vc.setBlank(); touched++; } Cell yc = row.getCell(yoyCol); if (yc != null) { yc.setBlank(); touched++; } String fq = q.getCellFormula(); if (fq != null && fq.contains("+" + vLetter + excelRow)) { q.setCellFormula(fq.replace("+" + vLetter + excelRow, "")); touched++; } Cell rc = row.getCell(17); // R å = ç´¯è®¡åæ¯ if (rc != null && rc.getCellType() == CellType.FORMULA) { String fr = rc.getCellFormula(); int lastCol = 19 + 2 * (m - 1); // 2025 åæå T..AFï¼0-basedï¼T=19,AF=31ï¼ String lLetter = colLetter(lastCol); String txt = fr; if (txt != null && txt.contains("," + lLetter + excelRow)) { txt = txt.replace("," + lLetter + excelRow, ""); touched++; } if (txt != null && txt.contains("+" + lLetter + excelRow)) { txt = txt.replace("+" + lLetter + excelRow, ""); touched++; } if (txt != null && !txt.equals(fr)) rc.setCellFormula(txt); } } } } return touched; } /** æ±æ»å·¥ä½ç°¿å¹´ä»½å¨æåï¼ä» æ 2026å¹´ åç¼æ¿æ¢ä¸ºç®æ å¹´ï¼2025/2024 åèåä¸å¨ï¼ */ private void dynamicSummaryYear(XSSFWorkbook wb, int year) { String oldPrefix = "2026å¹´";