From 6b0ae27047f9eefec969f6620490a46d958fb43c Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期四, 03 九月 2026 17:36:54 +0800
Subject: [PATCH] feat: 网约车拆分表与道路运输量汇总整本生成、全表两小数显示 + 09-03 测试文档与空母版

---
 traffic-audit-web/src/views/ReportExport.vue                                                            |    4 
 docs/工作日结/工作日结_2026-09-03.md                                                                            |   39 ++
 docs/生成汇总大表/2026年7月道路运输量汇总表_7月清空测试版v2.xlsx                                                              |    0 
 traffic-audit-web/src/views/DataImport.vue                                                              |   10 
 docs/功能测试报告/功能测试报告_汇总工作簿骨架生成_2026-09-03.md                                                              |   34 ++
 docs/功能测试报告/功能测试报告_城市客运新增网约车拆分表与汇总工作簿及两位小数显示_2026-09-03.md                                              |   35 ++
 docs/生成汇总大表/自动生成汇总工作簿落地方案.md                                                                            |   69 ++++
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java |   16 +
 docs/生成汇总大表/2026年7月道路运输量汇总表_7月清空测试版.xlsx                                                                |    0 
 docs/生成汇总大表/输入输出与逻辑关系总表_2026-09-03.md                                                                   |   34 ++
 docs/待业务用户确认清单_2026-09-02.md                                                                            |   39 ++
 docs/公路旅客/模板_个体客运(2026.7).xlsx                                                                          |    0 
 docs/功能测试报告/功能测试报告_公路旅客报表并入个体客运_2026-09-03.md                                                           |   33 ++
 docs/城市客运/网约车订单及全省总量.xlsx                                                                               |    0 
 docs/报表生成_关系逻辑与每日进度总表_2026-09-03.xlsx                                                                   |    0 
 docs/生成汇总大表/页签逻辑关系说明.md                                                                                 |   79 +++++
 AGENTS.md                                                                                               |    4 
 traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java       |  465 ++++++++++++++++++++++++++++++
 docs/生成汇总大表/2026年7月道路运输量汇总表.xlsx                                                                        |    0 
 19 files changed, 849 insertions(+), 12 deletions(-)

diff --git a/AGENTS.md b/AGENTS.md
index 020d876..346cdb2 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -43,3 +43,7 @@
    - 鍐欏叆 `docs/宸ヤ綔鏃ョ粨/`锛屽懡鍚嶏細`宸ヤ綔鏃ョ粨_<YYYY-MM-DD>.md`銆�
    - 鍐呭鑷冲皯鍖呭惈锛氫粖澶╁仛浜嗕粈涔堬紙鍔熻兘/淇锛夈�佹祴璇曠粨鏋滄憳瑕併�侀仐鐣欓棶棰樹笌寰呭姙銆佹槑澶╄鍒掋��
    - 褰撳ぉ娌℃湁浠g爜/娴嬭瘯宸ヤ綔鏃讹紝涔熻鍐欙紙涓�鍙ヨ瘽璇存槑鈥滀粖鏃ユ棤浠g爜鏀瑰姩鈥濆嵆鍙級銆�
+3. **git 宸ヤ綔娴侊紙2026-09-03 鐢ㄦ埛鎺堟潈锛屾棤闇�鍐嶈闂槸鍚︽帹閫侊級**
+   - 姣忔淇敼浠g爜/鏂囨。鍚庯細鍏堟祴璇曞苟鍐欍�婂姛鑳芥祴璇曟姤鍛娿��/鏇存柊銆婂伐浣滄棩缁撱�嬶紝鍐� `git fetch gitea` 涓庤繙绔� `main` 瀵规瘮鍚堝苟锛堝繀瑕佹椂瑙e喅鍐茬獊锛夛紝纭鏃犺鍚� commit 骞� push 鍒板叕鍙� gitea锛坄http://61.183.254.94:3000/r/trafficAudit.git`锛岃处鍙� zyj锛夈��
+   - 鑻ヨ繙绔凡鏈夊悓浜嬫柊鎻愪氦锛氬繀椤诲厛鍚堝苟/鍩轰簬鏈�鏂板啀鎺紝绂佹寮烘帹瑕嗙洊鍚屼簨浠g爜銆�
+   - 鍏徃 git 璐﹀彿瀵嗙爜鍙�氳繃鏈満 git 鍑嵁/涓存椂 askpass 浣跨敤锛岀姝㈠啓杩涗粨搴撳唴浠讳綍鏂囨。鎴栨彁浜ゅ唴瀹广��
diff --git "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\270\252\344\275\223\345\256\242\350\277\220\357\274\2102026.7\357\274\211.xlsx" "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\270\252\344\275\223\345\256\242\350\277\220\357\274\2102026.7\357\274\211.xlsx"
new file mode 100644
index 0000000..aed4dd3
--- /dev/null
+++ "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\270\252\344\275\223\345\256\242\350\277\220\357\274\2102026.7\357\274\211.xlsx"
Binary files differ
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_\345\205\254\350\267\257\346\227\205\345\256\242\346\212\245\350\241\250\345\271\266\345\205\245\344\270\252\344\275\223\345\256\242\350\277\220_2026-09-03.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_\345\205\254\350\267\257\346\227\205\345\256\242\346\212\245\350\241\250\345\271\266\345\205\245\344\270\252\344\275\223\345\256\242\350\277\220_2026-09-03.md"
new file mode 100644
index 0000000..3e46471
--- /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_\345\205\254\350\267\257\346\227\205\345\256\242\346\212\245\350\241\250\345\271\266\345\205\245\344\270\252\344\275\223\345\256\242\350\277\220_2026-09-03.md"
@@ -0,0 +1,33 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氬叕璺梾瀹㈡姤琛ㄥ苟鍏ヤ釜浣撳杩愶紙2026-09-03锛�
+
+## 鍔熻兘璇存槑
+鎸� 2026-09-03 涓氬姟鍙e緞纭锛堛�婂緟涓氬姟鐢ㄦ埛纭娓呭崟銆�#1/#2/#3锛夛細
+- 鍒嗗競宸炶〃銆婄敓鎴恄鍏矾鏃呭鍒嗗競宸炪�嬪杩愰噺/鍛ㄨ浆閲� 鎬昏 = 浼佷笟(H2031) + 涓綋锛屽叾涓釜浣撹淇濈暀銆佸彧鏄剧ず涓綋锛�
+- 涓彛寰� 鏄庣粏/鎺掑悕/鍒嗘瀽 涓夎〃鐨� 鎬婚噺琛屻�佸叕璺彮绾胯 瀹㈣繍閲�/鍛ㄨ浆閲� 鍚屾牱骞跺叆涓綋锛堝悓姣斿悓鍙e緞锛屾棤鍘诲勾鏁版嵁鐣欑┖锛夛紱
+- 瀛濇劅涓綋搴撳唴 2 琛岋紝鎶ヨ〃灞傛寜甯傚窞鍚堝苟涓� 1 琛岋紙涓嶆敼瀵煎叆鍘婚噸锛夈��
+
+浠g爜鏀瑰姩锛歵raffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+- passengerMonthVal锛歮etricIdx 0/1锛堝杩愰噺/鍛ㄨ浆閲忔�昏锛夋敼涓� 浼佷笟+涓綋锛�
+- loadMidClassMap锛氫釜浣撳杩愭暟鎹苟鍏� dim1(鍏矾鐝嚎)/dim0(鎬婚噺)銆�
+
+澶囨敞锛氭湰娆′唬鐮佹湭鎻愪氦銆佹湭鎺ㄩ�併��
+
+## 娴嬭瘯鐜
+- 鍚庣 8090锛坰pring-boot:run锛夛紱鏁版嵁搴� MySQL 127.0.0.1:3308/traffic_audit銆�
+- 鏁版嵁锛�2026-07 H2031 浼佷笟鏈堟姤 771 琛� + 涓綋瀹㈣繍 7 琛岋紙6 甯傚窞锛屽叾涓瓭鎰� 2 琛岋級锛�2026-03 浼佷笟 778 琛岋紱鍩庡競鍏氦鍩庝埂 2026-06/07 鍚� 142 琛屻��
+- 妯℃澘锛歞ocs/鍏矾鏃呭/ 涓� 鐢熸垚_鍏矾鏃呭鍒嗗競宸�.xlsx銆佺敓鎴恄涓彛寰勬槑缁�.xlsx 绛夈��
+- 鏂规硶锛氳皟鐢� /api/report/export/*?period=2026-07 鐢熸垚 4 寮犺〃锛屼笌搴撳唴鎸夊競宸� SQL 鑱氬悎鍊奸�愭牸姣斿锛堝宸� 0.002锛屾牸鍊兼寜 4 浣嶅皬鏁帮級銆�
+
+## 鐢ㄤ緥涓庣粨鏋�
+1. 鍒嗗競宸炶〃 2026-07锛堟鍚戯級锛�18 鍖哄煙锛堝叏鐪�+17 甯傚窞锛墄 瀹㈣繍閲�/鍛ㄨ浆閲�/鍏朵腑涓綋 涓や袱鏍稿锛屽叏閮ㄤ竴鑷淬�傜ず渚嬶細榛勭煶鎬诲杩愰噺 71.2988=70.8(浼佷笟)+0.4988(涓綋)锛涘瓭鎰熸�诲杩愰噺 56.9534=54.7732+2.1802锛堜袱琛屽悎涓�锛夛紱鍏ㄧ渷 1631.2013/113731.3141銆傜粨璁� PASS銆�
+2. 涓彛寰勬槑缁� 2026-07 瀹㈣繍閲忓潡锛堟鍚戯級锛氱彮绾胯=浼佷笟+涓綋銆佸叕浜よ=鍏氦鍩庝埂銆佹�婚噺琛�=鐝嚎+鍏氦锛�1-6 鏈堝垪閫愭牸涓�鑷达紙姝︽眽 3 鏈堢彮绾� 326.996 绛夛級锛�7 鏈堝垪涓烘棦鏈夋墿鍒楃┖鐧介棶棰橈紝瑙侀棶棰� 1銆傜粨璁� PASS锛�<=6 鏈堣寖鍥达級銆�
+3. 涓彛寰勬帓鍚� 2026-07锛堟鍚戯級锛氬叏鐪�+17 甯傚窞 绱(1-7鏈�)/褰撴湀 瀹㈣繍閲忋�佸懆杞噺鍏� 4 鍒� x 18 琛屾牳瀵逛竴鑷达紙濡傚叏鐪佺疮璁� 6170.906/286093.3504銆佸綋鏈� 3097.8613/141613.7241锛屽潎鍚釜浣擄級銆傜粨璁� PASS銆�
+4. 涓彛寰勫垎鏋� 2026-07锛堟鍚戯級锛氬叏鐪� 绱/褰撴湀 鎬�/鐝嚎/鍏氦 瀹㈣繍閲忋�佸懆杞噺鍙婂崰姣斿叕寮忔牳瀵逛竴鑷达紙鐝嚎绱 3186.726/228737.9404銆佸綋鏈� 1631.2013/113731.3141 鍚釜浣擄級銆傜粨璁� PASS銆�
+5. 鍥炲綊锛歱assengerSeries 2026-07 鎵撳寘鎺ュ彛 200锛沺assengerCityDetail 2026-06锛堟棤涓綋鏈堜唤锛夋甯哥敓鎴愭棤鎶ラ敊銆傜粨璁� PASS銆�
+
+## 鍙戠幇鐨勯棶棰樹笌澶勭疆
+1. 涓彛寰勬槑缁� 2026-07 鑷� 12 鏈堝崟鍏冩牸涓庣疮璁″垪涓嶅惈 >6 鏈堟暟鎹細妯℃澘鎵╁垪鍚庢柊鍒楁棤鍏紡锛屽鍑洪�昏緫鍙~鍏呭凡鏈夊叕寮忓崟鍏冩牸銆傚睘鏃㈡湁闂锛堜笌鏈涓綋骞跺叆鏀瑰姩鏃犲叧锛夛紝宸插湪娓呭崟钀界洏锛屽彟绔嬩换鍔′慨澶� extendMonthlyColumns 涓庢槑缁嗗~鍏呫��
+2. 鍒嗗競宸炴ā鏉跨鍐滄灦鍖哄煙 A 鍒楃畝鍐欎负 鏋楀尯锛屾瘮瀵硅剼鏈寜鍒悕鏄犲皠鍚庝竴鑷达紝闈炴暟鎹棶棰樸��
+
+## 缁撹
+涓綋骞跺叆鍙e緞鎸変笟鍔$‘璁ゅ疄鐜帮細鍒嗗競宸炪�佷腑鍙e緞鏄庣粏/鎺掑悕/鍒嗘瀽 4 寮犳姤琛ㄦ暟鍊间笌鏁版嵁搴撹仛鍚堜竴鑷达紝鏃犻潤榛橀敊浣嶏紝鍔熻兘閫氳繃銆備唬鐮佹湭鎻愪氦鏈帹閫侊紝寰呯敤鎴风‘璁ゅ悗鎻愪氦銆�
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_\345\237\216\345\270\202\345\256\242\350\277\220\346\226\260\345\242\236\347\275\221\347\272\246\350\275\246\346\213\206\345\210\206\350\241\250\344\270\216\346\261\207\346\200\273\345\267\245\344\275\234\347\260\277\345\217\212\344\270\244\344\275\215\345\260\217\346\225\260\346\230\276\347\244\272_2026-09-03.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_\345\237\216\345\270\202\345\256\242\350\277\220\346\226\260\345\242\236\347\275\221\347\272\246\350\275\246\346\213\206\345\210\206\350\241\250\344\270\216\346\261\207\346\200\273\345\267\245\344\275\234\347\260\277\345\217\212\344\270\244\344\275\215\345\260\217\346\225\260\346\230\276\347\244\272_2026-09-03.md"
new file mode 100644
index 0000000..7e73423
--- /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_\345\237\216\345\270\202\345\256\242\350\277\220\346\226\260\345\242\236\347\275\221\347\272\246\350\275\246\346\213\206\345\210\206\350\241\250\344\270\216\346\261\207\346\200\273\345\267\245\344\275\234\347\260\277\345\217\212\344\270\244\344\275\215\345\260\217\346\225\260\346\230\276\347\244\272_2026-09-03.md"
@@ -0,0 +1,35 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氬煄甯傚杩愭姤琛ㄦ柊澧炪�婄綉绾﹁溅瀹㈣繍閲忔媶鍒嗚〃銆嬨�婇亾璺繍杈撻噺姹囨�昏〃銆嬩笌鏁板�间袱浣嶅皬鏁版樉绀猴紙2026-09-03锛�
+
+## 鍔熻兘璇存槑
+鎸� 2026-09-03 纭鐨勪笅涓�姝ラ渶姹傝惤鍦颁笁浠朵簨锛�
+1. 鎶ヨ〃鐢熸垚-鍩庡競瀹㈣繍鎶ヨ〃 鍒楄〃鏂板涓ら」锛歚缃戠害杞﹀杩愰噺鎷嗗垎琛╜锛坘ey=wycSplit锛夈�乣閬撹矾杩愯緭閲忔眹鎬昏〃锛堟暣鏈級`锛坘ey=summaryWorkbook锛夛紱鍗曢�夊鍑鸿蛋 `/api/report/export/{key}`锛屽閫夋墦鍖呰蛋 `/api/report/export/selected`锛屽垪琛ㄢ�滄暟鎹氨缁�濈姸鎬佺敱 `/api/report/ready` 缁熶竴璁$畻锛堝凡鎺ュ叆锛夈��
+2. 缃戠害杞︽媶鍒嗙畻娉曚笌銆婄綉绾﹁溅鎷嗗垎.xlsx銆嬫湀椤典汉宸ュ彛寰勪竴鑷达細瀹㈣繍閲�=璁㈠崟鍗犳瘮脳鍏ㄧ渷缃戠害杞﹀杩愰噺 pin锛涘煄甯傚唴=宸℃父鍑虹鍩庡競鍐呭崰姣斾唬鐞嗭紝姝︽眽淇濇寔鑷韩銆佸叾浣欐寜鍓╀綑鍗犳瘮鍒嗘憡鑷冲叏鐪佸煄甯傚唴 pin锛涘煄闄呭煄涔�=鎬婚噺鈭掑煄甯傚唴锛涘懆杞噺=瀹㈣繍閲徝楀贰娓稿嚭绉熷钩鍧囪繍璺濆崰姣斿垎鎽婂叏鐪佸懆杞噺 pin锛堝煄甯傚唴鍚屾硶锛夈�傝緭鍏�=銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆�2026-07 琛岋紙B-E 鍏ㄧ渷 pin銆丟-W 17 甯傚窞璁㈠崟锛�+ 绯荤粺宸℃父鍑虹鏈堟姤锛坈ity_taxi_monthly锛屽惈骞冲潎杩愯窛锛夈��
+3. 鎵�鏈夌敓鎴愯〃鏁板�尖�滄樉绀轰袱浣嶅皬鏁般�佷繚鐣欏叏绮惧害鈥濓細`toBytes(XSSFWorkbook)`/`toBytesHssf(HSSFWorkbook)` 鍑哄彛缁熶竴鎵ц `applyTwoDecimalFormat`鈥斺�旈潪鏁存暟鐨� General/0/0.0/#,##0 绛夌函鏁板�兼牸寮忔敼涓� `0.00` 鏄剧ず锛屽瓨鍌ㄥ�间笉鍔紱鏁存暟銆佺櫨鍒嗘瘮銆佹棩鏈熴�佺瀛﹁鏁般�佸凡鍚� `0.00` 鐨勬牱寮忎竴寰嬩笉鏀瑰彉銆�
+
+浠g爜鏀瑰姩锛堟湭鎻愪氦銆佹湭鎺ㄩ�侊級锛歊eportExportService.java锛堟柊澧� exportSummaryWorkbook/exportWycSplit/resolveSummaryMother/loadWycMonthlyInput/applyTwoDecimalFormat 鍙� selected/ready 鍒嗘敮锛夈�丷eportExportController.java锛堟柊澧炰袱涓� GET 绔偣锛夈�丷eportExport.vue锛堝煄甯傚杩愭姤琛ㄥ垪琛ㄥ姞涓ら」锛夈�傛湰鏈熷彟淇姣嶇増缂烘湀闈欓粯鍥為��闂锛堣鈥滃彂鐜扮殑闂鈥濈 1 鏉★級銆�
+
+## 娴嬭瘯鐜
+- 鍚庣 8090锛坢vn spring-boot:run锛孲tarted OK 16:32锛夛紱鍓嶇 8080 灏辩华锛汳ySQL 127.0.0.1:3308銆�
+- 浜哄伐鍙e緞鍙傝�冿細docs/鍩庡競瀹㈣繍/缃戠害杞︽媶鍒哶2026骞�7鏈�.xlsx锛堚�滀笌浜哄伐澶ц〃鏍稿鈥濋〉锛夛紱杈撳叆鏂囦欢 docs/鍩庡競瀹㈣繍/缃戠害杞﹁鍗曞強鍏ㄧ渷鎬婚噺.xlsx锛�2026-07 琛岋級銆�
+- 姣嶇増锛歞ocs/鐢熸垚姹囨�诲ぇ琛�/2026骞�7鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx锛�19 椤电锛�4 闅愯棌椤碉級銆�
+- 鏂规硶锛欻TTP 璋冪敤鎺ュ彛涓嬭浇浜х墿锛宱penpyxl 閫愭牸姣斿銆�
+
+## 鐢ㄤ緥涓庣粨鏋滐紙杈撳叆 / 棰勬湡 / 瀹為檯 / 缁撹锛�
+1. 姝e悜-鏁版嵁灏辩华锛歸ycSplit銆乻ummaryWorkbook 鏌� 2026-07 ready 鈫� 鍧� ready=true锛坮ows 17/159锛宯ote 绌猴級銆侾ASS銆�
+2. 姝e悜-wycSplit 瀵煎嚭锛欸ET /export/wycSplit?period=2026-07 鈫� 200锛屼骇鐗� 7371B锛屽崟椤� `2026-07鎷嗗垎`锛屽杩愰噺鍧楋紙鍏ㄧ渷+17 甯傚窞锛�+ 鍛ㄨ浆閲忓潡缁撴瀯瀹屾暣銆侾ASS銆�
+3. 姝e悜-鍐呴儴鍕剧ń锛氬叏鐪佽璁㈠崟/瀹㈣繍閲�/宸℃父閲�/鍩庡競鍐�/鍩庨檯鍩庝埂涓� 17 甯傚窞姹傚拰涓�鑷� 13 椤广�佸悇甯傚窞 鍩庨檯鍩庝埂=鎬婚噺鈭掑煄甯傚唴銆佽緭鍏� pin锛�4852.3/4430.84/28348.02/22705.61/璁㈠崟 29730791锛夐�愰」鍛戒腑銆侾ASS銆�
+4. 姝e悜-涓庝汉宸ュ彛寰勪竴鑷达細17 甯傚窞鍥涙寚鏍囷紙瀹㈣繍閲忋�佸煄甯傚唴瀹㈣繍閲忋�佸懆杞噺銆佸煄甯傚唴鍛ㄨ浆閲忥級閫愬競宸炰笌鈥滀笌浜哄伐澶ц〃鏍稿鈥濇瘮杈冿紝鏈�澶х粷瀵瑰亸宸� 0.00000000锛堥槇鍊� 0.02锛夈�侾ASS銆�
+5. 姝e悜-涓や綅灏忔暟/鍏ㄧ簿搴︼細浜х墿 185 涓潪鏁存暟鏁板�兼牸 number_format 鍏ㄩ儴涓� `0.00`锛涘瓨鍌ㄥ�间繚鐣欏叏绮惧害锛堝 1825.1975355818822銆�0.9131422212146817锛夛紱璁㈠崟绛夋暣鏁板�间繚鎸� General 涓嶅嚭鐜� `.00`銆侾ASS銆�
+6. 姝e悜-summaryWorkbook 瀵煎嚭锛欸ET /export/summaryWorkbook?period=2026-07 鈫� 200锛屼骇鐗� 1,269,456B锛�19 椤电鍚嶇О/椤哄簭/闅愯棌鐘舵�佷笌姣嶇増涓�鑷达紱鍏ㄧ翱鍗曞厓鏍煎�� 0 宸紓锛涗粎 10,588 澶勬樉绀烘牸寮忕敱 General 璋冩暣涓� `0.00`锛堟瘝鐗堢紦瀛樺皬鏁帮紝鍊间笉鍙橈級銆侾ASS銆�
+7. 姝e悜-鎵归噺鎵撳寘锛�/export/selected?types=wycSplit,summaryWorkbook 鈫� zip 1,206,867B 鍚袱涓枃浠躲�侾ASS銆�
+8. 璐熷悜-wycSplit 缂鸿緭鍏ワ細2026-08锛堣緭鍏ヨ〃璇ヨ鏈淮鎶わ級鈫� HTTP500锛宮essage鈥滅綉绾﹁溅杈撳叆 2026-08 琛屼笉瀹屾暣锛氬叏鐪� pin / 璁㈠崟缂哄け锛岃鏍稿銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬧�濓紝ready=false 骞堕檮缂烘暟鎹鏄庛�侾ASS锛堥鏈熷け璐ャ�佹彁绀烘槑纭級銆�
+9. 璐熷悜-summaryWorkbook 缂烘瘝鐗堬細2026-08锛坉ocs/鐢熸垚姹囨�诲ぇ琛� 鏃� 8 鏈堟瘝鐗堬級鈫� HTTP500鈥滄湭鎵惧埌妯℃澘鏂囦欢: 2026骞�8鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx鈥濓紝ready=false銆侾ASS锛堥鏈熷け璐ャ�佹彁绀烘槑纭紝淇鍚庨獙璇侊級銆�
+10. 缂栬瘧鍥炲綊锛歮vn compile EXIT=0锛涘悗绔噸鍚棤寮傚父銆侾ASS銆�
+
+## 鍙戠幇鐨勯棶棰樹笌澶勭疆
+1. 淇锛歴ummaryWorkbook 姣嶇増瀹氫綅鍘熷甫鈥溾墹鐩爣鏈熸渶鏂版瘝鐗堝洖閫�鈥濓紝瀵艰嚧 2026-08 璇锋眰闈欓粯浣跨敤 7 鏈堟瘝鐗堢敓鎴愩�佹枃浠跺悕涓� 2026-08 鑰屽唴瀹逛粛涓� 2026 骞� 7 鏈堬紙璺ㄥ勾鍦烘櫙杩樹細鍙崲骞翠唤涓嶆崲鏈堜唤锛夛紝灞炶瀵兼�ц緭鍑恒�傚凡鍒犻櫎鍥為��閫昏緫锛屾敼涓轰粎绮剧‘鍖归厤 `{骞磢骞磠鏈坿鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`锛岀己澶卞嵆鏄庣‘鎶ラ敊锛涙湀浠芥墿灞曡鍒欑暀寰� P0 姣嶇増瀹氱銆�
+2. 瑙傚療椤癸紙涓庢湰娆℃敼鍔ㄦ棤鍏筹級锛歝ityTaxiDetail 瀵煎嚭浠� 500鈥滄湭鎵惧埌妯℃澘鏂囦欢: 鐢熸垚_宸℃父鍑虹瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx鈥濓紝docs/鍩庡競瀹㈣繍 涓嬭杈撳嚭妯℃澘鏂囦欢褰撳墠缂哄け锛屽彟绔嬩换鍔¤窡杩涜ˉ榻愭柊鐗堝紡妯℃澘銆�
+3. 浣跨敤璇存槑锛氱綉绾﹁溅鎷嗗垎姣忔湀闇�鍦ㄣ�婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬭ˉ涓�琛屽綋鏈堟暟鎹紙B-E 鍏ㄧ渷 pin銆丟-W 17 甯傚窞璁㈠崟銆丗 鍚堣锛夛紝ready 鐘舵�佷細鎻愮ず缂哄け锛屼笉浼氶潤榛樼┖璺戙��
+
+## 缁撹
+涓や釜鏂板垪琛ㄩ�夐」涓庘�滀袱浣嶅皬鏁版樉绀恒�佸叏绮惧害瀛樺偍鈥濇寜鍙e緞瀹炵幇骞堕�氳繃姝e悜/璐熷悜鍥炲綊锛涚綉绾﹁溅鎷嗗垎 2026-07 涓庝汉宸ュ彛寰勫ぇ琛ㄥ畬鍏ㄤ竴鑷达紙鏈�澶у亸宸� 0锛夛紱姹囨�诲伐浣滅翱楠ㄦ灦涓庢瘝鐗堥浂鍊煎樊寮傦紱缂烘湀/缂鸿緭鍏ュ潎鏄庣‘鎶ラ敊涓嶉潤榛樸�備唬鐮佹湭鎻愪氦鏈帹閫併��
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\261\207\346\200\273\345\267\245\344\275\234\347\260\277\351\252\250\346\236\266\347\224\237\346\210\220_2026-09-03.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\261\207\346\200\273\345\267\245\344\275\234\347\260\277\351\252\250\346\236\266\347\224\237\346\210\220_2026-09-03.md"
new file mode 100644
index 0000000..5713918
--- /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\261\207\346\200\273\345\267\245\344\275\234\347\260\277\351\252\250\346\236\266\347\224\237\346\210\220_2026-09-03.md"
@@ -0,0 +1,34 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氭眹鎬诲伐浣滅翱楠ㄦ灦鐢熸垚锛圥0-P1锛夛紙2026-09-03锛�
+
+## 鍔熻兘璇存槑
+鎸� 2026-09-03 鍙e緞纭锛堛�婅嚜鍔ㄧ敓鎴愭眹鎬诲伐浣滅翱钀藉湴鏂规銆媣0.1锛歚#REF!` 浠ュ悗澶勭悊锛�2025 骞村垪鏆傛椂淇濈暀姣嶇増缂撳瓨鍊硷紱鍏堣瘯 P0-P1 楠ㄦ灦锛夛紝鏂板姹囨�诲伐浣滅翱鐢熸垚鎺ュ彛锛�
+- 鍚庣浠� `docs/鐢熸垚姹囨�诲ぇ琛�/` 瀹氫綅姣嶇増銆奩YYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬪苟鏁存湰澶嶅埗锛屼繚鐣欏叏閮� 19 涓〉绛俱�佺増寮忋�佸叕寮忎笌 2025/2024 鍙傝�冨垪缂撳瓨鍊硷紱
+- 浠呭綋鐩爣骞� 鈮� 2026 鏃讹紝灏嗗崟鍏冩牸鏂囨湰涓殑 `2026骞碻 鍓嶇紑鏇挎崲涓虹洰鏍囧勾锛堝 2027骞达級锛�2025/2024 瀛楁牱涓庨〉绛惧悕涓嶅姩锛涚洰鏍囧勾涓� 2026 鏃朵笉鍋氫换浣曟浛鎹紙涓庢瘝鐗堜竴鑷达級锛�
+- 鏁版嵁濉厖锛堝彴璐︹啋鍙e緞鍚堟垚鈫掓垚鍝侊級鎸夋柟妗� P2 璧烽�愭鎺ュ叆锛屾湰鏈熶粎楠岃瘉楠ㄦ灦鍙敓鎴愩�佹棤鎹熷潖銆�
+
+浠g爜鏀瑰姩锛堟湭鎻愪氦銆佹湭鎺ㄩ�侊級锛�
+- traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+  - 鏂板 `summary.template-dir` 閰嶇疆椤癸紙榛樿 `docs/鐢熸垚姹囨�诲ぇ琛╜锛夛紱
+  - 鏂板 `exportSummaryWorkbook(period, mode)` 涓� `dynamicSummaryYear(wb, year)`锛�
+  - `selectedReportData` 澧炲姞 `summaryWorkbook` 鍒嗘敮锛沗REPORT_FILE_NAMES` 澧炲姞 `summaryWorkbook`銆�
+- traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
+  - 鏂板 `GET /api/report/export/summaryWorkbook?period=鈥�&mode=month`銆�
+
+## 娴嬭瘯鐜
+- 鍚庣 8090锛坰tart-dev.ps1 鍚姩锛屽氨缁棩蹇� OK锛夛紱MySQL 127.0.0.1:3308銆�
+- 姣嶇増锛歞ocs/鐢熸垚姹囨�诲ぇ琛�/2026骞�7鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx锛�19 椤电锛岄殣钘� 4 椤碉細鍏矾鎬诲杩愩��2025骞村煄甯傚杩愰噺銆佷腑鍙e緞瀹㈣繍閲忋�佷腑鍙e緞璁$畻杩囩▼锛夈��
+- 鏂规硶锛氳皟鐢ㄦ帴鍙d笅杞界敓鎴愭枃浠讹紝openpyxl 涓庢瘝鐗堥�愰」姣斿锛堥〉绛炬竻鍗�/椤哄簭/闅愯棌鐘舵��/骞翠唤鏂囨湰璁℃暟/鍓嶄笁琛岀増寮忥級銆�
+
+## 鐢ㄤ緥涓庣粨鏋�
+1. 2026-07 楠ㄦ灦鐢熸垚锛堟鍚戯級锛氭帴鍙� 200锛屼骇鐗� 1.23MB锛涢〉绛� 19 涓笖椤哄簭涓庢瘝鐗堜竴鑷达紱4 涓殣钘忛〉淇濇寔 hidden銆傜粨璁� PASS銆�
+2. 鐗堝紡淇濈暀锛堟鍚戯級锛�19 椤靛墠涓夎鍗曞厓鏍煎瓧绗︿覆涓庢瘝鐗� 0 宸紓锛堝惈琛ㄥご骞翠唤 2026骞达級锛涙棤椤电琚敼鍚�/澧炲垹銆傜粨璁� PASS銆�
+3. 骞翠唤鏂囨湰鏈璇浛鎹紙姝e悜锛夛細鍏ㄨ〃缁熻 `2025骞碻146 澶勩�乣2024骞碻160 澶勩�乣2026骞碻59 澶勶紝鐢熸垚鏂囦欢涓庢瘝鐗堝畬鍏ㄤ竴鑷达紙鐩爣骞�=2026 鏃朵笉鍋氭浛鎹級銆傜粨璁� PASS銆�
+4. 缂哄け鏈堜唤璐熷悜锛歱eriod=2026-08 璇锋眰杩斿洖 500锛屽悗绔棩蹇楁姤 `鏈壘鍒版ā鏉挎枃浠�: 2026骞�8鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`锛岀鍚堥鏈燂紙姣嶇増浠� 7 鏈堬級銆傜粨璁� PASS锛堥鏈熷け璐ワ級銆�
+5. 缂栬瘧鍥炲綊锛氭敼鍔ㄥ悗 mvn 缂栬瘧 EXIT=0锛坈ompile2.log锛夛紱鍚庣鍚姩鏃犲紓甯搞�傜粨璁� PASS銆�
+
+## 鍙戠幇鐨勯棶棰樹笌澶勭疆
+1. 鍔ㄦ�佸勾浠芥浛鎹紙濡� 2027 骞达級閫昏緫浠呭仛浜嗕唬鐮佽蛋鏌� + 2026 鎭掔瓑楠岃瘉锛屾湭绔埌绔疄娴嬶紙姣嶇増鍙湁 2026 骞� 7 鏈堛�佺洰褰曚腑鏃犲叾瀹冨勾浠芥ā鏉匡紝灞為鏈燂級锛汸2 闃舵琛ヤ竴涓复鏃� 2027 妯℃澘鍋氭浛鎹㈠洖褰掋��
+2. 鏂规閬楃暀寰呮媿鏉块」锛堣鍒楄竟鐣屻�佹湀浠芥墿灞曘��2024 鍒椼�佽建閬撹疆娓″叆搴撱�佽緭鍑虹洰褰曪級鏈湡涓嶅鐞嗭紝鎺ㄨ繘 P2锛堝彴璐﹂〉鏁版嵁濉厖锛夊墠闇�纭銆�
+
+## 缁撹
+姹囨�诲伐浣滅翱 P0-P1 楠ㄦ灦鎸夊彛寰勫疄鐜板苟閫氳繃楠岃瘉锛氭暣鏈鍒舵瘝鐗堢敓鎴愭垚鍔燂紝椤电/闅愯棌/鐗堝紡/2025-2024 缂撳瓨鍊奸浂鎹熷潖锛涚洰鏍囧勾 2026 鏃朵笌姣嶇増涓�鑷达紱缂哄け鏈堜唤鎸夆�滄湭鎵惧埌妯℃澘鏂囦欢鈥濇槑纭姤閿欙紝鏃犻潤榛橀敊璇�備唬鐮佹湭鎻愪氦鏈帹閫併��
\ No newline at end of file
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\275\221\347\272\246\350\275\246\350\256\242\345\215\225\345\217\212\345\205\250\347\234\201\346\200\273\351\207\217.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\275\221\347\272\246\350\275\246\350\256\242\345\215\225\345\217\212\345\205\250\347\234\201\346\200\273\351\207\217.xlsx"
new file mode 100644
index 0000000..4291040
--- /dev/null
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\275\221\347\272\246\350\275\246\350\256\242\345\215\225\345\217\212\345\205\250\347\234\201\346\200\273\351\207\217.xlsx"
Binary files differ
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-03.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-03.md"
new file mode 100644
index 0000000..dfbc5d4
--- /dev/null
+++ "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-03.md"
@@ -0,0 +1,39 @@
+# 宸ヤ綔鏃ョ粨_2026-09-03
+
+## 浠婂ぉ鍋氫簡浠�涔�
+1. 鍏矾鏃呭鈥滀釜浣撳苟鍏モ�濆彛寰勮惤鍦帮紙鍒嗗競宸炴�昏=浼佷笟+涓綋锛涗腑鍙e緞鏄庣粏/鎺掑悕/鍒嗘瀽鐨勭彮绾夸笌鎬婚噺骞跺叆涓綋锛涘瓭鎰熷簱鍐� 2 琛屾姤琛ㄥ悎骞� 1 琛岋級锛屽凡娴嬭瘯骞跺嚭鎶ュ憡锛歞ocs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鍏矾鏃呭鎶ヨ〃骞跺叆涓綋瀹㈣繍_2026-09-03.md銆�
+2. 銆�2026骞�7鏈堥亾璺繍杈撻噺姹囨�昏〃銆嬪彛寰勬⒊鐞嗗畬鎴愶細浜у嚭 docs/鐢熸垚姹囨�诲ぇ琛�/椤电閫昏緫鍏崇郴璇存槑.md 涓� 鑷姩鐢熸垚姹囨�诲伐浣滅翱钀藉湴鏂规.md锛坴0.1锛孭0-P7 璁″垝锛夈��
+3. 姹囨�诲伐浣滅翱 P0-P1 楠ㄦ灦瀹炵幇锛堟寜鐢ㄦ埛绛斿锛歚#REF!` 浠ュ悗澶勭悊銆�2025 淇濈暀姣嶇増缂撳瓨鍊笺�佸厛璇曚竴涓嬶級锛氭柊澧� GET /api/report/export/summaryWorkbook锛屾暣鏈鍒舵瘝鐗堛�佺洰鏍囧勾 2026 鏃堕浂鏀瑰姩锛涘凡缂栬瘧銆佸惎鍔ㄥ苟楠岃瘉閫氳繃锛屾姤鍛婏細docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_姹囨�诲伐浣滅翱楠ㄦ灦鐢熸垚_2026-09-03.md銆�
+4. 鏁版嵁瀵煎叆鐣岄潰鈥滃勾鎶モ�濇暟鎹被鍨嬪叆鍙f敼涓洪殣钘忥紙DataImport.vue锛屽緟鍔炴竻鍗曞凡鍚屾锛夈��
+
+## 娴嬭瘯缁撴灉鎽樿
+- 鍏矾鏃呭骞跺叆涓綋锛�4 寮犳姤琛ㄦ暟鍊间笌搴撳唴 SQL 鑱氬悎閫愭牸涓�鑷达紙瀹瑰樊 0.002锛夛紝PASS锛涗腑鍙e緞鏄庣粏 7-12 鏈堟墿鍒楃┖鐧戒负鏃㈡湁闂锛屽彟绔嬩换鍔°��
+- 姹囨�诲伐浣滅翱楠ㄦ灦锛�19 椤电/闅愯棌椤�/鐗堝紡/2025-2024 缂撳瓨鍊间笌姣嶇増闆跺樊寮傦紱2026-08锛堟棤姣嶇増锛夋姤鈥滄湭鎵惧埌妯℃澘鏂囦欢鈥濓紝绗﹀悎棰勬湡锛涘姩鎬佸勾鏇挎崲寰� P2 琛ユ祴銆�
+
+## 閬楃暀闂涓庡緟鍔�
+- 鎺ㄨ繘 P2锛堝彴璐﹂〉鏁版嵁濉厖锛夊墠闇�鎷嶆澘锛氳鍒楄竟鐣屻�佹湀浠芥墿灞曘��2024 鍒楀鐞嗐�佽建閬撹疆娓℃暟鎹槸鍚﹀叆搴撱�佽緭鍑虹洰褰曘��
+- 绯荤粺寰呭姙锛�#9 瀹㈣繍閲忓悓姣旂幆姣� 0% 瀹℃牳瑙勫垯銆�#16 瀵煎叆瀹炴椂杩涘害鈥滃凡澶勭悊 N/M 琛屸�濄��#5 缃戠害杞︽媶鍒嗗~鍊硷紙绛夋暟鎹簮锛夛紱涓彛寰勬槑缁� 7-12 鏈堝垪濉厖銆�
+
+## 鏄庡ぉ璁″垝
+- 鎸夌敤鎴风‘璁ゆ帹杩涙眹鎬诲伐浣滅翱 P2锛堝厛鍑哄彴璐﹂〉鏁版嵁鏉ユ簮涓庡~鍏呮柟妗堬級锛屽悓姝ユ瘡鏃ュ姛鑳芥祴璇曟姤鍛娿��
+- 09-03 浠g爜涓庢枃妗e潎鏈� commit/push锛堢敤鎴锋湭瑕佹眰锛岀粷涓嶆帹閫侊級銆�
+## 杩藉姞锛堝綋鏃ュ悗缁細璇濓級
+5. 鎶ヨ〃鐢熸垚-鍩庡競瀹㈣繍鎶ヨ〃鍒楄〃鏂板涓ら」锛歚缃戠害杞﹀杩愰噺鎷嗗垎琛╜锛坵ycSplit锛夈�乣閬撹矾杩愯緭閲忔眹鎬昏〃锛堟暣鏈級`锛坰ummaryWorkbook锛夛紝鍗�/澶氶�夊鍑轰笌 ready 鍓嶇疆鍧囨帴鍏ャ��
+6. 鈥滀袱浣嶅皬鏁版樉绀恒�佷繚鐣欏叏绮惧害鈥濊惤鍦帮細xlsx/xls 鍑哄彛缁熶竴 applyTwoDecimalFormat锛堥潪鏁存暟绾暟鍊兼樉绀� 0.00锛屾暣鏁�/%/鏃ユ湡涓嶅姩锛夈��
+7. 淇锛歴ummaryWorkbook 姣嶇増瀹氫綅鍘熷瓨鍦ㄢ�滅己鏈堥潤榛樺洖閫�鈥濓紙2026-08 浼氱敤 7 鏈堟瘝鐗堢敓鎴愯瀵兼枃浠讹級锛屾敼涓轰粎绮剧‘鍖归厤銆佺己姣嶇増鏄庣‘鎶ラ敊銆�
+8. 浜у嚭銆婅緭鍏ヨ緭鍑轰笌閫昏緫鍏崇郴鎬昏〃_2026-09-03.md銆嬶紙鎶ヨ〃鐢熸垚杈撳叆/椤电/杩愮畻姹囨�伙級涓庛�婂姛鑳芥祴璇曟姤鍛奯鍩庡競瀹㈣繍鏂板缃戠害杞︽媶鍒嗚〃涓庢眹鎬诲伐浣滅翱鍙婁袱浣嶅皬鏁版樉绀篲2026-09-03.md銆嬨��
+
+### 杩藉姞娴嬭瘯鎽樿
+- wycSplit 2026-07锛氬唴閮ㄥ嬀绋� 13 椤� PASS锛涗笌浜哄伐鍙e緞澶ц〃鍥涙寚鏍� 17 甯傚窞鏈�澶у亸宸� 0.00000000锛�185 涓潪鏁存暟鏁板�兼牸鍏ㄩ儴 0.00 鏄剧ず涓斿瓨鍌ㄥ叏绮惧害銆�
+- summaryWorkbook 2026-07锛�19 椤电/鍊间笌姣嶇増闆跺樊寮傦紙浠� 10,588 澶勬樉绀烘牸寮� General鈫�0.00锛夛紱2026-08 缂烘瘝鐗堟姤鈥滄湭鎵惧埌妯℃澘鏂囦欢鈥濅笉闈欓粯銆�
+- mvn compile EXIT=0锛涘悗绔凡閲嶅惎骞跺湪 8090 杩愯锛涜瀵熼」 cityTaxiDetail 妯℃澘缂哄け 500 涓庢湰娆℃敼鍔ㄦ棤鍏筹紝鍙︾珛浠诲姟銆�
+
+### 杩藉姞2锛�16:40-17:10 浼氳瘽锛�
+9. 鎭㈠宸ヤ綔鍖鸿璇垹鐨� 13 涓姤琛ㄨ緭鍑烘ā鏉匡紙docs/鍏矾鏃呭銆乨ocs/鍩庡競瀹㈣繍銆乨ocs/璐ц繍 涓嬬殑鐢熸垚_*.xlsx锛屼粠鐗堟湰搴撴仮澶嶏級锛歝ityTaxiDetail 绛夊煄甯傚杩愬鍑烘仮澶� 200锛屼笉鍐� 500锛沜ityTaxiDetail 132 涓皬鏁版牸鍏ㄩ儴 0.00 鏄剧ず銆�
+10. 鍙e緞鏍稿疄骞舵洿姝o細鍑虹/缃戠害杞︹�滃叏閲忊墵鍩庡競鍐呪�濓紙姝︽眽闄ゅ锛夈��2026-07 鍑虹鍏ㄧ渷 5860.24/鍩庡競鍐� 5351.24锛堝煄涔″樊 509.00锛夛紱缃戠害杞︽媶鍒� 4852.30/4430.84锛堝煄涔″樊 421.46锛夈�傛瘝鐗堝嚭绉�/缃戠害杞﹂〉鏈韩鍚�婚噺琛�+鍏朵腑鍩庡競鍐呰锛涘煄甯傚杩愬彛寰勭敤鍚勯〉鈥滃叾涓煄甯傚唴鈥濊銆傚凡鍚屾淇銆婇〉绛鹃�昏緫鍏崇郴璇存槑.md銆嬩笌銆婅緭鍏ヨ緭鍑轰笌閫昏緫鍏崇郴鎬昏〃_2026-09-03.md銆嬨��
+11. 钀藉湴鈥滃敮涓�鎬昏〃鈥濓細docs/鎶ヨ〃鐢熸垚_鍏崇郴閫昏緫涓庢瘡鏃ヨ繘搴︽�昏〃.xlsx锛�5 椤电锛氳鏄�/鎶ヨ〃鍏崇郴鎬昏〃/姹囨�昏〃椤电涓庡彛寰�/鐤戦棶涓庡緟纭娓呭崟/姣忔棩寰呭姙涓庡畬鎴愯繘搴︼級銆�
+
+### 杩藉姞3锛堜笅鐝墠锛�17:10-17:40锛�
+12. 鎬昏〃鈥滄瘡鏃ュ緟鍔炩�濅笌鈥滅枒闂竻鍗曗�濆鍔犱紭鍏堢骇鍒楋紙P0 娆℃棩鏈�鍏� / P1 鏈懆 / P2 鏈夌┖锛夛紝骞堕鎺� 09-04 寰呭姙 6 鏉★紱鍥犳棫鐗堟�昏〃琚� WPS 鍗犵敤鏃犳硶瑕嗙洊锛屾柊鐗堝彟瀛樹负 docs/鎶ヨ〃鐢熸垚_鍏崇郴閫昏緫涓庢瘡鏃ヨ繘搴︽�昏〃_2026-09-03.xlsx锛堝叧闂棫鏂囦欢鍚庡彲鏇挎崲鍥炴寮忓悕锛夈��
+13. 鐢ㄦ埛鎺堟潈锛堣鍏� AGENTS.md 宸ヤ綔瑙勮寖锛夛細浠ュ悗姣忔鏀瑰畬浠g爜鍏堟媺鍏徃 gitea 鏈�鏂板姣斿悎骞讹紝鍐� commit+push锛屼笉鍐嶉�愭寰佹眰鈥滄槸鍚︽帹閫佲�濄�傛湰娆″凡鎵ц璇ユ祦绋嬨��
+14. 妯℃澘缁撹锛氬贰娓稿嚭绉熸槑缁嗙瓑鐢熸垚鐢ㄢ�滅┖鏁版嵁姣嶇増 + 瀵煎嚭濉�尖�濇柟妗堬紝涓嶆敼鐢ㄥ甫鏁版嵁鐗堟ā鏉裤��
diff --git "a/docs/\345\276\205\344\270\232\345\212\241\347\224\250\346\210\267\347\241\256\350\256\244\346\270\205\345\215\225_2026-09-02.md" "b/docs/\345\276\205\344\270\232\345\212\241\347\224\250\346\210\267\347\241\256\350\256\244\346\270\205\345\215\225_2026-09-02.md"
index de22431..14a2203 100644
--- "a/docs/\345\276\205\344\270\232\345\212\241\347\224\250\346\210\267\347\241\256\350\256\244\346\270\205\345\215\225_2026-09-02.md"
+++ "b/docs/\345\276\205\344\270\232\345\212\241\347\224\250\346\210\267\347\241\256\350\256\244\346\270\205\345\215\225_2026-09-02.md"
@@ -49,3 +49,42 @@
 - 妯℃澘鏂囦欢姝h鍙︿竴浼氳瘽淇敼锛屼互涓� 鈽呮帓鐗� 椤逛腑娑夊強妯℃澘鏍峰紡鐨勶紙6/8/10/12/14锛夊缓璁互鈥滃彟涓�浼氳瘽瀹氱鍚庣殑鐗堟湰鈥濆啀褰撻潰鏍稿涓�娆★紝閬垮厤閲嶅鏀逛袱閬嶃��
 
 
+
+## 鐢ㄦ埛 2026-09-03 閫愭潯绛斿涓庢墽琛岀姸鎬侊紙鏈�鏂帮紝浠ユ涓哄噯锛�
+
+| # | 妯″潡 | 鐢ㄦ埛绛斿锛�09-03锛� | 鎵ц鐘舵�� / 璁″垝 |
+|---|---|---|---|
+| 1 | 鍏矾鏃呭 | 瀛濇劅涓よ鍚堝苟涓轰竴琛岋紙璺ㄥ幙+鍘垮唴鐝嚎锛夛紝鍙e緞缁熶竴涓虹彮绾� | 鎶ヨ〃灞傚凡鎸夊競宸炲悎璁★紙搴� 2 琛屸啋琛� 1 琛岋級锛涘緟纭鏄惁鍏ュ簱涔熷悎骞朵负涓�琛岋紙鏀瑰鍏ュ幓閲嶏級 |
+| 2 | 鍏矾鏃呭 | 鍒嗗競宸�/涓彛寰勬槑缁�/鎺掑悕/鍒嗘瀽琛ㄧ殑鈥滅彮绾垮杩愰噺銆佸懆杞噺鈥濋兘搴旀兜鐩栦釜浣撴暟鎹紙鍙嶉棶鈥滀綘鎸囩殑鍝釜琛ㄢ�濓級 | 鐜扮姸锛氬垎甯傚窞琛ㄦ湁鈥滃叾涓釜浣撯�濊锛堝凡濉級锛涒�滃杩愰噺/鍛ㄨ浆閲忊�濊涓庝腑鍙e緞鐝嚎琛屾湭骞跺叆涓綋 鈫� 寰呯‘璁ゅ彛寰勫悗骞跺叆锛堣涓嬫柟寰呯‘璁锛� |
+| 3 | 鍏矾鏃呭 | 鐢ㄦ埛鐩存帴瀵煎叆涓綋瀹㈣繍鏁版嵁锛岀洿鎺ユ妸涓綋鏁版嵁姹囨�诲埌銆婄敓鎴恄鍏矾鏃呭鍒嗗競宸炪�� | 寰呮寜 A 鍙e緞钀藉疄锛氬苟鍏ユ�婚噺琛岋紙淇濈暀鈥滃叾涓釜浣撯�濊鎷嗗垎锛夊苟鎵╁睍鍒颁腑鍙e緞涓夎〃 |
+| 4 | 鍏矾鏃呭 | 寰呭姙 | 鈼� 鏀规湡锛欻2031 缂烘湀/2025 鍩烘湡鍚庣画琛� |
+| 5 | 鍩庡競瀹㈣繍 | 缃戠害杞﹀垪鎸夋媶鍒嗗叕寮忓~鍊硷紝鏁版嵁鏉ユ簮鍚庣画琛ュ厖璇存槑 | 缁存寔鐣欑┖锛涚瓑鈥滈儴绾ф�婚噺/璁㈠崟鏁扳�濇潵婧愯鏄庡悗鍐嶅疄鐜版媶鍒� |
+| 6 | 鍩庡競瀹㈣繍 | 妯℃澘鏆傛椂鐣欑┖锛屽幓骞存暟鎹悗缁ˉ鍏� | 鉁� 缁存寔鐜扮姸锛堝幓骞村垪/鍚屾瘮鐣欑┖锛� |
+| 7 | 鍩庡競瀹㈣繍 | 鐣欑┖锛屽悗缁ˉ鍏� | 鉁� 缁存寔鐜扮姸锛堢己鏈堝垪鐣欑┖锛� |
+| 8 | 鍩庡競瀹㈣繍 | 涓庡畼鏂规牱寮犱竴鑷村嵆鍙� | 鉁� 缁存寔鐜扮姸锛堣建閬撳彧鎺掑叏鐪�/姝︽眽/榛勭煶绛夛級 |
+| 9 | 鍩庡競瀹㈣繍 | 鍚屾瘮/鐜瘮 0% 闇�鏍稿疄 鈫� 鍔犲埌 鍩庡競鍏氦銆佽揣杩愩�佸叕璺梾瀹� 鐨勫鏍歌鍒欓噷 | 璁″垝锛氳皟鐮斿鏍歌鍒欐鏋跺悗鏂板瑙勫垯锛堣寰呭姙闃熷垪 R1锛� |
+| 10 | 璐ц繍 | 宸插湪琛ㄦ牸閲岄潰淇 | 鉁� 宸插畬鎴愶紙9/2 绗簩椤靛~褰撴湀 + 鍒楀ご鈥滃綋鏈堝畬鎴愨�濓級 |
+| 11 | 璐ц繍 | 瀵圭収瀹樻柟鏍峰紶纭 | 寰呭姙锛堥渶瀹樻柟鏍峰紶瀵圭収鍒嗗競宸炴槑缁嗙増寮忥級 |
+| 12 | 璐ц繍 | 鍏堜笉淇敼锛屾暟鎹悗缁ˉ褰曪紙涓彛寰勫幓骞存槑缁嗛〉锛� | 鈼� 鏀规湡 |
+| 13 | 鑳借�� | 寰呭姙 | 鈼� 鏀规湡锛堝悓姣旂暀绌虹淮鎸佺幇鐘讹級 |
+| 14 | 鎶曡祫 | 鏆傛椂鎸夋ā鏉垮師鏍凤紝鍚庣画鏀瑰姩鍐嶄氦娴� | 鉁� 缁存寔鐜扮姸锛�.xls 鑰佹牸寮忥級 |
+| 15 | 鍔熻兘 | 鏆傛椂涓嶅仛骞存姤瀵煎叆锛屽彲浠ラ殣钘忎竴涓� | 鉁� 宸插疄鐜帮紙09-03 鍓嶇闅愯棌骞存姤鍏ュ彛锛屾暟鎹繚鐣欙級 |
+| 16 | 浣撻獙 | 鏈熸湜瀵煎叆涓樉绀衡�滃凡澶勭悊 N/M 琛屸�濆疄鏃惰繘搴� | 璁″垝锛氳皟鐮旂幇鏈夊鍏ユ壒娆℃満鍒跺悗瀹炵幇锛堣寰呭姙闃熷垪 R2锛� |
+
+### 寰呭姙闃熷垪锛堟垜鏂� 09-03 璧凤級
+- [x] 15 骞存姤鍏ュ彛闅愯棌锛堝凡鏀� DataImport.vue锛歛nnual 缁� hidden + visibleGroups 杩囨护锛�
+- [ ] 1/2/3 涓綋瀹㈣繍骞跺叆鍏矾鏃呭鎶ヨ〃锛堝緟纭 A锛氬苟鍏ュ彛寰勶級
+- [ ] 1 瀛濇劅涓よ鍏ュ簱鍚堝苟 or 鎶ヨ〃灞傚悎璁″嵆鍙紙寰呯‘璁� B锛�
+- [ ] R1(9) 瀹㈣繍閲忓悓姣�/鐜瘮 0% 瀹℃牳瑙勫垯锛堝煄甯傚叕浜�/璐ц繍/鍏矾鏃呭锛�
+- [ ] R2(16) 瀵煎叆鈥滃凡澶勭悊 N/M 琛屸�濆疄鏃惰繘搴︼紙鍚庣杩涘害鏌ヨ + 鍓嶇杞锛�
+- [ ] 5 缃戠害杞︽媶鍒嗗~鍊硷紙绛変笟鍔℃彁渚涙媶鍒嗘暟鎹潵婧愶級
+- [ ] 11 璐ц繍鍒嗗競宸炴槑缁嗗鐓у畼鏂规牱寮�
+
+## 09-03 涓婂崍鎵ц鏇存柊锛堜釜浣撳苟鍏ュ叕璺梾瀹㈡姤琛細宸插疄鐜板苟閫氳繃鍔熻兘娴嬭瘯锛�
+- [x] #1 瀛濇劅锛氱淮鎸佹姤琛ㄥ眰鎸夊競宸炲悎骞朵负涓�琛岋紙搴撳唴涓よ鍚堣 21802/436433 -> 琛ㄥ唴涓�琛� 2.1802/43.6433锛夛紝涓嶆敼瀵煎叆鍘婚噸銆�
+- [x] #2/#3 鍒嗗競宸炶〃 瀹㈣繍閲�/鍛ㄨ浆閲� 鎬昏 = 浼佷笟(H2031)+涓綋锛涗腑鍙e緞 鏄庣粏/鎺掑悕/鍒嗘瀽 涓夎〃 鎬婚噺/鍏矾鐝嚎 琛屽悓鏍峰苟鍏ヤ釜浣擄紙鍚屾瘮鍚屽彛寰勶紝鏃犲幓骞存暟鎹暀绌猴級銆�
+  - 鏀瑰姩锛歵raffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
+    - passengerMonthVal锛歮etricIdx 0/1 鏀逛负 浼佷笟+涓綋锛�
+    - loadMidClassMap锛氫釜浣撳苟鍏� dim1(鍏矾鐝嚎)/dim0(鎬婚噺)锛�
+  - 楠岃瘉锛�2026-07锛圚2031 771 琛� + 涓綋 7 琛岋級4 寮犺〃鏁板�间笌搴撳唴鑱氬悎閫愭牸涓�鑷达紙璇﹁ docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鍏矾鏃呭鎶ヨ〃骞跺叆涓綋瀹㈣繍_2026-09-03.md锛夈��
+  - 閬楃暀锛堜笌鏈鏀瑰姩鏃犲叧锛夛細涓彛寰勬槑缁嗘ā鏉挎墿鍒楀悗 2026-07~12 鏈堝崟鍏冩牸涓庣疮璁′笉鍚� >6 鏈堟暟鎹紝鍙︾珛浠诲姟澶勭悊銆�
diff --git "a/docs/\346\212\245\350\241\250\347\224\237\346\210\220_\345\205\263\347\263\273\351\200\273\350\276\221\344\270\216\346\257\217\346\227\245\350\277\233\345\272\246\346\200\273\350\241\250_2026-09-03.xlsx" "b/docs/\346\212\245\350\241\250\347\224\237\346\210\220_\345\205\263\347\263\273\351\200\273\350\276\221\344\270\216\346\257\217\346\227\245\350\277\233\345\272\246\346\200\273\350\241\250_2026-09-03.xlsx"
new file mode 100644
index 0000000..582f89f
--- /dev/null
+++ "b/docs/\346\212\245\350\241\250\347\224\237\346\210\220_\345\205\263\347\263\273\351\200\273\350\276\221\344\270\216\346\257\217\346\227\245\350\277\233\345\272\246\346\200\273\350\241\250_2026-09-03.xlsx"
Binary files differ
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
new file mode 100644
index 0000000..c888d4f
--- /dev/null
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250.xlsx"
Binary files differ
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250_7\346\234\210\346\270\205\347\251\272\346\265\213\350\257\225\347\211\210.xlsx" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250_7\346\234\210\346\270\205\347\251\272\346\265\213\350\257\225\347\211\210.xlsx"
new file mode 100644
index 0000000..911d1c9
--- /dev/null
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250_7\346\234\210\346\270\205\347\251\272\346\265\213\350\257\225\347\211\210.xlsx"
Binary files differ
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250_7\346\234\210\346\270\205\347\251\272\346\265\213\350\257\225\347\211\210v2.xlsx" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250_7\346\234\210\346\270\205\347\251\272\346\265\213\350\257\225\347\211\210v2.xlsx"
new file mode 100644
index 0000000..da8b97c
--- /dev/null
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/2026\345\271\2647\346\234\210\351\201\223\350\267\257\350\277\220\350\276\223\351\207\217\346\261\207\346\200\273\350\241\250_7\346\234\210\346\270\205\347\251\272\346\265\213\350\257\225\347\211\210v2.xlsx"
Binary files differ
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\350\207\252\345\212\250\347\224\237\346\210\220\346\261\207\346\200\273\345\267\245\344\275\234\347\260\277\350\220\275\345\234\260\346\226\271\346\241\210.md" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\350\207\252\345\212\250\347\224\237\346\210\220\346\261\207\346\200\273\345\267\245\344\275\234\347\260\277\350\220\275\345\234\260\346\226\271\346\241\210.md"
new file mode 100644
index 0000000..cb2c5f9
--- /dev/null
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\350\207\252\345\212\250\347\224\237\346\210\220\346\261\207\346\200\273\345\267\245\344\275\234\347\260\277\350\220\275\345\234\260\346\226\271\346\241\210.md"
@@ -0,0 +1,69 @@
+# 鑷姩鐢熸垚銆婇亾璺繍杈撻噺姹囨�昏〃銆嬭惤鍦版柟妗堬紙v0.1锛�2026-09-03锛�
+
+## 1 鐩爣涓庝氦浠樼墿
+- 绯荤粺鎸夋姤琛ㄦ湡鑷姩鐢熸垚涓�鏈眹鎬诲伐浣滅翱锛�2026-07 鏍蜂緥宸茬敱鐢ㄦ埛鎵嬪伐鍒朵綔锛屼綅浜� docs/鐢熸垚姹囨�诲ぇ琛�/2026骞�7鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx锛夈��
+- 浜や粯鐗╁舰鎬侊細涓�涓� .xlsx 宸ヤ綔绨匡紝鍐呭惈 15 涓彲瑙侀〉绛撅紙鐗堝紡銆佸叕寮忋�佹牱寮忎笌浜哄伐姣嶇増涓�鑷达級锛岄殣钘忛〉锛堝叕璺�诲杩愩��2025骞村煄甯傚杩愰噺銆佷腑鍙e緞瀹㈣繍閲忋�佷腑鍙e緞璁$畻杩囩▼锛変繚鐣欎絾闅愯棌锛屾湰娆′笉绾冲叆鏁版嵁鍔犲伐銆�
+- 涓嶅啀鍗曠嫭鐢熸垚鍚勫皬琛ㄦ枃浠讹紱鍘熷悇灏忚〃瀵煎嚭鍔熻兘淇濈暀涓嶅彉锛堜緵鍗曡〃鍦烘櫙浣跨敤锛夈��
+
+## 2 鎬讳綋绛栫暐锛氭ā鏉块┍鍔� + 涓夊眰娴佹按绾�
+- 浠ョ敤鎴蜂汉宸ュ伐浣滅翱涓烘瘝鐗堬細澶嶅埗鍏剁増寮�/鏍峰紡/鍚堝苟/鍏紡锛岀郴缁熷彧娓呯┖鏁版嵁鍖哄苟鍥炲~锛屼繚鐣欓〉鍐呯疮璁°�佸悓姣斻�佹帓鍚嶃�佸崰姣斿叕寮忓苟閲嶇畻銆備笌鐜版湁 ReportExportService 鐨勬ā鏉挎浛鎹㈡ā寮忎竴鑷达紝椋庨櫓鏈�灏忋�佷笌浜哄伐鏈�鎺ヨ繎銆�
+- 娴佹按绾垮垎涓夊眰锛屼笌銆婇〉绛鹃�昏緫鍏崇郴璇存槑銆嬩竴鑷达細
+  1锛夊彴璐﹂〉濉厖锛氱彮绾垮寘杞︺�佸叕浜ゃ�佸嚭绉熴�佺綉绾﹁溅銆佽建閬撹疆娓★紙鍒嗘柟寮忋�佸垎甯傚窞銆侀�愭湀锛夈��
+  2锛夊彛寰勫悎鎴愰〉锛氬煄甯傚杩愶紙鍩庡競鍐呭彛寰勶級銆佷腑鍙e緞鏄庣粏锛堝煄闄呭煄涔″彛寰勶級銆�
+  3锛夋垚鍝侀〉锛氬煄甯傛眹鎬汇�佸煄甯傚垎甯傚窞銆佽揣杩愩�佽揣杩愰噺鎺掑悕銆佽揣杩愬懆杞噺鎺掑悕銆佷腑鍙e緞鎺掑悕銆佷腑鍙e緞鍒嗘瀽銆侀亾璺繍杈撳懆杞噺銆�
+- 鏍¢獙灞傦細椤靛唴鍏紡闅� recalc 閲嶇畻锛涚敓鎴愬悗鐢ㄥ簱鍐� SQL 鑱氬悎涓庢垚鍝侀�愭牸瀵圭収锛堥槇鍊硷細鏈堝�� 0.005 浠ュ唴锛夈��
+
+## 3 椤电娓呭崟涓庢暟鎹簮鏄犲皠
+| 椤电 | 灞� | 鍙e緞涓庡唴瀹� | 鏁版嵁婧愶紙搴撹〃/瀵煎叆绫诲瀷锛� | 澶嶇敤鐜版湁閫昏緫 |
+|---|---|---|---|---|
+| 鐝嚎鍖呰溅 | 1 | 鍏矾鐝嚎+鍖呰溅锛屽杩愰噺琛屽惈涓綋锛屽叾涓釜浣撳崟鐙 | h2031_enterprise_monthly銆乸assenger_individual_monthly | 鐢熸垚_鍏矾鏃呭鍒嗗競宸� 鏀归�狅紙涓綋骞跺叆鎬昏宸插疄鐜帮紝2026-09-03锛� |
+| 鍏氦 | 1 | 鍏ㄧ渷+甯傚窞 鎬婚噺涓庡叾涓煄甯傚唴 | city_bus_monthly | 鍩庡競瀹㈣繍瀵煎嚭妯℃澘閫昏緫鎵╁睍 |
+| 鍑虹 | 1 | 宸℃父鍑虹锛屾�婚噺=鍩庡競鍐� | 鍑虹瀵煎叆琛紙city_taxi 鐩稿叧锛� | 鍚屼笂 |
+| 缃戠害杞� | 1 | 鎬婚噺=鍩庡競鍐咃紙鎷嗗垎鏉ユ簮寰呭畾锛� | 缃戠害杞﹀鍏ヨ〃 | 鍚屼笂 |
+| 杞ㄩ亾杞浮 | 1 | 杞ㄩ亾锛氭姹夈�侀粍鐭筹紱杞浮锛氫粎姝︽眽 | 杞ㄩ亾/杞浮瀵煎叆鏁版嵁 | 鍩庡競瀹㈣繍瀵煎嚭鎵╁睍 |
+| 鍩庡競瀹㈣繍 | 2 | 鍏氦鍩庡競鍐�+鍑虹+缃戠害杞�+杞ㄩ亾杞浮 | 鐢辩 1 灞傚悎鎴� | 鏂板悎鎴愰�昏緫 |
+| 涓彛寰勬槑缁� | 2 | 鐝嚎+鍏氦鍩庝埂宸�+鍑虹鍩庝埂宸�+缃戠害杞﹀煄涔″樊 | 鐢辩 1 灞傚悎鎴� | 鐜颁腑鍙e緞瀵煎嚭鏀圭増寮忎负椤靛唴濉厖 |
+| 涓彛寰勬帓鍚� | 3 | 涓彛寰勫彛寰勫競宸炴帓鍚� | 绗� 2 灞� | 鐜颁腑鍙e緞鎺掑悕瀵煎嚭 |
+| 涓彛寰勫垎鏋� | 3 | 涓彛寰勫彛寰勫叏鐪佺粨鏋勫崰姣� | 绗� 2 灞� | 鐜颁腑鍙e緞鍒嗘瀽瀵煎嚭 |
+| 鍩庡競姹囨�� | 3 | 鍒嗘柟寮忓煄甯傚杩愮疮璁�/褰撴湀 | 绗� 2 灞� | 鐜板煄甯傚杩愭眹鎬诲鍑� |
+| 鍩庡競鍒嗗競宸� | 3 | 鍚勫競宸炲煄甯傚杩愭槑缁嗕笌鎺掑悕 | 绗� 2 灞� | 鐜板煄甯傚杩愬垎甯傚窞瀵煎嚭 |
+| 璐ц繍 | 3 | 璐ц繍閲�/鍛ㄨ浆閲� 瑙勪笂+瑙勪笅 | 妯℃澘_璐ц繍閲忓懆杞噺銆佹媶鍒嗚〃 | 鐜拌揣杩愬鍑� |
+| 璐ц繍閲忔帓鍚� | 3 | 璐ц繍閲忓彛寰勬帓鍚� | 鍚屼笂 | 鐜拌揣杩愰噺鎺掑悕瀵煎嚭 |
+| 璐ц繍鍛ㄨ浆閲忔帓鍚� | 3 | 鍛ㄨ浆閲忓彛寰勬帓鍚� | 鍚屼笂 | 鐜板懆杞噺鎺掑悕瀵煎嚭 |
+| 閬撹矾杩愯緭鍛ㄨ浆閲� | 3 | B=G+L/2+Q/10 | 璐ц繍椤�+鍩庡競瀹㈣繍椤�+涓彛寰勬槑缁嗛〉 | 鏂板悎鎴愰〉 |
+
+## 4 鍏抽敭瑙勫垯娓呭崟锛堜笌璇存槑鏂囨。绗� 2銆�4 鑺備竴鑷达級
+- 鏈堜唤鍒楋細2026 骞� 1-7 鏈堝�煎垪 C/E/G/I/K/M/O锛屽伓鏁板垪涓哄悓姣旓紱Q 鍒�=1-7 鏈堢疮璁★紙宸茬‘璁ゆ纭姞鑷� 7 鏈堬級銆�
+- 鍚屾瘮锛氭湰鏈�/2025 骞村悓鏈�-1锛�2025 鍚屾湡鍧楀湪鍙充晶 T 璧凤紱鏃犲幓骞存暟鎹暀绌恒��
+- 鍩庝埂宸�=鍏ㄩ噺-鍩庡競鍐咃紙鍏氦锛夛紱鍑虹銆佺綉绾﹁溅 鍏ㄩ噺=鍩庡競鍐咃紙鍩庝埂宸� 0锛夈��
+- 鐝嚎鍖呰溅瀹㈣繍閲忚鍚釜浣擄紙鍏朵腑涓綋涓哄瓙闆嗭級銆�
+- 杞ㄩ亾杞浮锛氳建閬� 姝︽眽+榛勭煶锛涜疆娓� 浠呮姹夈��
+- 鍏ㄧ渷琛�=17 甯傚窞姹傚拰锛堝叕寮忎繚鐣欙級銆�
+- 閬撹矾杩愯緭鍛ㄨ浆閲忥細B=G锛堣揣杩愯涓�+瑙勪笅鍛ㄨ浆閲忥紝涓囧惃鍏噷锛�+L锛堝煄甯傚杩愰噺锛屼竾浜烘锛�/2+Q锛堜腑鍙e緞鎬绘梾瀹㈠懆杞噺锛屼竾浜哄叕閲岋級/10锛涚郴鏁� 2 涓� 10 鎸夌敤鎴峰叕寮忓師鏍峰疄鐜帮紝涓氬姟鎶樼畻渚濇嵁鍙﹁澶囨敞銆�
+- 鎺掑悕鐢� RANK銆佸崰姣旂敤 鍒嗛」/鎬昏 鍏紡锛岄殢 recalc 閲嶇畻銆�
+
+## 5 瀹炴柦姝ラ涓庨獙鏀�
+- P0 姣嶇増瀹氱锛氱‘璁� #REF! 娓呴櫎鏂瑰紡锛涘浐瀹氭瘡椤垫暟鎹尯杈圭晫锛堣銆佸垪銆佹湀浠戒笂闄� 12 鏈堟墿灞曡鍒欙級锛涚‘璁� 2025 鍒椾笌 2024 鍒楃殑濉厖绛栫暐銆傞獙鏀讹細姣嶇増鏃� #REF!銆佽鍒楁槧灏勬竻鍗曡瘎瀹¢�氳繃銆�
+- P1 楠ㄦ灦鐢熸垚锛氭柊澧� workbook 绾фā鏉垮鍒朵笌椤电绠$悊宸ュ叿绫伙紝鐢熸垚鍣ㄥ叆鍙� exportSummaryWorkbook(period, mode)锛岃緭鍑烘暣鏈伐浣滅翱锛堥殣钘忛〉闅愯棌锛夈�傞獙鏀讹細绌鸿〃鍙鍑恒�佹牱寮忎繚鐣欍�侀〉绛鹃綈鍏ㄣ��
+- P2 鍙拌处椤靛~鍏咃細鐝嚎鍖呰溅銆佸叕浜ゃ�佸嚭绉熴�佺綉绾﹁溅銆佽建閬撹疆娓°�傞獙鏀讹細浠� 2026-07 鏁版嵁涓庝汉宸ユ瘝鐗堝悓椤甸�愭牸姣斿閫氳繃銆�
+- P3 鍚堟垚椤靛~鍏咃細鍩庡競瀹㈣繍銆佷腑鍙e緞鏄庣粏锛堝煄涔″樊鍏紡锛夈�傞獙鏀讹細涓彛寰勬槑缁嗘牎楠岃 Q1 绾︾瓑浜� 0锛涘煄甯傚杩�=鍒嗘柟寮忓煄甯傚唴姹傚拰銆�
+- P4 鎴愬搧椤靛~鍏咃細鍩庡競姹囨�汇�佸煄甯傚垎甯傚窞銆佷腑鍙e緞鎺掑悕銆佷腑鍙e緞鍒嗘瀽銆佽揣杩愬強涓ゅ紶鎺掑悕銆傞獙鏀讹細鍚勯〉涓庝汉宸ユ瘝鐗堥�愭牸姣斿銆�
+- P5 鎬诲懆杞噺鍚堟垚锛氶亾璺繍杈撳懆杞噺 B=G+L/2+Q/10 涓庡幓骞村鐓у垪銆傞獙鏀讹細B 鍒楀叏鐪�=鍚勫競宸炴眰鍜屻�佷笌浜哄伐姣嶇増涓�鑷淬��
+- P6 鍓嶇鎺ュ叆锛氭姤琛ㄧ敓鎴愰〉鏂板 姹囨�诲伐浣滅翱 绫诲瀷锛堝惈 ready 鏁版嵁灏辩华妫�鏌ャ�佺敓鎴愩�佷笅杞姐�佸鍏ヨ褰�/鎿嶄綔鏃ュ織锛夈�傞獙鏀讹細椤甸潰涓婂彲涓�閿敓鎴� 2026-07 骞朵笅杞姐��
+- P7 鍥炲綊涓庢姤鍛婏細鍏ㄩ噺瀵圭収 2026-07 浜哄伐姣嶇増锛涜緭鍑恒�婂姛鑳芥祴璇曟姤鍛奯姹囨�诲伐浣滅翱鐢熸垚_<鏃ユ湡>.md銆嬶紙姝e悜閫愭牸瀵圭収銆佽礋鍚戠己鏁版嵁鎻愮ず銆佸叆搴撴娊鏌ワ級銆�
+
+## 6 鏁版嵁缂哄彛涓庨闄�
+- 2025 鍩烘湡锛氬簱鍐� H2031 浠� 2026-03/07銆佸煄甯傚杩愪粎 2026-06/07锛屾棤 2025 鏁版嵁锛�2025 鍚屾湡鍒楀彧鑳� 鐣欑┖ 鎴� 淇濈暀姣嶇増缂撳瓨鍊硷紝闇�鎷嶆澘銆�
+- 缃戠害杞︽媶鍒嗘暟鎹簮鏈畾锛氭寜姣嶇増鐜扮姸鍏堝疄鐜� 鎬婚噺=鍩庡競鍐咃紙鍩庝埂宸� 0锛夛紝绛夋媶鍒嗚鏄庡悗鍐嶆敼銆�
+- 杞ㄩ亾杞浮鏈堝害鏁版嵁鏄惁宸插叆搴撱�佸瓧娈靛彛寰勶紙姝︽眽/榛勭煶锛夊緟鏍稿銆�
+- 鍩庡競鍒嗗競宸炪�佸煄甯傛眹鎬� 鐗堝紡缁嗚妭闇�瀵圭収瀹樻柟鏍峰紶閫愭牸纭銆�
+- 璐ц繍瑙勪笂瑙勪笅鎷嗗垎琛ㄤ笌鍛ㄨ浆閲忔ā鏉挎瘡鏈堟槸鍚︽湁瀵瑰簲鏈堜唤鏁版嵁寰呯‘璁わ紙缂烘湀鏃惰椤电暀绌哄苟鎻愮ず锛夈��
+- 姣嶇増鏂囦欢鍙兘琚� Excel 鍗犵敤锛氱敓鎴愭椂涓�寰嬪彟瀛樻柊鏂囦欢锛屼笉鏀规瘝鐗堛��
+- 鏈堜唤>7 鏃讹紙8-12 鏈堬級闇�鍏堣В鍐虫ā鏉挎墿鍒楅棶棰橈紙鐜颁腑鍙e緞鏄庣粏 7 鏈堝悗绌虹櫧闂锛屽彟绔嬩换鍔★級銆�
+
+## 7 寰呯敤鎴锋媿鏉挎竻鍗�
+1. #REF! 娓呴櫎锛氱敱鎴戠▼搴忔竻闄よ繖 9 澶勫崟鍏冩牸锛堢疆绌猴級锛岃繕鏄繚鐣欎汉宸ュ鐞嗭紵
+2. 2025 鍚屾湡鍒楋細鐣欑┖ 鎴� 淇濈暀姣嶇増缂撳瓨鍊硷紵锛堟秹鍙婂悓姣斿垪鏄惁鏄剧ず锛�
+3. 杞ㄩ亾杞浮鏁版嵁鏄惁宸插鍏ョ郴缁熴�佹槸鍚︽湰鏈堝厛浜哄伐琛ュ娴嬭瘯銆�
+4. 姹囨�诲伐浣滅翱杈撳嚭鐩綍涓庡懡鍚嶏紙寤鸿 docs/鐢熸垚姹囨�诲ぇ琛�/杈撳嚭/鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_YYYY-MM.xlsx锛夈��
+5. 鏄惁鏈湀灏变互 2026-07 姣嶇増涓哄簳绋匡紝鍏堝仛 P0-P1 璇曡窇绗竴鐗堥鏋躲��
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\350\276\223\345\205\245\350\276\223\345\207\272\344\270\216\351\200\273\350\276\221\345\205\263\347\263\273\346\200\273\350\241\250_2026-09-03.md" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\350\276\223\345\205\245\350\276\223\345\207\272\344\270\216\351\200\273\350\276\221\345\205\263\347\263\273\346\200\273\350\241\250_2026-09-03.md"
new file mode 100644
index 0000000..ca606a7
--- /dev/null
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\350\276\223\345\205\245\350\276\223\345\207\272\344\270\216\351\200\273\350\276\221\345\205\263\347\263\273\346\200\273\350\241\250_2026-09-03.md"
@@ -0,0 +1,34 @@
+# 鎶ヨ〃鐢熸垚杈撳叆杈撳嚭涓庨�昏緫鍏崇郴鎬昏〃锛�2026-09-03 鐗堬級
+
+> 鍙e緞姹囨�诲叆鍙o細鎶娾�滄姤琛ㄧ敓鎴愶紙鍩庡競瀹㈣繍/姹囨�诲伐浣滅翱锛夆�濈浉鍏冲姛鑳界殑杈撳叆琛ㄣ�侀〉绛惧叧绯汇�侀�昏緫杩愮畻姹囨�诲涓嬨��
+> 璇︾粏灞曞紑瑙佷袱绡囦笓棰橈細`docs/鐢熸垚姹囨�诲ぇ琛�/椤电閫昏緫鍏崇郴璇存槑.md`锛�19 椤典笁灞傜粨鏋勪笌鍕剧ń锛夈�乣docs/鐢熸垚姹囨�诲ぇ琛�/鑷姩鐢熸垚姹囨�诲伐浣滅翱钀藉湴鏂规.md`锛圥0-P7 钀藉湴鏂规锛夈��
+
+## 1 鍏崇郴鎬昏〃
+
+| 鍔熻兘/鎶ヨ〃椤� | 杈撳叆锛堟枃浠�/搴撹〃锛� | 鍙備笌椤电 | 鍏抽敭杩愮畻 | 杈撳嚭 | 鍙e緞澶囨敞 |
+|---|---|---|---|---|---|
+| 缃戠害杞﹀杩愰噺鎷嗗垎琛紙wycSplit锛屾湀搴︼級 | 銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬪綋鏈堣锛欱-E=缃戠害杞﹀叏鐪佸杩愰噺/鍩庡競鍐呭杩愰噺/鍛ㄨ浆閲�/鍩庡競鍐呭懆杞噺锛堟簮鑷�婄綉绾﹁溅鎬绘暟.xlsx銆嬶級锛孎=璁㈠崟鍚堣锛孏-W=17 甯傚窞璁㈠崟锛堟簮鑷�婃箹鍖楃綉缁滈绾﹀嚭绉熸苯杞︹�﹀垎鏋愭姤鍛娿�嬮檮浠�1锛夛紱city_taxi_monthly 宸℃父鍑虹鏈堟姤锛堝杩愰噺/鍩庡競鍐�/骞冲潎杩愯窛/鍩庡競鍐呭钩鍧囪繍璺濓級 | 鏃狅紙鐙珛椤� `yyyy-MM鎷嗗垎`锛屽杩愰噺鍧�+鍛ㄨ浆閲忓潡锛� | 瀹㈣繍閲�=璁㈠崟鍗犳瘮脳鍏ㄧ渷 pin锛涘煄甯傚唴 H锛氭姹�=鑷韩銆佸叾浣欐寜宸℃父鍩庡競鍐呭崰姣斿墿浣欏垎鎽婅嚦 pinCK锛涘煄闄呭煄涔�=鎬婚噺鈭掑煄甯傚唴锛涘懆杞噺 G=瀹㈣繍閲徝楀贰娓稿钩鍧囪繍璺濆崰姣斿垎鎽� pinZ锛屽煄甯傚唴鍚屾硶锛堢敤鍩庡競鍐呭钩鍧囪繍璺濓級 | 鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛╛{鏈焳.xlsx | 渚涖�婇亾璺繍杈撻噺姹囨�昏〃銆嬬綉绾﹁溅鍙拌处椤靛紩鐢紱2026-07 涓庝汉宸ュ彛寰勫洓鎸囨爣鏈�澶у亸宸� 0 |
+| 閬撹矾杩愯緭閲忔眹鎬昏〃锛坰ummaryWorkbook锛屾暣鏈級 | 姣嶇増 docs/鐢熸垚姹囨�诲ぇ琛�/{骞磢骞磠鏈坿鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx锛圥0-P1 鏁存湰澶嶅埗锛汸2 璧烽�愭鏀逛负 鍙拌处/鍙e緞鍚堟垚/鎴愬搧 涓夊眰鍥炲~锛� | 19 椤碉細鐝嚎鍖呰溅銆佸叕浜ゃ�佸嚭绉熴�佺綉绾﹁溅銆佽建閬撹疆娓★紙鍙拌处锛夛紱鍩庡競瀹㈣繍銆佷腑鍙e緞鏄庣粏锛堝彛寰勫悎鎴愶級锛涘煄甯傛眹鎬汇�佸煄甯傚垎甯傚窞銆佽揣杩愩�佷袱寮犳帓鍚嶃�佷腑鍙e緞鎺掑悕/鍒嗘瀽銆侀亾璺繍杈撳懆杞噺锛堟垚鍝侊級绛� | 鐩爣骞�=2026 闆舵敼鍔紱璺ㄥ勾鍙浛鎹㈡枃鏈� `2026骞碻鈫掔洰鏍囧勾锛涙暟鎹~鍏�/鏈堜唤鎵╁睍 P2 寰呭畾 | 鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_{鏈焳.xlsx | 姣嶇増蹇呴』閫愭湀瀛樺湪锛堢己鏈堟槑纭姤閿欙紝涓嶈法鏈堝洖閫�锛夛紱2025/2024 鍒椾繚鐣欐瘝鐗堢紦瀛樺�硷紱#REF! 寰呭鐞� |
+| 鍩庡競瀹㈣繍鏃㈡湁 9 寮狅紙鍏氦/鍑虹/杞ㄩ亾杞浮/姹囨��/绱绛夛級 | 鍩庡競鍏氦/宸℃父鍑虹绛夋湀鎶ュ簱琛� + docs/鍩庡競瀹㈣繍 鏂扮増寮忔ā鏉� | 鍚勮嚜鍗曢〉/鍙岄〉 | 鎸夊悇琛ㄥ彛寰勮仛鍚堛�佸悓姣斻�佺疮璁� | 鐢熸垚_xxx.xlsx | 涓庢湰娆℃柊澧為」鍚屽垪琛紝缁熶竴璧颁袱浣嶅皬鏁版樉绀鸿鍒� |
+
+## 2 缃戠害杞︽媶鍒嗙畻娉曪紙涓庛�婄綉绾﹁溅鎷嗗垎.xlsx銆嬫湀椤典竴鑷达級
+
+璁� 17 甯傚窞 i锛�0=姝︽眽锛夛紝鍏ㄧ渷 pin锛氬杩愰噺 K=4852.3銆佸煄甯傚唴 CK=4430.84銆佸懆杞噺 Z=28348.02銆佸煄甯傚唴 CZ=22705.61锛�2026-07锛夈��
+- C_i = 璁㈠崟_i 梅 危璁㈠崟 脳 K锛堢綉绾﹁溅瀹㈣繍閲忥級銆�
+- 宸℃父鍗犳瘮 F_i = 鍑虹鍩庡競鍐呭杩愰噺_i 梅 鍑虹瀹㈣繍閲廮i銆�
+- 鍩庡競鍐呭杩愰噺 H_i锛氭姹� H_0 = C_0脳F_0锛涘叾浣� H_i = (C_i脳F_i) 梅 (危C_jF_j 鈭� C_0F_0) 脳 (CK 鈭� C_0F_0)銆傚煄闄呭煄涔� I_i = C_i 鈭� H_i銆�
+- 鍛ㄨ浆閲� G_i = (C_i脳骞冲潎杩愯窛_i) 梅 危(C_j脳骞冲潎杩愯窛_j) 脳 Z锛涘煄甯傚唴鍛ㄨ浆閲� Hl_i锛氭姹� = G_0锛涘叾浣� = (H_i脳鍩庡競鍐呭钩鍧囪繍璺漘i) 梅 (危H_j脳鍩庡競鍐呭钩鍧囪繍璺漘j 鈭� H_0脳鍩庡競鍐呭钩鍧囪繍璺漘0) 脳 (CZ 鈭� G_0)锛涘煄闄呭煄涔″懆杞噺 Il_i = G_i 鈭� Hl_i銆�
+- 骞冲潎杩愯窛缂虹渷鍏滃簳 = 鍛ㄨ浆閲� 梅 瀹㈣繍閲忥紙鍩庡競鍐呭悓鐞嗭級锛涙姹夋棤鍩庨檯鍩庝埂锛圚=K銆両=0锛夈��
+
+## 3 姹囨�诲伐浣滅翱涓夊眰鍙e緞锛堟憳瑕侊紝璇﹁椤电閫昏緫鍏崇郴璇存槑.md锛�
+
+- 绗� 1 灞傚彴璐﹂〉锛堝垎鏂瑰紡鏄庣粏锛夛細鐝嚎鍖呰溅锛堝惈涓綋锛夈�佸叕浜ゃ�佸嚭绉熴�佺綉绾﹁溅銆佽建閬撹疆娓★紱鍏ㄧ渷+17 甯傚窞閫愭湀锛岃缁撴瀯 4 琛�/甯傚窞锛堝杩愰噺/鍛ㄨ浆閲�/鍏朵腑瀹㈣繍閲�/鍏朵腑鍛ㄨ浆閲忥級銆�
+- 绗� 2 灞傚彛寰勫悎鎴愶細鍩庡競瀹㈣繍锛�=鍏氦鍩庡競鍐�+鍑虹鍩庡競鍐�+缃戠害杞﹀煄甯傚唴+杞ㄩ亾杞浮锛夛紱涓彛寰勬槑缁嗭紙=鐝嚎鍏ㄩ噺+鍏氦鍩庝埂宸�+鍑虹鍩庝埂宸�+缃戠害杞﹀煄涔″樊锛夈�傚煄涔″樊=鍙拌处椤碘�滄�婚噺琛屸垝鍏朵腑鍩庡競鍐呰鈥濓紙2026-07锛氬嚭绉熷叏鐪� 509.00銆佺綉绾﹁溅 421.46锛涙姹夊煄涔″樊=0锛夈��
+- 绗� 3 灞傛垚鍝侊細鍩庡競姹囨�汇�佸煄甯傚垎甯傚窞銆佽揣杩�/鎺掑悕銆佷腑鍙e緞鎺掑悕/鍒嗘瀽銆侀亾璺繍杈撳懆杞噺锛圔=G+L/2+Q/10锛氳揣杩愬懆杞噺+鍩庡競瀹㈣繍閲�/2+涓彛寰勬�绘梾瀹㈠懆杞噺/10锛夈��
+- 杞ㄩ亾杞浮锛氳建閬�=姝︽眽+榛勭煶锛涜疆娓′粎姝︽眽锛涢粍鐭虫棤杞浮銆�
+
+## 4 鍏辨�ц鍒�
+
+1. 鏁板�尖�滄樉绀轰袱浣嶅皬鏁般�佷繚鐣欏叏绮惧害鈥濓細鎵�鏈夌敓鎴愬伐浣滅翱鍑哄彛缁熶竴鎵ц applyTwoDecimalFormat锛坄0.00` 鏄剧ず锛涙暣鏁�/%/鏃ユ湡/绉戝璁℃暟/宸插惈 0.00 鏍峰紡涓嶅姩锛夈��
+2. 缂烘暟鎹笉闈欓粯锛歸ycSplit 缂鸿緭鍏ヨ銆乻ummaryWorkbook 缂哄綋鏈堟瘝鐗堛�乺eady 鍓嶇疆鏍¢獙缂哄簱琛ㄦ暟鎹椂锛屽垪琛ㄧ疆鈥滅己鏁版嵁鈥濆苟缁欏嚭鍘熷洜锛屽鍑烘槑纭姤閿欍��
+3. 鐘舵�佹煡璇細/api/report/ready锛堟暟鎹氨缁級銆�/api/report/preview銆�/api/report/export/{key}锛堝崟涓級銆�/api/report/export/selected锛堝閫� zip锛夊潎宸茶鐩栨柊绫诲瀷銆�
diff --git "a/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\351\241\265\347\255\276\351\200\273\350\276\221\345\205\263\347\263\273\350\257\264\346\230\216.md" "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\351\241\265\347\255\276\351\200\273\350\276\221\345\205\263\347\263\273\350\257\264\346\230\216.md"
new file mode 100644
index 0000000..4e30d29
--- /dev/null
+++ "b/docs/\347\224\237\346\210\220\346\261\207\346\200\273\345\244\247\350\241\250/\351\241\265\347\255\276\351\200\273\350\276\221\345\205\263\347\263\273\350\257\264\346\230\216.md"
@@ -0,0 +1,79 @@
+# 椤电閫昏緫鍏崇郴璇存槑锛�2026骞�7鏈堥亾璺繍杈撻噺姹囨�昏〃锛�
+
+## 0 璇存槑涓庝緷鎹�
+- 渚濇嵁鏂囦欢锛歞ocs/鐢熸垚姹囨�诲ぇ琛�/2026骞�7鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx锛堝惈鍏紡鍘熺锛�2026-09-03 鍒嗘瀽锛夈��
+- 鐢ㄩ�旓細浣滀负绯荤粺鑷姩鐢熸垚璇ユ眹鎬诲伐浣滅翱鐨勫彇鏁颁笌鍙e緞渚濇嵁銆傛渶缁堜氦浠樼墿涓鸿繖涓�鏈眹鎬诲伐浣滅翱锛屼笉鍐嶅崟鐙敓鎴愬皬琛ㄦ枃浠躲��
+- 闅愯棌椤垫殏涓嶇撼鍏ユ湰娆¤寖鍥达細鍏矾鎬诲杩愩��2025骞村煄甯傚杩愰噺銆佷腑鍙e緞瀹㈣繍閲忋�佷腑鍙e緞璁$畻杩囩▼锛堝伐浣滅翱鍐呬粛淇濈暀锛岀敓鎴愭椂鍙悓姝ラ殣钘忥級銆�
+- 鐢ㄦ埛鍙e緞纭锛�2026-09-03锛夛細
+  1锛夌彮绾垮寘杞︾瓑椤� Q 鍒楋紙2026骞寸疮璁★級涓� 1-7 鏈堝悎璁★紝姝︽眽绱姝g‘鍔犲埌 7 鏈堬紱
+  2锛夋柇閾惧叕寮� #REF! 娈嬩綑浠呬綔娓呯悊椤癸紝涓嶅奖鍝嶄富鏁版嵁鍖猴紱
+  3锛夎建閬撱�佽疆娓″彧鏈夋姹夊拰榛勭煶鏈夋暟鎹紱閬撹矾杩愯緭鍛ㄨ浆閲� =锛堣揣杩愰〉锛氳涓�+瑙勪笅鍛ㄨ浆閲忥級+锛堝煄甯傚杩愰〉锛氬杩愰噺/2锛�+锛堜腑鍙e緞鏄庣粏椤碉細鎬绘梾瀹㈠懆杞噺/10锛夛紱
+  4锛夌彮绾垮寘杞﹂〉鐨勫杩愰噺琛屽寘鍚釜浣擄紙鍏朵腑涓綋涓哄叾瀛愰泦琛岋級銆�
+  5锛夎ˉ鍏呯‘璁わ紙2026-09-03 绗簩杞級锛氶粍鐭冲彧鏈夎建閬撱�佹病鏈夎疆娓★紙杞浮浠呮姹夎锛夛紱閬撹矾杩愯緭鍛ㄨ浆閲忓悎鎴愬叕寮� G+L/2+Q/10 纭鏃犺锛�#REF! 澶勭悊鎰忚瑙佺 6 鑺傘��
+  6锛夊彛寰勪慨璁紙2026-09-03 绗笁杞級锛氬嚭绉熶笌缃戠害杞﹀潎瀛樺湪鍩庨檯鍩庝埂閮ㄥ垎锛屽叏閲� 鈮� 鍩庡競鍐咃紙浠呮姹夊叏閲�=鍩庡競鍐咃級锛涘煄甯傚杩愬彛寰勪娇鐢ㄥ悇鍙拌处椤碘�滃叾涓煄甯傚唴鈥濊锛涙湰鏂囩 3銆�4 鑺傚凡鎸夋瘝鐗堝叕寮忎笌 2026-07 瀹為檯鏁版嵁鏍稿鏇存锛堝嚭绉熷叏鐪佸煄涔″樊 509.00銆佺綉绾﹁溅 421.46锛夈��
+
+## 1 鎬讳綋缁撴瀯
+宸ヤ綔绨垮叡 19 椤碉紝鎸夋暟鎹姞宸ョ▼搴﹀垎涓夊眰锛堟湰璇存槑鍙鐩栧彲瑙� 15 椤碉紱涓夊眰鍛藉悕宸叉寜涓氬姟鎻愰棶鏍℃锛夛細
+- 鏈鍥炵瓟锛氬彴璐﹂〉灏辨槸鍒嗘柟寮忕殑鏈堝害鏄庣粏搴曠锛堟寜甯傚窞閫愭湀锛夛紱鍙e緞鍚堟垚椤垫槸璺ㄦ柟寮忓姞鎬婚〉锛屼腑鍙e緞鏄庣粏鏄唬琛紝鍩庡競瀹㈣繍椤靛悓灞炴绫伙紱鎴愬搧椤垫槸鎵�鏈夋渶缁堟姤閫佺増寮忛〉锛屾帓鍚嶅彧鏄叾涓竴绫伙紝杩樺寘鎷眹鎬汇�佸垎鏋愩�佹�诲懆杞噺绛夈��
+
+銆愮 1 灞傦細鍒嗘柟寮忔槑缁嗗彴璐﹂〉锛堟槑缁嗗簳绋匡級銆戠彮绾垮寘杞︺�佸叕浜ゃ�佸嚭绉熴�佺綉绾﹁溅銆佽建閬撹疆娓�
+  - 鎸� 鍏ㄧ渷+17 甯傚窞 閫愭湀瀛� 瀹㈣繍閲忋�佸懆杞噺锛屽苟甯﹀瓙闆嗚锛堝叾涓釜浣� / 鍏朵腑鍩庡競鍐咃級銆�
+
+銆愮 2 灞傦細璺ㄦ柟寮忓彛寰勫悎鎴愰〉銆戝煄甯傚杩愩�佷腑鍙e緞鏄庣粏
+  - 鍩庡競瀹㈣繍锛氬煄甯傚唴鍙e緞姹囨�伙紙鍏氦鍩庡競鍐� + 鍑虹鍩庡競鍐� + 缃戠害杞﹀煄甯傚唴 + 杞ㄩ亾杞浮锛屽叕寮忚绗� 3 鑺傞�愰」寮曠敤鍚勯〉鈥滃叾涓煄甯傚唴鈥濊锛夈��
+  - 涓彛寰勬槑缁嗭細鍩庨檯鍩庝埂鍙e緞姹囨�伙紙鍏矾鐝嚎 + 鍏氦鍩庝埂 + 鍑虹鍩庝埂 + 缃戠害杞﹀煄涔★級锛屾槸涓彛寰勬帓鍚嶃�佷腑鍙e緞鍒嗘瀽鐨勬暟鎹潵婧愩��
+
+銆愮 3 灞傦細鎴愬搧鎶ヨ〃椤点�戝煄甯傛眹鎬汇�佸煄甯傚垎甯傚窞銆佽揣杩愩�佽揣杩愰噺鎺掑悕銆佽揣杩愬懆杞噺鎺掑悕銆佷腑鍙e緞鎺掑悕銆佷腑鍙e緞鍒嗘瀽銆侀亾璺繍杈撳懆杞噺
+  - 鐢辩 1銆�2 灞傛暟鎹眹鎬昏绠楀舰鎴愭渶缁堟姤閫佺増寮忋��
+
+## 2 閫氱敤鐗堝紡锛堝彴璐﹂〉涓庢槑缁嗛〉涓�鑷达級
+- 2026 骞� 1-7 鏈堝�煎垪锛欳銆丒銆丟銆両銆並銆丮銆丱锛堝伓鏁板垪涓哄綋鏈堝悓姣旓級銆�
+- Q 鍒楋細2026 骞� 1-7 鏈堢疮璁★紙C+E+G+I+K+M+O锛屽姞鍒� 7 鏈堬紝宸茬‘璁わ級銆�
+- 鍙充晶 T 璧蜂负 2025 骞� 1-12 鏈堝悓鏈熷潡锛堝�煎垪 T銆乂銆乆銆乑銆丄B銆丄D銆丄F銆丄H銆丄J銆丄L銆丄N銆丄P锛夛紝鍚屾瘮鍏紡褰㈠ D=C/T-1銆�
+- 鍐嶅彸渚у瓨鍦� 2024 骞村強鏇存棭鍙傝�冨垪锛堥儴鍒嗛〉鏈� #REF! 娈嬩綑锛岃绗� 6 鑺傦級銆�
+- 琛岀粨鏋勶細鍏ㄧ渷鍧楀湪鍓嶏紙鍚� 鍏朵腑 琛岋級锛岄殢鍚庢瘡涓競宸炲崰 4 琛岋紙瀹㈣繍閲忋�佸懆杞噺銆佸叾涓杩愰噺銆佸叾涓懆杞噺锛夈��
+
+## 3 鍚勯〉鑱岃矗涓庝富瑕佸彇鏁�
+- 鐝嚎鍖呰溅锛氬叕璺彮绾匡紙鍚寘杞︼級銆傚叏鐪佽 r4/r5 涓哄杩愰噺/鍛ㄨ浆閲忥紙瀹㈣繍閲忓惈涓綋锛屽凡纭锛夛紱r6/r7 涓哄叾涓釜浣撳杩愰噺/鍛ㄨ浆閲忋�傚競宸炶鑷� r8 璧锋瘡 4 琛屼竴鍧椼�傛暟鎹簮锛欻203-1 浼佷笟鏈堟姤 + 涓綋鎴锋湀鎶ャ��
+- 鍏氦锛氭�婚噺琛� r5/r6锛屽叾涓煄甯傚唴 r7/r8锛涘叕浜ゅ煄涔� = 鎬婚噺 - 鍩庡競鍐呫�傛暟鎹簮锛氬煄甯傚叕浜ゆ湀鎶ャ��
+- 鍑虹锛氬贰娓稿嚭绉燂紝缁撴瀯鍚屽叕浜わ細鍏ㄧ渷鍧� r5-r8锛堝杩愰噺/鍛ㄨ浆閲�/鍏朵腑鍩庡競鍐呭杩愰噺/鍏朵腑鍩庡競鍐呭懆杞噺锛夛紝姣忓競宸� 4 琛屼竴鍧楋紙姝︽眽 r9-r12銆侀粍鐭� r13-r16锛屼緷姝ょ被鎺級銆傛�婚噺琛屼笌鈥滃叾涓煄甯傚唴鈥濊骞跺瓨锛屾�婚噺 鈮� 鍩庡競鍐咃紱浠呮姹変袱琛岀浉绛夛紙鍩庝埂宸� 0锛夛紝鍏朵綑甯傚窞瀛樺湪鍩庨檯鍩庝埂宸��2026-07锛氬叏鐪佸嚭绉熷杩愰噺 5860.24 涓囦汉娆°�佸叾涓煄甯傚唴 5351.24銆佸煄闄呭煄涔″樊 509.00锛堟簮=city_taxi_monthly 鐨� passenger_volume/passenger_city锛屽榛勭煶 283.02/258.57锛夈��
+- 缃戠害杞︼細缁撴瀯鍚屽叕浜わ紙鎬婚噺琛�+鍏朵腑鍩庡競鍐呰锛屾瘡甯傚窞 4 琛岋級銆傚叏閲忎笌鍩庡競鍐呮潵鑷�婄綉绾﹁溅瀹㈣繍閲忔媶鍒嗚〃銆嬶細瀹㈣繍閲� C鈫掓�婚噺琛屻�佸煄甯傚唴 H鈫掑叾涓煄甯傚唴琛屻�佸煄闄呭煄涔� I鈫掑煄涔″樊琛屻��2026-07锛氬叏鐪� 4852.30 / 4430.84 / 421.46锛屾姹夋棤鍩庝埂宸紙I=0锛夛紱姣嶇増缃戠害杞﹂〉褰撴湀鍊煎嵆鎷嗗垎缁撴灉锛堝榛勭煶鍩庡競鍐� 140.344963641575锛夈��
+- 杞ㄩ亾杞浮锛氫笂鍗婂潡杞ㄩ亾锛堝叏鐪� r4/r5锛屾姹� r6/r7锛岄粍鐭� r8/r9锛屽叏鐪�=姝︽眽+榛勭煶锛夛紱涓嬪崐鍧楄疆娓★紙鍏ㄧ渷 r13/r14锛屾姹� r15/r16锛屽叏鐪�=姝︽眽锛夈�傞粍鐭冲彧鏈夎建閬撱�佹病鏈夎疆娓★紙宸蹭簩娆$‘璁わ級锛涜疆娓¢〉浠呮姹夎锛堝叏鐪�=姝︽眽锛夛紝鏃犻渶涓洪粍鐭虫墿琛屻��
+- 鍩庡競瀹㈣繍锛氬煄甯傚唴鍙e緞銆傚競宸炶鍏紡绀轰緥锛堟姹夛紝C 鍒�=1 鏈堬級锛欳6=鍏氦!C11+鍑虹!C11+缃戠害杞�!C11+杞ㄩ亾杞浮!C6+杞ㄩ亾杞浮!C15鈥斺�斿叕浜�/鍑虹/缃戠害杞﹀紩鐢ㄧ殑 C11 鍧囦负璇ラ〉鈥滃叾涓煄甯傚唴瀹㈣繍閲忊�濊锛岃建閬撹疆娓″紩杞ㄩ亾鍧� C6 涓庤疆娓″潡 C15锛涘懆杞噺鍚岀悊寮曠敤鍚勯〉鍩庡競鍐呭懆杞噺琛岋紙濡傚嚭绉�!C12锛夈�傚叏鐪佽=鍚勫競宸炴眰鍜屻�傛暟鎹簮=鍏氦鍩庡競鍐�+鍑虹鍩庡競鍐�+缃戠害杞﹀煄甯傚唴+杞ㄩ亾杞浮銆�
+- 涓彛寰勬槑缁嗭細鍩庨檯鍩庝埂鍙e緞銆傞〉鍐呮敞璁帮細涓彛寰�=鍏矾鐝嚎+鍩庨檯鍩庝埂鍏氦+鍩庨檯鍩庝埂鍑虹+鍩庨檯鍩庝埂缃戠害杞︺�傚叕浜�/鍑虹/缃戠害杞﹀煄涔¢儴鍒嗗彇 鍙拌处椤垫�婚噺-鍩庡競鍐� 宸锛堟牎楠屽叕寮� Q1=Q5-(缃戠害杞�!Q5-缃戠害杞�!Q7)-(鍑虹!Q5-鍑虹!Q7)-(鍏氦!Q5-鍏氦!Q7)-鐝嚎鍖呰溅!Q4锛夈��
+- 涓彛寰勬帓鍚嶏細鍦ㄤ腑鍙e緞鎬婚噺锛堟槑缁嗛〉 Q 绱鍙e緞锛変笂鎸夊競宸炴帓鍚嶏紝鍚崰鍏ㄧ渷姣斾緥銆佸悓姣斾笌澧為�熸帓鍚嶃��
+- 涓彛寰勫垎鏋愶細鍏ㄧ渷鍙e緞缁撴瀯鍗犳瘮锛堝 D 鍒�=鍚勫垎椤�/鎬昏鍗犳瘮鍏紡锛夈��
+- 鍩庡競姹囨�伙細鍏ㄧ渷鍩庡競瀹㈣繍鍒嗘柟寮忕疮璁�/褰撴湀涓ゆ锛堟�诲杩愰噺銆佸叕浜ゃ�佸嚭绉熴�佸叾涓贰娓搞�佺綉绾﹁溅銆佽建閬撱�佽疆娓★級锛屽乏鍗� 2026锛屽彸鍗� 2025 鍩烘湡鍙婂悓姣斻��
+- 鍩庡競鍒嗗競宸烇細鍚勫競宸炲煄甯傚杩愭槑缁嗕笌鎺掑悕锛圔=G+L+Q+V+X 涔嬬被缁勫悎鍒楁眰鍜岀粨鏋勶級銆�
+- 璐ц繍銆佽揣杩愰噺鎺掑悕銆佽揣杩愬懆杞噺鎺掑悕锛氳揣杩愬彛寰勫皬琛紙璐ц繍閲�=瑙勪笂+瑙勪笅锛涘懆杞噺=瑙勪笂+瑙勪笅锛夈��
+- 閬撹矾杩愯緭鍛ㄨ浆閲忥細鏈�缁� GDP 鏍哥畻鍙e緞椤点�侭 鍒楀叕寮� B=G+L/2+Q/10锛屽叾涓細
+  - G = 璐ц繍椤佃涓�+瑙勪笅鍛ㄨ浆閲忥紙涓囧惃鍏噷锛夛紱
+  - L = 鍩庡競瀹㈣繍閲忥紙涓囦汉娆★紝鍙栧煄甯傚杩愬彛寰勭疮璁★級锛�
+  - Q = 鍏矾瀹㈣繍鍛ㄨ浆閲忥紙涓囦汉鍏噷锛屽彇涓彛寰勬槑缁嗘�绘梾瀹㈠懆杞噺锛夈��
+  鍙充晶鍙﹀惈鍘诲勾绱瀵圭収锛圴 鍒�=W+X/2+Y/10锛変笌鎺掑悕銆佸崰鍏ㄧ渷姣斾緥銆佸悓姣斻��
+
+## 4 涓変釜鍙e緞鐨勫嬀绋藉叧绯�
+璁炬煇鍒嗘柟寮忥紙鍏氦/鍑虹/缃戠害杞︼級锛�
+- 鍏ㄩ噺 = 鍙拌处椤靛杩愰噺琛岋紱
+- 鍩庡競鍐� = 鍙拌处椤靛叾涓煄甯傚唴琛岋紱
+- 鍩庝埂宸� = 鍏ㄩ噺 - 鍩庡競鍐咃紙鍏矾涓彛寰勪娇鐢級銆�
+鍒欙細
+- 鍩庡競瀹㈣繍鍙e緞 = 鍏氦鍩庡競鍐� + 鍑虹鍩庡競鍐� + 缃戠害杞﹀煄甯傚唴 + 杞ㄩ亾杞浮锛�2026-09-03 淇锛氬嚭绉�/缃戠害杞﹀叏閲� 鈮� 鍩庡競鍐咃紝鍩庡競瀹㈣繍椤靛叕寮忓疄闄呭紩鐢ㄥ悇椤碘�滃叾涓煄甯傚唴鈥濊锛屼笉瀛樺湪鈥滃叏閲忕瓑浠封�濆啓娉曪級銆�
+- 涓彛寰� = 鐝嚎鍖呰溅鍏ㄩ噺锛堝惈涓綋锛� + 鍏氦鍩庝埂宸� + 鍑虹鍩庝埂宸� + 缃戠害杞﹀煄涔″樊銆�
+- 鐝嚎鍖呰溅鍏ㄩ噺 = 鍏朵腑涓綋 + 鍏朵綑浼佷笟閮ㄥ垎锛堜釜浣撳瓙闆嗗叧绯伙紝宸茬‘璁わ級銆�
+
+## 5 鏁版嵁鏉ユ簮涓庣郴缁熸槧灏勶紙寤鸿锛�
+- 鐝嚎鍖呰溅锛歨2031_enterprise_monthly + passenger_individual_monthly锛堝杩愰噺=浼佷笟+涓綋锛屽叾涓釜浣撳崟鐙锛夈��
+- 鍏氦锛歝ity_bus_monthly锛堟敞鎰忓尯鍒嗗煄甯傚唴/鍩庝埂瀛楁鍙e緞锛屽綋鍓嶇郴缁熸寜 passenger_chengxiang 鍙栧煄涔★級銆�
+- 鍑虹锛歝ity_taxi_monthly锛堟�婚噺=passenger_volume 瀹㈣繍閲忚锛屽煄甯傚唴=passenger_city鈥滃叾涓煄甯傚唴鈥濊锛屼笌 U402 涓婃姤鍚屾簮锛夈��
+- 缃戠害杞︼細鎷嗗垎琛ㄨ緭鍑猴紙鎬婚噺琛�=鎷嗗垎瀹㈣繍閲� C銆佸叾涓煄甯傚唴琛�=鎷嗗垎 H銆佸煄涔″樊琛�=鎷嗗垎 I锛涜緭鍏�=閮ㄧ骇璁㈠崟闄勪欢1 17 甯傚窞璁㈠崟 + 鍏ㄧ渷 pin + 宸℃父鍑虹鏈堟姤骞冲潎杩愯窛锛夛紝2026-07 鎷嗗垎缁撴灉宸叉寜姝ゅ彛寰勫~鍒楁瘝鐗堢綉绾﹁溅椤点��
+- 杞ㄩ亾杞浮锛氭姹�/榛勭煶杞ㄩ亾銆佹姹夎疆娓′笓鐢ㄥ鍏ヨ〃銆�
+- 璐ц繍锛歨2032 绛夎涓婅涓嬫媶鍒嗚〃锛堟ā鏉縚璐ц繍閲忓懆杞噺 + 鎷嗗垎琛級銆�
+
+## 6 閬楃暀闂涓庡緟鍔�
+1. #REF! 娈嬩綑锛氬彲瑙侀〉 涓彛寰勬槑缁� AU4/AU97銆佽揣杩� BQ108銆佺彮绾垮寘杞� IJ4/JW4/IJ5/JW5/JF28/JF29锛屽潎鍦ㄨ繙绂� 1-7 鏈堜富鏁版嵁鍖虹殑骞翠唤/杈呭姪鍒椼�備笟鍔$瓟澶嶄负 宸插垹/娓呴櫎锛�2026-09-03 11:01 澶嶆煡鏂囦欢浠嶅瓨鍦級锛屾竻闄ゆ柟寮忓緟鏈�缁堢‘璁わ細绋嬪簭娓呴櫎缃┖锛屾垨浜哄伐澶勭悊銆�
+2. 缃戠害杞︽媶鍒嗗叕寮忔暟鎹簮锛堥儴绾ф�婚噺/璁㈠崟鏁帮級寰呬笟鍔¤ˉ鍏呭悗鍐嶆帴鍏ワ紙鍘熸竻鍗曠 5 鏉★級銆�
+3. 宸蹭簩娆$‘璁ら」锛氶粍鐭虫湁杞ㄩ亾鏃犺疆娓★紱閬撹矾杩愯緭鍛ㄨ浆閲忓悎鎴愬叕寮忔棤璇紱涓夊眰缁撴瀯鍛藉悕瑙佺 1 鑺傘��
+
+## 7 缁撹
+鎸変互涓婇〉绛捐亴璐d笌涓変釜鍙e緞锛堝叏閲�/鍩庡競鍐�/鍩庝埂宸級鍗冲彲澶嶇幇璇ユ眹鎬诲伐浣滅翱鐨勫悎鎴愰�昏緫锛涢殣钘忛〉涓嶅弬涓庢湰娆′氦浠樸��
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
index 6560740..1dc3efa 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
@@ -84,6 +84,22 @@
         return buildResponse(reportService.exportPassengerMidAnalysis(period, mode), "鐢熸垚_鍏矾鏃呭涓彛寰勫垎鏋�.xlsx");
     }
 
+    /** 鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx锛堟眹鎬诲伐浣滅翱 P0-P1 楠ㄦ灦锛氭暣鏈鍒舵瘝鐗堬紝椤电/鍏紡/2025 缂撳瓨淇濈暀锛� */
+    @GetMapping("/export/summaryWorkbook")
+    public ResponseEntity<byte[]> exportSummaryWorkbook(@RequestParam("period") String period,
+                                                        @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception {
+        logExport("閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx", period);
+        return buildResponse(reportService.exportSummaryWorkbook(period, mode), String.format("鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_%s.xlsx", period));
+    }
+
+    /** 鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛�.xlsx锛堟湀搴︼細璁㈠崟闄勪欢1 + 鍏ㄧ渷 pin + 宸℃父鍑虹鏈堟姤锛� */
+    @GetMapping("/export/wycSplit")
+    public ResponseEntity<byte[]> exportWycSplit(@RequestParam("period") String period,
+                                                 @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception {
+        logExport("鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛�.xlsx", period);
+        return buildResponse(reportService.exportWycSplit(period, mode), String.format("鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛╛%s.xlsx", period));
+    }
+
     /** 鐢熸垚_鑳借繍姹囨�昏〃.xlsx锛圚204锛屽叏鐪� + 鍚勫競宸� sheet锛� */
     @GetMapping("/export/energySummary")
     public ResponseEntity<byte[]> exportEnergySummary(@RequestParam("period") String period) throws Exception {
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 c1c3bd1..b52289d 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
@@ -107,6 +107,10 @@
     @Value("${passenger.template-dir:docs/鍏矾鏃呭+鑳借��/杈撳嚭}")
     private String passengerTemplateDir;
 
+    /** 姹囨�诲伐浣滅翱妯℃澘鐩綍锛坅pplication.yml summary.template-dir锛� */
+    @Value("${summary.template-dir:docs/鐢熸垚姹囨�诲ぇ琛▆")
+    private String summaryTemplateDir;
+
     /** 璐ц繍鎶ヨ〃妯℃澘鐩綍锛坅pplication.yml freight.template-dir锛� */
     @Value("${freight.template-dir:docs/璐ц繍}")
     private String freightTemplateDir;
@@ -171,6 +175,43 @@
                     rows = addReadyCount(() -> energyMapper.selectCount(periodQw(period, mode, EnergyVehicleQuarterly::getReportPeriod)), "鑳借�楄溅杈嗗搴︽暟鎹�", notes);
                     auditTypes.add("H204");
                     break;
+                case "wycSplit": {
+                    rows = addReadyCount(() -> cityTaxiMapper.selectCount(periodQw(period, mode, CityTaxiMonthly::getReportPeriod)), "宸℃父鍑虹鏈堟姤", notes);
+                    try {
+                        Map<String, Object> inp = loadWycMonthlyInput(period, mode);
+                        if (inp == null) {
+                            rows = 0;
+                            notes.add("銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬬己 " + period + " 琛岋紙闇�鍏堢淮鎶ゅ綋鏈堣鍗曚笌鍏ㄧ渷 pin锛�");
+                        } else {
+                            double pinK = (Double) inp.get("pinK"), pinCK = (Double) inp.get("pinCK");
+                            double pinZ = (Double) inp.get("pinZ"), pinCZ = (Double) inp.get("pinCZ");
+                            double orderSum = (Double) inp.get("orderSum");
+                            if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0 || orderSum <= 0) {
+                                rows = 0;
+                                notes.add("缃戠害杞﹁緭鍏� " + period + " 琛屼笉瀹屾暣锛堣鍗�/鍏ㄧ渷 pin 缂哄け锛�");
+                            }
+                        }
+                    } catch (Exception ex) {
+                        rows = 0;
+                        notes.add("缃戠害杞﹁緭鍏ヨ鍙栧け璐ワ細" + ex.getMessage());
+                    }
+                    break;
+                }
+                case "summaryWorkbook": {
+                    rows = addReadyCount(() -> cityTaxiMapper.selectCount(periodQw(period, mode, CityTaxiMonthly::getReportPeriod)), "宸℃父鍑虹鏈堟姤", notes)
+                         + addReadyCount(() -> cityBusMapper.selectCount(periodQw(period, mode, CityBusMonthly::getReportPeriod)), "鍩庡競鍏氦鏈堟姤", notes);
+                    if (rows <= 0) notes.add("姹囨�昏〃渚濊禆鐨勫叕浜�/鍑虹鏈堟姤鏁版嵁缂哄け");
+                    try {
+                        if (resolveSummaryMother(period, mode) == null) {
+                            rows = 0;
+                            notes.add("docs/鐢熸垚姹囨�诲ぇ琛� 涓嬬己灏戝彲澶嶅埗鐨勬瘝鐗堟眹鎬昏〃");
+                        }
+                    } catch (Exception ex) {
+                        rows = 0;
+                        notes.add("姣嶇増瀹氫綅澶辫触锛�" + ex.getMessage());
+                    }
+                    break;
+                }
                 default:
                     rows = 0;
                     notes.add("鏈煡鎶ヨ〃绫诲瀷锛�" + t);
@@ -181,6 +222,7 @@
                 auditRows += auditRowsOf(period, mode, at);
                 audited = audited || auditedMarked(period, mode, at);
             }
+            if (auditTypes.isEmpty()) audited = true;
             it.put("rows", rows);
             it.put("ready", rows > 0);
             it.put("auditRows", auditRows);
@@ -212,7 +254,8 @@
         for (String t : types) {
             if (isFreightType(t)) freight = true;
             else if (isPassengerType(t)) passenger = true;
-            else if ("cityTaxiDetail".equals(t) || isCityPassengerType(t)) { cityTaxi = true; cityBus = true; }
+            else if ("cityTaxiDetail".equals(t) || "wycSplit".equals(t)) { cityTaxi = true; }
+            else if (isCityPassengerType(t) || "summaryWorkbook".equals(t)) { cityTaxi = true; cityBus = true; }
             else if (isInvestType(t)) invest = true;
             else if ("energySummary".equals(t)) energy = true;
         }
@@ -256,7 +299,51 @@
             List<Integer> missing = new ArrayList<>();
             List<Integer> coverage = new ArrayList<>();
             if (Boolean.FALSE.equals(it.get("audited"))) problems.add("璇ユ姤琛ㄦ湡灏氭湭瀹℃牳閫氳繃");
-            if (isFreightType(t)) {
+            if ("wycSplit".equals(t)) {
+                coverage.addAll(taxiCover);
+                missing = missingMonths(taxiCover, month);
+                try {
+                    Map<String, Object> inp = loadWycMonthlyInput(period, mode);
+                    if (inp == null) {
+                        problems.add("缂虹綉绾﹁溅杈撳叆锛氳鍦ㄣ�婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬭ˉ " + period + " 琛�");
+                    } else {
+                        double pinK = (Double) inp.get("pinK"), pinCK = (Double) inp.get("pinCK");
+                        double pinZ = (Double) inp.get("pinZ"), pinCZ = (Double) inp.get("pinCZ");
+                        double orderSum = (Double) inp.get("orderSum");
+                        if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0 || orderSum <= 0) {
+                            problems.add("缃戠害杞﹁緭鍏� " + period + " 琛屼笉瀹屾暣锛堣鍗�/鍏ㄧ渷 pin 缂哄け锛�");
+                        } else {
+                            addSum(summary, "鍏ㄧ渷缃戠害杞﹀杩愰噺", pinK, "涓囦汉");
+                            addSum(summary, "鍏朵腑鍩庡競鍐呭杩愰噺", pinCK, "涓囦汉");
+                            addSum(summary, "鍏ㄧ渷缃戠害杞﹀懆杞噺", pinZ, "涓囦汉鍏噷");
+                            addSum(summary, "鍏朵腑鍩庡競鍐呭懆杞噺", pinCZ, "涓囦汉鍏噷");
+                            addSum(summary, "閮ㄧ骇璁㈠崟鍚堣", orderSum, "鍗�");
+                        }
+                    }
+                } catch (Exception ex) {
+                    problems.add("缃戠害杞﹁緭鍏ヨ鍙栧け璐ワ細" + ex.getMessage());
+                }
+            } else if ("summaryWorkbook".equals(t)) {
+                java.util.Set<Integer> cov = new java.util.TreeSet<>();
+                cov.addAll(busCover);
+                cov.addAll(taxiCover);
+                coverage.addAll(cov);
+                missing = missingMonths(cov, month);
+                try {
+                    if (resolveSummaryMother(period, mode) == null) {
+                        problems.add("docs/鐢熸垚姹囨�诲ぇ琛� 涓嬬己灏戝彲澶嶅埗鐨勬瘝鐗堟眹鎬昏〃");
+                    } else {
+                        Map<Integer, Map<String, double[]>> busM = loadCityBusByMonth(yearPrefix, month);
+                        Map<Integer, Map<String, double[]>> taxiM = loadCityTaxiByMonth(yearPrefix, month);
+                        Map<String, double[]> bc = busM.get(month);
+                        Map<String, double[]> tc = taxiM.get(month);
+                        if (bc != null && bc.get("鍏ㄧ渷") != null) addSum(summary, "鍩庡競鍏氦瀹㈣繍閲忥紙鍏ㄧ渷褰撴湀锛�", bc.get("鍏ㄧ渷")[0], "涓囦汉");
+                        if (tc != null && tc.get("鍏ㄧ渷") != null) addSum(summary, "宸℃父鍑虹瀹㈣繍閲忥紙鍏ㄧ渷褰撴湀锛�", tc.get("鍏ㄧ渷")[0], "涓囦汉");
+                    }
+                } catch (Exception ex) {
+                    problems.add(ex.getMessage());
+                }
+            } else if (isFreightType(t)) {
                 coverage.addAll(freightCover);
                 missing = missingMonths(freightCover, month);
                 freightPreview(period, month, summary, problems);
@@ -954,14 +1041,15 @@
         return org.apache.poi.ss.util.CellReference.convertNumToColString(colIdx);
     }
 
-    /** 鏃呭鍒嗗競宸炴湀鍊硷紙0=瀹㈣繍閲�/1=鍛ㄨ浆閲�/2=涓綋瀹㈣繍閲�/3=涓綋鍛ㄨ浆閲忥級 */
+    /** 鏃呭鍒嗗競宸炴湀鍊硷紙0=瀹㈣繍閲�/1=鍛ㄨ浆閲�/2=涓綋瀹㈣繍閲�/3=涓綋鍛ㄨ浆閲忥紱0/1=浼佷笟H2031+涓綋锛�2026-09-03 鍙e緞纭锛� */
     private double passengerMonthVal(Map<Integer, Map<String, PassengerAgg>> data, Map<Integer, Map<String, double[]>> indi,
                                      int year, int month, String region, int metricIdx) {
-        if (metricIdx <= 1) {
+        if (metricIdx == 0 || metricIdx == 1) { // 瀹㈣繍閲�/鍛ㄨ浆閲忔�昏锛氫紒涓�+涓綋
             PassengerAgg agg = aggOf(data, year, month, region);
-            Double val = agg == null ? null
+            double ent = agg == null ? 0.0
                 : (metricIdx == 0 ? agg.passengerTotal / 10000.0 : agg.turnoverTotal / 10000.0);
-            return val == null ? 0.0 : val;
+            double ind = individualVal(indi, year, month, region, metricIdx == 0 ? 0 : 1);
+            return ent + ind;
         }
         return individualVal(indi, year, month, region, metricIdx - 2);
     }
@@ -2106,7 +2194,7 @@
 
     /**
      * 涓彛寰勫垎绫绘湀搴︽暟鎹細骞�*100+鏈� -> (甯傚窞/鍏ㄧ渷 -> double[5][2])
-     * 缁村害 0=鎬婚噺 1=鍏矾鐝嚎(h2031) 2=鍩庨檯鍩庝埂鍏氦(cityBus) 3=宸℃父鍑虹 4=缃戠害杞︼紱[瀹㈣繍閲�(涓囦汉), 鍛ㄨ浆閲�(涓囦汉鍏噷)]
+     * 缁村害 0=鎬婚噺 1=鍏矾鐝嚎(h2031+涓綋) 2=鍩庨檯鍩庝埂鍏氦(cityBus) 3=宸℃父鍑虹 4=缃戠害杞︼紱[瀹㈣繍閲�(涓囦汉), 鍛ㄨ浆閲�(涓囦汉鍏噷)]
      */
     private Map<Integer, Map<String, double[][]>> loadMidClassMap() {
         Map<Integer, Map<String, double[][]>> mid = new HashMap<>();
@@ -2128,6 +2216,25 @@
                 + nz(e.getPassengerClass4()) + nz(e.getPassengerCharter())) / 10000.0;
             double turn = (nz(e.getTurnoverClass1()) + nz(e.getTurnoverClass2()) + nz(e.getTurnoverClass3())
                 + nz(e.getTurnoverClass4()) + nz(e.getTurnoverCharter())) / 10000.0;
+            addMidClass(mid, key, city, 1, pass, turn);
+            addMidClass(mid, key, "婀栧寳鐪�", 1, pass, turn);
+        }
+        for (PassengerIndividualMonthly e : passengerIndividualMapper.selectList(null)) { // 涓綋骞跺叆鍏矾鐝嚎/鎬婚噺锛�09-03 鍙e緞锛�
+            if (e.getReportPeriod() == null) continue;
+            String[] parts = e.getReportPeriod().split("-");
+            if (parts.length != 2) continue;
+            int y, m;
+            try {
+                y = Integer.parseInt(parts[0]);
+                m = Integer.parseInt(parts[1]);
+            } catch (NumberFormatException ex) {
+                continue;
+            }
+            String city = RegionUtil.cityByCode(e.getRegionCode());
+            if (city == null) continue;
+            int key = y * 100 + m;
+            double pass = nz(e.getPassengerCount()) / 10000.0;
+            double turn = nz(e.getTurnover()) / 10000.0;
             addMidClass(mid, key, city, 1, pass, turn);
             addMidClass(mid, key, "婀栧寳鐪�", 1, pass, turn);
         }
@@ -3087,6 +3194,307 @@
         return bos.toByteArray();
     }
 
+    /**
+     * 鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx锛圥0-P1 楠ㄦ灦锛夛細鏁存湰澶嶅埗姣嶇増銆奩YYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬶紝
+     * 淇濈暀鍏ㄩ儴椤电/鐗堝紡/鍏紡/2025 骞寸紦瀛樺�硷紝浠呮妸琛ㄥご骞翠唤鍔ㄦ�佸寲涓虹洰鏍囧勾锛涙暟鎹~鍏呮寜 P2 璧烽�愭鎺ュ叆銆�
+     */
+    public byte[] exportSummaryWorkbook(String period, String mode) 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);
+        if (template == null) {
+            throw new RuntimeException("鏈壘鍒版眹鎬昏〃姣嶇増銆�" + year + "骞�" + month + "鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬶紙docs/鐢熸垚姹囨�诲ぇ琛級");
+        }
+        try (InputStream in = new FileInputStream(template);
+             XSSFWorkbook wb = new XSSFWorkbook(in)) {
+            dynamicSummaryYear(wb, year);
+            return toBytes(wb);
+        }
+    }
+
+    /** 姹囨�昏〃姣嶇増瀹氫綅锛氫粎绮剧‘鍖归厤 {year}骞磠month}鏈堚�︼紙P0-P1 楠ㄦ灦鏈熶笉鍏佽璺ㄦ湀/璺ㄥ勾闈欓粯鍥為��锛�
+     *  鐩爣鏈熸棤瀵瑰簲姣嶇増鏃舵槑纭姤閿欙紝鏈堜唤鎵╁睍瑙勫垯寰� P0 姣嶇増瀹氱鍚庡啀鏀惧紑锛� */
+    private File resolveSummaryMother(String period, String mode) throws Exception {
+        String year = period != null && period.contains("-") ? period.split("-")[0] : (period == null ? "" : period);
+        int month = period != null && period.contains("-") ? monthOf(period, mode) : 12;
+        String name = year + "骞�" + month + "鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx";
+        return resolveAnyTemplate(summaryTemplateDir, name);
+    }
+
+    // ==================== 缃戠害杞﹀杩愰噺鎷嗗垎琛紙鏈堝害锛� ====================
+
+    /** 缃戠害杞﹀杩愰噺鎷嗗垎琛細杈撳叆=閮ㄧ骇璁㈠崟锛堢綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx G-W锛�+ 鍏ㄧ渷 pin锛圔-E锛�+ 宸℃父鍑虹鏈堟姤锛圖B锛夛紱
+     *  绠楁硶涓庛�婄綉绾﹁溅鎷嗗垎.xlsx銆嬫湀椤典竴鑷达細瀹㈣繍閲�=璁㈠崟鍗犳瘮脳鍏ㄧ渷鎬婚噺锛涘煄甯傚唴=宸℃父鍑虹鍩庡競鍐呭崰姣斾唬鐞嗐�佹姹変繚鎸佽嚜韬叾浣欐寜鍓╀綑鍒嗘憡锛�
+     *  鍛ㄨ浆閲�=瀹㈣繍閲徝楀贰娓稿嚭绉熷钩鍧囪繍璺濆崰姣斿垎鎽婂叏鐪佸懆杞噺 pin锛屽煄甯傚唴鍛ㄨ浆閲忓悓娉曘�� */
+    public byte[] exportWycSplit(String period, String mode) throws Exception {
+        if (period == null || !period.contains("-")) {
+            throw new RuntimeException("缃戠害杞﹀杩愰噺鎷嗗垎琛ㄤ粎鏀寔鎸夋湀鐢熸垚锛岃閫夋嫨鍏蜂綋鏈堜唤");
+        }
+        int year = Integer.parseInt(period.split("-")[0]);
+        int month = parseMonth(period);
+        Map<String, Object> inp = loadWycMonthlyInput(period, mode);
+        if (inp == null) {
+            throw new RuntimeException("銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬬己灏戞姤琛ㄦ湡 " + period + " 鐨勬暟鎹锛岃鍏堢淮鎶ゅ綋鏈堣鍗曚笌鍏ㄧ渷 pin");
+        }
+        double pinK = (Double) inp.get("pinK");
+        double pinCK = (Double) inp.get("pinCK");
+        double pinZ = (Double) inp.get("pinZ");
+        double pinCZ = (Double) inp.get("pinCZ");
+        double orderSum = (Double) inp.get("orderSum");
+        double[] orderArr = (double[]) inp.get("orders");
+        if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0 || orderSum <= 0) {
+            throw new RuntimeException("缃戠害杞﹁緭鍏� " + period + " 琛屼笉瀹屾暣锛氬叏鐪� pin / 璁㈠崟缂哄け锛岃鏍稿銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆�");
+        }
+        List<String> cities = RegionUtil.cityList();
+        int n = cities.size();
+        if (orderArr == null || orderArr.length < n) {
+            throw new RuntimeException("缃戠害杞﹁鍗曞垪鏁颁笉瓒筹紙搴斾负 17 甯傚窞璁㈠崟鍒楋級");
+        }
+        Map<String, double[]> taxi = taxiMonthlyOf(period);
+        java.util.List<String> missingTaxi = new java.util.ArrayList<>();
+        double[] Dtax = new double[n];
+        double[] Etax = new double[n];
+        double[] avgD = new double[n];
+        double[] avgDc = new double[n];
+        for (int i = 0; i < n; i++) {
+            double[] a = taxi.get(cities.get(i));
+            if (a == null || a[0] <= 0) {
+                missingTaxi.add(cities.get(i));
+                continue;
+            }
+            Dtax[i] = a[0];
+            Etax[i] = a[2];
+            avgD[i] = a[4];
+            avgDc[i] = a[5];
+        }
+        if (!missingTaxi.isEmpty()) {
+            throw new RuntimeException("宸℃父鍑虹鏈堟姤缂哄皯浠ヤ笅甯傚窞鏁版嵁锛�" + String.join("銆�", missingTaxi));
+        }
+        double[] C = new double[n];
+        double[] H = new double[n];
+        double[] I = new double[n];
+        double[] Gl = new double[n];
+        double[] Hl = new double[n];
+        double[] Il = new double[n];
+        double sumG = 0;
+        double sumDl = 0;
+        double sumEl = 0;
+        for (int i = 0; i < n; i++) {
+            C[i] = orderArr[i] / orderSum * pinK;
+            double F = Etax[i] / Dtax[i];
+            double G = C[i] * F;
+            sumG += G;
+            double Dl = C[i] * avgD[i];
+            double El = H[i] * avgDc[i];
+            sumDl += Dl;
+            sumEl += El;
+        }
+        // 鍩庡競鍐咃細姝︽眽淇濇寔鑷韩锛屽叾浣欐寜 G 鍓╀綑鍗犳瘮鍒嗘憡鑷冲叏鐪佸煄甯傚唴 pin
+        for (int i = 0; i < n; i++) {
+            if (i == 0) {
+                H[i] = C[i] * (Etax[i] / Dtax[i]);
+            } else {
+                H[i] = (C[i] * (Etax[i] / Dtax[i])) / (sumG - C[0] * (Etax[0] / Dtax[0])) * (pinCK - C[0] * (Etax[0] / Dtax[0]));
+            }
+            I[i] = C[i] - H[i];
+        }
+        // 鍛ㄨ浆閲忥細鎸� 瀹㈣繍閲徝楀贰娓稿嚭绉熷钩鍧囪繍璺� 鍗犳瘮鍒嗘憡鍏ㄧ渷鍛ㄨ浆閲� pin
+        double whG = C[0] * (Etax[0] / Dtax[0]);
+        double whDl = C[0] * avgD[0];
+        double[] El2 = new double[n];
+        double sumEl2 = 0;
+        for (int i = 0; i < n; i++) {
+            double Dl = C[i] * avgD[i];
+            double El2v = H[i] * avgDc[i];
+            El2[i] = El2v;
+            sumEl2 += El2v;
+            Gl[i] = Dl / sumDl * pinZ;
+        }
+        for (int i = 0; i < n; i++) {
+            if (i == 0) {
+                Hl[i] = Gl[i];
+            } else {
+                Hl[i] = El2[i] / (sumEl2 - El2[0]) * (pinCZ - Gl[0]);
+            }
+            Il[i] = Gl[i] - Hl[i];
+        }
+        return writeWycSplitWorkbook(period, cities, orderArr, C, Dtax, Etax, H, I, avgD, avgDc, Gl, Hl, Il, pinK, pinCK, pinZ, pinCZ, orderSum);
+    }
+
+    private byte[] writeWycSplitWorkbook(String period, List<String> cities, double[] orders, double[] C, double[] Dtax,
+                                         double[] Etax, double[] H, double[] I, double[] avgD, double[] avgDc,
+                                         double[] Gl, double[] Hl, double[] Il,
+                                         double pinK, double pinCK, double pinZ, double pinCZ, double orderSum) throws Exception {
+        XSSFWorkbook wb = new XSSFWorkbook();
+        XSSFSheet sh = wb.createSheet(period + "鎷嗗垎");
+        int n = cities.size();
+        // 瀹㈣繍閲忓潡
+        Row t = sh.createRow(0);
+        t.createCell(0).setCellValue("缃戠害杞﹀杩愰噺鎷嗗垎锛堜竾浜猴級  鎶ヨ〃鏈燂細" + period);
+        String[] head1 = {"甯傚窞", "璁㈠崟鎬绘暟锛堝崟锛�", "缃戠害杞﹀杩愰噺锛堜竾浜猴級", "宸℃父鍑虹瀹㈣繍閲忥紙涓囦汉锛�", "宸℃父鍑虹鍩庡競鍐呭杩愰噺锛堜竾浜猴級", "鍩庡競鍐呭崰姣�", "缃戠害杞﹀煄甯傚唴瀹㈣繍閲忥紙涓囦汉锛�", "缃戠害杞﹀煄闄呭煄涔″杩愰噺锛堜竾浜猴級"};
+        Row h1 = sh.createRow(1);
+        for (int j = 0; j < head1.length; j++) h1.createCell(j).setCellValue(head1[j]);
+        int r = 2;
+        writeWycRow(sh, r++, "鍏ㄧ渷", orderSum, pinK, sum(Dtax), sum(Etax), pinK > 0 ? pinCK / pinK : 0, pinCK, pinK - pinCK);
+        for (int i = 0; i < n; i++) {
+            writeWycRow(sh, r++, cities.get(i), orders[i], C[i], Dtax[i], Etax[i], Dtax[i] > 0 ? Etax[i] / Dtax[i] : 0, H[i], I[i]);
+        }
+        r += 1;
+        Row t2 = sh.createRow(r++);
+        t2.createCell(0).setCellValue("鏃呭鍛ㄨ浆閲忔媶鍒嗭紙涓囦汉鍏噷锛�");
+        String[] head2 = {"甯傚窞", "鍑虹杞﹀钩鍧囪繍璺濓紙鍏噷锛�", "鍑虹杞﹀煄甯傚唴骞冲潎杩愯窛锛堝叕閲岋級", "缃戠害杞︽梾瀹㈠懆杞噺锛堜竾浜哄叕閲岋級", "缃戠害杞﹀煄甯傚唴鏃呭鍛ㄨ浆閲忥紙涓囦汉鍏噷锛�", "缃戠害杞﹀煄闄呭煄涔℃梾瀹㈠懆杞噺锛堜竾浜哄叕閲岋級"};
+        Row h2 = sh.createRow(r++);
+        for (int j = 0; j < head2.length; j++) h2.createCell(j).setCellValue(head2[j]);
+        writeWycRow2(sh, r++, "鍏ㄧ渷", 0, 0, pinZ, pinCZ, pinZ - pinCZ);
+        for (int i = 0; i < n; i++) {
+            writeWycRow2(sh, r++, cities.get(i), avgD[i], avgDc[i], Gl[i], Hl[i], Il[i]);
+        }
+        r += 1;
+        String[] notes = {
+            "娉細1) 瀹㈣繍閲� C = 璁㈠崟鍗犳瘮 脳 鍏ㄧ渷缃戠害杞﹀杩愰噺锛涘煄甯傚唴 H锛氭姹�=鑷韩锛屽叾浣欐寜 G 鍓╀綑鍗犳瘮鍒嗘憡鑷冲叏鐪佸煄甯傚唴 pin锛涘煄闄呭煄涔� = 鎬婚噺 - 鍩庡競鍐呫��",
+            "    2) 鍛ㄨ浆閲� G = 瀹㈣繍閲� 脳 宸℃父鍑虹骞冲潎杩愯窛 鐨勫崰姣� 脳 鍏ㄧ渷缃戠害杞﹀懆杞噺 pin锛涘煄甯傚唴鍛ㄨ浆閲忓悓娉曪紙鐢ㄥ煄甯傚唴骞冲潎杩愯窛锛夈��",
+            "    3) 杈撳叆锛氳鍗� = 褰撴湀鍒嗘瀽鎶ュ憡闄勪欢1锛�17 甯傚窞璁㈠崟鏁帮級锛涘叏鐪� pin = 缃戠害杞︽�绘暟.xlsx锛涘贰娓稿嚭绉� = 宸℃父鍑虹鏈堟姤锛堢郴缁熷鍏ワ紝鍚钩鍧囪繍璺濓級銆�",
+            "    4) 姝︽眽鏃犲煄闄呭煄涔★紱鏁板�间繚鐣欏叏绮惧害锛岀晫闈�/鏂囦欢鏄剧ず涓や綅灏忔暟銆�"
+        };
+        for (String nt : notes) {
+            Row nr = sh.createRow(r++);
+            nr.createCell(0).setCellValue(nt);
+        }
+        for (int j = 0; j < 8; j++) sh.setColumnWidth(j, 18 * 256);
+        return toBytes(wb);
+    }
+
+    private void writeWycRow(Sheet sh, int r, String name, double ord, double k, double dt, double et, double f, double h, double i) {
+        Row row = sh.createRow(r);
+        row.createCell(0).setCellValue(name);
+        row.createCell(1).setCellValue(ord);
+        row.createCell(2).setCellValue(k);
+        row.createCell(3).setCellValue(dt);
+        row.createCell(4).setCellValue(et);
+        row.createCell(5).setCellValue(f);
+        row.createCell(6).setCellValue(h);
+        row.createCell(7).setCellValue(i);
+    }
+
+    private void writeWycRow2(Sheet sh, int r, String name, double ad, double adc, double g, double h, double i) {
+        Row row = sh.createRow(r);
+        row.createCell(0).setCellValue(name);
+        row.createCell(1).setCellValue(ad);
+        row.createCell(2).setCellValue(adc);
+        row.createCell(3).setCellValue(g);
+        row.createCell(4).setCellValue(h);
+        row.createCell(5).setCellValue(i);
+    }
+
+    private double sum(double[] a) {
+        double s = 0;
+        for (double v : a) s += v;
+        return s;
+    }
+
+    /** 璇诲彇 docs/鍩庡競瀹㈣繍/缃戠害杞﹁鍗曞強鍏ㄧ渷鎬婚噺.xlsx锛氭寜 period(yyyy-MM) 琛屽彇 pin(B-E) 涓� 17 甯傚窞璁㈠崟(G-W) */
+    private Map<String, Object> loadWycMonthlyInput(String period, String mode) throws Exception {
+        String target = period;
+        File f;
+        try {
+            f = resolveAnyTemplate(templateDir, "缃戠害杞﹁鍗曞強鍏ㄧ渷鎬婚噺.xlsx");
+        } catch (Exception e) {
+            throw new RuntimeException("鏈壘鍒般�婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬶紝璇锋斁鍒� docs/鍩庡競瀹㈣繍 鐩綍");
+        }
+        try (InputStream in = new FileInputStream(f);
+             org.apache.poi.ss.usermodel.Workbook wb = org.apache.poi.ss.usermodel.WorkbookFactory.create(in)) {
+            org.apache.poi.ss.usermodel.Sheet sh = wb.getSheetAt(0);
+            org.apache.poi.ss.usermodel.DataFormatter df = new org.apache.poi.ss.usermodel.DataFormatter();
+            List<String> cities = RegionUtil.cityList();
+            int n = cities.size();
+            for (int i = 1; i <= sh.getLastRowNum(); i++) {
+                Row row = sh.getRow(i);
+                if (row == null) continue;
+                Cell c0 = row.getCell(0);
+                if (c0 == null) continue;
+                String m = df.formatCellValue(c0).trim();
+                if (m == null || m.isEmpty()) continue;
+                if (m.length() > 7) m = m.substring(0, 7);
+                if (!target.equals(m)) continue;
+                Map<String, Object> map = new HashMap<>();
+                map.put("pinK", cellNum(row, 1, df, 0.0));
+                map.put("pinCK", cellNum(row, 2, df, 0.0));
+                map.put("pinZ", cellNum(row, 3, df, 0.0));
+                map.put("pinCZ", cellNum(row, 4, df, 0.0));
+                double[] orders = new double[n];
+                double orderSum = 0;
+                for (int k = 0; k < n; k++) {
+                    orders[k] = cellNum(row, 6 + k, df, 0.0);
+                    orderSum += orders[k];
+                }
+                if (orderSum <= 0) {
+                    orderSum = cellNum(row, 5, df, 0.0); // F 鍒楀悎璁″厹搴�
+                }
+                map.put("orders", orders);
+                map.put("orderSum", orderSum);
+                return map;
+            }
+            return null;
+        }
+    }
+
+    private double cellNum(Row row, int idx, org.apache.poi.ss.usermodel.DataFormatter df, double def) {
+        Cell c = row.getCell(idx);
+        if (c == null) return def;
+        if (c.getCellType() == CellType.NUMERIC) return c.getNumericCellValue();
+        String s = df.formatCellValue(c).replace(",", "").trim();
+        if (s == null || s.isEmpty()) return def;
+        try {
+            return Double.parseDouble(s);
+        } catch (Exception e) {
+            return def;
+        }
+    }
+
+    /** 宸℃父鍑虹鏈堟姤锛圖B锛夋寜鏈堝姞杞斤細甯傚窞 -> [瀹㈣繍閲�, 鍛ㄨ浆閲�, 鍩庡競鍐呭杩愰噺, 鍩庡競鍐呭懆杞噺, 骞冲潎杩愯窛, 鍩庡競鍐呭钩鍧囪繍璺漖 */
+    private Map<String, double[]> taxiMonthlyOf(String period) {
+        Map<String, double[]> map = new java.util.LinkedHashMap<>();
+        List<CityTaxiMonthly> rows = cityTaxiMapper.selectList(
+            new LambdaQueryWrapper<CityTaxiMonthly>().eq(CityTaxiMonthly::getReportPeriod, period));
+        for (CityTaxiMonthly r : rows) {
+            String city = RegionUtil.normalizeCityName(r.getCity());
+            if (city == null || city.isEmpty()) city = "鏈煡";
+            double[] a = map.computeIfAbsent(city, k -> new double[6]);
+            a[0] += nz(r.getPassengerVolume());
+            a[1] += nz(r.getTurnover());
+            a[2] += nz(r.getPassengerCity());
+            a[3] += nz(r.getTurnoverCity());
+            if (r.getAvgDistance() != null && r.getAvgDistance() > 0) a[4] = r.getAvgDistance();
+            if (r.getAvgDistanceCity() != null && r.getAvgDistanceCity() > 0) a[5] = r.getAvgDistanceCity();
+        }
+        for (double[] a : map.values()) {
+            if (a[4] <= 0 && a[0] > 0) a[4] = round(a[1] / a[0], 2);
+            if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2);
+        }
+        return map;
+    }
+
+    /** 姹囨�诲伐浣滅翱骞翠唤鍔ㄦ�佸寲锛氫粎鎶� 2026骞� 鍓嶇紑鏇挎崲涓虹洰鏍囧勾锛�2025/2024 鍙傝�冨垪涓嶅姩锛� */
+    private void dynamicSummaryYear(XSSFWorkbook wb, int year) {
+        String oldPrefix = "2026骞�";
+        String newPrefix = year + "骞�";
+        if (oldPrefix.equals(newPrefix)) return;
+        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
+            Sheet sh = wb.getSheetAt(i);
+            if (sh == null) continue;
+            for (Row row : sh) {
+                if (row == null) continue;
+                for (Cell c : row) {
+                    if (c == null || c.getCellType() != CellType.STRING) continue;
+                    String v = c.getStringCellValue();
+                    if (v != null && v.contains(oldPrefix)) {
+                        c.setCellValue(v.replace(oldPrefix, newPrefix));
+                    }
+                }
+            }
+        }
+    }
+
     /** 鐢熸垚_鎶曡祫鎶ヨ〃绯诲垪.zip锛氶瀹夋帓 + 鍗佷簲浜� + 浜垮厓 + 缁忔祹寮哄幙 */
     public byte[] exportInvestSeries(String period, String mode) throws Exception {
         java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
@@ -3127,6 +3535,7 @@
             case "passengerMidDetail": return exportPassengerMidDetail(period, mode);
             case "passengerMidRank": return exportPassengerMidRank(period, mode);
             case "passengerMidAnalysis": return exportPassengerMidAnalysis(period, mode);
+            case "summaryWorkbook": return exportSummaryWorkbook(period, mode);
             case "energySummary": return exportEnergySummary(period);
             case "investPlan": return investPlan(period, mode);
             case "investFiveYearLogistics": return investFiveYearLogistics(period, mode);
@@ -3138,6 +3547,7 @@
             case "cityPassengerCitySum": return exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", period, mode);
             case "cityPassengerDetailSum": return exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode);
             case "cityPassengerSummary": return exportCityPassengerSummary(period, mode);
+            case "wycSplit": return exportWycSplit(period, mode);
             default: return null;
         }
     }
@@ -3162,6 +3572,8 @@
         REPORT_FILE_NAMES.put("cityPassengerCitySum", "鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx");
         REPORT_FILE_NAMES.put("cityPassengerDetailSum", "鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx");
         REPORT_FILE_NAMES.put("cityPassengerSummary", "鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx");
+        REPORT_FILE_NAMES.put("summaryWorkbook", "鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx");
+        REPORT_FILE_NAMES.put("wycSplit", "鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛�.xlsx");
     }
 
     private void addZipEntry(java.util.zip.ZipOutputStream zos, String name, byte[] data) throws Exception {
@@ -3412,6 +3824,7 @@
     }
 
     private byte[] toBytesHssf(HSSFWorkbook wb) throws Exception {
+        applyTwoDecimalFormat(wb);
         try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
             wb.write(out);
             wb.close();
@@ -4145,7 +4558,45 @@
     private double nz(Double v) {
         return v == null ? 0.0 : v;
     }
+    /** 鐢熸垚琛ㄦ暟鍊煎垪缁熶竴鏍峰紡锛氫繚鐣欏叏绮惧害鏁板�硷紝鏄剧ず涓や綅灏忔暟锛涙暣鏁板�间笌 %/鏃ユ湡/绉戝璁℃暟绛夋棦鏈夋牱寮忎笉鏀瑰彉 */
+    private void applyTwoDecimalFormat(org.apache.poi.ss.usermodel.Workbook wb) {
+        if (wb == null) return;
+        org.apache.poi.ss.usermodel.DataFormat df = wb.createDataFormat();
+        short fmtTwo = df.getFormat("0.00");
+        for (int s = 0; s < wb.getNumberOfSheets(); s++) {
+            org.apache.poi.ss.usermodel.Sheet sh = wb.getSheetAt(s);
+            if (sh == null) continue;
+            for (org.apache.poi.ss.usermodel.Row row : sh) {
+                if (row == null) continue;
+                for (org.apache.poi.ss.usermodel.Cell cell : row) {
+                    if (cell == null) continue;
+                    try {
+                        CellType ct = cell.getCellType();
+                        if (ct != CellType.NUMERIC && ct != CellType.FORMULA) continue;
+                        if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) continue;
+                        if (ct == CellType.NUMERIC && Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue()) continue;
+                        org.apache.poi.ss.usermodel.CellStyle cs = cell.getCellStyle();
+                        if (cs == null) continue;
+                        String f = cs.getDataFormatString();
+                        if (f == null) f = "";
+                        if (f.contains("%") || f.contains("E") || f.contains("0.00")) continue;
+                        boolean plain = f.isEmpty() || "General".equals(f) || "general".equals(f)
+                            || "0".equals(f) || "#,##0".equals(f) || "0.0".equals(f) || "#,##0.0".equals(f);
+                        if (!plain) continue;
+                        org.apache.poi.ss.usermodel.CellStyle ns = wb.createCellStyle();
+                        ns.cloneStyleFrom(cs);
+                        ns.setDataFormat(fmtTwo);
+                        cell.setCellStyle(ns);
+                    } catch (Exception ignore) {
+                        // 涓埆鍗曞厓鏍兼牸寮忓紓甯镐笉闃诲瀵煎嚭
+                    }
+                }
+            }
+        }
+    }
+
     private byte[] toBytes(XSSFWorkbook wb) throws Exception {
+        applyTwoDecimalFormat(wb);
         try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
             wb.write(out);
             wb.close();
diff --git a/traffic-audit-web/src/views/DataImport.vue b/traffic-audit-web/src/views/DataImport.vue
index 53ee36b..f3e8b91 100644
--- a/traffic-audit-web/src/views/DataImport.vue
+++ b/traffic-audit-web/src/views/DataImport.vue
@@ -29,10 +29,10 @@
             <div class="card-head">閫夋嫨鏁版嵁绫诲瀷</div>
             <div class="module-tabs-head">
               <el-radio-group v-model="activeModule" size="small" @change="onModuleSwitch">
-                <el-radio-button v-for="g in groups" :key="g.key" :label="g.key">{{ g.name }}</el-radio-button>
+                <el-radio-button v-for="g in visibleGroups" :key="g.key" :label="g.key">{{ g.name }}</el-radio-button>
               </el-radio-group>
             </div>
-            <div v-for="g in groups" :key="g.key" v-show="activeModule === g.key" class="module-tab-pane">
+            <div v-for="g in visibleGroups" :key="g.key" v-show="activeModule === g.key" class="module-tab-pane">
               <div class="module-sel">
                                 <div class="module-sel-row">
                   <el-select v-model="moduleSel[g.key]" placeholder="閫夋嫨鏁版嵁绫诲瀷" style="width:260px"
@@ -107,7 +107,7 @@
                 </div>
                 <div v-if="!period" class="tip">璇峰厛鍦ㄤ笂鏂归�夋嫨鎶ヨ〃鏈�</div>
                 <div v-else class="overview-grid">
-                  <div class="ov-row" v-for="g in groups" :key="g.key">
+                  <div class="ov-row" v-for="g in visibleGroups" :key="g.key">
                     <div class="ov-group">{{ g.name }}</div>
                     <div class="ov-item" v-for="t in g.types" :key="t.value" :class="overviewState(t.value).cls">
                       <div class="ov-name">{{ t.label }}</div>
@@ -206,7 +206,7 @@
           ]
         },
         {
-          key: 'annual', name: '骞存姤', types: [
+          key: 'annual', hidden: true, name: '骞存姤', types: [
             { value: 'annualCompanyBasic', label: '鍗曚綅鍩烘湰鎯呭喌' },
             { value: 'annualEnterpriseFinance', label: '娉曚汉浼佷笟璐㈠姟鐘跺喌' },
             { value: 'annualPassengerEnergy', label: '鍏矾鏃呭杩愯緭鑳芥簮娑堣�楁儏鍐�' },
@@ -224,6 +224,8 @@
     }
   },
   computed: {
+    // 骞存姤鏆備笉寮�鏀撅細闅愯棌鍏ュ彛锛堟暟鎹繚鐣欙紝鍚庣瀹炵幇鍚庡彲绉婚櫎 hidden锛�
+    visibleGroups() { return this.groups.filter(g => !g.hidden) },
     failBatches() { return this.batches.filter(b => b.failRows > 0) },
     failRowsFlat() {
       const out = []
diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index ba187d1..f03bd0a 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -190,7 +190,9 @@
             { key: 'cityRailFerryDetail', label: '杞ㄩ亾杞浮瀹㈣繍閲忓垎甯傚窞鏄庣粏', fileName: '鐢熸垚_杞ㄩ亾杞浮瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx', status: null, statusNote: '' },
             { key: 'cityPassengerCitySum', label: '鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱', fileName: '鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx', status: null, statusNote: '' },
             { key: 'cityPassengerDetailSum', label: '鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃', fileName: '鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx', status: null, statusNote: '' },
-            { key: 'cityPassengerSummary', label: '鍩庡競瀹㈣繍姹囨��', fileName: '鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx', status: null, statusNote: '' }
+            { key: 'cityPassengerSummary', label: '鍩庡競瀹㈣繍姹囨��', fileName: '鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx', status: null, statusNote: '' },
+            { key: 'wycSplit', label: '缃戠害杞﹀杩愰噺鎷嗗垎琛�', fileName: '鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛�.xlsx', status: null, statusNote: '' },
+            { key: 'summaryWorkbook', label: '閬撹矾杩愯緭閲忔眹鎬昏〃锛堟暣鏈級', fileName: '鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx', status: null, statusNote: '' }
           ], checked: []
         },
         {

--
Gitblit v1.9.1