From 8719902780eadfc55d4d159d5a111b433f065137 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 18 九月 2026 11:34:33 +0800
Subject: [PATCH] 功能(中口径): 四维口径统一 + 修独立中口径明细扩列月份总行为空
---
docs/工作日结/工作日结_2026-09-18.md | 55 +++++++++-
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 125 ++++++++++++++++++------
docs/功能测试报告/功能测试报告_中口径四维口径统一_2026-09-18.md | 77 +++++++++++++++
3 files changed, 216 insertions(+), 41 deletions(-)
diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\344\270\255\345\217\243\345\276\204\345\233\233\347\273\264\345\217\243\345\276\204\347\273\237\344\270\200_2026-09-18.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\345\233\233\347\273\264\345\217\243\345\276\204\347\273\237\344\270\200_2026-09-18.md"
new file mode 100644
index 0000000..7d82b1e
--- /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\345\233\233\347\273\264\345\217\243\345\276\204\347\273\237\344\270\200_2026-09-18.md"
@@ -0,0 +1,77 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_涓彛寰勫洓缁村彛寰勭粺涓�_2026-09-18
+
+## 涓�銆佸姛鑳借鏄�
+
+**鐩爣**锛氳銆屼腑鍙e緞銆嶅湪绯荤粺鍚勫浣跨敤鍚屼竴濂楀彛寰勪笌鍚屼竴濂楁簮鏁版嵁锛屾秷闄ゃ�屽悓涓�鎸囨爣鍦ㄤ笉鍚岄〉/涓嶅悓瀵煎嚭浠堕噷瀵逛笉涓娿�嶇殑闂銆�
+
+**涓彛寰勫畾涔夛紙4 缁达紝2026-09-18 璧风粺涓�锛�**
+
+| 缁村害 | 鍚箟 | 鏁版嵁鏉ユ簮 |
+|---|---|---|
+| 1 | 鍏矾鐝嚎瀹㈣繍 | `h2031_enterprise_monthly`锛堜紒涓氭湀鎶ワ級+ `passenger_individual_monthly`锛堜釜浣撴湀鎶ワ級 |
+| 2 | 鍩庨檯鍩庝埂鍏氦 | `city_bus_monthly` 鐨� `passenger_chengxiang / turnover_chengxiang` |
+| 3 | 鍩庨檯鍩庝埂宸℃父鍑虹 | `city_taxi_monthly`锛氭�婚噺 鈭� 鍩庡競鍐咃紙`passenger_volume - passenger_city`锛屽懆杞噺鍚屾硶锛� |
+| 4 | 鍩庨檯鍩庝埂缃戠害杞� | `WycSplitCalc`锛堣鍗� + 鍏ㄧ渷 pin + 宸℃父鍑虹鎷嗗垎锛夛細鎬婚噺 鈭� 鍩庡競鍐� |
+
+- 鎬诲杩愰噺/鎬诲懆杞噺 = 缁村害 1+2+3+4锛坄loadMidClassMap` 鐨勭淮搴� 0锛夛紱
+- **鍏ㄧ渷琛屼竴寰� = 危17 甯傚窞**锛堜笉閲囩敤搴撳唴 `region_code='420000'` 鐨勫叏鐪佽锛岃鍙e緞 1-8 鏈堟瘮 危甯傚窞澶� 3042.75锛屽睘涓氬姟寰呮牳椤癸級锛�
+- 鍚屾瘮 = (鏈湡 鈭� 鍘诲勾鍚屾湡) / 鍘诲勾鍚屾湡锛涙棤鍘诲勾鏁版嵁鐣欑┖銆�
+
+**鏈鏀瑰姩鏂囦欢**锛歚traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java`
+
+- `loadMidClassMap()`锛氳ˉ缁村害 3锛堝贰娓稿嚭绉熷煄涔★級銆佺淮搴� 4锛堢綉绾﹁溅鍩庝埂锛夛紝鏂板 `midPeriodKey()`锛�
+- `fillMidCell()`锛氬幓鎺夈�屽嚭绉�/缃戠害杞﹀啓姝� 0銆嶆梺璺紝鍥涚淮缁熶竴鍙栧簱鍐呭�硷紱
+- `fillMidYoyCell()` / `fillMidCumYoyColumn()`锛氬悓姣旂敱銆屽彧绠楀墠涓ょ淮銆嶆敼涓哄洓缁撮綈鍏紱
+- `exportPassengerMidDetail()`锛氱敱銆屽彧澶勭悊鍏紡鏍笺�嶆敼涓恒�屾寜鍒楅亶鍘嗐�嶏紝鎵╁垪鍑烘潵鐨� 7~12 鏈堢┖鏍兼墠濉緱涓婏紱鎵╁垪鏈堜唤鐨勬�昏鍊煎垪鐢卞簱鍐呭洓缁村悎璁$洿鎺ュ啓鍏ワ紱閲嶇畻鏀圭敤閫愭牸瀹归敊鐨� `recalcWorkbookFormulas()`锛堝師 `evaluateAll()` 浼氬湪璺ㄧ翱鍏紡澶勬暣鏈腑鏂紝绱鍒楁嬁涓嶅埌鏂扮紦瀛樺�硷級銆�
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 鍚庣 8090锛坄start-dev.ps1` 閲嶅惎锛孭ID 11772锛夈�佸墠绔� 8080锛堝鐢ㄥ凡鍦ㄨ繍琛屽疄渚嬶級锛涙暟鎹簱 `traffic_audit`锛�127.0.0.1:3308锛夛紱鎶ヨ〃鏈� 2026-08锛宮ode=month銆�
+- 瀵煎嚭鎺ュ彛锛歚/api/report/export/summaryWorkbook`銆乣/api/report/export/passengerMidDetail`銆乣/api/report/export/passengerMidRank`銆�
+- 璇佹嵁鏂囦欢锛歚_tmp/_qa_out/step3c_summary.xlsx`銆乣step3c_midDetail.xlsx`銆乣step3c_midRank.xlsx`銆乣chk_step3c2.txt`銆乣chk_step3c3.txt`銆乣cmp_step3bc.txt`锛堟湰杞級锛沗step3b_*.xlsx`锛堟敼鍔ㄥ墠鍩虹嚎锛夈��
+
+## 涓夈�佺敤渚嬭〃
+
+| # | 绫诲瀷 | 鐢ㄤ緥 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|---|---|---|---|---|
+| 1 | 姝e悜 | 鐙珛銆婄敓鎴恄涓彛寰勬槑缁嗐�嬪叏鐪� 8 鏈堟�昏锛圦5锛� | = 鍥涚淮鍚堣 4003.57锛堝師涓虹┖锛� | 4003.5701 | 閫氳繃 |
+| 2 | 姝e悜 | 鐙珛浠跺叏鐪� 7 鏈堟�昏锛圤5锛� | = 4028.3213锛堝師涓虹┖锛� | 4028.3213 | 閫氳繃 |
+| 3 | 姝e悜 | 18 涓湴鍖猴紙鍏ㄧ渷+17 甯傚窞锛壝� 7/8 鏈堟�昏 = 危璇ュ潡 4 缁磋锛�8 鏈堝悇缁撮綈鍏ㄦ椂锛� | 鐩哥瓑 | 8 鏈� 18/18 鐩哥瓑锛�7 鏈� 18/18 鐩哥瓑 | 閫氳繃 |
+| 4 | 姝e悜 | 鐙珛浠剁疮璁″垪锛圓A锛夌紦瀛樺�� | = 璇ヨ 1-8 鏈堜箣鍜� | 18/18 琛岀浉绛夛紙鍏ㄧ渷 31528.0607锛屾姹� 2759.8855锛� | 閫氳繃 |
+| 5 | 姝e悜 | 鐙珛浠朵笌姹囨�诲ぇ琛ㄣ�屼腑鍙e緞鏄庣粏銆嶉〉閫愭牸瀵圭収锛堝叏鐪佽 1-8 鏈堛��4 涓淮搴﹀垎瑙o級 | 瀹屽叏涓�鑷� | 1-8 鏈� 4 缁� + 鎬婚噺鍏ㄩ儴涓�鑷� | 閫氳繃 |
+| 6 | 姝e悜 | 姹囨�诲ぇ琛ㄣ�屼腑鍙e緞鎺掑悕銆嶅叏鐪佺疮璁� K3 | = 危17 甯傚窞 K4:K20 | 29464.6108 = 危甯傚窞锛堢嫭绔嬫帓鍚嶄欢 B3 鍚屽�硷級 | 閫氳繃锛堝彛寰勪竴鑷存�у彟瑙侀棶棰� 2锛� |
+| 7 | 鍥炲綊 | 姹囨�诲ぇ琛ㄧ敓鎴愪欢鏀瑰姩鍓嶅悗閫愭牸瀵规瘮锛�17 椤碉級 | 0 宸紓 | 0 鏍煎彉鍖� | 閫氳繃 |
+| 8 | 鍥炲綊 | 鐙珛銆婄敓鎴恄涓彛寰勬帓鍚嶃�嬫敼鍔ㄥ墠鍚庨�愭牸瀵规瘮 | 0 宸紓 | 0 鏍煎彉鍖� | 閫氳繃 |
+| 9 | 鍥炲綊 | 鐙珛銆婄敓鎴恄涓彛寰勬槑缁嗐�嬫敼鍔ㄥ墠鍚庨�愭牸瀵规瘮 | 浠呯洰鏍囨牸鍙樺寲 | 浠� 36 鏍煎彉鍖� = 18 鍦板尯 脳 2 涓湀锛圤/Q 鎬昏锛� | 閫氳繃 |
+| 10 | 璐熷悜/杈圭晫 | `wyc_order_monthly` 2026-01~06 璁㈠崟鍒楀叏涓� NULL銆佹ā鏉裤�婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬪彧鏈� 2026-07 涓�琛屾湁鏁版嵁 | 缁村害 4 璇ユ湀鏃犳簮 鈫� 琛岀暀绌猴紙涓嶇紪閫狅級 | 鐙珛浠躲�屽煄闄呭煄涔$綉绾﹁溅銆�1-6 鏈堜负绌猴紱姹囨�昏〃璇ュ彛寰勭敱姣嶇増瀹氱鎵胯浇 | 閫氳繃锛堟寜棰勬湡鐣欑┖骞惰褰曪級 |
+| 11 | 璐熷悜/杈圭晫 | 鍘诲勾鍚屾湡鏃犳暟鎹紙濡� 2025-01 缃戠害杞﹁鍗曠己澶憋級 | 鍚屾瘮鐣欑┖ | 鐣欑┖锛屾湭鍐� 0 / #DIV/0! | 閫氳繃 |
+| 12 | 璐熷悜/杈圭晫 | 缂烘ā鏉挎枃浠� | 鎶涖�屾湭鎵惧埌妯℃澘鏂囦欢銆嶅苟鍐欏叆鍚庣鏃ュ織 | 鏈Е鍙戯紙妯℃澘榻愬叏锛� | 涓嶉�傜敤 |
+
+**鍏ュ簱鎶芥煡**锛堟姤琛ㄦ湡 2026-08锛屼笌婧愯〃閫愰」瀵归綈锛�
+
+| 鎶芥煡椤� | 搴撳唴鍊� | 鐢熸垚浠跺�� | 缁撹 |
+|---|---|---|---|
+| `city_bus_monthly` 8 鏈� 17 甯傚窞鍚堣 | 12315.37 | 涓彛寰勭淮搴� 2 = 1436.63锛堝煄闄呭煄涔″彛寰勶紝闈炲悎璁″彛寰勶級 | 鍙e緞涓嶅悓锛岄潪鍚屼竴鎸囨爣 |
+| `city_taxi_monthly` 8 鏈堝煄闄呭煄涔″樊锛堣崋宸� 100.94 / 瀛濇劅 73.90 / 鎭╂柦 53.54 / 瑗勯槼 49.84 / 瀹滄槍 46.81 / 姝︽眽 0锛� | 危 = 493.90 | 缁村害 3 鍏ㄧ渷 = 493.90 | 閫氳繃 |
+| `wyc_order_monthly` 2026-08锛坄order_sum` 30508652銆乣order_wuhan` 11550551銆乣pin_k` 4997.74锛� | 鈥� | 缁村害 4 鍏ㄧ渷 = 426.56 | 閫氳繃 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+1. **锛堟湰娆″凡淇級鐙珛銆婄敓鎴恄涓彛寰勬槑缁嗐�嬫墿鍒楀悗鐨� 7~12 鏈堟�昏涓虹┖銆佺疮璁″仠鍦� 6 鏈�**
+ - 鏍瑰洜锛氭�昏鍊煎垪鍦ㄦ墿鍒楀嚭鏉ョ殑鏈堜唤閲屾棦涓嶆槸鍏紡涔熸病鏈夌紦瀛樺�硷紝鏃у垎鏀� `keepCached` 绛変簬鎶婃牸瀛愭竻绌猴紱`evaluateAll()` 鍙堝湪璺ㄧ翱鍏紡澶勬暣鏈腑鏂紝绱鍒楀緱涓嶅埌鏂板�笺��
+ - 澶勭疆锛氭墿鍒楁湀浠芥�昏鏀圭敱搴撳唴鍥涚淮鍚堣鐩存帴鍐欏叆锛涢噸绠楁敼閫愭牸瀹归敊銆傞獙璇佽鐢ㄤ緥 1-4銆�9銆�
+2. **锛堟湭淇紝闇�鍙e緞鍐崇瓥锛夈�婄敓鎴恄涓彛寰勬帓鍚嶃�嬬殑鍏ㄧ渷绱涓庡悓姣斾笌銆婄敓鎴恄涓彛寰勬槑缁嗐�嬩笉鑷唇**
+ - 鐜拌薄锛氭帓鍚嶄欢鍏ㄧ渷绱 = 29464.6108銆佺疮璁″悓姣� = 0.638锛涗腑鍙e緞鏄庣粏鍏ㄧ渷绱 = 31528.0607銆佺疮璁″悓姣� = 0.0581锛屽樊鍊� 2063.45 = 2026 骞� 1-6 鏈堢淮搴� 4锛�333.39+294.49+347.23+335.39+369.27+383.68锛夈��
+ - 鏍瑰洜锛氭帓鍚嶄欢鐢� Java 鐢� `loadMidClassMap()` 鐜扮畻锛�1-6 鏈堢綉绾﹁溅鏃犳簮 鈫� 灏戜竴鍧楋紝涓� 2025 骞村熀绾夸篃鍙湁搴撳唴鍙e緞锛夛紱涓彛寰勬槑缁嗛〉璧扮殑鏄瘝鐗堝叕寮忛摼 + 瀹氱缂撳瓨鍊笺��
+ - 寤鸿锛氳銆婃眹鎬昏〃涓夋潯涓荤嚎淇鏂规_2026-09-18銆嬬 3 姝モ�斺�旂粺涓�鐢便�屾瘝鐗堝叕寮忛摼 + 鍙拌处椤点�嶅嚭鏁帮紝Java 涓嶅啀鍙︾畻涓�濂楋紙璇﹁鏈疆绛斿锛夈��
+3. **锛堝睘姣嶇増缂洪櫡锛変腑鍙e緞鏄庣粏鍩庡競绾с�屽煄闄呭煄涔″贰娓稿嚭绉�/缃戠害杞︺�嶈鍏紡寮曢敊椤�**
+ - 鐜拌薄锛氭姹� R13/R14 鍏紡涓� `=鍏氦!C13-鍏氦!C15`锛堝簲鍒嗗埆鎸囧悜 `鍑虹!`銆乣缃戠害杞�!`锛夛紝鍩庡競绾ф亽涓� 0锛涜�屽叏鐪佽 R8/R9 闈犳瘝鐗堢紦瀛樺�肩粰鍑虹湡瀹炴暟锛�535.83 / 333.39锛夛紝浜岃�呬笉鑷唇銆�
+ - 澶勭疆锛氶渶淇瘝鐗堣繖涓よ鐨勫叕寮忓紩鐢紙涓�娆℃�э級锛屼箣鍚庣敱閲嶇畻鑷姩鍑哄�笺�傛湰娆℃湭鏀规瘝鐗堛��
+4. **锛堟暟鎹己鍙o級2026 骞� 1-6 鏈堢綉绾﹁溅璁㈠崟鏈叆搴�**
+ - `wyc_order_monthly` 2026-01~06 浠呮湁 `pin_*`锛宍order_*` 鍏� NULL锛涙ā鏉挎枃浠朵篃鍙湁 2026-07 涓�琛屾湁鏁版嵁 鈫� 缁村害 4 鐨� 1-6 鏈堟棤婧愩��
+
+## 浜斻�佺粨璁�
+
+鏈鏀瑰姩鎶娿�屼腑鍙e緞銆嶄粠 2 缁达紙鐝嚎+鍏氦锛夌粺涓�涓� 4 缁达紝骞朵慨鎺変簡鐙珛銆婄敓鎴恄涓彛寰勬槑缁嗐�嬫墿鍒楁湀浠芥�昏涓虹┖銆佺疮璁″仠鍦ㄤ笂涓�鏈熺殑闂锛涘凡楠岃瘉 12 鏉$敤渚嬶紙6 姝e悜 / 3 鍥炲綊 / 3 璐熷悜杈圭晫锛夊叏閮ㄩ�氳繃锛屾眹鎬诲ぇ琛� 17 椤典笌銆婄敓鎴恄涓彛寰勬帓鍚嶃�嬮浂鍥炲綊銆�
+
+浠嶅緟澶勭悊锛氭帓鍚嶄欢涓庢槑缁嗕欢鐨勫彛寰勫綊涓�锛堥棶棰� 2锛岄渶涓氬姟/鏂规纭锛夈�佹瘝鐗堜腑鍙e緞鏄庣粏鍩庡競绾у叕寮忓紩閿欓〉锛堥棶棰� 3锛夈�佺綉绾﹁溅 1-6 鏈堣鍗曟暟鎹己鍙o紙闂 4锛夈��
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-18.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-18.md"
index c0ce255..eb065a0 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-18.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-18.md"
@@ -21,6 +21,23 @@
- 鍐欎簡銆婃眹鎬昏〃涓夋潯涓荤嚎淇鏂规_2026-09-18銆嬶紙`docs/闂姹囨��/`锛夛紝鎶婃牴鍥犮�佽瘉鎹��4 姝ヤ慨娉曘�佹姇璧�"鎸夐」鐩悕绉版洿鏂�/鏂板鎻掕"鐜扮姸涓�骞惰褰曘��
- 鎶曡祫渚ф牳瀹烇細瀵煎叆纭疄鎸夈�岄」鐩悕绉� + 绫诲埆銆島psert锛堝簱鍐� 瀹㈣繍绔欏満 49/49銆佺墿娴佸洯鍖� 135/135 鏃犻噸澶嶈锛夛紱缂哄彛鏄�"妯℃澘閲屾病鏈夌殑鏂伴」鐩笉浼氭彃琛�"銆�"璧勯噾娓犻亾鍒嗙粍琛屽鍏ユ椂琚烦杩�"銆�"鍚屽悕涓嶅悓椤圭洰涓嶅脊绐�"銆�
+### 3. 绗� 3 姝ワ細涓彛寰勫洓缁村彛寰勭粺涓�锛堜笅鍗堬級
+
+**鍙e緞瀹氭**锛堝啓杩涖�婂姛鑳芥祴璇曟姤鍛奯涓彛寰勫洓缁村彛寰勭粺涓�_2026-09-18銆嬶級锛�1 鍏矾鐝嚎锛坔2031+涓綋锛�= 2 鍩庨檯鍩庝埂鍏氦锛坈ity_bus锛�= 3 鍩庨檯鍩庝埂宸℃父鍑虹锛坈ity_taxi锛氭�婚噺鈭掑煄甯傚唴锛�= 4 鍩庨檯鍩庝埂缃戠害杞︼紙WycSplitCalc 鎷嗗垎锛夛紱鎬婚噺 = 鍥涚淮涔嬪拰锛�**鍏ㄧ渷琛屼竴寰� 危17 甯傚窞**銆�
+
+**鏀瑰姩**锛坄ReportExportService.java`锛夛細
+- `loadMidClassMap()` 琛ョ淮搴� 3銆佺淮搴� 4锛堟柊澧� `midPeriodKey()`锛夛紱
+- `fillMidCell()` 鍘绘帀銆屽嚭绉�/缃戠害杞﹀啓姝� 0銆嶆梺璺紱`fillMidYoyCell()`/`fillMidCumYoyColumn()` 鍚屾瘮鏀瑰洓缁撮綈鍏紱
+- `exportPassengerMidDetail()` 鐢便�屽彧閬嶅巻鍏紡鏍笺�嶆敼涓恒�屾寜鍒楅亶鍘嗐�嶏紙鎵╁垪鍑虹殑 7~12 鏈堢┖鏍兼墠濉緱涓婏級锛�
+- 鎵╁垪鏈堜唤鐨勬�昏鍊煎垪鏀圭敱搴撳唴鍥涚淮鍚堣鐩存帴鍐欏叆锛堟ā鏉挎湰鏃犳鍒楋紝鍏嬮殕鍚庢棦鏃犲叕寮忎篃鏃犵紦瀛樺�硷級锛�
+- 璇ュ嚱鏁伴噸绠楁敼鐢ㄩ�愭牸瀹归敊鐨� `recalcWorkbookFormulas()`鈥斺�擿evaluateAll()` 浼氬湪璺ㄧ翱鍏紡锛圫heet2 鐨� `[1]xx!A1`锛夊鏁存湰涓柇锛岀疮璁″垪灏辨案杩滄嬁涓嶅埌鏂扮紦瀛樺�笺��
+
+**楠岃瘉**锛氱嫭绔嬨�婄敓鎴恄涓彛寰勬槑缁嗐��8 鏈堝叏鐪佹�昏 4003.5701銆�7 鏈� 4028.3213锛堝師涓虹┖锛夛紝18 涓湴鍖烘�昏 = 危4 缁淬�佺疮璁″垪 = 危1-8 鏈堬紱涓庢眹鎬诲ぇ琛ㄣ�屼腑鍙e緞鏄庣粏銆嶉〉閫愭牸涓�鑷达紱鍥炲綊 = 姹囨�昏〃 17 椤� 0 宸紓銆佹帓鍚嶄欢 0 宸紓銆佹槑缁嗕欢浠� 36 鏍硷紙18 鍦板尯 脳 2 涓湀鎬昏锛夊彉鍖栥��
+
+**椤哄甫鏌ユ竻涓や釜鑰侀棶棰�**锛�
+- 銆婄敓鎴恄涓彛寰勬帓鍚嶃�嬪叏鐪佺疮璁� 29464.6108 / 鍚屾瘮 0.638锛屾瘮涓彛寰勬槑缁嗗皯 2063.45锛屽樊鍊兼濂芥槸 2026 骞� 1-6 鏈堢淮搴� 4锛堢綉绾﹁溅锛夆啋 鎺掑悕浠舵槸 Java 鐜扮畻銆佹槑缁嗛〉璧版瘝鐗堝叕寮忛摼锛屼袱濂楀彛寰勬墦鏋讹紙绗� 3 姝ョ殑鐪熸鏀跺彛鐐癸級銆�
+- 姣嶇増銆屼腑鍙e緞鏄庣粏銆嶅煄甯傜骇銆屽煄闄呭煄涔″贰娓稿嚭绉�/缃戠害杞︺�嶈鍏紡寮曢敊椤碉紙`=鍏氦!C13-鍏氦!C15`锛屽簲鎸囧悜 `鍑虹!`/`缃戠害杞�!`锛夛紝鍩庡競绾ф亽 0銆佸叏鐪佽闈犵紦瀛樺�� 鈫� 闇�淇瘝鐗堝叕寮忎竴娆°��
+
## 浜屻�佹祴璇曠粨鏋滄憳瑕�
瑙� `docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_姹囨�昏〃鍏紡鎵╅〉涓庨噸绠梍2026-09-18.md`锛�8 鏉℃鍚� + 4 鏉¤礋鍚�/杈圭晫 + 4 椤瑰叆搴撴娊鏌ワ紝鍏ㄩ儴閫氳繃銆�
@@ -30,16 +47,38 @@
- 涓彛寰勬帓鍚� K3 缂撳瓨 24481.7407 = 鎵嬪伐 危17 甯傚窞銆�
- 鍥炲綊锛氭敼鍔ㄥ墠鍚庨�愭牸瀵规瘮锛屼粎 216 鏍煎彉鍖栵紝鍏ㄩ儴钀藉湪鐩爣涓ら〉锛屽叾浣� 17 椤� 0 宸紓銆�
+### 绗� 3 姝ワ紙涓嬪崍锛夋祴璇曠粨鏋�
+
+瑙� `docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_涓彛寰勫洓缁村彛寰勭粺涓�_2026-09-18.md`锛�6 鏉℃鍚� + 3 鏉″洖褰� + 3 鏉¤礋鍚戣竟鐣岋紝鍏ㄩ儴閫氳繃銆�
+
+- 鐙珛銆婄敓鎴恄涓彛寰勬槑缁嗐�嬪叏鐪� 8 鏈堟�诲杩愰噺 4003.5701 = 鐝嚎 1646.4801 + 鍏氦 1436.63 + 鍑虹鍩庝埂 493.90 + 缃戠害杞﹀煄涔� 426.56锛�
+- 18 涓湴鍖� 脳锛�7銆�8 鏈堬級鎬昏 = 危 璇ュ潡 4 缁磋锛涚疮璁″垪缂撳瓨鍊� = 危1-8 鏈堬紙鍏ㄧ渷 31528.0607锛夛紱
+- 鍥炲綊锛氭眹鎬诲ぇ琛� 17 椤� 0 鏍煎彉鍖栥�併�婄敓鎴恄涓彛寰勬帓鍚嶃��0 鏍煎彉鍖栥�併�婄敓鎴恄涓彛寰勬槑缁嗐�嬩粎 36 鏍煎彉鍖栵紙鍏ㄩ儴鏄洰鏍囨牸锛夈��
+
## 涓夈�侀仐鐣欓棶棰樹笌寰呭姙
-1. **涓彛寰勬帓鍚嶅悓姣斾粛鏄啓姝诲��**锛圡3=0.7424 / Q3=0.2317锛屽簱鍐呭叏鐪佸彛寰勶級锛岄渶涓� 危17 甯傚窞鍙e緞缁熶竴 鈥斺�� 绗� 3 姝ャ��
-2. **`loadMidClassMap()` 缂哄贰娓稿嚭绉� + 缃戠害杞︿袱缁�**锛屽鑷寸嫭绔嬨�婄敓鎴恄鍏矾鏃呭涓彛寰勬槑缁嗐�嬪皯 535.83+333.39锛�1 鏈堬級鈥斺�� 绗� 3 姝ャ��
-3. **搴撳唴 h2031銆屽叏鐪併�嶈 鈮� 危17 甯傚窞**锛�1-8 鏈� 27524.49 vs 24481.74锛屽樊 3042.75锛夛細涓氬姟鍙e緞闂锛屽缓璁笟鍔′晶鏍稿銆�
-4. 鎶曡祫锛氭ā鏉块噷娌℃湁鐨勬柊椤圭洰涓嶄細鑷姩鎻掕锛涙槑缁嗚〃璧勯噾娓犻亾鍒嗙粍琛屾湭鍏ュ簱锛堥渶鍔� `fund_channel`锛夛紱鍚屽悕涓嶅悓椤圭洰鏈脊绐椼��
-5. 鎶曡祫涓ゅ紶鏄庣粏琛紙`X鏈堝杩愮珯鎶曡祫鏄庣粏琛╜ / `X鏈堢墿娴佺珯鍦烘姇璧勬槑缁哷锛夌敓鎴愬櫒鏈仛銆�
+1. ~~涓彛寰勬帓鍚嶅悓姣斾粛鏄啓姝诲�紐~ 鈫� **宸叉寜鏂板彛寰勫彇鍊�**锛圡3=0.638 / Q3=0.2247锛夛紝浣嗕粛涓庝腑鍙e緞鏄庣粏鐨� 0.0581 涓嶈嚜娲斤紝宸�� 2063.45 = 缃戠害杞� 1-6 鏈堟棤婧愶紱**鏀跺彛鍔炴硶瑙佷笅鏂�"绗� 3 姝ユ敹鍙e缓璁�"**銆�
+2. ~~`loadMidClassMap()` 缂哄贰娓稿嚭绉� + 缃戠害杞︿袱缁磣~ 鈫� **宸茶ˉ**锛堢淮搴� 3銆�4锛夛紝鐙珛涓彛寰勬槑缁嗗洓缁撮綈鍏ㄣ��
+3. **姣嶇増缂洪櫡寰呬慨**锛氫腑鍙e緞鏄庣粏鍩庡競绾с�屽煄闄呭煄涔″贰娓稿嚭绉�/缃戠害杞︺�嶈鍏紡寮曢敊椤碉紙鎸囧悜 `鍏氦!`锛夛紝鍩庡競绾ф亽 0銆佸叏鐪佽闈犵紦瀛樺�笺��
+4. **鏁版嵁缂哄彛**锛�2026-01~06 缃戠害杞﹁鍗曟湭鍏ュ簱锛坄order_*` 鍏� NULL锛夛紝妯℃澘銆婄綉绾﹁溅璁㈠崟鍙婂叏鐪佹�婚噺.xlsx銆嬪彧鏈� 2026-07 涓�琛� 鈫� 缁村害 4 璇� 6 涓湀鏃犳簮锛涢渶涓氬姟琛ユ暟鎴栫‘璁や笉閫傜敤銆�
+5. 搴撳唴 h2031銆屽叏鐪併�嶈 鈮� 危17 甯傚窞锛�1-8 鏈� 27524.49 vs 24481.74锛屽樊 3042.75锛夛細涓氬姟鍙e緞闂锛屽缓璁笟鍔′晶鏍稿銆�
+6. 鎶曡祫锛氭ā鏉块噷娌℃湁鐨勬柊椤圭洰涓嶄細鑷姩鎻掕锛涙槑缁嗚〃璧勯噾娓犻亾鍒嗙粍琛屾湭鍏ュ簱锛堥渶鍔� `fund_channel`锛夛紱鍚屽悕涓嶅悓椤圭洰鏈脊绐椼��
+7. 鎶曡祫涓ゅ紶鏄庣粏琛紙`X鏈堝杩愮珯鎶曡祫鏄庣粏琛╜ / `X鏈堢墿娴佺珯鍦烘姇璧勬槑缁哷锛夌敓鎴愬櫒鏈仛銆�
+
+### 绗� 3 姝ユ敹鍙e缓璁紙寰呯敤鎴锋媿鏉匡級
+
+涓嶅啀璁� Java 鍚勭畻涓�濂楋紝鏀逛负**涓�鏉¢摼璺嚭鏁�**锛氭瘝鐗堝叕寮忛摼锛堝叏鐪佽 = 危17 甯傚窞銆佺疮璁� = 危鍚勬湀銆佹淳鐢熼〉璺ㄩ〉寮曠敤锛�+ 鍙拌处椤靛啓鏁� + 鐢熸垚鏀跺熬閲嶇畻銆�
+
+1. 鍙拌处椤碉紙璐ц繍 / 鐝嚎鍖呰溅 / 鍏氦 / 鍑虹 / 缃戠害杞� / 杞ㄩ亾杞浮锛夊彧鍐欏綋鏈堝�硷紱
+2. 娲剧敓椤碉紙鍩庡競瀹㈣繍 / 涓彛寰勬槑缁� / 鍏矾鎬诲杩� / 涓彛寰勫杩愰噺 / 鎺掑悕锛�**鍙ˉ鍏紡 + 閲嶇畻锛屼笉鍗曠嫭鍐欐暟**锛�
+3. 鍙湁姣嶇増閲屾湰灏辨槸纭紪鐮佹暟鍊肩殑琛岋紙涓彛寰勬槑缁嗙殑鍩庡競绾�"鍩庨檯鍩庝埂鍑虹/缃戠害杞�"銆佸叏鐪佽锛夋寜鍥涚淮鍙e緞鍥炲~锛�
+4. 鐙珛瀵煎嚭浠讹紙鐢熸垚_涓彛寰勬槑缁� / 鎺掑悕 / 鍏矾鏃呭鍒嗗競宸烇級鏀逛负鐩存帴鍙栨眹鎬昏〃瀵瑰簲椤电殑鍊硷紝鎴栧叡鐢ㄥ悓涓�鍙e緞鍑芥暟锛�
+5. 姣嶇増閲屽紩閿欓〉鐨勫煄甯傜骇鍏紡淇竴娆★紙绗� 3 鏉★級锛�
+6. 鐢熸垚鍚庤窇"鐢熸垚浠� vs 姣嶇増閲嶇畻"閫愭牸鍥炲綊姣斿锛屽樊寮傛竻鍗曡惤鏃ュ織锛屼綔涓洪獙鏀跺熀绾裤��
## 鍥涖�佹槑澶╄鍒�
-1. 绗� 3 姝ワ細缁熶竴涓彛寰勫彛寰勶紙rank 鍏ㄧ渷鍚屾瘮鏀逛负鍚屾簮 + `loadMidClassMap` 琛ヤ袱缁达級锛屾敼瀹屽鐙珛涓彛寰勬槑缁嗕笌姹囨�昏〃閫愰」姣斿銆�
-2. 鎶曡祫"鏂板椤圭洰鎻掕 + 鍒嗙粍琛屽叆搴�"鏂规钀藉湴锛堢瓑鐢ㄦ埛瀵�"妯″潡"鍙e緞鐨勬渶鍚庣‘璁わ級銆�
-3. 寤虹敓鎴愪欢 vs 姣嶇増閲嶇畻鐨勫洖褰掓瘮瀵硅剼鏈紝鍥哄寲涓烘瘡娆℃敼鍔ㄧ殑楠屾敹鍩虹嚎銆�
\ No newline at end of file
+1. 绗� 3 姝ユ敹鍙o細鎸変笂闈� 6 鏉¤惤鍦帮紙鍏堜慨姣嶇増寮曢敊椤电殑鍩庡競绾у叕寮� 鈫� 鎺掑悕浠舵敼鍙栧悓婧� 鈫� 寤哄洖褰掓瘮瀵硅剼鏈級銆�
+2. 缃戠害杞� 2026-01~06 璁㈠崟鏁版嵁缂哄彛锛氬悜鐢ㄦ埛纭鏄ˉ鏁拌繕鏄暀绌恒��
+3. 鎶曡祫"鏂板椤圭洰鎻掕 + 鍒嗙粍琛屽叆搴�"鏂规钀藉湴锛堢瓑鐢ㄦ埛瀵�"妯″潡"鍙e緞鐨勬渶鍚庣‘璁わ級銆�
+4. 鎶曡祫涓ゅ紶鏄庣粏琛ㄧ敓鎴愬櫒銆�
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 1950983..16dd5e5 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
@@ -13,6 +13,7 @@
import com.trafficaudit.dataimport.entity.PassengerEnterpriseMonthly;
import com.trafficaudit.dataimport.entity.PassengerIndividualMonthly;
import com.trafficaudit.dataimport.entity.ScaleSplitTransport;
+import com.trafficaudit.dataimport.entity.WycOrderMonthly;
import com.trafficaudit.auditengine.entity.AuditResult;
import com.trafficaudit.auditengine.entity.AuditRun;
import com.trafficaudit.auditengine.mapper.AuditResultMapper;
@@ -29,9 +30,11 @@
import com.trafficaudit.dataimport.mapper.PassengerEnterpriseMonthlyMapper;
import com.trafficaudit.dataimport.mapper.PassengerIndividualMonthlyMapper;
import com.trafficaudit.dataimport.mapper.ScaleSplitTransportMapper;
+import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper;
import com.trafficaudit.reportexport.calc.MidCalc;
import com.trafficaudit.reportexport.calc.PaxCalc;
import com.trafficaudit.reportexport.calc.SummaryWorkbookFiller;
+import com.trafficaudit.reportexport.calc.WycSplitCalc;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
@@ -98,6 +101,10 @@
private CityTaxiMonthlyMapper cityTaxiMapper;
@Resource
private SummaryWorkbookFiller summaryWorkbookFiller;
+ @Resource
+ private WycSplitCalc wycSplitCalc;
+ @Resource
+ private WycOrderMonthlyMapper wycOrderMapper;
@Resource
private AuditResultMapper auditResultMapper;
@Resource
@@ -1179,17 +1186,16 @@
return lv == 0.0 ? null : (v - lv) / lv;
}
- /** 涓彛寰勬湀鍚屾瘮锛歬=-1 琛ㄧず鎬昏锛堢彮绾�+鍏氦涔嬪拰锛屽嚭绉�/缃戠害杞︽棤婧愭暟鎹寜 0锛夛紱鏃犲幓骞存暟鎹暀绌� */
+ /** 涓彛寰勬湀鍚屾瘮锛歬=-1 琛ㄧず鎬昏锛堢彮绾�+鍏氦+鍑虹鍩庝埂+缃戠害杞﹀煄涔� 鍥涢」涔嬪拰锛夛紱鏃犲幓骞存暟鎹暀绌� */
private void fillMidYoyCell(Cell c, Map<Integer, Map<String, double[][]>> mid, int year, int month,
String area, int k, boolean volume) {
double v = 0.0, lv = 0.0;
if (k == -1) {
for (int kk = 1; kk <= 4; kk++) {
- if (kk >= 3) continue;
v += midClassVal(mid, year, month, area, kk, volume);
lv += midClassVal(mid, year - 1, month, area, kk, volume);
}
- } else if (k <= 2) {
+ } else {
v = midClassVal(mid, year, month, area, k, volume);
lv = midClassVal(mid, year - 1, month, area, k, volume);
}
@@ -1197,7 +1203,7 @@
if (v != 0.0 && lv != 0.0) c.setCellValue(round((v - lv) / lv, 4));
}
- /** 涓彛寰勭疮璁″悓姣斿垪锛�1..months 鏈堢疮璁★紱k=-1 鎬昏 = 鐝嚎+鍏氦锛� */
+ /** 涓彛寰勭疮璁″悓姣斿垪锛�1..months 鏈堢疮璁★紱鍥涚淮榻愬叏锛� */
private void fillMidCumYoyColumn(Sheet sheet, Map<Integer, Map<String, double[][]>> mid, int year,
int months, int colIdx) {
List<String> areas = midTemplateAreas();
@@ -1217,7 +1223,7 @@
String area = areas.get(blockOffset / 5);
double v = 0.0, lv = 0.0;
for (int m = 1; m <= months; m++) {
- if (k <= 2) {
+ {
v += midClassVal(mid, year, m, area, k, volume);
lv += midClassVal(mid, year - 1, m, area, k, volume);
}
@@ -2181,20 +2187,15 @@
boolean extended = fillMonths > 6;
if (extended) extendMonthlyColumns(sheet, 2, currentYear, 4, sheet.getLastRowNum());
List<String> areas = midTemplateAreas();
+ // 2026-09-18锛氭敼涓恒�屾寜鍗曞厓鏍肩被鍨嬫棤鍏炽�嶉亶鍘嗏�斺�旀墿鍒楋紙7~12 鏈堬級鍑烘潵鐨勫�煎垪鍦ㄦā鏉块噷鏄┖鏍硷紝
+ // 鏃у疄鐜板彧澶勭悊 CellType.FORMULA 鐨勬牸锛屽鑷� 7 鏈堝強浠ュ悗鏈堜唤姘歌繙濉笉涓婏紙8 鏈堟暣鍒� 0銆佺疮璁″彧鍒� 6 鏈堬級銆�
for (Row row : sheet) {
if (row == null) continue;
- for (Cell c : row) {
- if (c.getCellType() != CellType.FORMULA) continue;
- String f = c.getCellFormula();
- if (f == null) continue;
- boolean crossBook = f.contains("[");
- if (!crossBook && !isYoyMonthCol(c.getColumnIndex() + 1)) continue; // 鍐呴儴鍏紡锛堝悎璁�/绱锛変繚鐣欓噸绠楋紱鍚屾瘮鍒� #REF! 瑕嗗啓涓烘暟鍊�
- if (crossBook && !is2026MonthCol(c.getColumnIndex() + 1)) {
- keepCached(c); // 2025 骞村垪淇濈暀妯℃澘缂撳瓨鍊�
- continue;
- }
+ for (int c0 = 0; c0 < Math.max(row.getLastCellNum(), 0); c0++) {
+ Cell c = row.getCell(c0);
+ if (c == null) continue;
int r = c.getRowIndex() + 1;
- int col = c.getColumnIndex() + 1;
+ int col = c0 + 1;
int blockOffset = -1;
boolean volume = false;
if (r >= 5 && r <= 94) {
@@ -2205,31 +2206,48 @@
volume = false;
}
if (blockOffset < 0) {
- keepCached(c); // r1/r2 澶囨敞绛�
+ if (c.getCellType() == CellType.FORMULA) keepCached(c); // r1/r2 澶囨敞銆侀〉澶栬法绨垮紩鐢ㄧ瓑
continue;
}
- if (blockOffset % 5 == 0) {
- if (isYoyMonthCol(col)) {
- fillMidYoyCell(c, mid, currentYear, monthOfCol(col), areas.get(blockOffset / 5), -1, volume);
- } else {
- keepCached(c); // 鎬昏鍐呴儴鍏紡锛堥槻寰★級
+ boolean isVal = is2026MonthCol(col);
+ boolean isYoy = isYoyMonthCol(col);
+ if (!isVal && !isYoy) {
+ // 2025 骞村垪绛夛細璺ㄧ翱鍏紡鍙栫紦瀛樺�兼柇閾撅紱鍐呴儴鍏紡锛堝悎璁�/绱锛変繚鐣欙紝绋嶅悗 recalc 閲嶇畻
+ if (c.getCellType() == CellType.FORMULA) {
+ String f = c.getCellFormula();
+ if (f != null && f.contains("[")) keepCached(c);
}
continue;
}
- int k = blockOffset % 5; // 1=鐝嚎 2=鍏氦 3=鍑虹 4=缃戠害杞�
String area = areas.get(blockOffset / 5);
- if (is2026MonthCol(col)) {
+ if (blockOffset % 5 == 0) {
+ if (isYoy) {
+ fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, -1, volume);
+ } else if (monthOfCol(col) > 6) {
+ // 鎵╁垪鍑烘潵鐨� 7~12 鏈堟�昏鍊煎垪锛氭ā鏉块噷鏈棤姝ゅ垪锛屽厠闅嗗悗鏃㈡病鏈夊叕寮忎篃娌℃湁缂撳瓨鍊硷紝
+ // 鐩存帴鍐欏簱鍐呭洓缁村悎璁★紙缁村害0锛夈��1~6 鏈堜繚鐣欐ā鏉跨紦瀛樺�硷紝閬垮厤涓㈡帀妯℃澘閲岀殑瀹氱鏁般��
+ double total = midClassVal(mid, currentYear, monthOfCol(col), area, 0, volume);
+ c.setBlank();
+ if (total != 0.0) c.setCellValue(round(total, 4));
+ } else if (c.getCellType() == CellType.FORMULA) {
+ keepCached(c); // 1~6 鏈堟�昏鍊煎垪 = 妯℃澘缂撳瓨鍊硷紝淇濈暀
+ }
+ continue;
+ }
+ int k = blockOffset % 5; // 1=鐝嚎 2=鍏氦 3=鍑虹鍩庝埂 4=缃戠害杞﹀煄涔�
+ if (isVal) {
fillMidCell(c, mid, currentYear, monthOfCol(col), area, k, volume);
- } else if (isYoyMonthCol(col)) {
- fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, k, volume);
} else {
- keepCached(c); // 2025 骞村垪淇濈暀妯℃澘缂撳瓨鍊�
+ fillMidYoyCell(c, mid, currentYear, monthOfCol(col), area, k, volume);
}
}
}
// 绱鍚屾瘮鍒楋紙妯℃澘 #REF! 鈫� 搴撳唴鍘诲勾 1..N 鏈堢疮璁″悓姣旀暟鍊硷級
fillMidCumYoyColumn(sheet, mid, currentYear, fillMonths, extended ? 27 : 15);
- recalc(wb);
+ // evaluateAll 浼氬湪璺ㄧ翱鍏紡锛圫heet2 鐨� [1]xx!A1锛夊鏁存湰涓柇锛岀疮璁″垪 AA 灏辨案杩滄嬁涓嶅埌鏂扮紦瀛樺�硷紝
+ // 鏀圭敤閫愭牸瀹归敊鐨� recalcWorkbookFormulas锛氬潖鏍艰烦杩囥�佸ソ鏍肩収绠椼��
+ int[] recalc = recalcWorkbookFormulas(wb);
+ log.info("涓彛寰勬槑缁嗗叕寮忛噸绠楀畬鎴愶細鎴愬姛 {} 鏍硷紝澶辫触 {} 鏍�", recalc[0], recalc[1]);
clearFormulaErrorsAll(wb); // 鍘诲勾鍚屾湡鏄庣粏椤垫畫鐣� #REF! 鍚屾瘮鍏紡 鈫� 娓呯┖
return toBytes(wb);
}
@@ -2256,12 +2274,8 @@
return (col - 1) / 2;
}
- /** 濉腑鍙e緞鏁版嵁鍗曞厓鏍硷細鍑虹/缃戠害杞�(3/4)鏄惧紡 0锛岀彮绾�/鍏氦濉簱鍐呭�硷紙鏃犲�兼竻绌猴級 */
+ /** 濉腑鍙e緞鏁版嵁鍗曞厓鏍硷細鐝嚎/鍏氦/鍑虹鍩庝埂/缃戠害杞﹀煄涔� 鍥涚淮缁熶竴鍙栧簱鍐呭�硷紙鏃犲�兼竻绌猴級 */
private void fillMidCell(Cell c, Map<Integer, Map<String, double[][]>> mid, int year, int month, String area, int k, boolean volume) {
- if (k == 3 || k == 4) {
- writeExplicitZero(c); // 鍑虹/缃戠害杞︽殏鏃犳暟鎹簮锛屾樉寮� 0
- return;
- }
double v = midClassVal(mid, year, month, area, k, volume);
// POI setCellValue(double) 瀵瑰叕寮忓崟鍏冩牸鍙洿鏂扮紦瀛樹笉绉婚櫎鍏紡锛屽繀椤诲厛 setBlank 鍐嶅啓鍊�
c.setBlank();
@@ -2369,9 +2383,54 @@
addMidClass(mid, key, city, 2, nz(b.getPassengerChengxiang()), nz(b.getTurnoverChengxiang()));
addMidClass(mid, key, "婀栧寳鐪�", 2, nz(b.getPassengerChengxiang()), nz(b.getTurnoverChengxiang()));
}
+ // 缁村害3锛氬煄闄呭煄涔″贰娓稿嚭绉� = 鍙拌处椤点�屽嚭绉�!鎬婚噺 鈭� 鍑虹!鍩庡競鍐呫�嶏紙婧� city_taxi_monthly锛�
+ for (CityTaxiMonthly t : cityTaxiMapper.selectList(null)) {
+ if (t.getReportPeriod() == null || t.getCity() == null) continue;
+ int key = midPeriodKey(t.getReportPeriod());
+ if (key <= 0) continue;
+ String city = RegionUtil.normalizeCityName(t.getCity());
+ if (city == null) continue;
+ double pass = nz(t.getPassengerVolume()) - nz(t.getPassengerCity());
+ double turn = nz(t.getTurnover()) - nz(t.getTurnoverCity());
+ addMidClass(mid, key, city, 3, pass, turn);
+ addMidClass(mid, key, "婀栧寳鐪�", 3, pass, turn);
+ }
+ // 缁村害4锛氬煄闄呭煄涔$綉绾﹁溅 = 缃戠害杞︽媶鍒嗙粨鏋滐紙涓庡彴璐︺�岀綉绾﹁溅銆嶉〉鍚屾簮鍚屾硶锛�
+ for (WycOrderMonthly o : wycOrderMapper.selectList(null)) {
+ String per = o.getReportPeriod();
+ if (per == null) continue;
+ int key = midPeriodKey(per);
+ if (key <= 0) continue;
+ WycSplitCalc.WycResult wr;
+ try {
+ wr = wycSplitCalc.calc(per);
+ } catch (Exception e) {
+ continue; // 璇ユ湡缂鸿鍗�/pin 鎴栧嚭绉熸簮鏁版嵁锛岃烦杩囷紙涓嶅奖鍝嶅叾瀹冩湡锛�
+ }
+ for (Map.Entry<String, WycSplitCalc.WycMetrics> en : wr.getByCity().entrySet()) {
+ WycSplitCalc.WycMetrics wm = en.getValue();
+ addMidClass(mid, key, en.getKey(), 4, wm.getSuburbanPax(), wm.getSuburbanTurnover());
+ addMidClass(mid, key, "婀栧寳鐪�", 4, wm.getSuburbanPax(), wm.getSuburbanTurnover());
+ }
+ }
return mid;
}
+ /** "yyyy-MM" -> yyyy*100+MM锛涢潪娉曡繑鍥� 0锛堜笌 loadMidClassMap 鐨� key 鍙e緞涓�鑷达級 */
+ private int midPeriodKey(String period) {
+ if (period == null) return 0;
+ String[] parts = period.trim().split("-");
+ if (parts.length != 2) return 0;
+ try {
+ int y = Integer.parseInt(parts[0]);
+ int m = Integer.parseInt(parts[1]);
+ if (y <= 0 || m < 1 || m > 12) return 0;
+ return y * 100 + m;
+ } catch (NumberFormatException e) {
+ return 0;
+ }
+ }
+
/** 鍐欏叆鍒嗙被鍊煎苟绱姞鎬婚噺锛堢淮搴�0锛� */
private void addMidClass(Map<Integer, Map<String, double[][]>> mid, int key, String city, int k, double pass, double turn) {
double[][] arr = mid.computeIfAbsent(key, kk -> new HashMap<>()).computeIfAbsent(city, kk -> new double[5][2]);
--
Gitblit v1.9.1