From abf468c9946c21512ddf2093895b30910e09e536 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期一, 21 九月 2026 11:33:54 +0800
Subject: [PATCH] fix(汇总表): 中口径排名累计同比基数改用母版2025静态列
---
HANDOFF.md | 16 +++
docs/交接文档_2026-09-21.md | 5
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 130 ++++++++++++++++++++++++-
docs/工作日结/工作日结_2026-09-21.md | 15 ++
docs/问题汇总/汇总大表问题交接_2026-09-21.md | 16 ++-
docs/功能测试报告/功能测试报告_中口径排名同比基数方案A_2026-09-21.md | 66 +++++++++++++
6 files changed, 229 insertions(+), 19 deletions(-)
diff --git a/HANDOFF.md b/HANDOFF.md
index 2adaaf3..9f08756 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -4,6 +4,20 @@
> **姣忓ぉ缁撴潫鏃�**锛氭妸褰撳ぉ杩涘睍銆佽俯杩囩殑鍧戙�佹柊闇�姹傘�佹湭瀹屾垚浜嬮」鏇存柊鍒版湰鏂囦欢锛岀劧鍚庡彲浠ユ斁蹇冨紑鏂板璇濄��
> **鍗忎綔绾﹀畾锛�2026-08-31锛�**锛氳銆屾彁浜ゃ��= 鏈湴 commit + 鎺ㄩ�佸埌杩滅 git锛坥rigin main锛孏itblit锛夛紝涓嶅啀鍙仛鏈湴 commit銆�
+## 鏈�鏂帮紙2026-09-21锛�
+
+- **鏈�鏂版�诲叆鍙�**锛歚docs/浜ゆ帴鏂囨。_2026-09-21.md`锛堢郴缁熺幇鐘躲�丳0/P1/P2 閬楃暀銆佹搷浣滄墜鍐岋級锛涙眹鎬诲ぇ琛ㄤ笓椤硅 `docs/闂姹囨��/姹囨�诲ぇ琛ㄩ棶棰樹氦鎺2026-09-21.md`銆�
+- **鏈棩瀹屾垚**锛�
+ 1. 鎷夊彇骞跺悎骞� origin/main 鏈�鏂版彁浜わ紙鍚姇璧勭郴缁熸柊妯℃澘銆佸崄鍫版簮鏂囦欢娓呯悊銆佹眹鎬诲ぇ琛ㄥ紓姝ュ鍑虹瓑锛夈��
+ 2. 澶勭悊鈥滀腑鍙e緞鎺掑悕 vs 涓彛寰勬槑缁嗏�濆巻鍙插悓姣斿熀鏁板弻杞ㄥ埗锛氱敤鎴烽噰鐢�**鏂规 A**锛屾帓鍚嶉〉绱鍚屾瘮鍩烘暟鏀硅姣嶇増銆婁腑鍙e緞鏄庣粏銆嬬殑 2025 闈欐�佸垪銆�
+ - 榛勫唸 2026 骞� 1-8 鏈堝杩愰噺绱鍚屾瘮鐢� `7.744917%` 淇涓� `7.641733%`锛�
+ - 17 甯傚窞 脳 瀹㈣繍閲�/鍛ㄨ浆閲忕疮璁″�间笌鍚屾瘮 68 涓暟鍊煎鍏ㄩ儴涓�鑷达紙鏈�澶у樊 `2.91e-11`锛夛紱
+ - 8 鏈堝綋鏈堝悓姣� 34 涓暟鍊煎鏃犲洖褰掞紙鏈�澶у樊 `5.48e-15`锛夛紱
+ - 瑙併�婂姛鑳芥祴璇曟姤鍛奯涓彛寰勬帓鍚嶅悓姣斿熀鏁版柟妗圓_2026-09-21.md銆嬨��
+- **褰撳墠鐜**锛歞ev 鍚庣 `8090`銆佸墠绔� `8080` 杩愯涓紱鏁版嵁搴� `127.0.0.1:3305/traffic_audit`銆�
+- **鏈畬鎴愰噸鐐�**锛�2026-09 姣嶇増锛堜汉宸ユ瘝鐗堟垨鎵╁垪鍣級銆併�婁嚎鍏冩姇璧勯」鐩�嬫寜 Q7 杩藉垪銆佸鍑哄墠鍩烘暟浣撴 B4銆丳1/P2 鍏朵粬浜嬮」锛堣瑙佹�讳氦鎺ユ枃妗g 4 绔狅級銆�
+- **娴嬭瘯浜х墿**锛歚_tmp/qa_plan_a_20260921/`锛堟寜椤圭洰绾﹀畾淇濈暀锛屾湭缁忓悓鎰忎笉鍒狅級銆�
+
## 浠婃棩锛�2026-09-04锛�
### 13. 鍏虫満浜ゆ帴蹇収锛�09-04 鏅氾級
@@ -261,4 +275,4 @@
repository"锛岄渶閲嶅缓 gitdir 鏂囦欢锛汸owerShell 鐨� -e "..." 瀛楃涓查噷 $ 浼氳褰撳彉閲忓睍寮�锛屽啓 SQL 瀵嗙爜鍝堝笇瑕佺敤 SQL 鏂囦欢銆�
-- 2026-08-31锛堜笅鐝墠锛夛細鏁版嵁瀵煎叆椤甸噸鏋勯獙鏀堕�氳繃锛坈ommit 791e70f 宸叉帹閫侊紝璇﹁绗� 7 鑺傦級銆傛敼閫犲叏鐢� Python 鏇挎崲鍐欐枃浠讹紙apply_patch 鏈満蹇呰触锛夛紱鍏抽敭鍧戯細Vue 鏂版柟娉曡鏀� methods 澶� 鈫� render TypeError銆乪l-table 灞曞紑琛屼笉娓叉煋锛孾Vue warn] 鍙湪 console 涓嶅湪 pageerror锛涢獙璇佺敤 puppeteer 鎷︽埅 /api/import/batches 杩斿洖 mock 澶辫触鏁版嵁鐩存帴楠屾槑缁嗚〃锛岀湡瀹炴棤澶辫触鏁版嵁楠屻�屾殏鏃犲鍏ュけ璐ヨ褰曘�嶇┖鎬併��
\ No newline at end of file
+- 2026-08-31锛堜笅鐝墠锛夛細鏁版嵁瀵煎叆椤甸噸鏋勯獙鏀堕�氳繃锛坈ommit 791e70f 宸叉帹閫侊紝璇﹁绗� 7 鑺傦級銆傛敼閫犲叏鐢� Python 鏇挎崲鍐欐枃浠讹紙apply_patch 鏈満蹇呰触锛夛紱鍏抽敭鍧戯細Vue 鏂版柟娉曡鏀� methods 澶� 鈫� render TypeError銆乪l-table 灞曞紑琛屼笉娓叉煋锛孾Vue warn] 鍙湪 console 涓嶅湪 pageerror锛涢獙璇佺敤 puppeteer 鎷︽埅 /api/import/batches 杩斿洖 mock 澶辫触鏁版嵁鐩存帴楠屾槑缁嗚〃锛岀湡瀹炴棤澶辫触鏁版嵁楠屻�屾殏鏃犲鍏ュけ璐ヨ褰曘�嶇┖鎬併��
diff --git "a/docs/\344\272\244\346\216\245\346\226\207\346\241\243_2026-09-21.md" "b/docs/\344\272\244\346\216\245\346\226\207\346\241\243_2026-09-21.md"
index 03533e3..f04d309 100644
--- "a/docs/\344\272\244\346\216\245\346\226\207\346\241\243_2026-09-21.md"
+++ "b/docs/\344\272\244\346\216\245\346\226\207\346\241\243_2026-09-21.md"
@@ -194,7 +194,7 @@
| # | 浜嬮」 | 璇存槑 | 鐘舵�� |
| --- | --- | --- | --- |
-| P1-1 | 涓彛寰勬帓鍚� vs 涓彛寰勬槑缁嗐�屽巻鍙插悓鏈熷熀鏁板弻杞ㄥ埗銆� | 闄ゆ姹夊 16 涓競宸炵疮璁″悓姣旈兘鏈夊樊锛堥粍鍐� 7.74% vs 7.64%锛夛紱鏍瑰洜鏄瘝鐗� 2025 骞� 3銆�4 鏈堢綉绾﹁溅鎷嗗垎鐢ㄤ簡涓�濂椾笌鍑虹鍒楄嚜鐩哥煕鐩剧殑鏃ц緭鍏ャ�傛湁鏂规 A/B锛�**寤鸿 A**锛堟帓鍚嶉〉鏀圭敤姣嶇増 2025 闈欐�佸垪锛� | 鉂岋紙璇﹁姹囨�诲ぇ琛ㄤ氦鎺ョ 4 绔狅級 |
+| P1-1 | 涓彛寰勬帓鍚� vs 涓彛寰勬槑缁嗐�屽巻鍙插悓鏈熷熀鏁板弻杞ㄥ埗銆� | 闄ゆ姹夊 16 涓競宸炵疮璁″悓姣旈兘鏈夊樊锛堥粍鍐� 7.74% vs 7.64%锛夛紱鏍瑰洜鏄瘝鐗� 2025 骞� 3銆�4 鏈堢綉绾﹁溅鎷嗗垎鐢ㄤ簡涓�濂椾笌鍑虹鍒楄嚜鐩哥煕鐩剧殑鏃ц緭鍏ャ��**鏂规 A 宸插疄鏂藉苟鍥炲綊锛氭帓鍚嶉〉鏀圭敤姣嶇増 2025 闈欐�佸垪**锛涢粍鍐� 1-8 鏈堢疮璁″悓姣斾慨姝d负 `7.641733%`锛�17 甯傚窞 脳 涓ゆ寚鏍囧叡 68 涓悓姣�/绱鏍煎叏閮ㄤ竴鑷达紙鏈�澶у樊 `2.91e-11`锛夛紝褰撴湀鍚屾瘮鏃犲洖褰� | 鉁咃紙2026-09-21锛岃瑙佹眹鎬诲ぇ琛ㄤ氦鎺ョ 4 绔狅級 |
| P1-2 | 涓彛寰勬帓鍚嶅叏鐪佽宸� 0.0002 涓囦汉鍏噷 | 姣嶇増鍏紡 `=SUM(O4:O20)` 鍏堝洓鑸嶄簲鍏ュ啀姹傚拰鐨勭粨鏋勬�у樊寮傦紝鏄惁鏀瑰叏绮惧害鍐欏�奸渶鎷嶆澘 | 鈴� |
| P1-3 | 涓彛寰勬槑缁� 4 鏍� `#DIV/0!` | 2025 骞� 8 鏈堝熀鏁颁负 0锛堜笉鍙瘮锛夛紝鏄惁鏀圭┖鐧介渶涓氬姟纭 | 鈴� |
| P1-4 | 鍏ㄧ渷 h2031 1-8 鏈� 27524.49 vs 危17 甯傚窞 24481.74 | 宸� **3042.75**锛堜紒涓氫笂鎶ョ殑銆屽叏鐪併�嶅惈甯傚窞鏄庣粏澶栫殑鏁版嵁锛屾垨鏌愬競宸炴紡鎶ワ級銆傜▼搴忎竴寰嬫寜姣嶇増鍙e緞锛埼e競宸烇級璧� 鈫� 寤鸿涓氬姟渚ф牳涓�娆� | 鈴� |
@@ -231,7 +231,7 @@
1. **P0-1**锛�8 鏈堝崄鍫扮墿娴佹簮鏂囦欢鐨勩�岄潪鍗佸牥娈点�嶇敱璋佹竻銆佷粈涔堟椂鍊欐竻锛燂紙寤鸿锛氭帴鎵嬩汉鍒犳骞跺浠斤級
2. **P0-2**锛氥�婁嚎鍏冩姇璧勯」鐩�嬫寜鏈堣拷鍔犲垪鐨勫仛娉曠‘璁わ紙鐢ㄦ埛 Q7 宸茬粰瑙勫垯锛屽疄鏂藉墠鍐嶇‘璁や竴娆″垪浣嶏級銆�
3. **P0-4**锛�2026-09 姣嶇増鎬庝箞鍔� 鈥斺�� 鐩存帴鏀句竴浠戒汉宸ユ瘝鐗堬紝杩樻槸鍏堝仛鎵╁垪鍣紵锛堢敤鎴锋鍦ㄩ棶鍚屼簨锛�
-4. **P1-1**锛氫腑鍙e緞鎺掑悕鍘嗗彶鍩烘暟璧版柟妗� A 杩樻槸 B锛燂紙寤鸿 A锛�
+4. **P1-1**锛氫腑鍙e緞鎺掑悕鍘嗗彶鍩烘暟鈥斺�旂敤鎴峰凡鎷嶆澘骞跺畬鎴愭柟妗� A锛堟帓鍚嶉〉鏀圭敤姣嶇増 2025 闈欐�佸垪锛夛紝鏃犻渶鍐嶇‘璁ゃ��
5. **P1-2 / P1-3**锛�0.0002 涓囦汉鍏噷鏄惁鏀瑰叏绮惧害鍐欏�硷紱`#DIV/0!` 鏄惁鏀圭┖鐧姐��
6. **P1-4**锛歨2031 鍏ㄧ渷琛屼笌 危17 甯傚窞宸� 3042.75 鐨勪笟鍔¤В閲娿��
7. **P1-6**锛氳崋宸� / 榛勭煶銆岃鍒掑唴 / 瑙勫垝澶栥�嶅彛寰勩��
@@ -321,3 +321,4 @@
| --- | --- |
| 2026-09-21 | 棣栨鎴愭枃锛氭暣鍚堟眹鎬诲ぇ琛ㄤ氦鎺ワ紙`docs/闂姹囨��/姹囨�诲ぇ琛ㄩ棶棰樹氦鎺2026-09-21.md`锛変笌鎶曡祫/璐ц繍/瀹㈣繍鍚勭嚎閬楃暀 |
| 2026-09-21锛堜笅鍗堬級 | P0-1 闂幆锛堝崄鍫版簮鏂囦欢宸插垹娈� + 閲嶅楠岃瘉锛夛紱鏂板 P1-13锛堟姇璧勭郴缁熸柊妯℃澘鏀寔锛夛紱鏁版嵁蹇収琛� `investment_system` 琛� |
+| 2026-09-21锛堜笅鍗堬級 | P1-1 闂幆锛氱敤鎴烽噰鐢ㄦ柟妗� A锛屼腑鍙e緞鎺掑悕鐨� 2025 绱鍩烘暟鏀硅姣嶇増銆婁腑鍙e緞鏄庣粏銆嬮潤鎬佸垪锛涢粍鍐堢疮璁″悓姣旂敱 7.74% 淇涓� 7.641733%锛屽弻椤典竴鑷存�у洖褰掗�氳繃 |
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_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215\345\220\214\346\257\224\345\237\272\346\225\260\346\226\271\346\241\210A_2026-09-21.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_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215\345\220\214\346\257\224\345\237\272\346\225\260\346\226\271\346\241\210A_2026-09-21.md"
new file mode 100644
index 0000000..cac6417
--- /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_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215\345\220\214\346\257\224\345\237\272\346\225\260\346\226\271\346\241\210A_2026-09-21.md"
@@ -0,0 +1,66 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氫腑鍙e緞鎺掑悕鍚屾瘮鍩烘暟鏂规 A锛�2026-09-21锛�
+
+## 1. 闇�姹備笌鏂规
+
+鐢ㄦ埛閽堝 2026 骞� 1-8 鏈堟眹鎬诲ぇ琛ㄦ彁鍑洪棶棰橈細
+
+- 銆屼腑鍙e緞鎺掑悕銆嶉粍鍐堢疮璁″悓姣旂郴缁熺敓鎴� `7.744917%`
+- 銆屼腑鍙e緞鏄庣粏銆嶅悓涓�鎸囨爣涓� `7.641733%`
+- 瑕佹眰鏌ユ槑骞朵慨姝c��
+
+鎸夌敤鎴锋媿鏉块噰鐢�**鏂规 A**锛�
+
+- 銆屼腑鍙e緞鎺掑悕銆嶈绠楀幓骞村悓鏈熺疮璁℃椂锛屼笉鍐嶄娇鐢ㄥ簱鍐呯幇绠楃殑 2025 缃戠害杞︽媶鍒嗙粨鏋滐紱
+- 鏀圭敤姣嶇増銆婁腑鍙e緞鏄庣粏銆嬮〉宸叉湁鐨� 2025 骞撮�愭湀闈欐�佸畾绋垮�硷紱
+- 2026 骞村綋骞寸疮璁″�笺�佹帓鍚嶅叕寮忋�佸叏鐪� SUM 鍏紡鍜屽綋鏈堝悓姣旈�昏緫鍧囦笉鍙橈紱
+- 鎵句笉鍒版瘝鐗堥潤鎬佸垪鏃朵繚鐣欏師搴撳唴鐜扮畻閫昏緫锛屽苟鍐� WARN 鏃ュ織銆�
+
+## 2. 瀹炵幇鑼冨洿
+
+鏂囦欢锛歚traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java`
+
+- `exportPassengerMidRank()` 澧炲姞鍙�夊伐浣滅翱涓婁笅鏂囬噸杞姐��
+- 姹囨�诲ぇ琛ㄥ鍑烘椂鐩存帴澶嶇敤褰撳墠鍐呭瓨宸ヤ綔绨匡紝璇诲彇銆婁腑鍙e緞鏄庣粏銆�2025 骞撮潤鎬佸垪銆�
+- 鐙珛瀵煎嚭銆婄敓鎴恄涓彛寰勬帓鍚�.xlsx銆嬫椂锛屾寜鎶ヨ〃鏈熸墦寮�瀵瑰簲姹囨�绘瘝鐗堣鍙栧悓涓�闈欐�佸垪銆�
+- 闈欐�佸垪鎸夎〃澶存枃瀛楄瘑鍒紝涓嶅啓姝诲垪瀛楁瘝銆�
+- 璇诲彇 17 甯傚窞銆屾�诲杩愰噺銆嶃�屾�绘梾瀹㈠懆杞噺銆�1..N 鏈堝�煎苟绱锛涘叏鐪佸熀鏁扮敱 17 甯傚窞姹傚拰銆�
+- 浠讳竴甯傚窞銆佷换涓�鎸囨爣缂哄皯瀹屾暣鏈堜唤鏃舵斁寮冮潤鎬佸熀鏁板苟鍥為��鍘熼�昏緫锛岄伩鍏嶉潤榛樹娇鐢ㄦ畫缂哄熀鏁般��
+
+## 3. 楠岃瘉鐜
+
+- 鍚庣锛歋pring Boot `8090`
+- 鏁版嵁搴擄細`127.0.0.1:3305/traffic_audit`
+- 鎶ヨ〃鏈燂細`2026-08`
+- 姣嶇増锛歚docs/鐢熸垚姹囨�诲ぇ琛�/2026骞�8鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`
+- 娴嬭瘯浜х墿锛�
+ - `_tmp/qa_plan_a_20260921/鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_202608_鏂规A.xlsx`
+ - `_tmp/qa_plan_a_20260921/鐢熸垚_涓彛寰勬帓鍚峗202608_鏂规A.xlsx`
+
+## 4. 娴嬭瘯缁撴灉
+
+| 缂栧彿 | 鐢ㄤ緥 | 棰勬湡 | 瀹炴祴 | 缁撴灉 |
+| --- | --- | --- | --- | --- |
+| A01 | 鍚庣缂栬瘧 | 缂栬瘧鎴愬姛 | `mvn -DskipTests compile` 鎴愬姛 | 閫氳繃 |
+| A02 | 2026-08 姹囨�诲ぇ琛ㄧ敓鎴� | 鎴愬姛浜у嚭鍙 xlsx | 鐢熸垚鎴愬姛锛�1325107 bytes | 閫氳繃 |
+| A03 | 榛勫唸瀹㈣繍閲忕疮璁″悓姣� | 鎺掑悕=鏄庣粏=`7.641733%` | 鎺掑悕 `0.07641733462732472`锛屾槑缁� `0.07641733462732603` | 閫氳繃 |
+| A04 | 榛勫唸鍛ㄨ浆閲忕疮璁″悓姣� | 鎺掑悕=鏄庣粏 | 鎺掑悕 `0.01593727813242681`锛屾槑缁� `0.015937278132423405` | 閫氳繃 |
+| A05 | 17 甯傚窞 脳 瀹㈣繍閲�/鍛ㄨ浆閲忕疮璁″悓姣� | 34 缁勯�愭牸涓�鑷� | 鍚疮璁″�煎湪鍐呭叡 68 涓暟鍊煎鍏ㄩ儴涓�鑷达紝鏈�澶х粷瀵瑰樊 `2.91e-11` | 閫氳繃 |
+| A06 | 鍏ㄧ渷绱鍚屾瘮 | 鎺掑悕=鏄庣粏 | 瀹㈣繍閲忥細鎺掑悕 `0.0581055773685379`锛屾槑缁� `0.058105577368537276`锛涘懆杞噺鍚屾牱涓�鑷� | 閫氳繃 |
+| A07 | 鍏ㄧ渷绱鍊�=危17 甯傚窞 | 瀹屽叏鐩哥瓑 | 瀹㈣繍閲� `31528.060699999998`锛涘懆杞噺 `1227147.4890200002`锛屽潎鐩哥瓑 | 閫氳繃 |
+| A08 | 2026-08 褰撴湀鍚屾瘮鍥炲綊 | 鎺掑悕=鏄庣粏 | 34 涓競宸炴寚鏍囧叏閮ㄤ竴鑷达紝鏈�澶х粷瀵瑰樊 `5.48e-15` | 閫氳繃 |
+| A09 | 鐙珛銆婄敓鎴恄涓彛寰勬帓鍚�.xlsx銆� | 浣跨敤鍚屼竴闈欐�佸熀鏁� | 榛勫唸瀹㈣繍閲� `7.641733%`銆佸懆杞噺 `1.593728%`锛屼笌鏄庣粏涓�鑷� | 閫氳繃 |
+| A10 | 闈欐�佸熀鏁扮己澶卞厹搴� | 涓嶄腑鏂鍑猴紝鍥為��鐜扮畻骞惰鏃ュ織 | 浠g爜绾ф鏌ワ細姣嶇増/闈欐�佸垪缂哄け杩斿洖 `null`锛屾部鐢ㄥ師 `midCumYoy()` | 閫氳繃 |
+
+## 5. 缁撹
+
+鏂规 A 宸插疄鏂藉苟瀹屾垚鍥炲綊銆�
+
+- 鍘熸潵鐨� `7.74%` 涓� `7.64%` 鍙岃建宸紓宸叉秷闄わ紱
+- 2026-08 姹囨�诲ぇ琛ㄤ腑锛岄粍鍐堢疮璁″悓姣斾负 `7.641733%`锛�
+- 鎺掑悕椤典笌涓彛寰勬槑缁嗛〉鐨勭疮璁″悓姣斻�佺疮璁″�笺�佸叏鐪佹眹鎬诲潎涓�鑷达紱
+- 褰撴湀鍚屾瘮鏈彂鐢熷洖褰掞紱
+- 鏈慨鏀逛换浣曟暟鎹簱琛ㄧ粨鏋勬垨涓氬姟鏁版嵁銆�
+
+## 6. 澶囨敞
+
+椤圭洰鏍圭洰褰� `_tmp/qa_plan_a_20260921/` 涓嬬殑娴嬭瘯浜х墿鎸夐」鐩害瀹氫繚鐣欙紝鏈粡鐢ㄦ埛鍚屾剰涓嶅垹闄ゃ��
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-21.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-21.md"
index 87ed8c6..7c5d312 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-21.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-21.md"
@@ -80,8 +80,7 @@
## 涓夈�侀仐鐣欓棶棰樹笌寰呭姙
-1. **P0-1**锛氬巻鍙插悓姣斿熀鏁板弻杞ㄥ埗 鈥斺�� 鏂规 A锛堟帓鍚嶉〉鏀圭敤姣嶇増 2025 闈欐�佸垪锛屾帹鑽愶級/ 鏂规 B锛堟槑缁嗛〉鏀圭幇绠楋級
- 寰呯敤鎴锋媿鏉匡紝**鏈疄鏂�**銆�
+1. **P0-1 宸茶В鍐�**锛氱敤鎴烽�夋嫨鏂规 A锛堟帓鍚嶉〉鏀圭敤姣嶇増 2025 闈欐�佸垪锛夛紝宸蹭簬 2026-09-21 瀹炴柦骞跺洖褰掗�氳繃锛岃鏈枃浠剁鍏妭銆�
2. **P0-2**锛氭瘝鐗堜緷璧� 鈥斺�� 9 鏈堝嚭琛ㄩ渶鍏堟湁鏂版瘝鐗堬紱鏂规 A锛堢▼搴忚嚜鍔ㄦ墿鍒楋紝2-3 澶╋級/ 鏂规 B锛圗xcel 灏忓伐鍏凤紝1 澶╋級寰呮媿鏉裤��
3. P2锛欱4 瀵煎嚭鍓嶅熀鏁颁綋妫� + 銆婃暟鎹己澶辨竻鍗曘�嬮〉銆丏 缁勫閫熸帓鍚嶆帾杈炪�佷腑鍙e緞鏄庣粏 4 鏍� `#DIV/0!`銆�
缂烘瘝鐗堟彁绀哄疄娴嬨�侀儴缃插寘鏃ф瘝鐗堬紙鐢ㄦ埛鏄庣‘鏆備笉澶勭悊锛夈��
@@ -130,3 +129,15 @@
- 閲嶆柊楠岃瘉锛堜笁灞傦紝鍏ㄨ繃锛夛細缁撴瀯 `CREATE TABLE` 29/29锛涢�愯〃 `COUNT(*)` 29/29 涓�鑷达紱`CHECKSUM TABLE` 29/29 涓�鑷达紱`mysqldump --order-by-primary` 鏈夊簭瀵煎嚭涓や唤鏁版嵁鏂囦欢 **SHA256 瀹屽叏鐩稿悓**锛堥�愯鍐呭涓�鑷达級銆�
- **缁忛獙**锛氬浠藉彧鏄煇涓�鏃跺埢鐨勫揩鐓э紝瀵煎畬涔嬪悗鍙杩樺湪瀵兼暟鎹�/璺戝鏍稿氨鏃т簡锛涗氦浠樺墠蹇呴』鏈�鍚庡啀瀵间竴娆°��
- 鏂板鏂囨。锛歚docs/宸ュ叿/鏁版嵁搴撳浠戒笌杩樺師鎿嶄綔姝ラ.md`锛堝浠藉弬鏁拌鏄� / 涓夋楠岃瘉 / 杩樺師 / 甯歌闂锛屽懡浠ゅ彲鐩存帴澶嶅埗锛夈��
+
+## 鍏�佽拷鍔狅細P0-1 鍘嗗彶鍚屾瘮鍩烘暟鍙岃建鍒舵寜鏂规 A 淇
+
+鐢ㄦ埛閫夋嫨 **鏂规 A**锛堟帓鍚嶉〉鏀圭敤姣嶇増銆婁腑鍙e緞鏄庣粏銆�2025 闈欐�佸垪锛夛紝宸插畬鎴愪唬鐮併�佸洖褰掍笌鏂囨。鏇存柊銆�
+
+- 浠g爜锛歚ReportExportService.exportPassengerMidRank()` 澧炲姞姣嶇増宸ヤ綔绨夸笂涓嬫枃閲嶈浇锛涙眹鎬诲鍑哄鐢ㄥ唴瀛樻瘝鐗堬紝鐙珛鎺掑悕琛ㄥ鍑烘墦寮�瀵瑰簲姣嶇増锛涙寜琛ㄥご璇嗗埆 2025 骞撮�愭湀鍒楋紝璇诲彇銆屾�诲杩愰噺 / 鎬绘梾瀹㈠懆杞噺銆嶅苟鎸� 1..N 鏈堢疮璁★紱鍏ㄧ渷鍩烘暟鐢� 17 甯傚窞姹傚拰锛涢潤鎬佸熀鏁颁笉瀹屾暣鏃跺洖閫�搴撳唴鐜扮畻骞跺啓 WARN銆�
+- 缂栬瘧锛歚mvn -DskipTests compile` 閫氳繃銆�
+- 鐢熸垚鍥炲綊锛�2026-08 姹囨�诲ぇ琛紱榛勫唸瀹㈣繍閲忕疮璁″悓姣旀帓鍚�/鏄庣粏鍧囦负 `7.641733%`锛堝師 7.744917%锛夈��
+- 鍙岄〉涓�鑷存�э細17 甯傚窞 脳 瀹㈣繍閲�/鍛ㄨ浆閲忕殑绱鍊间笌鍚屾瘮鍏� 68 涓暟鍊煎鍏ㄩ儴涓�鑷达紝鏈�澶х粷瀵瑰樊 `2.91e-11`锛涘叏鐪佺疮璁″�� = 危17 甯傚窞锛�8 鏈堝綋鏈堝悓姣� 34 涓暟鍊煎鏈�澶у樊 `5.48e-15`銆�
+- 鐙珛銆婄敓鎴恄涓彛寰勬帓鍚�.xlsx銆嬩篃鎸夊悓涓�闈欐�佸彛寰勫鍑猴紝缁撴灉涓庢槑缁嗛〉涓�鑷淬��
+- 娴嬭瘯浜х墿锛歚_tmp/qa_plan_a_20260921/鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃_202608_鏂规A.xlsx`銆乣_tmp/qa_plan_a_20260921/鐢熸垚_涓彛寰勬帓鍚峗202608_鏂规A.xlsx`锛堟寜绾﹀畾淇濈暀锛夈��
+- 娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_涓彛寰勬帓鍚嶅悓姣斿熀鏁版柟妗圓_2026-09-21.md`銆�
diff --git "a/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\345\244\247\350\241\250\351\227\256\351\242\230\344\272\244\346\216\245_2026-09-21.md" "b/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\345\244\247\350\241\250\351\227\256\351\242\230\344\272\244\346\216\245_2026-09-21.md"
index 1e9b8b9..38cdcc2 100644
--- "a/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\345\244\247\350\241\250\351\227\256\351\242\230\344\272\244\346\216\245_2026-09-21.md"
+++ "b/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\346\261\207\346\200\273\345\244\247\350\241\250\351\227\256\351\242\230\344\272\244\346\216\245_2026-09-21.md"
@@ -8,7 +8,7 @@
8 鏈堟眹鎬诲ぇ琛ㄥ凡鑳藉仛鍒般�屽鍏ュ熀纭�鏁版嵁 鈫� 涓�閿敓鎴愩�嶏紝涓庝汉宸ユ瘝鐗堥�愭牸姣斿鍩烘湰涓�鑷淬�備絾鏈変袱涓珮鍗遍仐鐣欙細
-1. **鍘嗗彶鍚屾湡锛�2025 骞达級鍒楀湪涓ゅ鍙e緞涔嬮棿娌℃湁缁熶竴** 鈥斺�� 銆屼腑鍙e緞鎺掑悕銆嶉〉涓庛�屼腑鍙e緞鏄庣粏銆嶉〉鐨勭疮璁″悓姣斿涓嶄笂锛堥粍鍐� 7.74% vs 7.64%锛夛紝**杩欐槸绗竴浼樺厛闂**銆�
+1. ~~**鍘嗗彶鍚屾湡锛�2025 骞达級鍒楀湪涓ゅ鍙e緞涔嬮棿娌℃湁缁熶竴** 鈥斺�� 銆屼腑鍙e緞鎺掑悕銆嶉〉涓庛�屼腑鍙e緞鏄庣粏銆嶉〉鐨勭疮璁″悓姣斿涓嶄笂锛堥粍鍐� 7.74% vs 7.64%锛夛紝**杩欐槸绗竴浼樺厛闂**銆倊~ **宸蹭簬 2026-09-21 鎸夋柟妗� A 瑙e喅锛岃绗� 4 绔犮��**
2. **姣忔湀瑕佷汉宸ュ噯澶囦竴浠芥柊姣嶇増**锛岀▼搴忎笉浼氳嚜宸辨墿鍒楋紝9 鏈堝強浠ュ悗涓嶈В鍐冲氨浼氬崱浣忓嚭琛ㄣ��
## 1. 鍓嶇疆闃呰锛堝厛鐪嬭繖 5 浠斤紝绾� 30 鍒嗛挓寤虹珛姒傚康锛�
@@ -40,7 +40,7 @@
| 缂栧彿 | 闂 | 鐘舵�� | 浼樺厛绾� |
| --- | --- | --- | --- |
-| P0-1 | 鍘嗗彶鍚屾瘮鍩烘暟銆屽弻杞ㄥ埗銆嶏細涓彛寰勬帓鍚� vs 涓彛寰勬槑缁� 绱鍚屾瘮鍏ㄥ競宸炰笉涓�鑷� | **鏈В鍐�** | 楂� |
+| P0-1 | 鍘嗗彶鍚屾瘮鍩烘暟銆屽弻杞ㄥ埗銆嶏細涓彛寰勬帓鍚� vs 涓彛寰勬槑缁� 绱鍚屾瘮鍏ㄥ競宸炰笉涓�鑷� | **宸茶В鍐筹紙2026-09-21锛屾柟妗� A锛�** | 楂� |
| P0-2 | 姣嶇増渚濊禆锛氭瘡鏈堣浜哄伐鍑嗗鏂版瘝鐗堬紝绋嬪簭涓嶄細鑷繁鎵╁垪 | **鏈В鍐�** | 楂� |
| P1-1 | 鍩庡競瀹㈣繍椤� AJ 鍒楋紙2025骞�1-7鏈堢疮璁★級娈嬬暀鍦ㄧ敓鎴愯〃 | 宸蹭慨澶� 09-20 | - |
| P1-2 | 涓彛寰勬帓鍚嶅懆杞噺鍙e緞涓庝汉宸ュ垪涓嶄竴鑷� | 宸蹭慨澶� 09-19 | - |
@@ -52,6 +52,8 @@
| P2-4 | 缂烘瘝鐗堟彁绀烘湭瀹炴祴锛涢儴缃插寘鍐呮槸甯� AJ 鍒楃殑鏃ф瘝鐗� | 寰呭鐞� | 浣� |
## 4. P0-1 鍘嗗彶鍚屾瘮鍩烘暟銆屽弻杞ㄥ埗銆嶏紙鏈浜ゆ帴閲嶇偣锛�
+
+> **鐘舵�佹洿鏂帮紙2026-09-21锛夛細鐢ㄦ埛閲囩敤鏂规 A锛屽凡瀹炴柦骞跺洖褰掗�氳繃銆�** 鎺掑悕椤电殑 2025 绱鍩烘暟鏀硅姣嶇増銆婁腑鍙e緞鏄庣粏銆嬮潤鎬佸垪锛涢粍鍐� 1-8 鏈堢疮璁″悓姣旂敱 7.744917% 淇涓� 7.641733%锛屼笌鏄庣粏椤典竴鑷淬��
### 4.1 鐜拌薄
@@ -118,7 +120,11 @@
- **鍏ㄧ渷琛屼袱椤靛畬鍏ㄤ竴鑷�**锛�31528.0607 / 5.810558%锛夛紝鍥犱负杩欐槸**甯傚窞涔嬮棿鐨勫垎鎽婂樊寮�**锛屽叏鐪佸姞鎬荤浉浜掓姷娑堛��
-### 4.6 澶勭疆鏂规锛堝緟鎷嶆澘锛屽皻鏈疄鏂斤級
+### 4.6 澶勭疆鏂规锛�2026-09-21锛氭柟妗� A 宸插疄鏂斤級
+
+**瀹炴柦缁撴灉**锛歚exportPassengerMidRank()` 鍦ㄦ眹鎬诲鍑轰腑澶嶇敤鍐呭瓨姣嶇増锛屽湪鐙珛鎺掑悕琛ㄥ鍑轰腑鎵撳紑瀵瑰簲姣嶇増锛屾寜琛ㄥご璇诲彇銆婁腑鍙e緞鏄庣粏銆�2025 骞淬�屾�诲杩愰噺銆嶃�屾�绘梾瀹㈠懆杞噺銆�1..N 鏈堥潤鎬佸�硷紱鍏ㄧ渷鍩烘暟鐢� 17 甯傚窞姹傚拰銆傞潤鎬佸垪涓嶅畬鏁存椂鑷姩鍥為��鍘熷簱鍐呯幇绠楀苟鍐� WARN 鏃ュ織銆�
+
+鍥炲綊璇佹嵁锛�2026-08 姹囨�诲ぇ琛ㄩ粍鍐堝杩愰噺绱鍚屾瘮鎺掑悕/鏄庣粏鍧囦负 `7.641733%`锛�17 甯傚窞 脳 瀹㈣繍閲�/鍛ㄨ浆閲忕殑绱鍊间笌绱鍚屾瘮鍏� 68 涓暟鍊煎鍏ㄩ儴涓�鑷达紝鏈�澶х粷瀵瑰樊 `2.91e-11`锛涘綋鏈堝悓姣� 34 涓暟鍊煎鏈�澶у樊 `5.48e-15`銆傝瑙併�婂姛鑳芥祴璇曟姤鍛奯涓彛寰勬帓鍚嶅悓姣斿熀鏁版柟妗圓_2026-09-21.md銆嬨��
- **鏂规 A锛堟帹鑽愶紝鏀瑰姩灏忥級**锛氳 `exportPassengerMidRank()` 鍙栥�屽幓骞村悓鏈熺疮璁°�嶆椂锛屾敼鐢ㄦ瘝鐗堥偅浠� 2025 闈欐�佸垪锛堜笌涓彛寰勬槑缁嗗悓婧愶級銆�
- 鐞嗙敱锛氬澶栧彂甯冪殑鍚屾瘮锛屽熀鏁版湰璇ョ敤鍘诲勾瀹氱鍊硷紱鍙姩鎺掑悕椤� `midCumYoy/midCumClass` 鐨勫彇鏁版潵婧愶紝2026 褰撴湀鍊间笉鍙楀奖鍝嶃��
@@ -237,7 +243,7 @@
## 11. 寰呯敤鎴�/涓氬姟纭娓呭崟锛堟帴鎵嬩汉鍏堝埆鑷繁鎷嶏級
-1. P0-1 璧版柟妗� A 杩樻槸 B锛燂紙寤鸿 A锛�
+1. ~~P0-1 璧版柟妗� A 杩樻槸 B锛燂紙寤鸿 A锛墌~ 鐢ㄦ埛宸查�夋嫨鏂规 A锛�2026-09-21 宸插疄鏂藉苟鍥炲綊閫氳繃銆�
2. P0-2 璧版柟妗� A锛堢▼搴忚嚜鍔ㄦ墿鍒楋級杩樻槸 B锛圗xcel 灏忓伐鍏凤級锛�9 鏈堟槸鍚﹀厛鐢� B 搴旀�ワ紵
3. 涓彛寰勬槑缁� 4 鏍� `#DIV/0!` 鏄惁鏀圭┖鐧斤紵
4. B4 鍩烘暟浣撴鐨勮Е鍙戞椂鏈轰笌寮圭獥鏂囨銆�
@@ -245,6 +251,6 @@
## 12. 寤鸿鐨勬帴鎵嬮『搴�
1. 璺戦�氱幆澧� + 鐢熸垚涓�娆� 2026-08 姹囨�诲ぇ琛紝纭鑳藉鐜版湰鏂囨墍鏈夌幇璞★紙鍗婂ぉ锛夈��
-2. 澶勭悊 P0-1 鏂规 A锛�1 澶╋紝鍚洖褰掞級銆�
+2. ~~澶勭悊 P0-1 鏂规 A锛�1 澶╋紝鍚洖褰掞級銆倊~ 宸蹭簬 2026-09-21 瀹屾垚銆�
3. 澶勭悊 P0-2 鏂规 B 鍑� 9 鏈堟瘝鐗堬紙1 澶╋級锛岄殢鍚庢帓 A銆�
4. 琛� B4 鍩烘暟浣撴锛�1-2 澶╋級銆�
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 d4673d6..bbe8df3 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
@@ -2681,9 +2681,19 @@
* 鐢熸垚_涓彛寰勬帓鍚�.xlsx锛氬崟鍧楃疮璁★紙閫� 1 涓湀=褰撴湀锛岄�� 1-6 鏈�=绱锛夛紝RANK/SUM 鍏紡淇濈暀銆�
*/
public byte[] exportPassengerMidRank(String period, String mode) throws Exception {
+ return exportPassengerMidRank(period, mode, null);
+ }
+
+ /**
+ * 鏂规 A锛�2026-09-21锛夛細涓彛寰勬帓鍚嶇殑绱鍚屾瘮鍩烘暟涓庘�滀腑鍙e緞鏄庣粏鈥濅繚鎸佸悓婧愩��
+ * 鏄庣粏椤电殑 2025 骞村垪鏄瘝鐗堥潤鎬佸畾绋垮�硷紝鎺掑悕椤靛師鍏堟煡搴撶幇绠楋紝涓よ�呭湪 2025-03/04 缃戠害杞︽媶鍒嗕笂涓嶅悓銆�
+ * summaryWb 闈炵┖鏃剁洿鎺ュ鐢ㄥ綋鍓嶆鍦ㄧ敓鎴愮殑姹囨�诲伐浣滅翱锛涚嫭绔嬪鍑烘椂鍐嶆墦寮�瀵瑰簲姣嶇増銆�
+ */
+ private byte[] exportPassengerMidRank(String period, String mode, XSSFWorkbook summaryWb) throws Exception {
int maxMonth = monthOf(period, mode);
int currentYear = Integer.parseInt(period.substring(0, 4));
File template = resolvePassengerTemplate("鐢熸垚_涓彛寰勬帓鍚�.xlsx");
+ Map<String, double[]> lastYearCumBase = loadMidRankStaticBase(period, mode, summaryWb, currentYear, maxMonth);
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
Sheet sheet = wb.getSheetAt(0);
@@ -2703,8 +2713,8 @@
title.getCell(10).setCellValue(currentYear + "骞�" + maxMonth + "鏈堝叏鐪佸垎甯傚窞瀹屾垚閬撹矾瀹㈣繍鐢熶骇鎯呭喌");
}
// 鍏ㄧ渷琛� r3锛欱3/F3 涓� SUM 鍏紡淇濈暀锛汥3/H3 鍚屾瘮濉�硷紙0-based 鍒� 3/7锛�
- setValOrBlank(sheet, 2, 3, midCumYoy(mid, currentYear, "婀栧寳鐪�", maxMonth, 0, true));
- setValOrBlank(sheet, 2, 7, midCumYoy(mid, currentYear, "婀栧寳鐪�", maxMonth, 0, false));
+ setValOrBlank(sheet, 2, 3, midRankCumYoy(mid, currentYear, "婀栧寳鐪�", maxMonth, true, lastYearCumBase));
+ setValOrBlank(sheet, 2, 7, midRankCumYoy(mid, currentYear, "婀栧寳鐪�", maxMonth, false, lastYearCumBase));
// 鍙冲潡鍏ㄧ渷琛� N3/R3锛氬綋鏈堝悓姣旓紙L3/P3 涓� SUM 鍏紡淇濈暀锛�
setValOrBlank(sheet, 2, 13, midMonthYoy(mid, currentYear, maxMonth, "婀栧寳鐪�", 0, true));
setValOrBlank(sheet, 2, 17, midMonthYoy(mid, currentYear, maxMonth, "婀栧寳鐪�", 0, false));
@@ -2715,17 +2725,13 @@
int r0 = 3 + i;
double pass = midCumClass(mid, currentYear, city, maxMonth, 0, true);
double turn = midCumClass(mid, currentYear, city, maxMonth, 0, false);
- double lastPass = midCumClass(mid, currentYear - 1, city, maxMonth, 0, true);
- double lastTurn = midCumClass(mid, currentYear - 1, city, maxMonth, 0, false);
setValOrBlank(sheet, r0, 1, pass == 0 ? null : pass);
- setValOrBlank(sheet, r0, 3, midCumYoy(mid, currentYear, city, maxMonth, 0, true));
+ setValOrBlank(sheet, r0, 3, midRankCumYoy(mid, currentYear, city, maxMonth, true, lastYearCumBase));
setValOrBlank(sheet, r0, 5, turn == 0 ? null : turn);
- setValOrBlank(sheet, r0, 7, midCumYoy(mid, currentYear, city, maxMonth, 0, false));
+ setValOrBlank(sheet, r0, 7, midRankCumYoy(mid, currentYear, city, maxMonth, false, lastYearCumBase));
// 鍙冲潡褰撴湀锛歀/P 鍊笺�丯/R 褰撴湀鍚屾瘮锛圡/O/Q/S 鎺掑悕鍏紡淇濈暀锛�
double mPass = midClassVal(mid, currentYear, maxMonth, city, 0, true);
double mTurn = midClassVal(mid, currentYear, maxMonth, city, 0, false);
- double mLastPass = midClassVal(mid, currentYear - 1, maxMonth, city, 0, true);
- double mLastTurn = midClassVal(mid, currentYear - 1, maxMonth, city, 0, false);
setValOrBlank(sheet, r0, 11, mPass == 0 ? null : mPass);
setValOrBlank(sheet, r0, 13, mPass == 0 ? null : midMonthYoy(mid, currentYear, maxMonth, city, 0, true));
setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : mTurn);
@@ -2734,6 +2740,112 @@
recalc(wb);
return toBytes(wb);
}
+ }
+
+ /** 璇诲彇姣嶇増銆婁腑鍙e緞鏄庣粏銆嬬殑 2025 骞撮�愭湀闈欐�佸�硷紝姹囨�绘垚鎺掑悕椤垫墍闇�鐨勫幓骞村悓鏈熺疮璁″熀鏁般�� */
+ private Map<String, double[]> readMidDetailLastYearCumulative(XSSFWorkbook sourceWb, int currentYear, int maxMonth) {
+ Map<String, double[]> out = new LinkedHashMap<>();
+ if (sourceWb == null || maxMonth <= 0) return out;
+ Sheet sheet = sourceWb.getSheet("涓彛寰勬槑缁�");
+ if (sheet == null) return out;
+ Map<Integer, Integer> monthCols = new LinkedHashMap<>();
+ java.util.regex.Pattern monthHeader = java.util.regex.Pattern.compile("^(\\d{4})骞�(\\d{1,2})鏈�$");
+ int headerEnd = Math.min(sheet.getLastRowNum(), sheet.getFirstRowNum() + 5);
+ for (int r = sheet.getFirstRowNum(); r <= headerEnd; r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ for (int c = row.getFirstCellNum(); c >= 0 && c < row.getLastCellNum(); c++) {
+ String text = cellText(row.getCell(c));
+ if (text == null) continue;
+ java.util.regex.Matcher matcher = monthHeader.matcher(text.trim());
+ if (!matcher.matches()) continue;
+ int y = Integer.parseInt(matcher.group(1));
+ int m = Integer.parseInt(matcher.group(2));
+ if (y == currentYear - 1 && m >= 1 && m <= maxMonth) monthCols.putIfAbsent(m, c);
+ }
+ }
+ if (monthCols.size() < maxMonth) return out;
+ for (int r = sheet.getFirstRowNum(); r <= sheet.getLastRowNum(); r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ String city = RegionUtil.normalizeCityName(cellText(row.getCell(0)));
+ if (city == null || !RegionUtil.CITY_LIST.contains(city)) continue;
+ String metric = cellText(row.getCell(1));
+ if (metric == null) continue;
+ int idx = metric.contains("鎬绘梾瀹㈠懆杞噺") ? 1 : (metric.contains("鎬诲杩愰噺") ? 0 : -1);
+ if (idx < 0) continue;
+ double sum = 0.0;
+ boolean complete = true;
+ for (int m = 1; m <= maxMonth; m++) {
+ Cell c = row.getCell(monthCols.get(m));
+ if (c == null) { complete = false; break; }
+ if (c.getCellType() == CellType.NUMERIC) {
+ sum += c.getNumericCellValue();
+ } else if (c.getCellType() == CellType.FORMULA && c.getCachedFormulaResultType() == CellType.NUMERIC) {
+ sum += c.getNumericCellValue();
+ } else {
+ complete = false;
+ break;
+ }
+ }
+ double[] values = out.computeIfAbsent(city, k -> new double[]{Double.NaN, Double.NaN});
+ values[idx] = complete ? sum : Double.NaN;
+ }
+ double[] province = new double[2];
+ for (String city : RegionUtil.CITY_LIST) {
+ double[] values = out.get(city);
+ if (values == null || Double.isNaN(values[0]) || Double.isNaN(values[1])) return new LinkedHashMap<>();
+ province[0] += values[0];
+ province[1] += values[1];
+ }
+ out.put("婀栧寳鐪�", province);
+ return out;
+ }
+
+ /** 鐙珛瀵煎嚭鏃朵粠瀵瑰簲姹囨�绘瘝鐗堣鍙栭潤鎬佸熀鏁帮紱姹囨�诲鍑烘椂鐩存帴澶嶇敤鍐呭瓨涓殑宸ヤ綔绨匡紝閬垮厤閲嶅 I/O銆� */
+ private Map<String, double[]> loadMidRankStaticBase(String period, String mode, XSSFWorkbook summaryWb,
+ int currentYear, int maxMonth) {
+ if (summaryWb != null) {
+ Map<String, double[]> base = readMidDetailLastYearCumulative(summaryWb, currentYear, maxMonth);
+ if (!base.isEmpty()) return base;
+ log.warn("涓彛寰勬帓鍚嶏細褰撳墠姹囨�诲伐浣滅翱鐨勪腑鍙e緞鏄庣粏鏈鍒板畬鏁� 2025 闈欐�佺疮璁″熀鏁帮紝鍥為��搴撳唴鐜扮畻");
+ return null;
+ }
+ double savedZipRatio = ZipSecureFile.getMinInflateRatio();
+ ZipSecureFile.setMinInflateRatio(0.0001);
+ try {
+ File mother = resolveSummaryMother(period, mode);
+ if (mother == null || !mother.isFile()) {
+ log.warn("涓彛寰勬帓鍚嶏細鏈壘鍒� {} 鐨勬眹鎬绘瘝鐗堬紝2025 绱鍩烘暟鍥為��搴撳唴鐜扮畻", period);
+ return null;
+ }
+ try (InputStream in = new FileInputStream(mother); XSSFWorkbook wb = new XSSFWorkbook(in)) {
+ Map<String, double[]> base = readMidDetailLastYearCumulative(wb, currentYear, maxMonth);
+ if (base.isEmpty()) {
+ log.warn("涓彛寰勬帓鍚嶏細姣嶇増 {} 鐨勪腑鍙e緞鏄庣粏鏈鍒板畬鏁� 2025 闈欐�佺疮璁″熀鏁帮紝鍥為��搴撳唴鐜扮畻", mother.getName());
+ return null;
+ }
+ log.info("涓彛寰勬帓鍚嶏細2025 绱鍩烘暟鏀圭敤姣嶇増闈欐�佸垪锛坽}锛�", mother.getName());
+ return base;
+ }
+ } catch (Exception e) {
+ log.warn("涓彛寰勬帓鍚嶏細璇诲彇姣嶇増 2025 闈欐�佺疮璁″熀鏁板け璐ワ紝鍥為��搴撳唴鐜扮畻锛歿}", e.getMessage());
+ return null;
+ } finally {
+ ZipSecureFile.setMinInflateRatio(savedZipRatio);
+ }
+ }
+
+ /** 涓彛寰勬帓鍚嶇疮璁″悓姣旓細鏂规 A 鏈夐潤鎬佸熀鏁版椂涓庡叾瀵归綈锛屽惁鍒欎繚鐣欏師搴撳唴鐜扮畻閫昏緫銆� */
+ private Double midRankCumYoy(Map<Integer, Map<String, double[][]>> mid, int year, String area,
+ int monthCount, boolean volume, Map<String, double[]> staticBase) {
+ if (staticBase == null) return midCumYoy(mid, year, area, monthCount, 0, volume);
+ double[] values = staticBase.get(area);
+ if (values == null) return null;
+ double current = midCumClass(mid, year, area, monthCount, 0, volume);
+ if (current == 0.0) return null;
+ double base = volume ? values[0] : values[1];
+ return base == 0.0 ? null : yoyOf(current, base);
}
/** 鍐欐暟鍊兼垨娓呯┖锛堝叕寮忓崟鍏冩牸淇濈暀涓嶅姩锛� */
@@ -3754,7 +3866,7 @@
int n = 0;
n += copyRankValues(wb, "璐ц繍閲忔帓鍚�", exportFreightRank(period, mode), new int[][]{{0, 0}, {22, 0}});
n += copyRankValues(wb, "璐ц繍鍛ㄨ浆閲忔帓鍚�", exportTurnoverRank(period, mode), new int[][]{{0, 0}, {22, 0}});
- n += copyRankValues(wb, "涓彛寰勬帓鍚�", exportPassengerMidRank(period, mode), new int[][]{{0, 0}, {0, 10}});
+ n += copyRankValues(wb, "涓彛寰勬帓鍚�", exportPassengerMidRank(period, mode, wb), new int[][]{{0, 0}, {0, 10}});
return n;
}
--
Gitblit v1.9.1