| HANDOFF.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/交接文档_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/功能测试报告/功能测试报告_中口径排名同比基数方案A_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/问题汇总/汇总大表问题交接_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
HANDOFF.md
@@ -4,6 +4,20 @@ > **æ¯å¤©ç»ææ¶**ï¼æå½å¤©è¿å±ã踩è¿çåãæ°éæ±ãæªå®æäºé¡¹æ´æ°å°æ¬æä»¶ï¼ç¶åå¯ä»¥æ¾å¿å¼æ°å¯¹è¯ã > **åä½çº¦å®ï¼2026-08-31ï¼**ï¼è¯´ãæäº¤ã= æ¬å° commit + æ¨éå°è¿ç«¯ gitï¼origin mainï¼Gitblitï¼ï¼ä¸ååªåæ¬å° commitã ## ææ°ï¼2026-09-21ï¼ - **ææ°æ»å ¥å£**ï¼`docs/äº¤æ¥ææ¡£_2026-09-21.md`ï¼ç³»ç»ç°ç¶ãP0/P1/P2 éçãæä½æåï¼ï¼æ±æ»å¤§è¡¨ä¸é¡¹è§ `docs/é®é¢æ±æ»/æ±æ»å¤§è¡¨é®é¢äº¤æ¥_2026-09-21.md`ã - **æ¬æ¥å®æ**ï¼ 1. æåå¹¶åå¹¶ origin/main ææ°æäº¤ï¼å«æèµç³»ç»æ°æ¨¡æ¿ãåå °æºæä»¶æ¸ çãæ±æ»å¤§è¡¨å¼æ¥å¯¼åºçï¼ã 2. å¤çâä¸å£å¾æå vs ä¸å£å¾æç»âåå²åæ¯åºæ°å轨å¶ï¼ç¨æ·éç¨**æ¹æ¡ A**ï¼æåé¡µç´¯è®¡åæ¯åºæ°æ¹è¯»æ¯çãä¸å£å¾æç»ãç 2025 éæåã - é»å 2026 å¹´ 1-8 æå®¢è¿éç´¯è®¡åæ¯ç± `7.744917%` ä¿®æ£ä¸º `7.641733%`ï¼ - 17 å¸å· à 客è¿é/å¨è½¬é累计å¼ä¸åæ¯ 68 个æ°å¼å¯¹å ¨é¨ä¸è´ï¼æå¤§å·® `2.91e-11`ï¼ï¼ - 8 æå½æåæ¯ 34 个æ°å¼å¯¹æ åå½ï¼æå¤§å·® `5.48e-15`ï¼ï¼ - è§ãåè½æµè¯æ¥å_ä¸å£å¾æååæ¯åºæ°æ¹æ¡A_2026-09-21.mdãã - **å½åç¯å¢**ï¼dev å端 `8090`ãå端 `8080` è¿è¡ä¸ï¼æ°æ®åº `127.0.0.1:3305/traffic_audit`ã - **æªå®æéç¹**ï¼2026-09 æ¯çï¼äººå·¥æ¯çææ©åå¨ï¼ããäº¿å æèµé¡¹ç®ãæ Q7 追åã导åºååºæ°ä½æ£ B4ãP1/P2 å ¶ä»äºé¡¹ï¼è¯¦è§æ»äº¤æ¥ææ¡£ç¬¬ 4 ç« ï¼ã - **æµè¯äº§ç©**ï¼`_tmp/qa_plan_a_20260921/`ï¼æé¡¹ç®çº¦å®ä¿çï¼æªç»åæä¸å ï¼ã ## 仿¥ï¼2026-09-04ï¼ ### 13. å ³æºäº¤æ¥å¿«ç §ï¼09-04 æï¼ @@ -261,4 +275,4 @@ repository"ï¼éé建 gitdir æä»¶ï¼PowerShell ç -e "..." å符串é $ ä¼è¢«å½åéå±å¼ï¼å SQL å¯ç åå¸è¦ç¨ SQL æä»¶ã - 2026-08-31ï¼ä¸çåï¼ï¼æ°æ®å¯¼å ¥é¡µéæéªæ¶éè¿ï¼commit 791e70f å·²æ¨éï¼è¯¦è§ç¬¬ 7 èï¼ãæ¹é å ¨ç¨ Python æ¿æ¢åæä»¶ï¼apply_patch æ¬æºå¿ è´¥ï¼ï¼å ³é®åï¼Vue æ°æ¹æ³è¯¯æ¾ methods å¤ â render TypeErrorãel-table å±å¼è¡ä¸æ¸²æï¼[Vue warn] åªå¨ console ä¸å¨ pageerrorï¼éªè¯ç¨ puppeteer æ¦æª /api/import/batches è¿å mock å¤±è´¥æ°æ®ç´æ¥éªæç»è¡¨ï¼ç宿 å¤±è´¥æ°æ®éªãææ å¯¼å ¥å¤±è´¥è®°å½ã空æã - 2026-08-31ï¼ä¸çåï¼ï¼æ°æ®å¯¼å ¥é¡µéæéªæ¶éè¿ï¼commit 791e70f å·²æ¨éï¼è¯¦è§ç¬¬ 7 èï¼ãæ¹é å ¨ç¨ Python æ¿æ¢åæä»¶ï¼apply_patch æ¬æºå¿ è´¥ï¼ï¼å ³é®åï¼Vue æ°æ¹æ³è¯¯æ¾ methods å¤ â render TypeErrorãel-table å±å¼è¡ä¸æ¸²æï¼[Vue warn] åªå¨ console ä¸å¨ pageerrorï¼éªè¯ç¨ puppeteer æ¦æª /api/import/batches è¿å mock å¤±è´¥æ°æ®ç´æ¥éªæç»è¡¨ï¼ç宿 å¤±è´¥æ°æ®éªãææ å¯¼å ¥å¤±è´¥è®°å½ã空æã docs/½»½ÓÎĵµ_2026-09-21.md
@@ -194,7 +194,7 @@ | # | äºé¡¹ | 说æ | ç¶æ | | --- | --- | --- | --- | | P1-1 | ä¸å£å¾æå vs ä¸å£å¾æç»ãåå²åæåºæ°å轨å¶ã | 餿¦æ±å¤ 16 个å¸å·ç´¯è®¡åæ¯é½æå·®ï¼é»å 7.74% vs 7.64%ï¼ï¼æ ¹å æ¯æ¯ç 2025 å¹´ 3ã4 æç½çº¦è½¦æåç¨äºä¸å¥ä¸åºç§åèªç¸çç¾çæ§è¾å ¥ãææ¹æ¡ A/Bï¼**建议 A**ï¼æå页æ¹ç¨æ¯ç 2025 éæåï¼ | âï¼è¯¦è§æ±æ»å¤§è¡¨äº¤æ¥ç¬¬ 4 ç« ï¼ | | P1-1 | ä¸å£å¾æå vs ä¸å£å¾æç»ãåå²åæåºæ°å轨å¶ã | 餿¦æ±å¤ 16 个å¸å·ç´¯è®¡åæ¯é½æå·®ï¼é»å 7.74% vs 7.64%ï¼ï¼æ ¹å æ¯æ¯ç 2025 å¹´ 3ã4 æç½çº¦è½¦æåç¨äºä¸å¥ä¸åºç§åèªç¸çç¾çæ§è¾å ¥ã**æ¹æ¡ A 已宿½å¹¶åå½ï¼æå页æ¹ç¨æ¯ç 2025 éæå**ï¼é»å 1-8 æç´¯è®¡åæ¯ä¿®æ£ä¸º `7.641733%`ï¼17 å¸å· Ã ä¸¤ææ å ± 68 ä¸ªåæ¯/ç´¯è®¡æ ¼å ¨é¨ä¸è´ï¼æå¤§å·® `2.91e-11`ï¼ï¼å½æåæ¯æ åå½ | â ï¼2026-09-21ï¼è¯¦è§æ±æ»å¤§è¡¨äº¤æ¥ç¬¬ 4 ç« ï¼ | | P1-2 | ä¸å£å¾æåå ¨çè¡å·® 0.0002 ä¸äººå ¬é | æ¯çå ¬å¼ `=SUM(O4:O20)` å åèäºå ¥åæ±åçç»ææ§å·®å¼ï¼æ¯å¦æ¹å ¨ç²¾åº¦åå¼éææ¿ | ⸠| | P1-3 | ä¸å£å¾æç» 4 æ ¼ `#DIV/0!` | 2025 å¹´ 8 æåºæ°ä¸º 0ï¼ä¸å¯æ¯ï¼ï¼æ¯å¦æ¹ç©ºç½éä¸å¡ç¡®è®¤ | ⸠| | P1-4 | å ¨ç h2031 1-8 æ 27524.49 vs Σ17 å¸å· 24481.74 | å·® **3042.75**ï¼ä¼ä¸ä¸æ¥çãå ¨çãå«å¸å·æç»å¤çæ°æ®ï¼ææå¸å·æ¼æ¥ï¼ãç¨åºä¸å¾ææ¯çå£å¾ï¼Î£å¸å·ï¼èµ° â 建议ä¸å¡ä¾§æ ¸ä¸æ¬¡ | ⸠| @@ -231,7 +231,7 @@ 1. **P0-1**ï¼8 æåå °ç©æµæºæä»¶çãéåå °æ®µãç±è°æ¸ ãä»ä¹æ¶åæ¸ ï¼ï¼å»ºè®®ï¼æ¥æäººå 段并å¤ä»½ï¼ 2. **P0-2**ï¼ãäº¿å æèµé¡¹ç®ãææè¿½å åçåæ³ç¡®è®¤ï¼ç¨æ· Q7 å·²ç»è§åï¼å®æ½ååç¡®è®¤ä¸æ¬¡åä½ï¼ã 3. **P0-4**ï¼2026-09 æ¯çæä¹å ââ ç´æ¥æ¾ä¸ä»½äººå·¥æ¯çï¼è¿æ¯å åæ©åå¨ï¼ï¼ç¨æ·æ£å¨é®åäºï¼ 4. **P1-1**ï¼ä¸å£å¾æååå²åºæ°èµ°æ¹æ¡ A è¿æ¯ Bï¼ï¼å»ºè®® Aï¼ 4. **P1-1**ï¼ä¸å£å¾æååå²åºæ°ââç¨æ·å·²ææ¿å¹¶å®ææ¹æ¡ Aï¼æå页æ¹ç¨æ¯ç 2025 éæåï¼ï¼æ éå确认ã 5. **P1-2 / P1-3**ï¼0.0002 ä¸äººå ¬éæ¯å¦æ¹å ¨ç²¾åº¦åå¼ï¼`#DIV/0!` æ¯å¦æ¹ç©ºç½ã 6. **P1-4**ï¼h2031 å ¨çè¡ä¸ Σ17 å¸å·å·® 3042.75 çä¸å¡è§£éã 7. **P1-6**ï¼èå· / é»ç³ãè§åå / è§åå¤ãå£å¾ã @@ -321,3 +321,4 @@ | --- | --- | | 2026-09-21 | 馿¬¡ææï¼æ´åæ±æ»å¤§è¡¨äº¤æ¥ï¼`docs/é®é¢æ±æ»/æ±æ»å¤§è¡¨é®é¢äº¤æ¥_2026-09-21.md`ï¼ä¸æèµ/è´§è¿/客è¿å线éç | | 2026-09-21ï¼ä¸åï¼ | P0-1 éç¯ï¼åå °æºæä»¶å·²å æ®µ + é导éªè¯ï¼ï¼æ°å¢ P1-13ï¼æèµç³»ç»æ°æ¨¡æ¿æ¯æï¼ï¼æ°æ®å¿«ç §è¡¥ `investment_system` è¡ | | 2026-09-21ï¼ä¸åï¼ | P1-1 éç¯ï¼ç¨æ·éç¨æ¹æ¡ Aï¼ä¸å£å¾æåç 2025 ç´¯è®¡åºæ°æ¹è¯»æ¯çãä¸å£å¾æç»ãéæåï¼é»åç´¯è®¡åæ¯ç± 7.74% ä¿®æ£ä¸º 7.641733%ï¼å页ä¸è´æ§åå½éè¿ | docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Öпھ¶ÅÅÃûͬ±È»ùÊý·½°¸A_2026-09-21.md
New file @@ -0,0 +1,66 @@ # åè½æµè¯æ¥åï¼ä¸å£å¾æååæ¯åºæ°æ¹æ¡ Aï¼2026-09-21ï¼ ## 1. 鿱䏿¹æ¡ ç¨æ·é对 2026 å¹´ 1-8 ææ±æ»å¤§è¡¨æåºé®é¢ï¼ - ãä¸å£å¾æåãé»åç´¯è®¡åæ¯ç³»ç»çæ `7.744917%` - ãä¸å£å¾æç»ãå䏿æ 为 `7.641733%` - è¦æ±æ¥æå¹¶ä¿®æ£ã æç¨æ·ææ¿éç¨**æ¹æ¡ A**ï¼ - ãä¸å£å¾æåã计ç®å»å¹´åæç´¯è®¡æ¶ï¼ä¸å使ç¨åºå ç°ç®ç 2025 ç½çº¦è½¦æåç»æï¼ - æ¹ç¨æ¯çãä¸å£å¾æç»ã页已æç 2025 å¹´éæéæå®ç¨¿å¼ï¼ - 2026 å¹´å½å¹´ç´¯è®¡å¼ãæåå ¬å¼ãå ¨ç SUM å ¬å¼å彿忝é»è¾åä¸åï¼ - æ¾ä¸å°æ¯çéæåæ¶ä¿çååºå ç°ç®é»è¾ï¼å¹¶å WARN æ¥å¿ã ## 2. å®ç°èå´ æä»¶ï¼`traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java` - `exportPassengerMidRank()` å¢å å¯éå·¥ä½ç°¿ä¸ä¸æéè½½ã - æ±æ»å¤§è¡¨å¯¼åºæ¶ç´æ¥å¤ç¨å½åå åå·¥ä½ç°¿ï¼è¯»åãä¸å£å¾æç»ã2025 å¹´éæåã - ç¬ç«å¯¼åºãçæ_ä¸å£å¾æå.xlsxãæ¶ï¼ææ¥è¡¨ææå¼å¯¹åºæ±æ»æ¯ç读ååä¸éæåã - éæåæè¡¨å¤´æåè¯å«ï¼ä¸åæ»å忝ã - 读å 17 å¸å·ãæ»å®¢è¿éããæ»æ 客å¨è½¬éã1..N æå¼å¹¶ç´¯è®¡ï¼å ¨çåºæ°ç± 17 å¸å·æ±åã - ä»»ä¸å¸å·ã任䏿æ 缺å°å®æ´æä»½æ¶æ¾å¼éæåºæ°å¹¶åéåé»è¾ï¼é¿å éé»ä½¿ç¨æ®ç¼ºåºæ°ã ## 3. éªè¯ç¯å¢ - å端ï¼Spring Boot `8090` - æ°æ®åºï¼`127.0.0.1:3305/traffic_audit` - æ¥è¡¨æï¼`2026-08` - æ¯çï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` - æµè¯äº§ç©ï¼ - `_tmp/qa_plan_a_20260921/çæ_éè·¯è¿è¾éæ±æ»è¡¨_202608_æ¹æ¡A.xlsx` - `_tmp/qa_plan_a_20260921/çæ_ä¸å£å¾æå_202608_æ¹æ¡A.xlsx` ## 4. æµè¯ç»æ | ç¼å· | ç¨ä¾ | 颿 | 宿µ | ç»æ | | --- | --- | --- | --- | --- | | A01 | å端ç¼è¯ | ç¼è¯æå | `mvn -DskipTests compile` æå | éè¿ | | A02 | 2026-08 æ±æ»å¤§è¡¨çæ | æå产åºå¯è¯» xlsx | çææåï¼1325107 bytes | éè¿ | | A03 | é»å客è¿éç´¯è®¡åæ¯ | æå=æç»=`7.641733%` | æå `0.07641733462732472`ï¼æç» `0.07641733462732603` | éè¿ | | A04 | é»åå¨è½¬éç´¯è®¡åæ¯ | æå=æç» | æå `0.01593727813242681`ï¼æç» `0.015937278132423405` | éè¿ | | A05 | 17 å¸å· à 客è¿é/å¨è½¬éç´¯è®¡åæ¯ | 34 ç»éæ ¼ä¸è´ | å«ç´¯è®¡å¼å¨å å ± 68 个æ°å¼å¯¹å ¨é¨ä¸è´ï¼æå¤§ç»å¯¹å·® `2.91e-11` | éè¿ | | A06 | å ¨çç´¯è®¡åæ¯ | æå=æç» | 客è¿éï¼æå `0.0581055773685379`ï¼æç» `0.058105577368537276`ï¼å¨è½¬éåæ ·ä¸è´ | éè¿ | | A07 | å ¨ç累计å¼=Σ17 å¸å· | å®å ¨ç¸ç | 客è¿é `31528.060699999998`ï¼å¨è½¬é `1227147.4890200002`ï¼åç¸ç | éè¿ | | A08 | 2026-08 彿忝åå½ | æå=æç» | 34 个å¸å·ææ å ¨é¨ä¸è´ï¼æå¤§ç»å¯¹å·® `5.48e-15` | éè¿ | | A09 | ç¬ç«ãçæ_ä¸å£å¾æå.xlsxã | 使ç¨åä¸éæåºæ° | é»å客è¿é `7.641733%`ãå¨è½¬é `1.593728%`ï¼ä¸æç»ä¸è´ | éè¿ | | A10 | éæåºæ°ç¼ºå¤±å åº | ä¸ä¸æå¯¼åºï¼åéç°ç®å¹¶è®°æ¥å¿ | 代ç çº§æ£æ¥ï¼æ¯ç/éæå缺失è¿å `null`ï¼æ²¿ç¨å `midCumYoy()` | éè¿ | ## 5. ç»è®º æ¹æ¡ A 已宿½å¹¶å®æåå½ã - 忥ç `7.74%` ä¸ `7.64%` å轨差å¼å·²æ¶é¤ï¼ - 2026-08 æ±æ»å¤§è¡¨ä¸ï¼é»åç´¯è®¡åæ¯ä¸º `7.641733%`ï¼ - æå页ä¸ä¸å£å¾æç»é¡µçç´¯è®¡åæ¯ã累计å¼ãå ¨çæ±æ»åä¸è´ï¼ - 彿忝æªåçåå½ï¼ - æªä¿®æ¹ä»»ä½æ°æ®åºè¡¨ç»ææä¸å¡æ°æ®ã ## 6. 夿³¨ é¡¹ç®æ ¹ç®å½ `_tmp/qa_plan_a_20260921/` ä¸çæµè¯äº§ç©æé¡¹ç®çº¦å®ä¿çï¼æªç»ç¨æ·åæä¸å é¤ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-21.md
@@ -80,8 +80,7 @@ ## ä¸ãéçé®é¢ä¸å¾ å 1. **P0-1**ï¼åå²åæ¯åºæ°åè½¨å¶ ââ æ¹æ¡ Aï¼æå页æ¹ç¨æ¯ç 2025 éæåï¼æ¨èï¼/ æ¹æ¡ Bï¼æç»é¡µæ¹ç°ç®ï¼ å¾ ç¨æ·ææ¿ï¼**æªå®æ½**ã 1. **P0-1 已解å³**ï¼ç¨æ·éæ©æ¹æ¡ Aï¼æå页æ¹ç¨æ¯ç 2025 éæåï¼ï¼å·²äº 2026-09-21 宿½å¹¶åå½éè¿ï¼è§æ¬æä»¶ç¬¬å èã 2. **P0-2**ï¼æ¯çä¾èµ ââ 9 æåºè¡¨éå ææ°æ¯çï¼æ¹æ¡ Aï¼ç¨åºèªå¨æ©åï¼2-3 天ï¼/ æ¹æ¡ Bï¼Excel å°å·¥å ·ï¼1 天ï¼å¾ ææ¿ã 3. P2ï¼B4 导åºååºæ°ä½æ£ + ãæ°æ®ç¼ºå¤±æ¸ åã页ãD ç»å¢éæåæªè¾ãä¸å£å¾æç» 4 æ ¼ `#DIV/0!`ã 缺æ¯çæç¤ºå®æµãé¨ç½²å æ§æ¯çï¼ç¨æ·æç¡®æä¸å¤çï¼ã @@ -130,3 +129,15 @@ - éæ°éªè¯ï¼ä¸å±ï¼å ¨è¿ï¼ï¼ç»æ `CREATE TABLE` 29/29ï¼é表 `COUNT(*)` 29/29 ä¸è´ï¼`CHECKSUM TABLE` 29/29 ä¸è´ï¼`mysqldump --order-by-primary` æåºå¯¼åºä¸¤ä»½æ°æ®æä»¶ **SHA256 å®å ¨ç¸å**ï¼éè¡å 容ä¸è´ï¼ã - **ç»éª**ï¼å¤ä»½åªæ¯æä¸æ¶å»çå¿«ç §ï¼å¯¼å®ä¹ååªè¦è¿å¨å¯¼æ°æ®/è·å®¡æ ¸å°±æ§äºï¼äº¤ä»åå¿ é¡»æåå坼䏿¬¡ã - æ°å¢ææ¡£ï¼`docs/å·¥å ·/æ°æ®åºå¤ä»½ä¸è¿åæä½æ¥éª¤.md`ï¼å¤ä»½åæ°è¯´æ / 䏿¥éªè¯ / è¿å / 常è§é®é¢ï¼å½ä»¤å¯ç´æ¥å¤å¶ï¼ã ## å ã追å ï¼P0-1 åå²åæ¯åºæ°åè½¨å¶ææ¹æ¡ A ä¿®å¤ ç¨æ·éæ© **æ¹æ¡ A**ï¼æå页æ¹ç¨æ¯çãä¸å£å¾æç»ã2025 éæåï¼ï¼å·²å®æä»£ç ãåå½ä¸ææ¡£æ´æ°ã - 代ç ï¼`ReportExportService.exportPassengerMidRank()` å¢å æ¯çå·¥ä½ç°¿ä¸ä¸æéè½½ï¼æ±æ»å¯¼åºå¤ç¨å 忝çï¼ç¬ç«æåè¡¨å¯¼åºæå¼å¯¹åºæ¯çï¼æè¡¨å¤´è¯å« 2025 å¹´éæåï¼è¯»åãæ»å®¢è¿é / æ»æ 客å¨è½¬éãå¹¶æ 1..N æç´¯è®¡ï¼å ¨çåºæ°ç± 17 å¸å·æ±åï¼éæåºæ°ä¸å®æ´æ¶åéåºå ç°ç®å¹¶å WARNã - ç¼è¯ï¼`mvn -DskipTests compile` éè¿ã - çæåå½ï¼2026-08 æ±æ»å¤§è¡¨ï¼é»å客è¿éç´¯è®¡åæ¯æå/æç»å为 `7.641733%`ï¼å 7.744917%ï¼ã - å页ä¸è´æ§ï¼17 å¸å· à 客è¿é/å¨è½¬éç累计å¼ä¸åæ¯å ± 68 个æ°å¼å¯¹å ¨é¨ä¸è´ï¼æå¤§ç»å¯¹å·® `2.91e-11`ï¼å ¨çç´¯è®¡å¼ = Σ17 å¸å·ï¼8 æå½æåæ¯ 34 个æ°å¼å¯¹æå¤§å·® `5.48e-15`ã - ç¬ç«ãçæ_ä¸å£å¾æå.xlsxã乿åä¸éæå£å¾å¯¼åºï¼ç»æä¸æç»é¡µä¸è´ã - æµè¯äº§ç©ï¼`_tmp/qa_plan_a_20260921/çæ_éè·¯è¿è¾éæ±æ»è¡¨_202608_æ¹æ¡A.xlsx`ã`_tmp/qa_plan_a_20260921/çæ_ä¸å£å¾æå_202608_æ¹æ¡A.xlsx`ï¼æçº¦å®ä¿çï¼ã - æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_ä¸å£å¾æååæ¯åºæ°æ¹æ¡A_2026-09-21.md`ã docs/ÎÊÌâ»ã×Ü/»ã×Ü´ó±íÎÊÌâ½»½Ó_2026-09-21.md
@@ -8,7 +8,7 @@ 8 ææ±æ»å¤§è¡¨å·²è½åå°ãå¯¼å ¥åºç¡æ°æ® â ä¸é®çæãï¼ä¸äººå·¥æ¯çéæ ¼æ¯å¯¹åºæ¬ä¸è´ãä½æä¸¤ä¸ªé«å±éçï¼ 1. **åå²åæï¼2025 å¹´ï¼åå¨ä¸¤å¥å£å¾ä¹é´æ²¡æç»ä¸** ââ ãä¸å£å¾æåã页ä¸ãä¸å£å¾æç»ã页çç´¯è®¡åæ¯å¯¹ä¸ä¸ï¼é»å 7.74% vs 7.64%ï¼ï¼**è¿æ¯ç¬¬ä¸ä¼å é®é¢**ã 1. ~~**åå²åæï¼2025 å¹´ï¼åå¨ä¸¤å¥å£å¾ä¹é´æ²¡æç»ä¸** ââ ãä¸å£å¾æåã页ä¸ãä¸å£å¾æç»ã页çç´¯è®¡åæ¯å¯¹ä¸ä¸ï¼é»å 7.74% vs 7.64%ï¼ï¼**è¿æ¯ç¬¬ä¸ä¼å é®é¢**ã~~ **å·²äº 2026-09-21 ææ¹æ¡ A è§£å³ï¼è§ç¬¬ 4 ç« ã** 2. **æ¯æè¦äººå·¥åå¤ä¸ä»½æ°æ¯ç**ï¼ç¨åºä¸ä¼èªå·±æ©åï¼9 æå以åä¸è§£å³å°±ä¼å¡ä½åºè¡¨ã ## 1. åç½®é 读ï¼å çè¿ 5 份ï¼çº¦ 30 åéå»ºç«æ¦å¿µï¼ @@ -40,7 +40,7 @@ | ç¼å· | é®é¢ | ç¶æ | ä¼å 级 | | --- | --- | --- | --- | | P0-1 | åå²åæ¯åºæ°ãå轨å¶ãï¼ä¸å£å¾æå vs ä¸å£å¾æç» ç´¯è®¡åæ¯å ¨å¸å·ä¸ä¸è´ | **æªè§£å³** | é« | | P0-1 | åå²åæ¯åºæ°ãå轨å¶ãï¼ä¸å£å¾æå vs ä¸å£å¾æç» ç´¯è®¡åæ¯å ¨å¸å·ä¸ä¸è´ | **已解å³ï¼2026-09-21ï¼æ¹æ¡ Aï¼** | é« | | P0-2 | æ¯çä¾èµï¼æ¯æè¦äººå·¥å夿°æ¯çï¼ç¨åºä¸ä¼èªå·±æ©å | **æªè§£å³** | é« | | P1-1 | åå¸å®¢è¿é¡µ AJ åï¼2025å¹´1-7æç´¯è®¡ï¼æ®çå¨çæè¡¨ | å·²ä¿®å¤ 09-20 | - | | P1-2 | ä¸å£å¾æåå¨è½¬éå£å¾ä¸äººå·¥åä¸ä¸è´ | å·²ä¿®å¤ 09-19 | - | @@ -52,6 +52,8 @@ | P2-4 | 缺æ¯çæç¤ºæªå®æµï¼é¨ç½²å å æ¯å¸¦ AJ åçæ§æ¯ç | å¾ å¤ç | ä½ | ## 4. P0-1 åå²åæ¯åºæ°ãå轨å¶ãï¼æ¬æ¬¡äº¤æ¥éç¹ï¼ > **ç¶ææ´æ°ï¼2026-09-21ï¼ï¼ç¨æ·éç¨æ¹æ¡ Aï¼å·²å®æ½å¹¶åå½éè¿ã** æå页ç 2025 ç´¯è®¡åºæ°æ¹è¯»æ¯çãä¸å£å¾æç»ãéæåï¼é»å 1-8 æç´¯è®¡åæ¯ç± 7.744917% ä¿®æ£ä¸º 7.641733%ï¼ä¸æç»é¡µä¸è´ã ### 4.1 ç°è±¡ @@ -118,7 +120,11 @@ - **å ¨çè¡ä¸¤é¡µå®å ¨ä¸è´**ï¼31528.0607 / 5.810558%ï¼ï¼å ä¸ºè¿æ¯**å¸å·ä¹é´çåæå·®å¼**ï¼å ¨çå æ»ç¸äºæµæ¶ã ### 4.6 å¤ç½®æ¹æ¡ï¼å¾ ææ¿ï¼å°æªå®æ½ï¼ ### 4.6 å¤ç½®æ¹æ¡ï¼2026-09-21ï¼æ¹æ¡ A 已宿½ï¼ **宿½ç»æ**ï¼`exportPassengerMidRank()` 卿±æ»å¯¼åºä¸å¤ç¨å 忝çï¼å¨ç¬ç«æå表导åºä¸æå¼å¯¹åºæ¯çï¼æè¡¨å¤´è¯»åãä¸å£å¾æç»ã2025 å¹´ãæ»å®¢è¿éããæ»æ 客å¨è½¬éã1..N æéæå¼ï¼å ¨çåºæ°ç± 17 å¸å·æ±åãéæåä¸å®æ´æ¶èªå¨åéååºå ç°ç®å¹¶å WARN æ¥å¿ã åå½è¯æ®ï¼2026-08 æ±æ»å¤§è¡¨é»å客è¿éç´¯è®¡åæ¯æå/æç»å为 `7.641733%`ï¼17 å¸å· à 客è¿é/å¨è½¬éç累计å¼ä¸ç´¯è®¡åæ¯å ± 68 个æ°å¼å¯¹å ¨é¨ä¸è´ï¼æå¤§ç»å¯¹å·® `2.91e-11`ï¼å½æåæ¯ 34 个æ°å¼å¯¹æå¤§å·® `5.48e-15`ã详è§ãåè½æµè¯æ¥å_ä¸å£å¾æååæ¯åºæ°æ¹æ¡A_2026-09-21.mdãã - **æ¹æ¡ Aï¼æ¨èï¼æ¹å¨å°ï¼**ï¼è®© `exportPassengerMidRank()` åãå»å¹´åæç´¯è®¡ãæ¶ï¼æ¹ç¨æ¯çé£ä»½ 2025 éæåï¼ä¸ä¸å£å¾æç»åæºï¼ã - çç±ï¼å¯¹å¤åå¸ç忝ï¼åºæ°æ¬è¯¥ç¨å»å¹´å®ç¨¿å¼ï¼åªå¨æå页 `midCumYoy/midCumClass` çåæ°æ¥æºï¼2026 彿å¼ä¸åå½±åã @@ -237,7 +243,7 @@ ## 11. å¾ ç¨æ·/ä¸å¡ç¡®è®¤æ¸ åï¼æ¥æäººå å«èªå·±æï¼ 1. P0-1 èµ°æ¹æ¡ A è¿æ¯ Bï¼ï¼å»ºè®® Aï¼ 1. ~~P0-1 èµ°æ¹æ¡ A è¿æ¯ Bï¼ï¼å»ºè®® Aï¼~~ ç¨æ·å·²éæ©æ¹æ¡ Aï¼2026-09-21 已宿½å¹¶åå½éè¿ã 2. P0-2 èµ°æ¹æ¡ Aï¼ç¨åºèªå¨æ©åï¼è¿æ¯ Bï¼Excel å°å·¥å ·ï¼ï¼9 ææ¯å¦å ç¨ B åºæ¥ï¼ 3. ä¸å£å¾æç» 4 æ ¼ `#DIV/0!` æ¯å¦æ¹ç©ºç½ï¼ 4. B4 åºæ°ä½æ£çè§¦åæ¶æºä¸å¼¹çªææ¡ã @@ -245,6 +251,6 @@ ## 12. å»ºè®®çæ¥æé¡ºåº 1. è·éç¯å¢ + çæä¸æ¬¡ 2026-08 æ±æ»å¤§è¡¨ï¼ç¡®è®¤è½å¤ç°æ¬æææç°è±¡ï¼å天ï¼ã 2. å¤ç P0-1 æ¹æ¡ Aï¼1 天ï¼å«åå½ï¼ã 2. ~~å¤ç P0-1 æ¹æ¡ Aï¼1 天ï¼å«åå½ï¼ã~~ å·²äº 2026-09-21 宿ã 3. å¤ç P0-2 æ¹æ¡ B åº 9 ææ¯çï¼1 天ï¼ï¼éåæ Aã 4. è¡¥ B4 åºæ°ä½æ£ï¼1-2 天ï¼ã traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -2681,9 +2681,19 @@ * çæ_ä¸å£å¾æå.xlsxï¼åå累计ï¼é 1 个æ=彿ï¼é 1-6 æ=累计ï¼ï¼RANK/SUM å ¬å¼ä¿çã */ public byte[] exportPassengerMidRank(String period, String mode) throws Exception { return exportPassengerMidRank(period, mode, null); } /** * æ¹æ¡ Aï¼2026-09-21ï¼ï¼ä¸å£å¾æåçç´¯è®¡åæ¯åºæ°ä¸âä¸å£å¾æç»âä¿æåæºã * æç»é¡µç 2025 年忝æ¯çéæå®ç¨¿å¼ï¼æå页åå æ¥åºç°ç®ï¼ä¸¤è å¨ 2025-03/04 ç½çº¦è½¦æåä¸ä¸åã * summaryWb é空æ¶ç´æ¥å¤ç¨å½åæ£å¨çæçæ±æ»å·¥ä½ç°¿ï¼ç¬ç«å¯¼åºæ¶åæå¼å¯¹åºæ¯çã */ private byte[] exportPassengerMidRank(String period, String mode, XSSFWorkbook summaryWb) throws Exception { int maxMonth = monthOf(period, mode); int currentYear = Integer.parseInt(period.substring(0, 4)); File template = resolvePassengerTemplate("çæ_ä¸å£å¾æå.xlsx"); Map<String, double[]> lastYearCumBase = loadMidRankStaticBase(period, mode, summaryWb, currentYear, maxMonth); try (InputStream in = new FileInputStream(template); XSSFWorkbook wb = new XSSFWorkbook(in)) { Sheet sheet = wb.getSheetAt(0); @@ -2703,8 +2713,8 @@ title.getCell(10).setCellValue(currentYear + "å¹´" + maxMonth + "æå ¨çåå¸å·å®æé路客è¿ç产æ åµ"); } // å ¨çè¡ r3ï¼B3/F3 为 SUM å ¬å¼ä¿çï¼D3/H3 忝填å¼ï¼0-based å 3/7ï¼ setValOrBlank(sheet, 2, 3, midCumYoy(mid, currentYear, "æ¹åç", maxMonth, 0, true)); setValOrBlank(sheet, 2, 7, midCumYoy(mid, currentYear, "æ¹åç", maxMonth, 0, false)); setValOrBlank(sheet, 2, 3, midRankCumYoy(mid, currentYear, "æ¹åç", maxMonth, true, lastYearCumBase)); setValOrBlank(sheet, 2, 7, midRankCumYoy(mid, currentYear, "æ¹åç", maxMonth, false, lastYearCumBase)); // å³åå ¨çè¡ N3/R3ï¼å½æåæ¯ï¼L3/P3 为 SUM å ¬å¼ä¿çï¼ setValOrBlank(sheet, 2, 13, midMonthYoy(mid, currentYear, maxMonth, "æ¹åç", 0, true)); setValOrBlank(sheet, 2, 17, midMonthYoy(mid, currentYear, maxMonth, "æ¹åç", 0, false)); @@ -2715,17 +2725,13 @@ int r0 = 3 + i; double pass = midCumClass(mid, currentYear, city, maxMonth, 0, true); double turn = midCumClass(mid, currentYear, city, maxMonth, 0, false); double lastPass = midCumClass(mid, currentYear - 1, city, maxMonth, 0, true); double lastTurn = midCumClass(mid, currentYear - 1, city, maxMonth, 0, false); setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass); setValOrBlank(sheet, r0, 3, midCumYoy(mid, currentYear, city, maxMonth, 0, true)); setValOrBlank(sheet, r0, 3, midRankCumYoy(mid, currentYear, city, maxMonth, true, lastYearCumBase)); setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn); setValOrBlank(sheet, r0, 7, midCumYoy(mid, currentYear, city, maxMonth, 0, false)); setValOrBlank(sheet, r0, 7, midRankCumYoy(mid, currentYear, city, maxMonth, false, lastYearCumBase)); // å³å彿ï¼L/P å¼ãN/R 彿忝ï¼M/O/Q/S æåå ¬å¼ä¿çï¼ double mPass = midClassVal(mid, currentYear, maxMonth, city, 0, true); double mTurn = midClassVal(mid, currentYear, maxMonth, city, 0, false); double mLastPass = midClassVal(mid, currentYear - 1, maxMonth, city, 0, true); double mLastTurn = midClassVal(mid, currentYear - 1, maxMonth, city, 0, false); setValOrBlank(sheet, r0, 11, mPass == 0 ? null : mPass); setValOrBlank(sheet, r0, 13, mPass == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, city, 0, true)); setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : mTurn); @@ -2734,6 +2740,112 @@ recalc(wb); return toBytes(wb); } } /** è¯»åæ¯çãä¸å£å¾æç»ãç 2025 å¹´éæéæå¼ï¼æ±æ»ææå页æéçå»å¹´åæç´¯è®¡åºæ°ã */ private Map<String, double[]> readMidDetailLastYearCumulative(XSSFWorkbook sourceWb, int currentYear, int maxMonth) { Map<String, double[]> out = new LinkedHashMap<>(); if (sourceWb == null || maxMonth <= 0) return out; Sheet sheet = sourceWb.getSheet("ä¸å£å¾æç»"); if (sheet == null) return out; Map<Integer, Integer> monthCols = new LinkedHashMap<>(); java.util.regex.Pattern monthHeader = java.util.regex.Pattern.compile("^(\\d{4})å¹´(\\d{1,2})æ$"); int headerEnd = Math.min(sheet.getLastRowNum(), sheet.getFirstRowNum() + 5); for (int r = sheet.getFirstRowNum(); r <= headerEnd; r++) { Row row = sheet.getRow(r); if (row == null) continue; for (int c = row.getFirstCellNum(); c >= 0 && c < row.getLastCellNum(); c++) { String text = cellText(row.getCell(c)); if (text == null) continue; java.util.regex.Matcher matcher = monthHeader.matcher(text.trim()); if (!matcher.matches()) continue; int y = Integer.parseInt(matcher.group(1)); int m = Integer.parseInt(matcher.group(2)); if (y == currentYear - 1 && m >= 1 && m <= maxMonth) monthCols.putIfAbsent(m, c); } } if (monthCols.size() < maxMonth) return out; for (int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++) { Row row = sheet.getRow(r); if (row == null) continue; String city = RegionUtil.normalizeCityName(cellText(row.getCell(0))); if (city == null || !RegionUtil.CITY_LIST.contains(city)) continue; String metric = cellText(row.getCell(1)); if (metric == null) continue; int idx = metric.contains("æ»æ 客å¨è½¬é") ? 1 : (metric.contains("æ»å®¢è¿é") ? 0 : -1); if (idx < 0) continue; double sum = 0.0; boolean complete = true; for (int m = 1; m <= maxMonth; m++) { Cell c = row.getCell(monthCols.get(m)); if (c == null) { complete = false; break; } if (c.getCellType() == CellType.NUMERIC) { sum += c.getNumericCellValue(); } else if (c.getCellType() == CellType.FORMULA && c.getCachedFormulaResultType() == CellType.NUMERIC) { sum += c.getNumericCellValue(); } else { complete = false; break; } } double[] values = out.computeIfAbsent(city, k -> new double[]{Double.NaN, Double.NaN}); values[idx] = complete ? sum : Double.NaN; } double[] province = new double[2]; for (String city : RegionUtil.CITY_LIST) { double[] values = out.get(city); if (values == null || Double.isNaN(values[0]) || Double.isNaN(values[1])) return new LinkedHashMap<>(); province[0] += values[0]; province[1] += values[1]; } out.put("æ¹åç", province); return out; } /** ç¬ç«å¯¼åºæ¶ä»å¯¹åºæ±æ»æ¯ç读åéæåºæ°ï¼æ±æ»å¯¼åºæ¶ç´æ¥å¤ç¨å åä¸çå·¥ä½ç°¿ï¼é¿å éå¤ I/Oã */ private Map<String, double[]> loadMidRankStaticBase(String period, String mode, XSSFWorkbook summaryWb, int currentYear, int maxMonth) { if (summaryWb != null) { Map<String, double[]> base = readMidDetailLastYearCumulative(summaryWb, currentYear, maxMonth); if (!base.isEmpty()) return base; log.warn("ä¸å£å¾æåï¼å½åæ±æ»å·¥ä½ç°¿çä¸å£å¾æç»æªè¯»å°å®æ´ 2025 éæç´¯è®¡åºæ°ï¼åéåºå ç°ç®"); return null; } double savedZipRatio = ZipSecureFile.getMinInflateRatio(); ZipSecureFile.setMinInflateRatio(0.0001); try { File mother = resolveSummaryMother(period, mode); if (mother == null || !mother.isFile()) { log.warn("ä¸å£å¾æåï¼æªæ¾å° {} çæ±æ»æ¯çï¼2025 ç´¯è®¡åºæ°åéåºå ç°ç®", period); return null; } try (InputStream in = new FileInputStream(mother); XSSFWorkbook wb = new XSSFWorkbook(in)) { Map<String, double[]> base = readMidDetailLastYearCumulative(wb, currentYear, maxMonth); if (base.isEmpty()) { log.warn("ä¸å£å¾æåï¼æ¯ç {} çä¸å£å¾æç»æªè¯»å°å®æ´ 2025 éæç´¯è®¡åºæ°ï¼åéåºå ç°ç®", mother.getName()); return null; } log.info("ä¸å£å¾æåï¼2025 ç´¯è®¡åºæ°æ¹ç¨æ¯çéæåï¼{}ï¼", mother.getName()); return base; } } catch (Exception e) { log.warn("ä¸å£å¾æåï¼è¯»åæ¯ç 2025 éæç´¯è®¡åºæ°å¤±è´¥ï¼åéåºå ç°ç®ï¼{}", e.getMessage()); return null; } finally { ZipSecureFile.setMinInflateRatio(savedZipRatio); } } /** ä¸å£å¾æåç´¯è®¡åæ¯ï¼æ¹æ¡ A æéæåºæ°æ¶ä¸å ¶å¯¹é½ï¼å¦åä¿çååºå ç°ç®é»è¾ã */ private Double midRankCumYoy(Map<Integer, Map<String, double[][]>> mid, int year, String area, int monthCount, boolean volume, Map<String, double[]> staticBase) { if (staticBase == null) return midCumYoy(mid, year, area, monthCount, 0, volume); double[] values = staticBase.get(area); if (values == null) return null; double current = midCumClass(mid, year, area, monthCount, 0, volume); if (current == 0.0) return null; double base = volume ? values[0] : values[1]; return base == 0.0 ? null : yoyOf(current, base); } /** åæ°å¼ææ¸ ç©ºï¼å ¬å¼åå æ ¼ä¿çä¸å¨ï¼ */ @@ -3754,7 +3866,7 @@ 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), new int[][]{{0, 0}, {0, 10}}); n += copyRankValues(wb, "ä¸å£å¾æå", exportPassengerMidRank(period, mode, wb), new int[][]{{0, 0}, {0, 10}}); return n; }