| docs/功能测试报告/功能测试报告_投资明细表就绪与预览类型补齐_2026-09-20.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-20.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Ͷ×ÊÃ÷ϸ±í¾ÍÐ÷ÓëÔ¤ÀÀÀàÐͲ¹Æë_2026-09-20.md
New file @@ -0,0 +1,60 @@ # åè½æµè¯æ¥å_æèµæç»è¡¨å°±ç»ªä¸é¢è§ç±»åè¡¥é½_2026-09-20 ## ä¸ãåè½è¯´æ **é®é¢**ï¼æ¥è¡¨çæé¡µé¢ä¸ï¼ã客è¿ç«æèµæç»è¡¨ããç©æµç«åºæèµæç»ãæ¾ç¤º `æªç¥æ¥è¡¨ç±»åï¼investPassengerDetail / investLogisticsDetail`ï¼æ æ³é¢è§/导åºã **æ ¹å **ï¼ä¸æ¯æ°æ®é®é¢ï¼8 æå®¢è¿/ç©æµæèµææ¥å·²å¨åºï¼å®¢è¿ 39 è¡ãç©æµ 128 è¡ï¼ã ä¸ä¸æ¥åªæè¿ä¸¤ä¸ªç±»åæ¥è¿äº**导åº**é¾è·¯ï¼`exportSelected` switchã`REPORT_FILE_NAMES`ãå端å表ãä¸¤ä¸ªå¯¼åºæ¥å£ï¼ï¼ æ¼äº**导åºåçå°±ç»ªæ ¡éªä¸é¢è§**é¾è·¯ï¼ 1. `checkExportReady()` ç `switch (t)` 没æè¿ä¸¤ä¸ª case â è½å° `default`ï¼`rows=0` + `notes.add("æªç¥æ¥è¡¨ç±»åï¼" + t)`ï¼äºæ¯ `ready=false`ï¼ 2. `isInvestType(t)` æªæ¶å½è¿ä¸¤ä¸ªç±»å â é¢è§å¾ªç¯æ¢ä¸å½å ¥æèµåæ¯ï¼ä¹æ¿ä¸å°æåº¦è¦çä¸æèµæè¦ã **å¤ç½®**ï¼ - `checkExportReady()` æ°å¢ä¸¤ä¸ª caseï¼æç±»å«ï¼å®¢è¿ç«åº / ç©æµååºï¼ç»è®¡ `investment_monthly` 该æè¡æ°ï¼ å¹¶æ ¡éª `docs/æèµ/模æ¿/` ä¸å¯¹åºæ¯çæ¯å¦åå¨ï¼ç¼ºæ¯çåæç¤ºï¼ï¼ - `isInvestType()` æ¶å½ä¸¤ä¸ªç±»åï¼æåº¦è¦ç + é®é¢æ¸ åçº³å ¥æèµåæ¯ï¼ï¼ - `investPreview()` å¢å æç±»å«è¿æ»¤çéè½½ï¼`category != null` æ¶åªç»è®¡è¯¥ç±»å«é¡¹ç®ï¼ï¼ ä½¿ä¸¤å¼ æç»è¡¨çæè¦ä¸åæ··å ¥å¦ä¸ç±»å«çå计ï¼åæ åéè½½ä¿çãè¡ä¸ºä¸åã - æªç¥ç±»åçå åºæ¥é**ä¿ç**ï¼æªè¢«åå¼±ï¼ã ## äºãæµè¯ç¯å¢ | 项 | å¼ | | --- | --- | | æ¥æ | 2026-09-20 10:4x | | å端 | Spring Boot 8090ï¼éå¯å è½½ï¼`Started TrafficAuditApplication` 10:49:51ï¼ | | å端 | Vue 8080ï¼HTTP 200ï¼ | | æ°æ®åº | MySQL 127.0.0.1:3308 `traffic_audit` | | æ¥è¡¨æ | 2026-08ï¼mode=monthï¼ | | æ¥å£ | `GET /api/report/ready`ã`GET /api/report/preview`ï¼`types` éå·åéï¼ | ## ä¸ãç¨ä¾è¡¨ | ç¼å· | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | | --- | --- | --- | --- | --- | --- | | T01 | å°±ç»ªæ ¡éªï¼æ£åï¼ | `types=investPassengerDetail,investLogisticsDetail` | ä¸ååºç°ãæªç¥æ¥è¡¨ç±»åãï¼ready=true | 两项å `ready=true`ã`note` 为空ï¼`rows` = 39ï¼å®¢è¿ï¼/ 128ï¼ç©æµï¼ | â éè¿ | | T02 | é¢è§ï¼æ£åï¼ | åä¸ï¼è° `/api/report/preview` | ææåº¦è¦çãæè¦ä¸é®é¢æ¸ å | è¦ç `[8]`ã`problems` ä¸ºç©ºï¼æè¦ï¼å®¢è¿ã39 é¡¹ç® / æ¬æ 2048.1 / èªå¹´å 38648.16 / èªå¼å§ 550929.76 ä¸å ãï¼ç©æµã128 é¡¹ç® / æ¬æ 90185.9 / èªå¹´å 704107.7 / èªå¼å§ 2656354.31 ä¸å ã | â éè¿ | | T03 | æè¦ä¸åºå é项对é½ï¼å ¥åºæ½æ¥ï¼ | ä¸è¿°æè¦ vs SQL èå | å®å ¨ä¸è´ | SQLï¼å®¢è¿ `2048.1 / 38648.16 / 550929.76`ãç©æµ `90185.9 / 704107.7 / 2656354.31`ï¼**é项ä¸è´** | â éè¿ | | T04 | åç±»å«è¿æ»¤ï¼æ£åï¼ | ä¸¤å¼ è¡¨æç»æè¦ | ä¸åºæ··å ¥å¦ä¸ç±»å«æ°æ® | å®¢è¿ 39 è¡ãç©æµ 128 è¡ï¼æ°å¥½çäº 39+128=167ï¼`investPlan` çå ¨ç±»å«ç±»åä»è¿å 167ï¼ï¼è¯´ææç»è¡¨å·²æç±»å«æ¶æ | â éè¿ | | T05 | 导åºåå½ï¼æ£åï¼ | è° `/api/report/export/investPassengerDetail`ã`.../investLogisticsDetail` | ä»è½æ£å¸¸åºè¡¨ | çæ `gen_pax_inv.xlsx`ï¼29462 åèï¼ã`gen_log_inv.xls`ï¼134144 åèï¼ï¼æ¤åå·²éªè¯å®¢è¿æ±æ»é¡µä¸å®ç¨¿ 0 å·®å¼ | â éè¿ | | T06 | åææèµç±»ååå½ï¼æ£åï¼ | `types=investPlan,investBillion,investCounty,investFiveYearLogistics` | è¡ä¸ºä¸å | å项å `ready=true`ã`rows=167`ãæ note | â éè¿ | | T07 | æªç¥ç±»åä»è¢«æ¦æªï¼è´åï¼ | `types=foo` | ä»æç¤ºæªç¥ç±»åä¸ä¸å°±ç»ª | `ready=false`ã`rows=0`ã`note=æªç¥æ¥è¡¨ç±»åï¼foo` | â éè¿ | | T08 | 缺æ¯çæç¤ºï¼è´å·设计è¦çï¼ | 移走æ¯ç | æç¤ºãdocs/æèµ/æ¨¡æ¿ ä¸ç¼ºå°ãâ¦ãã | æªå®æµï¼æªä¸´æ¶ç§»å¨ç¨æ·æ¯çæä»¶ï¼ï¼ä»£ç è·¯å¾ä¸ `summaryWorkbook` 缺æ¯çå¤å®åæ | â æªæ§è¡ | ## åãåç°çé®é¢ä¸å¤ç½® | ç¼å· | é®é¢ | æ ¹å | å¤ç½® | | --- | --- | --- | --- | | P01 | ä¸¤å¼ æèµæç»è¡¨å¨æ¥è¡¨çæé¡µæ¾ç¤ºãæªç¥æ¥è¡¨ç±»åï¼invest*Detailã | åªæ¥äºå¯¼åºé¾è·¯ï¼æ¼äºå°±ç»ªæ ¡éª `switch` ä¸ `isInvestType` | è¡¥é½ `checkExportReady` 两个 case + `isInvestType` æ¶å½ï¼è§ä¸ | | P02 | æç»è¡¨æè¦è¥æ²¿ç¨å `investPreview` 伿··å ¥å¦ä¸ç±»å« | åæ¹æ³åªææ¥è¡¨æèåå ¨é¨æèµææ¥ | æ°å¢å¸¦ `category` çéè½½ï¼æç±»å«è¿æ»¤é¡¹ç® idï¼åéè½½ä¿ç | | P03 | ãåããã计ãè¡å ¥åºä¼èå¢å计ï¼åä¸æä¿®å¤çè¿å¸¦å½±åï¼ | æºè¡¨å计è¡è¢«å½æé¡¹ç® | 已修å¤ï¼æ¬æ¬¡æ ¸å¯¹ï¼å®¢è¿æ¬æå®æç±å«å计è¡ç 2130.1 æ¶æä¸º **2048.1**ï¼ä¸ SQL é项ä¸è´ï¼æ éçå«ã计ãç项ç®è¡ | ## äºãç»è®º 7 æ¡ç¨ä¾éè¿ã1 æ¡ï¼ç¼ºæ¯çæç¤ºï¼æªå®æµï¼ æ¥è¡¨çæé¡µä¸¤å¼ æèµæç»è¡¨ç就绪/é¢è§å·²æ¢å¤æ£å¸¸ï¼æè¦æç±»å«è¿æ»¤ä¸ä¸åºå SQL é项ä¸è´ï¼ 导åºä¸å ¶å®æèµæ¥è¡¨ç±»ååæ åå½ï¼æªç¥ç±»åå åºæ¦æªä»ç¶ææã æ¤åãæªç¥æ¥è¡¨ç±»åã纯å±**ä»£ç æ¼é **ï¼ä¸ 8 ææèµææ¥æ¯å¦å¯¼å ¥æ å ³ ââ æ°æ®ä¸ç´å¨åºï¼å®¢è¿ 39 / ç©æµ 128ï¼ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-20.md
@@ -2,63 +2,49 @@ ## ä¸ãä»å¤©åäºä»ä¹ ### 1. åçç¨æ·æ ¸å¯¹å·®å¼ççé®ï¼æ¿æ¥ 09-19ï¼ ### 1.1 ä¿®å¤ï¼æ¥è¡¨çæé¡µä¸¤å¼ æèµæç»è¡¨æ¥ãæªç¥æ¥è¡¨ç±»åã ç¨æ·æäººå·¥ç®çä¸åæ¾è¿æ¡é¢ãçæ_éè·¯è¿è¾éæ±æ»è¡¨ (1).xlsxãï¼é®å·®å¼åå ã ç¨æ·è¿½é®ãæ¯ä¸æ¯åæ°ç»´åº¦ä¸å¯¹é æçââç¨åºç´æ¥å ãåé å乡ãï¼äººå·¥ç¨ãæ»éâåå¸å ããââ **æ¯çï¼æ£æ¯è¿ä¸ªåå **ï¼å·²å¨ 09-19 ä¿®å¤å¹¶æ¨éï¼é®é¢è®°äºãåè½æµè¯æ¥å_ä¸å£å¾æåå¨è½¬éå£å¾ç»ä¸_2026-09-19.mdãï¼ã - **ç°è±¡**ï¼æ¥è¡¨çæé¡µã客è¿ç«æèµæç»è¡¨ããç©æµç«åºæèµæç»ãæ¾ç¤º `æªç¥æ¥è¡¨ç±»åï¼investPassengerDetail / investLogisticsDetail`ï¼æ æ³é¢è§/导åºã - **å®ä½**ï¼æ¥éæ¥èª `ReportExportService.checkExportReady()` ç `switch (t)` å åºåæ¯ï¼`ReportExportService.java:231`ï¼ã åä¸æåªæè¿ä¸¤ä¸ªç±»åæ¥è¿**导åº**é¾è·¯ï¼`exportSelected` switchã`REPORT_FILE_NAMES`ã`ReportExportController` 两个æ¥å£ã`ReportExport.vue` 两项ï¼ï¼ æ¼äº**å°±ç»ªæ ¡éªä¸é¢è§**é¾è·¯ï¼`isInvestType()` 乿²¡æ¶å½è¿ä¸¤ä¸ªç±»åã - **䏿°æ®æ å ³**ï¼8 ææèµææ¥ä¸ç´å¨åºï¼å®¢è¿ç«åº 39 è¡ãç©æµååº 128 è¡ï¼ã - **ä¿®å¤**ï¼ 1. `checkExportReady()` æ°å¢ä¸¤ä¸ª caseï¼æç±»å«ç»è®¡ `investment_monthly` 该æè¡æ° + æ ¡éª `docs/æèµ/模æ¿/` æ¯çæ¯å¦åå¨ï¼ç¼ºæ¯çç»æç¤ºï¼ï¼ 2. `isInvestType()` æ¶å½ä¸¤ä¸ªç±»åï¼çº³å ¥æèµåæ¯çæåº¦è¦çä¸é®é¢æ¸ åï¼ï¼ 3. `investPreview()` å¢å æç±»å«è¿æ»¤éè½½ `(period, mode, category, summary, problems)`ï¼åæ åéè½½ä¿çï¼ 4. é¢è§å¾ªç¯æç±»ååæ´¾å°å¯¹åºç±»å«ï¼æªç¥ç±»åå åºæ¥éä¿æä¸åã ### 2. å ¨ç²¾åº¦åå¨ + 两ä½å°æ°æ¾ç¤ºæ¹é ï¼ä»å¤©ä¸»ä»»å¡ï¼ ### 1.2 å ¶å® **ç¨æ·æä»¤**ï¼ãææçæ°æ®é½å ¨é¨å ¨ç²¾åº¦ä¿çï¼è®¡ç®å¾å°çç»ææ¾ç¤ºä¸¤ä½å°æ°ãã - **å»é¢èå ¥**ï¼`ReportExportService.java` 廿 40 å¤åå ¥åç `round(...)`ââ è´§è¿è§ä¸/è§ä¸/忝ï¼ç´¯è®¡ä¸å½æï¼ã`÷10000` å使¢ç®ï¼ç/å¸ Ã æ/累计åå¤ï¼ã ä¸å£å¾æå/åæåå ¥ãæåé¡µå æ¯ï¼`setFreightShare`ãè´§è¿éæå/å¨è½¬éæååï¼ã éç¨æ°æ®æ ¼ `setDataCell`ãå¹³åè¿è·å åºã客è¿è½¬è¿åå ¥ãæèµè¿åº¦ãç©æµå æ¯ãæèµè®¡åä¸å¨ï¼ `WycSplitCalc.java` å¹³åè¿è·å åºæ¹å ¨ç²¾åº¦å¹¶å é¤å·²æ å¼ç¨çç§æ `round`ã - **å±ç¤ºä½æ°äº¤ç»åå æ ¼æ ¼å¼**ï¼éå `applyTwoDecimalFormat()` ââæ°å¼æ ¼ç»ä¸ `0.00`ï¼ä¿ç `;[Red]\(...\)` çååç¼ï¼ï¼**3 ä½å以ä¸å°æ°çæ ¼å¼**ï¼`0.000_ `ã`0.0000`ï¼ ç¨æ£å `\.0{3,}` æ¶æä¸ºä¸¤ä½ï¼ç¾åæ¯/æ¥æ/ç§å¦è®¡æ°/ææ¬æ ¼å¼ä¸å¨ï¼æ´æ°å¼æ²¿ç¨ã䏿¾ç¤º .00ã约å®ã - æ§å¶å°é¢è§æè¦éç `round` ä¿çï¼ä¸è¿æ¥è¡¨æ°æ®ï¼ã **è¿ç¨ä¸ä¿®æç两个èªä½èªæçå**ï¼å已卿µè¯æ¥åãåãåç°çé®é¢ä¸å¤ç½®ãçè¯ï¼ï¼ 1. ãæ´æ°ä¸æ¾ç¤º .00ãçä¿æ¤å æå ¬å¼æ ¼è·³è¿äºï¼é¦è½®æ¹é å `è´§è¿!EO90/EO93/EO108/EO111` 仿¯ `0.0000`ï¼ç¼åå¼ 0 被å¤ä¸ºæ´æ°ï¼â ææ ¼å¼å½ä¸å¤æ**æå°æ´æ°ä¿æ¤ä¹å**ã 2. æ§å¤æ `f.contains("0.00")` æ `0.000_ ` 误å¤ä¸ºãå·²æ¯ä¸¤ä½å°æ°ãï¼ä¸å£å¾æç» 134 æ ¼æ¼æ¹ â æ¹æ£ååå½é¶ã - éå¯åå端å è½½æ°ä»£ç ï¼å端 `Started TrafficAuditApplication` 10:49:51ï¼ã - é¡ºææ ¸å¯¹ï¼å䏿ãå计è¡è¢«å½é¡¹ç®ãä¿®å¤åï¼å®¢è¿æ¬æå®ææèµç±å«å计è¡ç 2130.1 æ¶æä¸º **2048.1**ï¼ä¸ SQL é项ä¸è´ï¼åºå å·²æ å«ã计ãç伪项ç®è¡ã ## äºãæµè¯ç»ææè¦ è§ãåè½æµè¯æ¥å_å ¨ç²¾åº¦åå¨ä¸ä¸¤ä½å°æ°æ¾ç¤º_2026-09-20.mdãï¼18 æ¡ç¨ä¾ï¼11 æ£å / 4 åå½ / 3 è¾¹ç / 1 è´åæèµ·ï¼éè¿ã ãåè½æµè¯æ¥å_æèµæç»è¡¨å°±ç»ªä¸é¢è§ç±»åè¡¥é½_2026-09-20.mdãï¼**7 æ¡ç¨ä¾éè¿ï¼1 æ¡æªå®æµ**ï¼ç¼ºæ¯çæç¤ºï¼æªä¸´æ¶ç§»å¨ç¨æ·æ¯çæä»¶ï¼ã - ç¼è¯éè¿ï¼22 ä¸ªå¯¼åºæ¥å£åå½ï¼21 个 OKï¼`wycSplit` å 缺 `docs\ç½ç»å®¢è¿` è¾å ¥ç®å½ 500ï¼å±æ¢æé®é¢ï¼ã - æ¹å vs æ¹åãéè·¯è¿è¾éæ±æ»è¡¨ãéæ ¼å¯¹æ¯ 66205 个æ°å¼æ ¼ï¼**ä» 249 æ ¼åå**ï¼æå¤§ 0.00022 ä¸äººå ¬éï¼ ä¸¤ä½å°æ°å£å¾çä¸ä¸è´æ ¼ **0**ï¼éè¯¯å¼æ°é 589 æ ååã - å ³é®å¼ï¼æ¦æ±ç´¯è®¡å¨è½¬é 152330.8912ï¼å ¨ç²¾åº¦ 152330.89119999998ï¼ãåæ 64429.944543113306 ä¸åè¢«æªææ 64429.9445ã - **09-19 éççãå ¨çè¡ 0.0002 ä¸äººå ¬éãå·²æ¶é¤**ï¼å¸å·å ¨ç²¾åº¦åæ¯ç `=SUM(O4:O20)` ä¸æç»æ±åéä½éåï¼å·® 0.0ï¼ã - æ ¼å¼ï¼æå¼æ°å¼/å ¬å¼æ ¼ä¸ 3 ä½ä»¥ä¸å°æ°æ ¼å¼ **108 æ ¼ â 0 æ ¼**ï¼æ±æ»å¤§è¡¨ï¼ã**134 æ ¼ â 0 æ ¼**ï¼ä¸å£å¾æç»ï¼ï¼ 15 个产ç©å计 0 æ ¼ã | æ ¡éªé¡¹ | ç»æ | | --- | --- | | `/api/report/ready`ï¼ä¸¤æ°ç±»åï¼ | ready=trueï¼rows=39 / 128ï¼note 为空 | | `/api/report/preview`ï¼ä¸¤æ°ç±»åï¼ | è¦ç [8]ï¼problems 为空 | | æè¦ vs SQL éé¡¹å¯¹é½ | å®¢è¿ `2048.1 / 38648.16 / 550929.76`ãç©æµ `90185.9 / 704107.7 / 2656354.31`ï¼**ä¸è´** | | åç±»å«è¿æ»¤ | å®¢è¿ 39 + ç©æµ 128 = 167ï¼å ¨ç±»å«ç±»åä» 167ï¼æªä¸²ç±»ï¼ | | 导åºåå½ | ä¸¤å¼ æç»è¡¨ä»å¯å¯¼åºï¼29462 / 134144 åèï¼ | | åææèµç±»ååå½ | investPlan / investBillion / investCounty / investFiveYearLogistics å ready=trueï¼rows=167 | | æªç¥ç±»åè´å | `foo` â ready=falseãnote=æªç¥æ¥è¡¨ç±»åï¼fooï¼å åºä»ææï¼ | ## ä¸ãéçé®é¢ä¸å¾ å 1. **æ¯çæå页 Q/R å æ¯å ¬å¼ä»æ¯ `=ROUND(B/L*10,1)`**ï¼è´§è¿éæå Q4:Q42ãè´§è¿å¨è½¬éæå Q5:Q44ï¼å ± 72 æ ¼ï¼ã ç¨åºä¸è¦åå ¬å¼æ ¼ï¼Excel æå¼ä¼éç®å 1 ä½åæ `0.00` å±ç¤ºãè¥è¦å½»åºå ¨ç²¾åº¦ï¼éæä¸ä¸ªæ¯çæ¹æ `=B/L*10`ï¼R å `=10-Q`ï¼ââ**å¾ ç¨æ·ææ¿**ã 2. ä»å¸¦ 4 ä½å°æ°æ ¼å¼ç 274 æ ¼ä¸ºç©ºå¼/ææ¬æ ¼ï¼æ æ¾ç¤ºå¼ï¼ï¼æ¬æ¬¡ä¸å¨ï¼è¥åç»è¦å¨è¿äºæ ¼å¡«æ°åè¯ä¼°ã 3. `wycSplit` æ¥å£ä¾èµ `docs\ç½ç»å®¢è¿\ç½ç»çº¦è½¦ï¼å ¨çï¼æ±æ».xlsx`ï¼è¯¥ç®å½å½åä¸åå¨ï¼å¯¼åºæ¥ 500ï¼å¾ è¡¥è¾å ¥ã 4. 09-19 çéç项ï¼ç¨æ·è¡¨ O åé«éè¿è·åæ¯æ¥æºã545 å®¶ vs å ¨å£å¾ä¸æ¥éæ©ï¼ä»æªéç¯ã 1. æ¦æ±ç©æµé¡¹ç®æ¸ åå£å¾ï¼å·²ç¡®è®¤å¿½ç¥ï¼ã 2. 天é¨ç©æµæºæä»¶ H/J/K 为空 â å¾ ç¨æ·æ¾åäºè¦æ°æ®åå¯¼å ¥ã 3. èå·/é»ç³ãè§åå /è§åå¤ãæåå£å¾ â å¾ ç¨æ·ååäºç¡®è®¤ã 4. C ç»ï¼åå¸å®¢è¿é¡µç»æå½ä¸ï¼éç¨æ·å å¨ WPS æ´åå é¤ AJ åï¼ï¼D ç»ï¼å¢éæåæªè¾ï¼ï¼B4ï¼å¯¼åºååºæ°ä½æ£ + å¼¹çª + ãæ°æ®ç¼ºå¤±æ¸ åã页ï¼å¾ ææã 5. 缺æ¯çæç¤ºï¼T08ï¼æªå®æµï¼å¯å¨ææµè¯å¯æ¬æ¶è¡¥æµã ## åãæå¤©è®¡å ## åãææ¥è®¡å 1. æç¨æ·åé¦å³å®æ¯å¦è¿æ¯ç Q/R å æ¯å ¬å¼ä¸èµ·å»æ `ROUND(...,1)`ã 2. è¥ç¨æ·æå ¶ä»è¡¨çæ¾ç¤ºä½æ°è¦æ±ï¼æåä¸å¥ãå ¨ç²¾åº¦åå ¥ + æ ¼å¼æ§å¶å±ç¤ºãè§åå¤çã 3. è¡¥é½ `docs\ç½ç»å®¢è¿` è¾å ¥ååå½ `wycSplit` 导åºã --- **æ¬æ¬¡æ¹å¨æä»¶** - `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java` - `traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/WycSplitCalc.java` - ææ¡£ï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_å ¨ç²¾åº¦åå¨ä¸ä¸¤ä½å°æ°æ¾ç¤º_2026-09-20.md`ãæ¬æä»¶ 1. ç天鍿ºæ°æ® / èå·é»ç³å£å¾ç¡®è®¤å补导并å¤éªã 2. æ¨è¿ C/D ç»ä¸ B4ã 3. ä¸ç¨æ·ç¡®è®¤æ¯å¦æ 09-18 å¤é´èµ·çæ¬å°æäº¤ä¸å¹¶æ¨éå°å ¬å¸ giteaï¼ç¨æ· 09-19 æ¾è¦æ±ãä»å¤©å 䏿¨å ¬å¸ãï¼ã traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -226,6 +226,36 @@ } break; } case "investPassengerDetail": case "investLogisticsDetail": { boolean paxDetail = "investPassengerDetail".equals(t); String catName = paxDetail ? "客è¿ç«åº" : "ç©æµååº"; String catLabel = paxDetail ? "客è¿ç«åºæèµææ¥" : "ç©æµååºæèµææ¥"; List<InvestmentProject> catProjects = investProjectMapper.selectList( new LambdaQueryWrapper<InvestmentProject>().eq(InvestmentProject::getCategory, catName)); final List<Long> catIds = new ArrayList<>(); for (InvestmentProject cp : catProjects) catIds.add(cp.getId()); if (catIds.isEmpty()) { rows = 0; notes.add("ç¼ºæ°æ®ï¼" + catLabel); } else { rows = addReadyCount(() -> investMonthlyMapper.selectCount( periodQw(period, mode, InvestmentMonthly::getReportPeriod) .in(InvestmentMonthly::getProjectId, catIds)), catLabel, notes); } String detTpl = paxDetail ? "模æ¿_Xæå®¢è¿ç«æèµæç»è¡¨.xlsx" : "模æ¿_Xæç©æµç«åºæèµæç».xls"; try { if (resolveAnyTemplate(investTemplateDir, detTpl) == null) { rows = 0; notes.add("docs/æèµ/æ¨¡æ¿ ä¸ç¼ºå°ã" + detTpl + "ã"); } } catch (Exception ex) { rows = 0; notes.add("æ¯çå®ä½å¤±è´¥ï¼" + ex.getMessage()); } auditTypes.add("INVEST"); break; } default: rows = 0; notes.add("æªç¥æ¥è¡¨ç±»åï¼" + t); @@ -381,7 +411,9 @@ coverage.addAll(investCover); // æèµä¸ºå½ææ¥è¡¨ï¼æ 1..N 累计å£å¾ï¼ï¼åªæç¤ºå½æç¼ºå¤± if (!investCover.contains(month)) missing.add(month); investPreview(period, mode, summary, problems); if ("investPassengerDetail".equals(t)) investPreview(period, mode, "客è¿ç«åº", summary, problems); else if ("investLogisticsDetail".equals(t)) investPreview(period, mode, "ç©æµååº", summary, problems); else investPreview(period, mode, summary, problems); } else if ("energySummary".equals(t)) { Long ec = energyMapper.selectCount(periodQw(period, mode, EnergyVehicleQuarterly::getReportPeriod)); if (ec != null && ec > 0) coverage.add(month); @@ -412,7 +444,8 @@ } private boolean isInvestType(String t) { return "investPlan".equals(t) || "investFiveYearLogistics".equals(t) || "investBillion".equals(t) || "investCounty".equals(t); return "investPlan".equals(t) || "investFiveYearLogistics".equals(t) || "investBillion".equals(t) || "investCounty".equals(t) || "investPassengerDetail".equals(t) || "investLogisticsDetail".equals(t); } private boolean isEnergyType(String t) { @@ -668,9 +701,23 @@ if (allZero) problems.add("å ¨ç累计å¼å ¨ä¸º 0ï¼å ¬äº¤/åºç§ææ¥å¯è½æªå¯¼å ¥ï¼"); } /** æèµæè¦ï¼é¡¹ç®æ° + æ¬æå®æ/èªå¹´å/èªå¼å§ç´¯è®¡ */ /** æèµæè¦ï¼é¡¹ç®æ° + æ¬æå®æ/èªå¹´å/èªå¼å§ç´¯è®¡ï¼å ¨æèµææ¥å计ï¼ä¸åç±»å«ï¼ */ private void investPreview(String period, String mode, List<Map<String, Object>> summary, List<String> problems) { List<InvestmentMonthly> list = investMonthlyMapper.selectList(periodQw(period, mode, InvestmentMonthly::getReportPeriod)); investPreview(period, mode, null, summary, problems); } /** æèµæè¦ï¼category é空æ¶åªç»è®¡è¯¥ç±»å«ï¼å¦å®¢è¿ç«åº/ç©æµååºæèµæç»è¡¨ï¼ */ private void investPreview(String period, String mode, String category, List<Map<String, Object>> summary, List<String> problems) { LambdaQueryWrapper<InvestmentMonthly> qw = periodQw(period, mode, InvestmentMonthly::getReportPeriod); if (category != null) { List<InvestmentProject> ps = investProjectMapper.selectList( new LambdaQueryWrapper<InvestmentProject>().eq(InvestmentProject::getCategory, category)); List<Long> ids = new ArrayList<>(); for (InvestmentProject p : ps) ids.add(p.getId()); if (ids.isEmpty()) { problems.add("ç¼ºæ°æ®ï¼åºå 没æã" + category + "ã项ç®ä¸»æ¡£"); return; } qw.in(InvestmentMonthly::getProjectId, ids); } List<InvestmentMonthly> list = investMonthlyMapper.selectList(qw); Set<Long> proj = new HashSet<>(); double monthDone = 0.0, yearCum = 0.0, startCum = 0.0; for (InvestmentMonthly m : list) {