From b80bb7253a87931fea5a1a788fc4c6ffb204d245 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期日, 20 九月 2026 10:54:05 +0800
Subject: [PATCH] fix(报表): 补齐客运站/物流站场投资明细表的就绪校验与预览类型

---
 docs/功能测试报告/功能测试报告_投资明细表就绪与预览类型补齐_2026-09-20.md                                                   |   60 +++++++++++++++
 docs/工作日结/工作日结_2026-09-20.md                                                                      |   82 ++++++++------------
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java |   55 ++++++++++++-
 3 files changed, 145 insertions(+), 52 deletions(-)

diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\346\230\216\347\273\206\350\241\250\345\260\261\347\273\252\344\270\216\351\242\204\350\247\210\347\261\273\345\236\213\350\241\245\351\275\220_2026-09-20.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\346\230\216\347\273\206\350\241\250\345\260\261\347\273\252\344\270\216\351\242\204\350\247\210\347\261\273\345\236\213\350\241\245\351\275\220_2026-09-20.md"
new file mode 100644
index 0000000..b9a1b5b
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\346\230\216\347\273\206\350\241\250\345\260\261\347\273\252\344\270\216\351\242\204\350\247\210\347\261\273\345\236\213\350\241\245\351\275\220_2026-09-20.md"
@@ -0,0 +1,60 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫鏄庣粏琛ㄥ氨缁笌棰勮绫诲瀷琛ラ綈_2026-09-20
+
+## 涓�銆佸姛鑳借鏄�
+
+**闂**锛氭姤琛ㄧ敓鎴愰〉闈腑锛屻�屽杩愮珯鎶曡祫鏄庣粏琛ㄣ�嶃�岀墿娴佺珯鍦烘姇璧勬槑缁嗐�嶆樉绀�
+`鏈煡鎶ヨ〃绫诲瀷锛歩nvestPassengerDetail / investLogisticsDetail`锛屾棤娉曢瑙�/瀵煎嚭銆�
+
+**鏍瑰洜**锛氫笉鏄暟鎹棶棰橈紙8 鏈堝杩�/鐗╂祦鎶曡祫鏈堟姤宸插湪搴擄細瀹㈣繍 39 琛屻�佺墿娴� 128 琛岋級銆�
+涓婁竴姝ュ彧鎶婅繖涓や釜绫诲瀷鎺ヨ繘浜�**瀵煎嚭**閾捐矾锛坄exportSelected` switch銆乣REPORT_FILE_NAMES`銆佸墠绔垪琛ㄣ�佷袱涓鍑烘帴鍙o級锛�
+婕忎簡**瀵煎嚭鍓嶇殑灏辩华鏍¢獙涓庨瑙�**閾捐矾锛�
+
+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锛圚TTP 200锛� |
+| 鏁版嵁搴� | MySQL 127.0.0.1:3308 `traffic_audit` |
+| 鎶ヨ〃鏈� | 2026-08锛坢ode=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 | 鍒嗙被鍒繃婊わ紙姝e悜锛� | 涓ゅ紶琛ㄦ槑缁嗘憳瑕� | 涓嶅簲娣峰叆鍙︿竴绫诲埆鏁版嵁 | 瀹㈣繍 39 琛屻�佺墿娴� 128 琛岋紝鎭板ソ绛変簬 39+128=167锛坄investPlan` 绛夊叏绫诲埆绫诲瀷浠嶈繑鍥� 167锛夛紝璇存槑鏄庣粏琛ㄥ凡鎸夌被鍒敹鏁� | 鉁� 閫氳繃 |
+| T05 | 瀵煎嚭鍥炲綊锛堟鍚戯級 | 璋� `/api/report/export/investPassengerDetail`銆乣.../investLogisticsDetail` | 浠嶈兘姝e父鍑鸿〃 | 鐢熸垚 `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=鏈煡鎶ヨ〃绫诲瀷锛歠oo` | 鉁� 閫氳繃 |
+| T08 | 缂烘瘝鐗堟彁绀猴紙璐熷悜路璁捐瑕嗙洊锛� | 绉昏蛋姣嶇増 | 鎻愮ず銆宒ocs/鎶曡祫/妯℃澘 涓嬬己灏戙�娾�︺�嬨�� | 鏈疄娴嬶紙鏈复鏃剁Щ鍔ㄧ敤鎴锋瘝鐗堟枃浠讹級锛涗唬鐮佽矾寰勪笌 `summaryWorkbook` 缂烘瘝鐗堝垽瀹氬悓鏋� | 鈿� 鏈墽琛� |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+| 缂栧彿 | 闂 | 鏍瑰洜 | 澶勭疆 |
+| --- | --- | --- | --- |
+| P01 | 涓ゅ紶鎶曡祫鏄庣粏琛ㄥ湪鎶ヨ〃鐢熸垚椤垫樉绀恒�屾湭鐭ユ姤琛ㄧ被鍨嬶細invest*Detail銆� | 鍙帴浜嗗鍑洪摼璺紝婕忎簡灏辩华鏍¢獙 `switch` 涓� `isInvestType` | 琛ラ綈 `checkExportReady` 涓や釜 case + `isInvestType` 鏀跺綍锛岃涓� |
+| P02 | 鏄庣粏琛ㄦ憳瑕佽嫢娌跨敤鍘� `investPreview` 浼氭贩鍏ュ彟涓�绫诲埆 | 鍘熸柟娉曞彧鎸夋姤琛ㄦ湡鑱氬悎鍏ㄩ儴鎶曡祫鏈堟姤 | 鏂板甯� `category` 鐨勯噸杞斤紝鎸夌被鍒繃婊ら」鐩� id锛涘師閲嶈浇淇濈暀 |
+| P03 | 銆屽悎銆�銆�銆�璁°�嶈鍏ュ簱浼氳櫄澧炲悎璁★紙鍓嶄竴鏅氫慨澶嶇殑杩炲甫褰卞搷锛� | 婧愯〃鍚堣琛岃褰撴垚椤圭洰 | 宸蹭慨澶嶏紱鏈鏍稿锛氬杩愭湰鏈堝畬鎴愮敱鍚悎璁¤鐨� 2130.1 鏀舵暃涓� **2048.1**锛屼笌 SQL 閫愰」涓�鑷达紝鏃犻仐鐣欏惈銆岃銆嶇殑椤圭洰琛� |
+
+## 浜斻�佺粨璁�
+
+7 鏉$敤渚嬮�氳繃銆�1 鏉★紙缂烘瘝鐗堟彁绀猴級鏈疄娴嬶細
+鎶ヨ〃鐢熸垚椤典袱寮犳姇璧勬槑缁嗚〃鐨勫氨缁�/棰勮宸叉仮澶嶆甯革紝鎽樿鎸夌被鍒繃婊や笖涓庡簱鍐� SQL 閫愰」涓�鑷达紝
+瀵煎嚭涓庡叾瀹冩姇璧勬姤琛ㄧ被鍨嬪潎鏃犲洖褰掞紝鏈煡绫诲瀷鍏滃簳鎷︽埅浠嶇劧鏈夋晥銆�
+姝ゅ墠銆屾湭鐭ユ姤琛ㄧ被鍨嬨�嶇函灞�**浠g爜婕忛厤**锛屼笌 8 鏈堟姇璧勬湀鎶ユ槸鍚﹀鍏ユ棤鍏� 鈥斺�� 鏁版嵁涓�鐩村湪搴擄紙瀹㈣繍 39 / 鐗╂祦 128锛夈��
\ No newline at end of file
diff --git "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md" "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md"
index 72a2f74..7e6963e 100644
--- "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md"
+++ "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-20.md"
@@ -2,63 +2,49 @@
 
 ## 涓�銆佷粖澶╁仛浜嗕粈涔�
 
-### 1. 鍥炵瓟鐢ㄦ埛鏍稿宸紓鐨勭枒闂紙鎵挎帴 09-19锛�
+### 1.1 淇锛氭姤琛ㄧ敓鎴愰〉涓ゅ紶鎶曡祫鏄庣粏琛ㄦ姤銆屾湭鐭ユ姤琛ㄧ被鍨嬨��
 
-鐢ㄦ埛鎶婁汉宸ョ畻鐨勪竴鍒楁斁杩涙闈€�婄敓鎴恄閬撹矾杩愯緭閲忔眹鎬昏〃 (1).xlsx銆嬶紝闂樊寮傚師鍥犮��
-鐢ㄦ埛杩介棶銆屾槸涓嶆槸鍙栨暟缁村害涓嶅閫犳垚鐨勨�斺�旂▼搴忕洿鎺ュ姞銆庡煄闄呭煄涔°�忥紝浜哄伐鐢ㄣ�庢�婚噺鈭掑煄甯傚唴銆忋�嶁�斺��
-**鏄殑锛屾鏄繖涓師鍥�**锛屽凡鍦� 09-19 淇骞舵帹閫侊紙闂璁颁簬銆婂姛鑳芥祴璇曟姤鍛奯涓彛寰勬帓鍚嶅懆杞噺鍙e緞缁熶竴_2026-09-19.md銆嬶級銆�
+- **鐜拌薄**锛氭姤琛ㄧ敓鎴愰〉銆屽杩愮珯鎶曡祫鏄庣粏琛ㄣ�嶃�岀墿娴佺珯鍦烘姇璧勬槑缁嗐�嶆樉绀�
+  `鏈煡鎶ヨ〃绫诲瀷锛歩nvestPassengerDetail / 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 鏍兼紡鏀�
-   鈫� 鏀规鍒欏悗褰掗浂銆�
+- 閲嶅惎鍓嶅悗绔姞杞芥柊浠g爜锛堝悗绔� `Started TrafficAuditApplication` 10:49:51锛夈��
+- 椤烘墜鏍稿锛氬墠涓�鏅氥�屽悎璁¤琚綋椤圭洰銆嶄慨澶嶅悗锛屽杩愭湰鏈堝畬鎴愭姇璧勭敱鍚悎璁¤鐨� 2130.1 鏀舵暃涓� **2048.1**锛屼笌 SQL 閫愰」涓�鑷达紱搴撳唴宸叉棤鍚�岃銆嶇殑浼」鐩銆�
 
 ## 浜屻�佹祴璇曠粨鏋滄憳瑕�
 
-瑙併�婂姛鑳芥祴璇曟姤鍛奯鍏ㄧ簿搴﹀瓨鍌ㄤ笌涓や綅灏忔暟鏄剧ず_2026-09-20.md銆嬶細18 鏉$敤渚嬶紙11 姝e悜 / 4 鍥炲綊 / 3 杈圭晫 / 1 璐熷悜鎸傝捣锛夐�氳繃銆�
+銆婂姛鑳芥祴璇曟姤鍛奯鎶曡祫鏄庣粏琛ㄥ氨缁笌棰勮绫诲瀷琛ラ綈_2026-09-20.md銆嬶細**7 鏉$敤渚嬮�氳繃锛�1 鏉℃湭瀹炴祴**锛堢己姣嶇増鎻愮ず锛屾湭涓存椂绉诲姩鐢ㄦ埛姣嶇増鏂囦欢锛夈��
 
-- 缂栬瘧閫氳繃锛�22 涓鍑烘帴鍙e洖褰掞紝21 涓� OK锛坄wycSplit` 鍥犵己 `docs\缃戠粶瀹㈣繍` 杈撳叆鐩綍 500锛屽睘鏃㈡湁闂锛夈��
-- 鏀瑰墠 vs 鏀瑰悗銆婇亾璺繍杈撻噺姹囨�昏〃銆嬮�愭牸瀵规瘮 66205 涓暟鍊兼牸锛�**浠� 249 鏍煎彉鍖�**锛屾渶澶� 0.00022 涓囦汉鍏噷锛�
-  涓や綅灏忔暟鍙e緞鐨勪笉涓�鑷存牸 **0**锛涢敊璇�兼暟閲� 589 鏃犲彉鍖栥��
-- 鍏抽敭鍊硷細姝︽眽绱鍛ㄨ浆閲� 152330.8912锛堝叏绮惧害 152330.89119999998锛夈�佸瓭鎰� 64429.944543113306 涓嶅啀琚埅鏂垚 64429.9445銆�
-- **09-19 閬楃暀鐨勩�屽叏鐪佽 0.0002 涓囦汉鍏噷銆嶅凡娑堥櫎**锛氬競宸炲叏绮惧害鍚庢瘝鐗� `=SUM(O4:O20)` 涓庢槑缁嗘眰鍜岄�愪綅闂悎锛堝樊 0.0锛夈��
-- 鏍煎紡锛氭湁鍊兼暟鍊�/鍏紡鏍间腑 3 浣嶄互涓婂皬鏁版牸寮� **108 鏍� 鈫� 0 鏍�**锛堟眹鎬诲ぇ琛級銆�**134 鏍� 鈫� 0 鏍�**锛堜腑鍙e緞鏄庣粏锛夛紝
-  15 涓骇鐗╁悎璁� 0 鏍笺��
+| 鏍¢獙椤� | 缁撴灉 |
+| --- | --- |
+| `/api/report/ready`锛堜袱鏂扮被鍨嬶級 | ready=true锛宺ows=39 / 128锛宯ote 涓虹┖ |
+| `/api/report/preview`锛堜袱鏂扮被鍨嬶級 | 瑕嗙洊 [8]锛宲roblems 涓虹┖ |
+| 鎽樿 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锛宺ows=167 |
+| 鏈煡绫诲瀷璐熷悜 | `foo` 鈫� ready=false銆乶ote=鏈煡鎶ヨ〃绫诲瀷锛歠oo锛堝厹搴曚粛鏈夋晥锛� |
 
 ## 涓夈�侀仐鐣欓棶棰樹笌寰呭姙
 
-1. **姣嶇増鎺掑悕椤� Q/R 鍗犳瘮鍏紡浠嶆槸 `=ROUND(B/L*10,1)`**锛堣揣杩愰噺鎺掑悕 Q4:Q42銆佽揣杩愬懆杞噺鎺掑悕 Q5:Q44锛屽叡 72 鏍硷級銆�
-   绋嬪簭涓嶈鍐欏叕寮忔牸锛孍xcel 鎵撳紑浼氶噸绠楀洖 1 浣嶅啀鎸� `0.00` 灞曠ず銆傝嫢瑕佸交搴曞叏绮惧害锛岄渶鎶婁笁涓瘝鐗堟敼鎴� `=B/L*10`锛圧 鍒� `=10-Q`锛夆�斺��**寰呯敤鎴锋媿鏉�**銆�
-2. 浠嶅甫 4 浣嶅皬鏁版牸寮忕殑 274 鏍间负绌哄��/鏂囨湰鏍硷紙鏃犳樉绀哄�硷級锛屾湰娆′笉鍔紱鑻ュ悗缁鍦ㄨ繖浜涙牸濉暟鍐嶈瘎浼般��
-3. `wycSplit` 鎺ュ彛渚濊禆 `docs\缃戠粶瀹㈣繍\缃戠粶绾﹁溅锛堝叏鐪侊級姹囨��.xlsx`锛岃鐩綍褰撳墠涓嶅瓨鍦紝瀵煎嚭鎶� 500锛屽緟琛ヨ緭鍏ャ��
-4. 09-19 鐨勯仐鐣欓」锛堢敤鎴疯〃 O 鍒楅珮閫熻繍璺濆悓姣旀潵婧愩��545 瀹� vs 鍏ㄥ彛寰勪笂鎶ラ�夋嫨锛変粛鏈棴鐜��
+1. 姝︽眽鐗╂祦椤圭洰娓呭崟鍙e緞锛堝凡纭蹇界暐锛夈��
+2. 澶╅棬鐗╂祦婧愭枃浠� H/J/K 涓虹┖ 鈫� 寰呯敤鎴锋壘鍚屼簨瑕佹暟鎹悗瀵煎叆銆�
+3. 鑽嗗窞/榛勭煶銆岃鍒掑唴/瑙勫垝澶栥�嶆媶鍒嗗彛寰� 鈫� 寰呯敤鎴峰悜鍚屼簨纭銆�
+4. C 缁勶紙鍩庡競瀹㈣繍椤电粨鏋勫綊涓�锛岄渶鐢ㄦ埛鍏堝湪 WPS 鏁村垪鍒犻櫎 AJ 鍒楋級锛廌 缁勶紙澧為�熸帓鍚嶆帾杈烇級锛廈4锛堝鍑哄墠鍩烘暟浣撴 + 寮圭獥 + 銆婃暟鎹己澶辨竻鍗曘�嬮〉锛夊緟鎺掓湡銆�
+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. 绛夊ぉ闂ㄦ簮鏁版嵁 / 鑽嗗窞榛勭煶鍙e緞纭鍚庤ˉ瀵煎苟澶嶉獙銆�
+2. 鎺ㄨ繘 C/D 缁勪笌 B4銆�
+3. 涓庣敤鎴风‘璁ゆ槸鍚︽妸 09-18 澶滈棿璧风殑鏈湴鎻愪氦涓�骞舵帹閫佸埌鍏徃 gitea锛堢敤鎴� 09-19 鏇捐姹傘�屼粖澶╁厛涓嶆帹鍏徃銆嶏級銆�
\ No newline at end of file
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 b83bd0b..03e2803 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
@@ -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 绱鍙e緞锛夛紝鍙彁绀哄綋鏈堢己澶�
                 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);
+    }
+
+    /** 鎶曡祫鎽樿锛坈ategory 闈炵┖鏃跺彧缁熻璇ョ被鍒紝濡傚杩愮珯鍦�/鐗╂祦鍥尯鎶曡祫鏄庣粏琛級 */
+    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) {

--
Gitblit v1.9.1