From 573e11132bd4a404934c03f9fd0802200e2ccd30 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期四, 03 九月 2026 08:59:57 +0800
Subject: [PATCH] feat: 报表新版式(上累计+下当月)与导入校验增强、I004 保护 + 09-02 测试文档
---
docs/功能测试报告/功能测试报告_运政车辆与轨迹里程导入回归_2026-09-02.md | 33 +
docs/功能测试报告/功能测试报告_导入校验增强_2026-09-02.md | 50 ++
docs/工作日结/工作日结_2026-09-02.md | 55 ++
docs/能耗/能耗简化(2026年).xlsx | 0
docs/货运/模板_货运量周转量.xlsx | 0
docs/货运/生成_周转量排名.xlsx | 0
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java | 290 ++++++++++--
docs/公路旅客/生成_中口径排名.xlsx | 0
docs/功能测试报告/导入与生成模块体检问题清单_2026-09-02.md | 63 ++
docs/城市客运/生成_轨道轮渡客运量分市州明细.xlsx | 0
docs/城市客运/生成_城市客运客运量分市州累计.xlsx | 0
docs/能耗/生成_能运汇总表.xlsx | 0
traffic-audit-server/src/main/java/com/trafficaudit/common/util/RegionUtil.java | 26 +
docs/导入功能体检报告.md | 75 +++
docs/功能测试报告/功能测试报告_生成模板新版式_2026-09-02.md | 57 ++
docs/功能测试报告/功能测试报告_2026-09-02_导入与报表生成回归.md | 57 ++
docs/货运/货运简化工作.xlsx | 0
docs/城市客运/城市客运数据优化.docx | 0
docs/工作日结/模块功能验证状态矩阵_2026-09-02.md | 82 +++
docs/城市客运/客运简化.xlsx | 0
traffic-audit-web/src/views/DataImport.vue | 4
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java | 5
docs/公路旅客/模板_交企统H203-1表_公路旅客运输月度生产情况.xlsx | 0
traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java | 6
docs/城市客运/生成_城市客运汇总.xlsx | 0
docs/待业务用户确认清单_2026-09-02.md | 51 ++
docs/交接文档-20260831.md | 61 ++
/dev/null | 0
docs/城市客运/生成_城市客运各市州明细表.xlsx | 0
docs/货运/模板_轨迹里程.xlsx | 0
AGENTS.md | 12
traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java | 300 ++++++++++++
docs/功能测试报告/功能测试报告_投资审核I004基准缺失保护_2026-09-02.md | 29 +
docs/功能测试报告/功能测试报告_投资市州月报多sheet识别与序号空格_2026-09-02.md | 36 +
docs/货运/模板_规上规下拆分运输量.xlsx | 0
docs/货运/生成_货运量排名.xlsx | 0
docs/公路旅客/生成_中口径分析.xlsx | 0
37 files changed, 1,215 insertions(+), 77 deletions(-)
diff --git a/AGENTS.md b/AGENTS.md
index 5e3065a..020d876 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -32,4 +32,14 @@
## 楠岃瘉娉ㄦ剰
- 娌欑鍐� `Get-NetTCPConnection` 浼氬洜鏉冮檺鈥滄嫆缁濊闂�濊�岄潤榛樺け璐ワ紝**涓嶈**鎹鍒ゅ畾绔彛鏈洃鍚紱鍒ゆ柇鏈嶅姟鐘舵�佷互 backend.log / frontend.log 涓哄噯銆�
-- 鐢ㄦ埛瑕佹眰锛氫复鏃惰剼鏈�/鏂囦欢鏈粡鍚屾剰涓嶅垹锛涘鍏ュけ璐ヨ鍦ㄩ〉闈㈡樉绀鸿鍙凤紱AI 鍒嗘瀽缁撴灉瑕佺粰缁撴瀯鍖栨帓鐗� + 閫愬瓧杈撳嚭鍔ㄧ敾銆�
\ No newline at end of file
+- 鐢ㄦ埛瑕佹眰锛氫复鏃惰剼鏈�/鏂囦欢鏈粡鍚屾剰涓嶅垹锛涘鍏ュけ璐ヨ鍦ㄩ〉闈㈡樉绀鸿鍙凤紱AI 鍒嗘瀽缁撴灉瑕佺粰缁撴瀯鍖栨帓鐗� + 閫愬瓧杈撳嚭鍔ㄧ敾銆�
+
+## 宸ヤ綔瑙勮寖锛�2026-09-02 璧凤紝蹇呴』閬靛畧锛�
+1. **姣忓仛瀹屼竴涓姛鑳斤紝绔嬪嵆娴嬭瘯骞跺啓銆婂姛鑳芥祴璇曟姤鍛娿��**
+ - 娴嬭瘯鑷冲皯瑕嗙洊锛氭鍚戠敤渚嬶紙姝e父鏁版嵁锛夈�佽礋鍚戠敤渚嬶紙閿欑被鍨�/閿欏垪浣�/缂哄垪绛夛級銆佸叆搴撴娊鏌ワ紙涓庢簮鏂囦欢閫愰」瀵归綈锛夈��
+ - 鎶ュ憡鍐欏叆 `docs/鍔熻兘娴嬭瘯鎶ュ憡/`锛屽懡鍚嶏細`鍔熻兘娴嬭瘯鎶ュ憡_<鍔熻兘鍚�>_<YYYY-MM-DD>.md`銆�
+ - 鎶ュ憡椤诲寘鍚細鍔熻兘璇存槑銆佹祴璇曠幆澧冦�佺敤渚嬭〃锛堣緭鍏�/棰勬湡/瀹為檯/缁撹锛夈�佸彂鐜扮殑闂涓庡缃�佺粨璁恒��
+2. **姣忓ぉ涓嬬彮鍓嶅啓銆婂伐浣滄棩缁撱�嬶紝鍛藉悕闄勬棩鏈�**
+ - 鍐欏叆 `docs/宸ヤ綔鏃ョ粨/`锛屽懡鍚嶏細`宸ヤ綔鏃ョ粨_<YYYY-MM-DD>.md`銆�
+ - 鍐呭鑷冲皯鍖呭惈锛氫粖澶╁仛浜嗕粈涔堬紙鍔熻兘/淇锛夈�佹祴璇曠粨鏋滄憳瑕併�侀仐鐣欓棶棰樹笌寰呭姙銆佹槑澶╄鍒掋��
+ - 褰撳ぉ娌℃湁浠g爜/娴嬭瘯宸ヤ綔鏃讹紝涔熻鍐欙紙涓�鍙ヨ瘽璇存槑鈥滀粖鏃ユ棤浠g爜鏀瑰姩鈥濆嵆鍙級銆�
diff --git "a/docs/\344\272\244\346\216\245\346\226\207\346\241\243-20260831.md" "b/docs/\344\272\244\346\216\245\346\226\207\346\241\243-20260831.md"
new file mode 100644
index 0000000..7d5957f
--- /dev/null
+++ "b/docs/\344\272\244\346\216\245\346\226\207\346\241\243-20260831.md"
@@ -0,0 +1,61 @@
+# 浜ゆ帴鏂囨。锛�2026-08-31锛屾湰鍦板紑鍙戜細璇濓級
+
+> 鐢ㄩ�旓細鏂颁細璇濇棤缂濇帴鍔涖�傚紑鏂颁細璇濆悗璁� Codex 鍏堣鏈枃浠� + 椤圭洰鏍� `AGENTS.md`銆�
+> 娉ㄦ剰锛氭湰鏂囦欢涓烘湰鍦颁細璇濈嫭绔嬩氦鎺ワ紝**涓嶈瑕嗙洊/淇敼鍚屼簨鎺ㄩ�佺殑 `HANDOFF.md`**銆�
+
+## 涓�銆侀」鐩鍐�
+- 浜ら�氳揣杩愮粺璁″鏍哥郴缁燂紙婀栧寳璐ц繍閲�/鍛ㄨ浆閲忕瓑锛夈��
+- 鍚庣 Spring Boot锛坄traffic-audit-server`锛岀鍙� 8090锛夛紱鍓嶇 Vue2 + Element UI锛坄traffic-audit-web`锛岀鍙� 8080锛宍/api` 浠g悊 8090锛夈��
+- 涓�閿惎鍔細`powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`锛堝繀椤绘矙绠卞杩愯锛涗細鑷姩妫�娴� 8090/8080锛屽凡鍦ㄨ窇鍒欒烦杩囷級銆�
+- 鏃ュ織锛氭牴鐩綍 `backend.log`銆乣traffic-audit-web/frontend.log`銆傛垚鍔熸爣蹇楋細鍚庣 `Started TrafficAuditApplication`+`Tomcat started on port(s): 8090`锛涘墠绔� `Compiled successfully`+`App running at:`銆�
+
+## 浜屻�佸綋鍓嶄唬鐮佺姸鎬�
+- 鏈湴 `main` 涓庢湇鍔″櫒涓�鑷达細`079d872`锛�8/31 鍚屼簨 5 涓柊鎻愪氦宸插悓姝ワ細sessionStorage 寮哄埗鐧诲綍 c62a61c銆�/import 涓� /report el-tabs 淇 684da41/d42a044銆佸穿婧冩牴鍥犳枃妗� f0597c2銆佷氦鎺ョ害瀹� 079d872锛夈��
+- 鍚屼簨 8/28 鏀瑰姩锛�
+ - `2bd663b` fix锛欵xplainReview.vue 閲嶅 components 閿紙AppHeader 琚� AiChatDialog 瑕嗙洊锛夊凡鍚堝苟锛汻uleManage/UserManage 甯冨眬缁熶竴涓� app-header 涓婁笅甯冨眬锛岀Щ闄よ彍鍗曞唴澶辨晥閫�鍑洪」銆�
+ - `37496dc` docs锛氱敤鎴� 4 闂锛堝鏍哥粨鏋滆彍鍗曚笉楂樹寒/妯爮缂哄け/閫�鍑轰笉鏄剧ず/寮哄埗鐧诲綍锛夆�斺�斺憽鈶㈠凡淇紱鈶� token 鏀� sessionStorage = 寰呭姙锛�**/import 鏁版嵁瀵煎叆椤� JS 涓荤嚎绋嬪崱姝绘柊鍙戠幇锛堟湭淇級**銆�
+- 鏈嶅姟褰撳墠**鍦ㄨ繍琛�**锛�8/31 浼氳瘽娌跨敤锛�8080/8090 鍧囧湪鐩戝惉锛宐ackend.log / frontend.log 姝e父锛夈�傞渶瑕侀噸鍚椂鐢� start-dev.ps1锛堟矙绠卞锛夈��
+
+## 涓夈�佽繍琛岀幆澧冿紙閲嶈锛�
+- 鏁版嵁搴擄細`localhost:3308`锛屽簱 `traffic_audit`锛宍root/123456`锛堣鏈湴 `traffic-audit-server/src/main/resources/application.yml`锛屼笉鍏ュ簱锛夈��
+ - 鈿狅笍 鍚屼簨 HANDOFF 閲屽啓鐨� `3305/root/root` 宸茶繃鏃讹紙3305 鏈洃鍚級锛屼互 application.yml 涓哄噯銆�
+ - 璇ュ簱涓� 8/27 鏅氬悓浜� Navicat 鍚堝苟鍚庣殑瀹屾暣搴擄紙27 琛ㄣ�佺害 6 涓囪锛泂ys_user 4 璐﹀彿 admin+zhangsan/lisi/wangwu锛�**鏈満搴撲腑 4 璐﹀彿瀵嗙爜鍧囦负 `123456`**锛�8/31 bcrypt+鐧诲綍鎺ュ彛瀹炴祴锛宎dmin/123456 杩斿洖 200锛涙枃妗f棫璁� admin/admin123 鍦ㄦ湰鏈轰笉鍖归厤锛屽嬁鍐嶇敤锛夈��
+- 鐧诲綍楠岃瘉鐮侊細鏈湴 `application.yml` 宸查厤 `app.captcha.required: false`锛堟祴璇曡烦杩囷紝鎺ュ彛 /api/auth/captcha-config 杩斿洖 false锛夈�傝閰嶇疆涓嶅叆搴擄紱**姝e紡鍙戝竷鍓嶆敼鍥� true**銆�
+- 瀹㈡埛绔細鏈満 MySQL 瀹㈡埛绔� `D:\mysql\mysql-5.7.41-winx64\bin\mysql.exe`锛堣繛 3308 鐢� root/123456锛夛紱HANDOFF 鎻愰啋姝e紡鐢� 8.0 瀹㈡埛绔紙鏈満 `C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe`锛夈��
+
+## 鍥涖�佹渶杩戝畬鎴愮殑浜嬮」- **璁よ瘉淇℃伅 localStorage 鈫� sessionStorage锛�8/31 瀹屾垚锛�**锛�
+ - 鐧诲綍鎬佸洓閿紙token/username/realName/modules锛夊叏閮ㄦ敼瀛� sessionStorage锛歀ogin.vue锛堝啓鍏ワ級銆乺outer/index.js锛堝畧鍗锛夈�乤pi/index.js锛堣姹傚ご璇� + 401 娓呴櫎锛夈�乵ain.js锛堝叏灞� mixin logout 娓� 4 閿級銆丄ppHeader.vue锛堢敤鎴峰悕鏄剧ず + 鐧诲嚭娓� 4 閿級銆丷eportExport.vue锛堢敤鎴峰悕/鐪熷疄鍚�/妯″潡璇诲彇 + 鐧诲嚭娓� 4 閿級銆�
+ - 鍋忓ソ绫讳繚鎸� localStorage锛欴ataImport 鐨� `dirLast_*`锛堢洰褰曡蹇嗭級銆丷eportExport 鐨� `report_note_*`锛堟姤琛ㄥ娉ㄨ崏绋匡級銆�
+ - 琛屼负锛氬悓鏍囩椤� F5 鍒锋柊淇濇寔鐧诲綍锛涘叧鏍囩椤�/鏂板紑鏍囩椤甸渶閲嶆柊鐧诲綍锛堝己鍒剁櫥褰曠敓鏁堬級锛涚櫥鍑烘竻绌� 4 閿洖鐧诲綍椤点��
+ - 楠岃瘉锛坧uppeteer锛宎dmin/123456 UI 鐧诲綍锛夛細鏃� token 璁块棶 /#/dashboard 涓� /#/audit 鍧囬噸瀹氬悜 /#/login锛涚櫥褰曞悗 sessionStorage 鏈� token銆乴ocalStorage 鏃� token锛涚櫥鍑烘竻绌猴紱/import 璇锋眰澶存惡甯� Bearer token銆佽〃鏍� 28 琛屾甯搞��
+
+- **/import 涓荤嚎绋嬪崱姝绘牴鍥犲畾浣嶅苟淇锛�8/31锛�**锛�
+ - 澶嶇幇锛坧uppeteer-core + 绯荤粺 Chrome锛孋DP锛夛細/import 鍦ㄧ獥鍙e搴� 鈮�1366 鏃� JS 涓荤嚎绋�**姘镐箙**鍗℃锛�800x600 / 1280x800 / 1366x768 鍧囧喕缁擄紝1440+ 姝e父锛夛紱鍚屾帰閽堜笅 /data /audit /report 鍏ㄥ搴︽甯搞��
+ - 鏍瑰洜锛欵lement UI `el-tabs`锛圱abNav锛塦updated()` 閽╁瓙閲岀殑 `update()` 鎸� DOM 娴嬮噺鍐欏搷搴斿紡 `scrollable`/`navOffset`銆傛湰椤靛竷灞�涓� `.el-tabs__nav-scroll` 瀹藉害鍦ㄩ潪 scrollable 鎬佸疄娴� 0銆佸姞婊氬姩鎸夐挳鍚庡疄娴� 998锛屽鑷� `scrollable` 鍦� false鈫攞} 闂存尟鑽� 鈫� 娓叉煋 watcher 鏃犻檺鑷叆闃燂紙`flushSchedulerQueue` 姘镐笉鎺掔┖锛夆啋 涓荤嚎绋嬫寰幆銆侰DP `Debugger.pause` 鎶撴爤锛歚flushSchedulerQueue鈫扺atcher.run鈫抲pdateComponent鈫抇render鈫抮ender` 涓� `updated鈫抲pdate鈫抮eactiveSetter(key=scrollable)`銆�
+ - 褰卞搷锛氬嵆銆屾暟鎹鍏ラ〉鏃犲搷搴斻�嶃�岀偣鏁版嵁瀵煎叆鑿滃崟娴忚鍣ㄦ棤鍝嶅簲銆嶏紱涔熻В閲娿�屽鏍哥粨鏋滆彍鍗曚笉楂樹寒銆嶏紙椤甸潰 JS 闃诲鈫掔偣鍑�/楂樹寒鏇存柊鍏ㄨ鍗′綇锛�/audit 椤佃嚜韬棤闂锛夈��
+ - 淇锛欴ataImport.vue 涓� ReportExport.vue 鐨� `el-tabs` 鎹㈡垚 `el-radio-group`/`el-radio-button` 鎸夐挳 + `v-show` 闈㈡澘锛堝悓浜嬫彁浜� 684da41/d42a044锛屾湰鏈哄凡鍚屾锛岀粫寮� TabNav 娴嬮噺寰幆锛夈��
+ - 楠岃瘉锛�800/1280/1366/1440/1920 鍏ㄥ搴︿袱椤靛潎涓嶅啀鍐荤粨锛�10s 鎸佺画 ping 姝e父锛夈�乀ab 鍒囨崲姝e父銆乥atches 琛ㄦ牸娓叉煋姝e父锛�/import 鐐瑰嚮銆屽鏍哥粨鏋溿�嶈彍鍗� 鈫� `#/audit` 楂樹寒姝e父銆�
+ - /report 铏芥祴璇曟湭鍐荤粨锛屼絾鍚岀粍浠舵祴閲忓悓鏍蜂笉鍙潬锛�1440x900 鏃� nav-wrap 浠� 97px锛夛紝宸蹭竴骞舵浛鎹㈤槻鍚岀被闅愭偅銆傛帰閽堣剼鏈湪 `outputs/pptr/`锛坧robe*.js銆乿erify_*.js锛夈��
+
+- 浠g爜鍚屾锛氬娆� fetch/pull 淇濇寔涓庢湇鍔″櫒涓�鑷达紱鍚屼簨鏂板鎻愪氦鍧囧凡鎷夊彇銆�
+- 鏈嶅姟绠$悊锛氬娆″仠鏃ц捣鏂帮紙绮剧‘鎸� PID 鍋滈摼锛氬悗绔� cmd鈫抦aven鈫抋pp锛屽墠绔� cmd鈫抧pm鈫抍md鈫抳ue-cli锛涗笉鏉� Codex 鍐呮牳/IDEA 缁堢锛夈��
+- 楠岃瘉鐮佸叧闂細鏈満閰嶇疆 `app.captcha.required: false` 骞堕噸鍚悗绔獙璇併��
+- 璐ц繍鏁版嵁涓�鑷存�ф牳瀵癸紙8/29锛夛細
+ - 瀵规瘮 `docs/璐ц繍闇�瀵煎叆鐨勬暟鎹�/璐ц繍/`锛�2025 鍏ㄥ勾 12 涓湀 + 2026 骞� 1-7 鏈堬紝鍏� 19 涓枃浠讹紝瀹炰负 xlsx 鏀� .xls 鎵╁睍鍚嶏級涓庡簱琛� `h2032_enterprise_monthly`銆�
+ - **18 涓湀浠藉畬鍏ㄤ竴鑷�**锛堜紒涓氭暟/杞﹁締/鍚ㄤ綅/璐ц繍閲�/鍛ㄨ浆閲忛�愰」鍖归厤锛夈��
+ - **2026-07 涓嶄竴鑷�**锛氬簱涓� 734 琛岋紝98 瀹朵紒涓氶噸澶嶏紙姣忔埛 2 琛岋級锛屾寚鏍囧悎璁″亸澶х害 12%锛沬mport_batch_id 鍏� NULL = 8/27 Navicat 鍚堝苟甯﹁繘锛堥潪绯荤粺瀵煎叆浜х敓锛夈�傛湭娓呯悊銆�
+ - 搴撲腑鍙︽湁 2026-08锛�664 琛岋紝8/26 娴嬭瘯瀵煎叆锛夛紝鐩綍鏃� 8 鏈堟枃浠躲��
+ - 瀵煎叆骞傜瓑宸茬‘璁わ細绯荤粺瀵煎叆鎸� report_period 鍏堝垹鍚庢彃锛屽啀娆″鍏ュ彧瀛樻渶鏂颁竴娆°��
+
+## 浜斻�佸緟鍔烇紙鏂颁細璇濅紭鍏堬級
+1. ~~/import 鏁版嵁瀵煎叆椤� JS 涓荤嚎绋嬪崱姝粇~锛�8/31 宸蹭慨澶嶏細el-tabs TabNav updated 閽╁瓙 scrollable 鎸崱 鈫� 鏃犻檺娓叉煋寰幆锛涘悓浜嬫彁浜ゅ凡鎹� el-radio-group 鎸夐挳 + v-show 闈㈡澘锛岃瑙佺鍥涜妭锛夈��
+2. ~~璁よ瘉淇℃伅 localStorage 鈫� sessionStorage锛堝己鍒剁櫥褰曪級~~锛�8/31 宸插畬鎴愬苟楠岃瘉锛岃瑙佺鍥涜妭锛夈��
+3. 2026-07 閲嶅 98 琛屾竻鐞嗭紙鍏堝浠藉啀鍒狅紝鎴栭噸鏂板鍏� 7 鏈堟枃浠讹級銆�
+4. `docs/鎵撳寘閮ㄧ讲璇存槑.docx` 绗叚鑺傘�屽缃� application.yml 闇�鍖呭惈瀹屾暣閰嶇疆銆嶆敼涓恒�屽睘鎬х骇鍚堝苟銆嶅悗閲嶆柊瀵煎嚭銆�
+5. 姝e紡鍙戝竷鍓嶏細captcha.required 鏀� true锛涘穿婧冩牴鍥犱互 access log 鍙栬瘉锛堝嬁瀹gО绾跨▼姹犲疄閿わ紝宸茶 3 鐢ㄦ埛鍦烘櫙鍙嶉┏锛夈��
+
+## 鍏�佸巻鍙茬粨璁轰笌鍧戯紙閬垮厤閲嶅韪╋級
+- 鏁版嵁瀵煎叆宕╂簝鎺掓煡锛氬厛璇瘖杩呴浄鎵╁睍 鈫� 鍚庡疄閿� Tomcat 绾跨▼姹� 鈫� 鍙堣 3 鐢ㄦ埛鍦烘櫙鍙嶉┏ 鈫� 鍚屼簨鍙戠幇鍓嶇涓荤嚎绋嬪崱姝伙紙鏈�鏂版柟鍚戯級銆�**瀵圭敤鎴蜂笉瑕佸绉扮嚎绋嬫睜瀹為敜**銆�
+- AGENTS.md 涓夊潙锛氣憼鏈満鍚屾椂瀛樺湪 Path/PATH 鍙岀幆澧冨彉閲忥紝绂佺敤 Start-Process锛堢敤 cmd.exe /c + ProcessStartInfo锛夛紱鈶ode 娌欑鍐呰闂� C:\Users 琚嫆锛岃剼鏈繀椤绘矙绠卞璺戯紱鈶笉瑕佸祵濂� powershell 寮曞彿銆�
+- 涓存椂鑴氭湰/鏂囦欢锛堥」鐩牴 `_probe*.py`銆乣_compare_freight.py`銆乣_probe*.sql`銆乣docs.zip`銆乣outputs/`銆佹墦鍖� zip锛夋湭缁忓悓鎰忎笉鍒犮��
+- 鎵撳寘 zip锛坱raffic-audit-deploy-20260827.zip 绛夛級鍐呭惈鐪熷疄 DeepSeek key / JWT secret锛屽嬁涓婁紶 git 鎴栧鍙戯紱浠撳簱鍙彁浜� `application.yml.example`銆�
\ No newline at end of file
diff --git "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\344\270\252\344\275\223\345\256\242\350\277\220\351\207\217\346\261\207\346\200\273.xlsx" "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\344\270\252\344\275\223\345\256\242\350\277\220\351\207\217\346\261\207\346\200\273.xlsx"
deleted file mode 100644
index 612d5af..0000000
--- "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\344\270\252\344\275\223\345\256\242\350\277\220\351\207\217\346\261\207\346\200\273.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\272\244\344\274\201\347\273\237H203-1\350\241\250_\345\205\254\350\267\257\346\227\205\345\256\242\350\277\220\350\276\223\346\234\210\345\272\246\347\224\237\344\272\247\346\203\205\345\206\265.xlsx" "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\272\244\344\274\201\347\273\237H203-1\350\241\250_\345\205\254\350\267\257\346\227\205\345\256\242\350\277\220\350\276\223\346\234\210\345\272\246\347\224\237\344\272\247\346\203\205\345\206\265.xlsx"
index c3af5b3..d94e4d9 100644
--- "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\272\244\344\274\201\347\273\237H203-1\350\241\250_\345\205\254\350\267\257\346\227\205\345\256\242\350\277\220\350\276\223\346\234\210\345\272\246\347\224\237\344\272\247\346\203\205\345\206\265.xlsx"
+++ "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\346\250\241\346\235\277_\344\272\244\344\274\201\347\273\237H203-1\350\241\250_\345\205\254\350\267\257\346\227\205\345\256\242\350\277\220\350\276\223\346\234\210\345\272\246\347\224\237\344\272\247\346\203\205\345\206\265.xlsx"
Binary files differ
diff --git "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\345\210\206\346\236\220.xlsx" "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\345\210\206\346\236\220.xlsx"
index 5181a4a..69a529e 100644
--- "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\345\210\206\346\236\220.xlsx"
+++ "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\345\210\206\346\236\220.xlsx"
Binary files differ
diff --git "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215.xlsx" "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215.xlsx"
index 4f1026c..4252670 100644
--- "a/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215.xlsx"
+++ "b/docs/\345\205\254\350\267\257\346\227\205\345\256\242/\347\224\237\346\210\220_\344\270\255\345\217\243\345\276\204\346\216\222\345\220\215.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_2026-09-02_\345\257\274\345\205\245\344\270\216\346\212\245\350\241\250\347\224\237\346\210\220\345\233\236\345\275\222.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_2026-09-02_\345\257\274\345\205\245\344\270\216\346\212\245\350\241\250\347\224\237\346\210\220\345\233\236\345\275\222.md"
new file mode 100644
index 0000000..cda2d09
--- /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_2026-09-02_\345\257\274\345\205\245\344\270\216\346\212\245\350\241\250\347\224\237\346\210\220\345\233\236\345\275\222.md"
@@ -0,0 +1,57 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛�2026-07 瀵煎叆涓庢姤琛ㄧ敓鎴愬洖褰掞紙2026-09-02锛�
+
+> 鐩殑锛氶獙璇佷粖鏃ヤ笁鏉℃暟鎹摼銆屽鍏モ啋鍏ュ簱鈫掓姤琛ㄣ�嶅叏绋嬪彲鐢�
+> 鈶� 鍑虹杩愭斂杞﹁締 7 鏈堬紙D:\妗岄潰\娴嬭瘯鏁版嵁\鍩庡競瀹㈣繍\鍑虹杞︿俊鎭垪琛� (2).xls锛�
+> 鈶� 涓綋瀹㈣繍閲�/鍛ㄨ浆閲� 7 鏈堬紙鏂板競宸炴眹鎬绘ā鏉匡細婀栧寳鐪佸叕璺梾瀹㈣繍杈撲釜浣撴埛鏈堝害鐢熶骇鎯呭喌锛�2026.7锛�.xlsx锛屽搴� docs\鍏矾鏃呭\妯℃澘_*.xlsx锛�
+> 鈶� 璐ц繍 7 鏈堟暟鎹綈鍏ㄥ悗鐨勬姤琛ㄥ彛寰勶紙D:\妗岄潰\娴嬭瘯鏁版嵁\璐ц繍\7鏈堬級
+> 椤哄甫瀹屾垚鏁版嵁姹℃煋娓呯悊 + 22 涓姤琛ㄦ帴鍙i敊璇崟鍏冩牸鍏ㄩ噺鎵弿銆�
+
+## 涓�銆佸鍏ュ姛鑳介獙璇�
+
+| 绫诲瀷 | 鎶ヨ〃鏈� | 婧愭枃浠� | 鎵规 | 鎬绘暟/鎴愬姛/澶辫触 | 鍏ュ簱鏍稿 |
+|---|---|---|---|---|---|
+| 鍑虹杩愭斂杞﹁締 CITY_TAXI_AUTH | 2026-07 | 鍑虹杞︿俊鎭垪琛� (2).xls锛堢湡瀹� 4.2 涓囪锛� | #188 | 42636 / 42636 / 0 | city_taxi_auth 2026-07 = 42636 琛屻��17 甯傚窞锛屼笌 2026-08锛�42636/17锛夊畬鍏ㄤ竴鑷� |
+| 涓綋瀹㈣繍閲� PASSENGER_INDIVIDUAL | 2026-07 | 婀栧寳鐪佸叕璺梾瀹㈣繍杈撲釜浣撴埛鏈堝害鐢熶骇鎯呭喌锛�2026.7锛�.xlsx锛堝競宸炴眹鎬绘ā鏉匡級 | #187 | 7 / 7 / 0 | passenger_individual_monthly 鍚堣 189998 浜� / 4584040.2 浜哄叕閲� = 婧愯〃鍏ㄧ渷鍚堣锛涙娊妫�榛勫唸 5886/175992銆佸瓭鎰� 19636/386845 绛変竴鑷� |
+| 璐ц繍閲�/鍛ㄨ浆閲忥紙鏁版嵁灞傝ˉ榻愶級 | 2026-07 | 2026骞�7鏈堝杩愰噺銆佽揣杩愰噺-5xlsx.xlsx | SQL 琛ラ綈 | 18 琛岋紙17 甯傚窞+婀栧寳鐪侊級 | 鍩庡競鏈堝悎璁� 16285.7105 涓� = 婀栧寳鐪� 16285.7105锛涘懆杞噺鍩庡競鍚堣 2181925.708 = 婀栧寳鐪� 2181925.71锛涙姹� 4940.9715/667561.3739 涓庢簮涓�鑷� |
+| 瑙勪笂瑙勪笅鎷嗗垎锛堟暟鎹眰閲嶅缓锛� | 2026-07 | 鍚屼笂 | SQL 閲嶅缓 | MONTH/CUMULATIVE 鍚� 18 琛� | MONTH 鍚堣鍛ㄨ浆閲� 2181925.71锛堣涓� 597278.64/瑙勪笅 1584647.07锛夈�丆UM 鍚堣 15222118.45锛涙姹� MONTH 204809.56/462751.81/667561.37 |
+
+琛ュ厖璇存槑锛�
+- 淇鍓� 2026-07 鏇惧瓨鍦ㄩ粍鐭崇瓑琛� freight_m07 涓� NULL 鈫� 鍒嗗競宸炴湀瀛e樊鍑虹幇 -323.97 绛夎礋鍊硷紝宸叉秷闄ゃ��
+- import_batch #177/#178/#179/#186 涓衡�滄ā鏉夸粎琛ㄥご/鏃фā鏉块璇曗�濅骇鐢熺殑 0 琛屾壒娆★紝鏈骇鐢熸暟鎹紝淇濈暀浣滃璁″巻鍙层��
+
+## 浜屻�佹姤琛ㄧ敓鎴愬洖褰掞紙period=2026-07&mode=month锛�
+
+- 22 涓鍑烘帴鍙e叏閮� HTTP 200锛岃緭鍑虹暀妗o細outputs\report_check\regression_2026-07\
+- 鍏ㄦ枃浠堕敊璇叕寮忔壂鎻忥紙鍚� 4 涓� series 鍖呭唴灞傦級锛�#REF! / #DIV/0! / #VALUE! 绛� **0 娈嬬暀**銆�
+- 鏁板�兼娊鏌ヤ笌瀹樻柟婧愯〃涓�鑷达細
+ - cityDetail锛氬叏鐪� 7 鏈堣揣杩愰噺 O5=16285.71銆佹姹� O11=4940.97銆佹姹� 1-7 绱 AA11=34306.78銆�
+ - turnoverRank锛氬叏鐪佺疮璁¤涓� 4357157.34 / 瑙勪笅 10864961.11 / 鍚堣 15222118.45锛屼笌 scale_split CUMULATIVE 閫愪綅涓�鑷淬��
+ - freightRank锛氭姹夌疮璁¤涓� 8905.15 / 瑙勪笅 25401.63 / 鍚堣 34306.78銆�
+ - 鍏氦/鍑虹/杞ㄩ亾杞浮涓夊紶琛細琛ㄥご涓恒��2026骞�1鏈堚��2026骞�7鏈堛��2026骞寸疮璁°�嶏紝鏃� 46082 鏁板瓧搴忓垪鍙凤紱杞ㄩ亾鍏ㄧ渷琛屾眰鍜� = 姝︽眽+榛勭煶锛�6 鏈� 11921.16 = 11886.3+34.86 鉁擄級銆�
+- 绯诲垪鍖咃紙cityPassengerSeries / passengerSeries / freightSeries / investSeries锛夊唴灞傚叏閮� clean銆�
+- 璇存槑锛氭姇璧勫洓寮� invest* 涓� HSSF 鑰佹牸寮忓鍑猴紙鎵╁睍鍚� .xlsx銆佸唴瀹逛负浜岃繘鍒� .xls锛孍xcel 鍙甯告墦寮�锛夛紝鏈棩鏈仛閫愭牸鍏紡鎵弿銆�
+
+## 涓夈�佹湰杞慨澶嶄笌娓呯悊
+
+浠g爜锛圧eportExportService.java 涓轰富锛夛細
+1. 鎶ヨ〃鍚屾湡鏁版嵁鎸� report_period 鍚屽勾杩囨护 鈥斺�� 淇 H2032 鍘诲勾鍚屾湀娣峰叆褰撳勾瀵艰嚧鈥滆涓婅揣杩愰噺脳2銆佽涓嬩负璐熷ぇ鍊尖�濈殑婧愬ご闂銆�
+2. fixCityMonthHeaderText锛氭湭鏍煎紡鍖栨棩鏈熷簭鍒楀彿锛�46082 绛夛級鈫掋�寉yyy骞碝鏈堛�嶃��
+3. clearFormulaErrorCells / clearFormulaErrorsAll锛氭竻绌烘眰鍊奸敊璇殑鍏紡缁撴灉锛堟ā鏉胯法绨�/璺ㄨ〃鍚屾瘮 #REF!銆佹棤鍘诲勾鏁版嵁 #DIV/0!锛夛紝涓嶆敼鍐欏叕寮忔枃鏈��
+4. 宸叉帴鍏ワ細exportCityByTemplate锛堝叕浜�/鍑虹锛夈�乪xportCityRailFerryDetail銆乪xportPassengerMidDetail銆乪xportEnergySummary銆乪xportCityPassengerCitySum銆乪xportCityPassengerDetailSum銆�
+5. DataImportService锛氫釜浣撳杩愬弻妯℃澘锛堜繚鐣欐棫鈥滀紒涓氬悕绉扳�濇ā鏉� + 鏂板甯傚窞姹囨�绘ā鏉挎寜鏍囬鍧楅�愯鍏ュ簱锛夛紱RegionUtil 澧炲姞甯傚窞鍚嶁啋6 浣嶅尯鍒掔爜鍙嶅悜瑙f瀽涓庣煭鍚嶅埆鍚嶃��
+
+鏁版嵁锛圫QL 宸叉墽琛岋紝鐣欐。 outputs\fill_2026-07_freight_scale.sql锛夛細
+- freight_turnover_import銆乻cale_split_transport 2026-07 琛ラ綈/閲嶅缓锛堣绗竴鑺傦級銆�
+- h2032_enterprise_monthly锛�2026-01~2026-08 鍚� 636 鎴枫��0 閲嶅锛�8/29 璁板綍鐨� 2026-07 鈥�734 琛� / 98 鎴烽噸澶嶁�濆凡娑堥櫎锛夛紱2025-01~12 鍚� 664 鎴蜂负鍘诲勾鍩烘湡锛屾甯搞��
+
+## 鍥涖�佸凡鐭ョ己鍙o紙鏁版嵁婧愰棶棰橈紝闈炰唬鐮佺己闄凤級
+
+- 鍩庡競瀹㈣繍鏈堝害鏁版嵁锛堝叕浜� U203/鍑虹 U402/杞ㄩ亾/杞浮锛夊簱鍐呭苟闈炴瘡鏈堥兘鏈夌湡瀹炲�硷細杞ㄩ亾 2026 骞翠粎 6銆�7 鏈堟湁鏁版嵁 鈫� 鎶ヨ〃 1-5 鏈堝垪鐣欑┖銆傝ˉ榻愬悇鏈堟簮鏂囦欢鍚庨噸鏂板鍏ュ嵆鍙畬鏁淬��
+- 缃戠害杞︽棤婧愭暟鎹紝妯℃澘鏍蜂緥宸叉竻绌猴紙璁捐涓婁笉璁″叆鍩庡競瀹㈣繍鍚堣锛夈��
+- 鍓嶇鈥滃鍏ヨ繘搴︽棤鏄剧ず鈥濓細鏈瀵煎叆鍧囪蛋鎺ュ彛骞舵垚鍔熻惤搴擄紙鎵规鍙煡锛夛紱4.2 涓囪澶ф枃浠跺湪椤甸潰涓婄殑杩涘害鎻愮ず鏈鐜版帓鏌ワ紝灞� UI 渚у緟鍔炪��
+
+## 浜斻�佺粨璁�
+
+- 瀵煎叆鍔熻兘锛氫笁鏉¢摼 0 澶辫触锛屽叆搴撳�间笌婧愭枃浠堕�愰」鏍稿涓�鑷� 鈫� 鍙敤銆�
+- 鎶ヨ〃鐢熸垚锛�22 鎺ュ彛鍙嚭鏁帮紝鏃� #REF!/#DIV/0! 姹℃煋锛岃揣杩� 7 鏈堟暟瀛椾笌瀹樻柟 workbook 涓�鑷� 鈫� 鍙敤銆�
+- 閬楃暀锛氬煄甯傚杩愮己鏈堟簮鏂囦欢琛ラ綈锛涙姇璧� .xls 鑰佹牸寮忓闇�褰诲簳鎵弿鍙﹁锛涢〉闈㈣繘搴︽潯 UI 澶嶇幇鎺掓煡銆�
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\257\274\345\205\245\346\240\241\351\252\214\345\242\236\345\274\272_2026-09-02.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\257\274\345\205\245\346\240\241\351\252\214\345\242\236\345\274\272_2026-09-02.md"
new file mode 100644
index 0000000..a2a3f25
--- /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\257\274\345\205\245\346\240\241\351\252\214\345\242\236\345\274\272_2026-09-02.md"
@@ -0,0 +1,50 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_瀵煎叆鏍¢獙澧炲己_2026-09-02
+
+## 1. 鍔熻兘璇存槑
+瀵规暟鎹鍏ユ湇鍔★紙`DataImportService`锛夊仛鈥滃鍏ュ墠缃牎楠� + 瑙f瀽鍋ュ.鎬р�濆寮猴紝閬垮厤鍍忚兘鑰椾簨鏁呴偅鏍封�滃垪閿欎綅闈欓粯瀵煎叆鈥濓細
+- 杩愭斂杞﹁締銆佽建杩归噷绋嬶細鐢扁�滃浐瀹氬垪浣嶁�濇敼涓�**琛ㄥご鍚嶇О鏄犲皠**锛堜笌 H2032 璐ц繍鏈堟姤涓�鑷达級鈥斺�斿垪椤哄簭鍙樺寲涔熻兘瀵煎叆锛岀己鍒�/鍒楀悕涓嶇鏄庣‘鎶ラ敊銆�
+- 鍩庡競鍏氦 U203銆佸贰娓稿嚭绉� U402銆佹姇璧勭郴缁熷鍑猴細鏂板**琛ㄥご鍒椾綅鏍¢獙**锛坄requireHeaderLayout`锛夛紝鍒椾綅閿欎綅鐩存帴鎷掔粷骞舵彁绀衡�滅 X 鍒楀簲涓衡�︹�濄��
+- 璐ц繍閲忓懆杞噺锛氭柊澧炶〃澶存牎楠岋紙棣栬椤讳负銆岃揣杩愰噺(涓囧惃)/1鏈堚�︺�嶅竷灞�锛夈��
+- 瑙勪笂瑙勪笅鎷嗗垎锛氭柊澧� sheet 甯冨眬鏍¢獙锛堢 2 琛屻�屽競宸�/瑙勪笂浼佷笟杩愯緭閲忋��+ 绗� 3 琛屻�屽懆杞噺/璐ц繍閲忋�嶅瓙琛ㄥご锛夈��
+
+## 2. 娴嬭瘯鐜
+- 鍚庣锛歋pring Boot锛�8090锛夛紝鏈湴鍚姩锛�2026-09-02 閲嶅惎鍚庣敓鏁堛��
+- 鏁版嵁搴擄細`traffic_audit`锛坙ocalhost:3308锛夈��
+- 鏂瑰紡锛歚curl /api/import/<type>` 鐩存帴璋冪敤锛屾祴璇曟姤琛ㄦ湡 `2026-HT` / `2026-06`锛堟祴鍚庡凡娓呯悊锛夈��
+- 鏂囦欢锛氬畼鏂规ā鏉匡紙docs/璐ц繍銆乨ocs/鍩庡競瀹㈣繍銆乨ocs/鎶曡祫锛�+ 鏋勯�犵敤渚嬶紙鍒楀簭鎵撲贡/閿欎綅鍒�/缂哄垪锛夈��
+
+## 3. 鐢ㄤ緥涓庣粨鏋�
+| # | 绫诲瀷 | 鐢ㄤ緥 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|---|---|---|---|---|
+| 1 | 杩愭斂杞﹁締 | 妯℃澘鏂囦欢瀵煎叆 | 鎴愬姛瀵煎叆 | 鎴愬姛 2 鏉� | 鉁� |
+| 2 | 杩愭斂杞﹁締 | 鍒楅『搴忔墦涔憋紙鍒楀悕涓嶅彉锛� | 浠嶈兘瀵煎叆涓斿瓧娈靛榻� | 鎴愬姛 2 鏉★紝鍏ュ簱涓庢ā鏉块�愰」涓�鑷� | 鉁� |
+| 3 | 杩愭斂杞﹁締 | 缂恒�屾寕杞︽�诲惃浣�(鍚�)銆嶅垪 | 鏄庣‘鎶ラ敊 | 琛ㄥご缂哄皯蹇呴渶鍒椼�愭寕杞︽�诲惃浣�(鍚�)銆� | 鉁� |
+| 4 | 杞ㄨ抗閲岀▼ | 妯℃澘鏂囦欢瀵煎叆 | 鎴愬姛瀵煎叆 | 鎴愬姛 2 鏉� | 鉁� |
+| 5 | 杞ㄨ抗閲岀▼ | 鍒楅『搴忔墦涔� | 浠嶈兘瀵煎叆涓斿瓧娈靛榻� | 鎴愬姛 2 鏉� | 鉁� |
+| 6 | 杞ㄨ抗閲岀▼ | 鍒楀悕鏀广�屾湀搴﹂噷绋�(鍏噷)銆� | 鏄庣‘鎶ラ敊 | 琛ㄥご缂哄皯蹇呴渶鍒椼�愭湀搴︽�婚噷绋�(鍏噷)銆� | 鉁� |
+| 7 | 鍩庡競鍏氦 | 琛ㄥご绗� 6 鍒楁彃銆岄敊浣嶅垪銆� | 鎷掔粷骞舵彁绀哄垪浣� | 鈥滅 6 鍒楀簲涓恒�屽叕鍏辨苯鐢佃溅_杩愯惀杞︽暟銆嶁�� | 鉁� |
+| 8 | 宸℃父鍑虹 | 琛ㄥご绗� 5 鍒楁彃銆岄敊浣嶅垪銆� | 鎷掔粷骞舵彁绀哄垪浣� | 鈥滅 5 鍒楀簲涓恒�岃浇瀹㈣溅娆℃�绘暟銆嶁�� | 鉁� |
+| 9 | 鎶曡祫绯荤粺瀵煎嚭 | 绗� 1 鍒椼�岃鍙枫�嶆敼銆屽簭鍙枫�� | 鎷掔粷骞舵彁绀哄垪浣� | 鈥滅 1 鍒楀簲涓恒�岃鍙枫�嶁�� | 鉁� |
+| 10 | 鎶曡祫绯荤粺瀵煎嚭 | 姝g‘琛ㄥご | 鎴愬姛 | 鎴愬姛 0 鏉� | 鉁� |
+| 11 | 璐ц繍閲忓懆杞噺 | 妯℃澘鏂囦欢瀵煎叆 | 鎴愬姛瀵煎叆 | 鎴愬姛 18 鏉� | 鉁� |
+| 12 | 璐ц繍閲忓懆杞噺 | 閿欑被鍨嬫枃浠讹紙杩愭斂杞﹁締锛� | 鎷掔粷 | 鈥滆〃澶村簲涓恒�岃揣杩愰噺(涓囧惃)/1鏈堚�︺�嶅竷灞�鈥� | 鉁� |
+| 13 | 瑙勪笂瑙勪笅 | 妯℃澘鏂囦欢瀵煎叆 | 鎴愬姛瀵煎叆 | 鎴愬姛 36 鏉� | 鉁� |
+| 14 | 瑙勪笂瑙勪笅 | sheet 鍚嶅惈鈥滃綋鏈堚�濅絾甯冨眬閿欒 | 鎷掔粷 | 鈥渟heet銆屾祴璇曞綋鏈堛�嶆湭鎵惧埌銆屽競宸�/瑙勪笂鈥︺�嶈〃澶粹�� | 鉁� |
+| 15 | 鍏矾鏃呭杩愭斂杞﹁締鏁� | 妯℃澘瀵煎叆锛堜笂鍗堜綋妫�锛� | 鎴愬姛 | 767 鏉� 0 澶辫触 | 鉁� |
+| 16 | 涓綋瀹㈣繍閲� | 琛ㄥご璇嗗埆锛堟ā鏉夸粎琛ㄥご锛� | 0 鏉℃棤鎶ラ敊 | 鎴愬姛 0 鏉� | 鉁� |
+| 17 | 鍑虹杞﹁繍鏀� | 琛ㄥご璇嗗埆锛堟ā鏉夸粎琛ㄥご锛� | 0 鏉℃棤鎶ラ敊 | 鎴愬姛 0 鏉� | 鉁� |
+
+## 4. 鍏ュ簱鎶芥煡锛堜笌婧愭枃浠堕�愰」瀵归綈锛�
+- 杩愭斂杞﹁締锛堝垪搴忔墦涔卞悗锛夛細瀹夊悏姹借溅鐗╂祦 鐗靛紩 0/鎸� 96/鍏跺畠 96/鎸傝溅鍚ㄤ綅 1057.708/鍏跺畠鍚ㄤ綅 871.56 鉁�
+- 杞ㄨ抗閲岀▼锛氭箹鍖椾腑鍗囪繍杈� 鏈堝害閲岀▼ 150427.03/鏈夐噷绋嬭溅杈� 29 鉁�
+- 璐ц繍閲忓懆杞噺锛氭姹� 1 鏈�=5367.97597銆�6 鏈�=5041.04224銆佸幓骞� 1 鏈�=4656.86022 鉁�
+- 瑙勪笂瑙勪笅锛氭姹夊綋鏈� 瑙勪笂=241659.5295/瑙勪笅=445444.355/鍚堣=687103.884锛堢疮璁� sheet 涓�鑷达級鉁�
+
+## 5. 鍙戠幇鐨勯棶棰樹笌澶勭疆
+- 鏈彂鐜版柊缂洪櫡銆傞仐鐣欙細鍑虹杞﹁繍鏀挎ā鏉挎棤鏁版嵁琛岋紝浠呴獙璇佽〃澶磋瘑鍒紱2026-08 宸茬湡瀹炲鍏� 42636 鏉℃垚鍔燂紝寤鸿鍚庣画鐢ㄧ湡瀹炲ぇ鏂囦欢鍥炲綊涓�娆°��
+
+## 6. 缁撹
+- 鎵�鏈夊鍏ョ被鍨嬬幇鍦ㄩ兘鏈夌被鍨嬭瘑鍒�/鏍¢獙鍏滃簳锛涜繍鏀胯溅杈�/杞ㄨ抗閲岀▼鍏煎鍒楅『搴忓彉鍖栥�傚姛鑳藉彲鐢紝鍙氦浠樸��
+
+## 7. 鏁版嵁璇存槑
+- 娴嬭瘯鏁版嵁锛�2026-HT銆�2026-06 娴嬭瘯鏈燂級宸插叏閮ㄦ竻鐞嗭紱鏈Е纰� 2026-07/08 鐪熷疄鏁版嵁銆�
diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\345\256\241\346\240\270I004\345\237\272\345\207\206\347\274\272\345\244\261\344\277\235\346\212\244_2026-09-02.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\345\256\241\346\240\270I004\345\237\272\345\207\206\347\274\272\345\244\261\344\277\235\346\212\244_2026-09-02.md"
new file mode 100644
index 0000000..dcfb7d9
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\345\256\241\346\240\270I004\345\237\272\345\207\206\347\274\272\345\244\261\344\277\235\346\212\244_2026-09-02.md"
@@ -0,0 +1,29 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫瀹℃牳I004鍩哄噯缂哄け淇濇姢_2026-09-02
+
+## 1. 鍔熻兘璇存槑
+闂锛�8 鏈堟姇璧勭墿娴佸洯鍖�/瀹㈣繍绔欏満瀵煎叆鍚庯紝瀹℃牳鍑虹幇澶ч噺 RULE_I004銆屾姇璧勭郴缁熼」鐩己澶辨牳瀹炪�嶈鎶ワ紙2026-08 鍏� 163 鏉★級锛屽師鍥犳槸鍚屾姤琛ㄦ湡鐨勬姇璧勭郴缁熷鍑哄熀鍑嗭紙investment_system 2026-08锛夊皻鏈鍏ワ紝搴撻噷鍙湁 2026-07 鍩哄噯锛汭001鈥揑003 缂哄熀鍑嗘椂浼氳烦杩囷紙sys==null 涓嶅姣旓級锛屼絾 I004锛坈heckInvestExistence锛夌己鍩哄噯鏃朵粛鎶婃瘡涓」鐩爣鎴愨�滄姇璧勭郴缁熷鍑轰腑涓嶅瓨鍦ㄢ�濄��
+淇锛圓uditEngineService锛夛細
+- executeInvestmentAudit锛氬悓鎶ヨ〃鏈熸姇璧勭郴缁熷熀鍑嗘暣鏈熺己澶憋紙sysMap 涓虹┖锛夋椂锛岃烦杩� EXISTENCE_SYS 绫昏鍒欙紝涓嶅啀鏁磋〃璇姤銆�
+- ruleSkipped锛歊ULE_I004 鍔犲叆鈥滃熀鍑嗘暣鏈熺己澶扁啋璺宠繃鈥濆垽瀹氾紝瑙勫垯缁熻椤垫爣璁� skipped=true锛堜笌 I001鈥揑003 涓�鑷达級銆�
+
+## 2. 娴嬭瘯鐜
+- 鍚庣锛歋pring Boot锛�8090锛夛紝2026-09-02 淇鍚庨噸鍚敓鏁堛��
+- 鏁版嵁搴擄細traffic_audit锛坙ocalhost:3308锛夈��
+- 鏂瑰紡锛歚/api/audit/execute?period=2026-08&reportType=INVEST` + 搴撹〃璁℃暟鏍稿銆�
+
+## 3. 鐢ㄤ緥涓庣粨鏋�
+| # | 鍦烘櫙 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|---|---|---|---|
+| 1 | 鍩哄噯缂哄け锛�2026-08 鏃� investment_system 鏁版嵁锛夛紝閲嶈窇 8 鏈堝鏍� | I004 涓嶅啀鏁磋〃璇姤 | 淇鍓� 163 鏉� 鈫� 淇鍚� 0 鏉� | 鉁� |
+| 2 | 瑙勫垯缁熻 ruleStats锛堝熀鍑嗙己澶憋級 | I001鈥揑004 鍧� skipped=true | 4 鏉¤鍒欏叏閮� skipped=true锛宧it=0 | 鉁� |
+| 3 | 瀵煎叆娴嬭瘯鍩哄噯锛�7鏈堟ā鏉库啋2026-08锛�148 鏉★級鍚庨噸璺戝鏍� | I004 鎭㈠鐪熷疄缂哄け妫�娴� | I004=42 鏉★紝I001=35銆両002=54銆両003=37锛堝潎鎸夊熀鍑嗘甯稿姣旓級 | 鉁� |
+| 4 | 娓呯悊娴嬭瘯鍩哄噯鍚庨噸璺戝鏍� | 鍥炲埌 0 璇姤銆佷笉娈嬬暀娴嬭瘯鏁版嵁 | INVEST 缁撴灉 0 鏉★紝investment_system 2026-08 0 琛� | 鉁� |
+
+## 4. 鍙戠幇鐨勯棶棰樹笌澶勭疆
+- 鏃犳柊澧炵己闄枫�備慨澶嶅悗 8 鏈堝鏍哥粨鏋滃凡杩樺師涓哄共鍑�鐘舵�侊紙0 鏉★級锛岀瓑寰� 8 鏈堟姇璧勭郴缁熷鍑烘枃浠跺鍏ュ悗閲嶈窇瀹℃牳鍗冲彲鎭㈠瀹屾暣瀵规瘮銆�
+
+## 5. 缁撹
+- I004 涓� I001鈥揑003 琛屼负涓�鑷达細鍩哄噯鏈埌浣嶆椂涓嶈鎶ワ紙鏍囪璺宠繃锛夛紝鍩哄噯鍒颁綅鍚庢甯告娴嬨�傚姛鑳藉彲鐢紝鍙氦浠樸��
+
+## 6. 鏁版嵁璇存槑
+- 娴嬭瘯鍩哄噯锛坕nvestment_system 2026-08 148 鏉� + 瀵煎叆璁板綍锛夊凡娓呯悊锛�2026-07 鐪熷疄鍩哄噯鏈姩锛�2026-08 瀹℃牳缁撴灉宸查噸缃负 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\212\225\350\265\204\345\270\202\345\267\236\346\234\210\346\212\245\345\244\232sheet\350\257\206\345\210\253\344\270\216\345\272\217\345\217\267\347\251\272\346\240\274_2026-09-02.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\345\270\202\345\267\236\346\234\210\346\212\245\345\244\232sheet\350\257\206\345\210\253\344\270\216\345\272\217\345\217\267\347\251\272\346\240\274_2026-09-02.md"
new file mode 100644
index 0000000..813ea24
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212_\346\212\225\350\265\204\345\270\202\345\267\236\346\234\210\346\212\245\345\244\232sheet\350\257\206\345\210\253\344\270\216\345\272\217\345\217\267\347\251\272\346\240\274_2026-09-02.md"
@@ -0,0 +1,36 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫甯傚窞鏈堟姤澶歴heet璇嗗埆涓庡簭鍙风┖鏍糭2026-09-02
+
+## 鍔熻兘璇存槑
+淇銆屾姇璧勶紙鐗╂祦鍥尯/瀹㈣繍绔欏満锛夈�嶅競宸炴湀鎶ュ鍏ョ殑 2 涓棶棰橈細
+1. **澶� sheet 閫夎〃閿欒**锛歚绁炲啘鏋舵灄鍖虹墿娴佹姇璧勬湀鎶�2026.08.xlsx` 鍏� 46 涓� sheet锛堝墠 24 涓负鍘嗗彶"娼滄睙浼犲寲1鏈垀2021.8"閬楃暀 sheet锛屽悗 22 涓负绁炲啘鏋剁湡瀹炴湀鎶� `2024.10`鈥2026.8`锛夛紝鏃ч�昏緫鍙湅"8鏈�"瀛楁牱锛岃閫夊巻鍙� sheet銆屾綔姹熶紶鍖�8鏈堛�嶏紝璇诲嚭娼滄睙椤圭洰褰掑睘绁炲啘鏋� 鈫� 琚競宸炰竴鑷存�ф牎楠屾嫆缁濓紙瀵煎叆澶辫触锛夈��
+2. **搴忓彿涓虹┖鐨勯」鐩琚烦杩�**锛氱湡鏁版嵁 sheet `2026.8` 涓�岀鍐滄灦鐗╂祦鍥�嶉」鐩搴忓彿鍒椾负绌猴紝鏃цВ鏋愭妸绌哄簭鍙疯涓�寰嬪綋甯傚窞灏忚妭琛岃烦杩囷紝瀵艰嚧鐪熷疄鏁版嵁浠庢湭鍏ュ簱锛堝簱閲屽彧鏈夊杩愩�岀鍐滄灦鏋㈢航绔欍�嶏紝鏃犮�岀鍐滄灦鐗╂祦鍥�嶏級銆�
+
+## 淇鏂规锛圖ataImportService.java锛�
+- `investSheetMatchesPeriod`锛氭敮鎸佺偣鍙锋姤琛ㄦ湡锛坄2026.8`/`2026.08` 鈫� 褰掍竴鍖栦负杩炲瓧绗﹀啀鍖归厤锛夈��
+- 閫� sheet 鍔犲垎锛氬尮閰嶆姤琛ㄦ湡涓� sheet 鍚嶅惈骞翠唤鍓嶇紑锛坄2026`锛夋椂棰濆 +100000 鍒嗭紝浼樺厛閫夊綋鏈熺湡瀹炴姤琛紝鍘嗗彶绾湀浠藉悕 sheet 鏃犳鍔犲垎銆�
+- 瑙f瀽寰幆锛氱┖搴忓彿琛岃嫢闈炲競宸炲悕銆佷笖 `isLikelyInvestProjectName` 涓虹湡 鈫� 鎸夐」鐩澶勭悊锛涢潪绌洪潪鏁板瓧搴忓彿 鈫� 璺宠繃銆�
+- 鏂板 helper `isLikelyInvestProjectName`锛氶暱搴�>4銆侀潪甯傚窞鍚嶃�侀潪澶囨敞/璇存槑/娉細/濉〃/瀹℃牳/缁熻/璐熻矗寮�澶淬��
+- `countInvestRows` 鍚屾鏀寔绌哄簭鍙烽」鐩璁℃暟銆�
+
+## 娴嬭瘯鐜
+- 鍚庣锛歵raffic-audit-server锛圫pring Boot锛�8090锛夛紝浠g爜閲嶆柊缂栬瘧鍚庨噸鍚紙11:34 灏辩华锛夈��
+- 鏁版嵁搴擄細MySQL 3308 traffic_audit銆�
+- 鎺ュ彛锛歚POST /api/import/batch`锛坱ype=investmentLogistics锛宲eriod=2026-08锛夈��
+- 娴嬭瘯鏂囦欢锛歚D:\妗岄潰\娴嬭瘯鏁版嵁\鍏湀婧愭暟鎹甛鐗╂祦\绁炲啘鏋舵灄鍖虹墿娴佹姇璧勬湀鎶�2026.08.xlsx`銆乣娼滄睙2026.08.xlsx`銆�
+
+## 鐢ㄤ緥琛�
+
+| # | 鐢ㄤ緥 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|------|------|------|------|------|
+| 1 | 姝e悜锛氱鍐滄灦+娼滄睙涓ゆ枃浠舵壒閲忓鍏� | 绁炲啘鏋舵灄鍖虹墿娴佹姇璧勬湀鎶�2026.08.xlsx + 娼滄睙2026.08.xlsx | total=2, success=2, fail=0 | total=2, success=2, fail=0锛岀鍐滄灦鏋楀尯 1 鏉°�佹綔姹熷競 1 鏉� | 鉁� 閫氳繃 |
+| 2 | 鍏ュ簱楠岃瘉锛氱鍐滄灦鐗╂祦鍥」鐩� | 鈥� | investment_project 瀛樺湪銆岀鍐滄灦鐗╂祦鍥�嶏紝city=绁炲啘鏋舵灄鍖� | id=228锛宼otal_investment=7440.35锛宑ity=绁炲啘鏋舵灄鍖猴紝builder=鍥芥姇闆嗗洟浜ゆ姇鍏徃 | 鉁� 閫氳繃 |
+| 3 | 鍏ュ簱楠岃瘉锛氱鍐滄灦鐗╂祦鍥� 8 鏈堟湀搴︽暟鎹� | 鈥� | investment_monthly 2026-08 鏈夎褰� | year_plan=31锛寉ear_cum=26.1锛宮onth_done=0锛宻tart_cum=7535.45 | 鉁� 閫氳繃 |
+| 4 | 鍏ュ簱楠岃瘉锛氭綔姹熸枃浠朵笉鍙楀奖鍝� | 鈥� | 娼滄睙浼犲寲鍏矾娓」鐩� 2026-08 姝e父 | year_plan=12000锛寉ear_cum=5173锛宮onth_done=1440 | 鉁� 閫氳繃 |
+| 5 | 鍙嶅悜瀵圭収锛氭棫浠g爜璇ュ満鏅� | 鍚屼竴鎵规枃浠讹紙淇鍓� 11:32 璁板綍锛� | 鈥� | batch#170锛歴uccess=1, fail=1锛屾姤銆屾綔姹熶紶鍖栧叕璺腐椤圭洰銆嶅競宸為敊浣� | 鉁� 淇鐢熸晥 |
+
+## 鍙戠幇鐨勯棶棰樹笌澶勭疆
+- 鏃犳柊闂銆傚巻鍙查仐鐣欒鏄庯細`import_batch` #170锛�11:32:19锛変笌 #168锛�11:00:56锛変负淇鍓嶆棫閫昏緫鐨勫け璐ヨ褰曪紝灞炴祴璇曞鐓э紝涓嶅奖鍝嶆暟鎹��
+- 淇鍓嶅簱閲岀‘瀹炵己澶辩鍐滄灦鐗╂祦鍥� 6/7/8 鏈堟暟鎹紙鐪熷疄鏁版嵁涓�鐩存紡瀵硷級锛屾湰娆″鍏ュ悗 8 鏈堝凡琛ラ綈锛�6/7 鏈堝闇�琛ュ锛岄渶鐢ㄥ悓閫昏緫閲嶅鍘嗗彶鏂囦欢銆�
+
+## 缁撹
+鍏ㄩ儴鐢ㄤ緥閫氳繃銆傚 sheet 閫夎〃浼樺厛褰撴湡甯﹀勾浠� sheet銆佺┖搴忓彿椤圭洰琛屽彲姝g‘瑙f瀽銆佸競宸炰竴鑷存�ф牎楠屼笉鍐嶈浼ょ鍐滄灦鏂囦欢锛涙綔姹熸枃浠惰В鏋愪笉鍙楀奖鍝嶃��
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_\347\224\237\346\210\220\346\250\241\346\235\277\346\226\260\347\211\210\345\274\217_2026-09-02.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_\347\224\237\346\210\220\346\250\241\346\235\277\346\226\260\347\211\210\345\274\217_2026-09-02.md"
new file mode 100644
index 0000000..5ae47fe
--- /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_\347\224\237\346\210\220\346\250\241\346\235\277\346\226\260\347\211\210\345\274\217_2026-09-02.md"
@@ -0,0 +1,57 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氱敓鎴愭ā鏉挎柊鐗堝紡鏀归�狅紙2026-09-02锛�
+
+> 鍔熻兘锛氭寜鐢ㄦ埛鎵嬪伐鏀瑰ソ鐨勨�滄柊鐗堝紡鈥濇ā鏉匡紙涓婂崐鍧椼��1-N鏈堢疮璁°��+ 涓嬪崐鍧椼�孨鏈堝綋鏈�/鍗曟湀銆嶏級璋冩暣璐ц繍銆佸叕璺梾瀹€�佸煄甯傚杩愪笁绫汇�婄敓鎴恄*.xlsx銆嬫姤琛ㄧ殑濉厖閫昏緫銆�
+> 鑼冨洿锛氬彧鏀规姤琛ㄧ敓鎴愪唬鐮佷笌搴曠寮曠敤锛屼笉娑夊強鏁版嵁瀵煎叆锛涗唬鐮佹湭鎻愪氦銆佹湭鎺ㄩ�併��
+
+## 涓�銆佸姛鑳借鏄庯紙浠g爜鏀瑰姩锛�
+
+### 1. 鍏矾鏃呭
+- `鐢熸垚_涓彛寰勫垎鏋�.xlsx`锛氫笅鍗婂潡鏍囬锛圓9锛夊姩鎬佸寲涓恒�孻YYY骞碝鏈堜腑鍙e緞瀹㈣繍閲忓強鍛ㄨ浆閲忋�嶏紱鏁版嵁琛� R11-R15 濉綋鏈堝杩愰噺/鍛ㄨ浆閲忥紙褰撴湀锛漀鏈堢疮璁♀垝N-1鏈堢疮璁★級涓庡綋鏈堝悓姣旓紱鍗犳瘮鍏紡 D/H 鐢辨寚鍚� B$3/F$3 鏀逛负鎸囧悜 B$11/F$11锛堝綋鏈堝潡鑷韩锛夈��
+- `鐢熸垚_涓彛寰勬帓鍚�.xlsx`锛氬彸渚у綋鏈堝潡 K1 鏍囬鍔ㄦ�佸寲銆孻YYY骞碝鏈堝叏鐪佸垎甯傚窞瀹屾垚閬撹矾瀹㈣繍鐢熶骇鎯呭喌銆嶏紱L/P 濉綋鏈堝�笺�丯/R 濉綋鏈堝悓姣旓紱宸︿晶浠嶄负 1-N 鏈堢疮璁″潡銆�
+
+### 2. 鍩庡競瀹㈣繍
+- `鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx`锛氬簳閮ㄦ柊澧炲崟鏈堝潡锛堟爣棰� A11锛屾暟鎹 R13-R19锛氭�诲杩愰噺/鎬诲懆杞噺銆佸叕浜ゃ�佸嚭绉熴�佸贰娓稿嚭绉熴�佺綉绾﹁溅=0銆佽建閬撱�佽疆娓★級锛屽~褰撴湀瀹屾垚閲忥紝鍚屾瘮鐣欑┖銆�
+- `鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx`銆乣鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx`锛氬綋鏈堝潡锛堝杩愰噺 R49-R66銆佸懆杞噺 R71-R88锛夋敼濉綋鏈堝�硷紙褰撴湀绱宸級锛涘綋鏈堝潡 RANK/鍗犳瘮/澧為�熸帓鍚嶅叕寮忕敱澶嶅埗绱鍧楄�屾潵锛屾敼鎸囧綋鏈堝潡鑷韩琛岋紱褰撴湀鏍囬 A45/A67 鍔ㄦ�佸寲銆�
+- 搴曠寮曠敤淇锛氬煄甯傚杩� 6 澶勫凡鍒犻櫎鐨勩�婂鍏ユā鏉縚鍩庡競鍏氦/宸℃父鍑虹/杞ㄩ亾杞浮/鍩庡競姹囨��/鍩庡競鍒嗗競宸�/鍚勫競宸炴槑缁嗚〃銆嬪叏閮ㄦ敼鍥炲悓鍚嶃�婄敓鎴恄*.xlsx銆嬶紙ReportExportService/Controller銆佷竴閿郴鍒楀寘鍐呭悓姝ワ級锛涘墠绔� DataImport.vue 鍩庡競鍏氦/宸℃父鍑虹鈥滀笅杞芥ā鏉库�濋摼鎺ュ悓姝ユ敼鎸囥�婄敓鎴恄*銆嬨��
+
+### 3. 璐ц繍
+- `鐢熸垚_璐ц繍閲忔帓鍚�.xlsx`銆乣鐢熸垚_鍛ㄨ浆閲忔帓鍚�.xlsx`锛歊23 鏍囬鍘绘帀鈥滅疮璁♀�濆瓧鏍� 鈫掋�孻YYY骞碝鏈堝叏鐪佸垎甯傚窞瀹屾垚鍏矾璐ц繍閲�/璐х墿杩愯緭鍛ㄨ浆閲忔儏鍐点�嶃��
+- **绗簩椤垫暟鎹敼濉�滃綋鏈堚�濆�硷紙2026-09-02 16:40 纭骞跺疄鐜帮級**锛氳揣杩愰噺绗簩椤靛悎璁�=妯℃澘_璐ц繍閲忓懆杞噺褰撴湀鍒楋紙freight_mN锛夈�佽涓�=H2032 褰撴湀鍚�/1e4銆佽涓�=宸�硷紝鍚屾瘮鍙栧幓骞村悓鏈堬紱鍛ㄨ浆閲忕浜岄〉鐩存帴鐢ㄦ媶鍒嗚〃 MONTH 琛岋紙鍚綋鏈堝悓姣斿瓧娈碉級銆�
+- 绗簩椤靛垪澶粹�滅疮璁″畬鎴� (涓囧惃/涓囧惃鍏噷锛夆�濆湪瀵煎嚭鏃跺唴瀛樻浛鎹负鈥滃綋鏈堝畬鎴愨�濓紙`renameRankMonthHeader`锛屼笉鏀规ā鏉挎簮鏂囦欢锛夈��
+
+## 浜屻�佹祴璇曠幆澧�
+- 鍚庣 8090 鏈湴杩愯锛涙暟鎹簱 mysql localhost:3308 traffic_audit銆�
+- 鏁版嵁鐜扮姸锛歨2031锛堝叕璺梾瀹紒涓氭湀鎶ワ級2026-03/07锛沜ity_bus/city_taxi 2026-06/07锛沨2032 2026-01~08 瀹屾暣銆�
+- 娴嬭瘯鎶ヨ〃鏈燂細2026-07锛宮ode=month銆備骇鐗╃暀妗o細outputs/report_check/regression_newtpl_2026-07/
+
+## 涓夈�佺敤渚嬭〃
+
+| # | 绫诲瀷 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|---|---|---|---|---|
+| 1 | 姝e悜 | passengerMidAnalysis 2026-07 | 涓婂崐鍧�=1-7鏈堢疮璁★紝涓嬪崐鍧�=7鏈堝綋鏈� | A1=銆�2026骞�1-7鏈堜腑鍙e緞鈥︺�岯3=6151.91 涓囦汉銆丗3=285634.95锛汚9=銆�2026骞�7鏈堜腑鍙e緞鈥︺�岯11=3078.86 涓囦汉銆丗11=141155.32锛汥12-H15 鍗犳瘮鍏紡鍒嗘瘝=B$11/F$11 | 閫氳繃 |
+| 2 | 姝e悜 | passengerMidRank 2026-07 | 宸﹀潡绱鏍囬銆佸彸鍧楀綋鏈堟爣棰樹笌褰撴湀鍊� | A1=1-7鏈堢疮璁℃爣棰橈紱K1=銆�2026骞�7鏈堝叏鐪佸垎甯傚窞瀹屾垚鈥︺�嶏紱L3=3078.86锛堝綋鏈堬級涓庡乏鍧� B 鍒楃疮璁℃暟鍊兼槑鏄惧尯鍒� | 閫氳繃 |
+| 3 | 姝e悜 | cityPassengerSummary 2026-07 | 搴曢儴鍗曟湀鍧�=搴撳唴 2026-07 鍚堣 | A11=銆�2026骞�7鏈堝叏鐪佸畬鎴愬煄甯傚杩愰噺鎯呭喌銆嶏紱B13=30612.85銆丏13=218186.08锛汢14=12974.73锛堝叕浜わ級銆丅15=5860.24锛堝嚭绉燂級銆丅18=11731.83锛堣建閬擄級銆丅19=46.05锛堣疆娓★級锛屼笌搴撳唴 city_bus/city_taxi 2026-07 鍒嗛」鍚堣閫愪綅涓�鑷� | 閫氳繃 |
+| 4 | 姝e悜 | cityPassengerCitySum 2026-07 | 褰撴湀鍧�=7鏈堝綋鏈堛�佸叕寮忔寚褰撴湀琛� | 褰撴湀瀹㈣繍閲忓潡姝︽眽 R50锛欸=4218.74锛堝叕浜わ級銆丩=1093.91锛堝嚭绉燂級銆乂=11701.74锛堣建閬擄級銆乆=46.05锛堣疆娓★級銆丅=17060.44锛屼笌 DB 2026-07 涓�鑷达紱C/H/M/R 鎺掑悕鍏紡鑼冨洿=B$50:B$66 绛夊綋鏈堣锛涚疮璁″潡涓庡綋鏈堝潡鏁板�煎尯鍒嗘槑鏄� | 閫氳繃 |
+| 5 | 姝e悜 | freightRank / turnoverRank 2026-07 | R23 鏍囬鏃犫�滅疮璁♀�濓紱绗簩椤�=褰撴湀鍊� | R23=銆�2026骞�7鏈堚�﹀畬鎴愨�︺�嶏紱涓婂崐鍧� 1-7 绱涓嶅彉锛涚浜岄〉 2026-07 褰撴湀鍊间笌搴撳唴閫愰」涓�鑷达紙瑙佺敤渚� 11锛� | 閫氳繃 |
+| 11 | 姝e悜 | freightRank/turnoverRank 2026-07 褰撴湀鐗堬紙浜у嚭 freightRank_褰撴湀鐗坃2026-07.xlsx / turnoverRank_褰撴湀鐗坃2026-07.xlsx锛� | 绗簩椤靛綋鏈堝�间笌 DB 涓�鑷淬�佸垪澶�=褰撴湀瀹屾垚 | 璐ц繍閲忕浜岄〉锛氬叏鐪� R26 B/G/L=3754.7823/12530.9282/16285.7105銆佹姹� R27 B=1227.5499锛圖B H2032 2026-07 姝︽眽鍚堣 1227.5499 鉁擄級銆丩=4940.9715锛涘懆杞噺绗簩椤碉細鍏ㄧ渷 R26=597278.64/1584647.07/2181925.71銆佹姹� R27=204809.5633/462751.8106/667561.3739锛屼笌 DB scale_split MONTH 琛屼竴鑷达紱B25/G25/L25 鍒楀ご=鈥滃綋鏈堝畬鎴愨�濓紱鏃犻敊璇叕寮� | 閫氳繃 |
+| 6 | 姝e悜 | 10 涓鍑烘帴鍙o紙鍚湭鍔ㄨ〃鐨勫叕浜�/鍑虹/杞ㄩ亾杞浮鏄庣粏锛�2026-07 | 鍏ㄩ儴鍙嚭鏁� | 鍏ㄩ儴 HTTP 200锛涘叏鏂囦欢閿欒鍏紡鎵弿 #REF!/#DIV/0!/#N/A = 0 娈嬬暀 | 閫氳繃 |
+| 7 | 璐熷悜 | 鏃犳暟鎹湀浠� period=2026-05锛坈itySummary/freightRank锛� | 涓嶆姤閿欍�佸綋鏈堝潡鐣欑┖ | HTTP 200锛岀┖琛ㄦ甯哥敓鎴愶紙浜х墿 neg_citySummary_2026-05_nodata.xlsx锛� | 閫氳繃 |
+| 8 | 璐熷悜 | 骞村垵鍗曟湀 period=2026-01锛坒reightRank锛� | 褰撴湀鍧�=1鏈堟暟鎹� | HTTP 200锛堜骇鐗� neg_freightRank_2026-01.xlsx锛� | 閫氳繃 |
+| 9 | 杈圭晫 | 瓒呰寖鍥存湀浠� period=2026-13 | 涓嶅穿銆佽蒋澶勭悊 | HTTP 200 姝e父鍑烘枃浠� | 閫氳繃锛堝鏉惧鐞嗭級 |
+| 10 | 璐熷悜 | 闈炴硶鎶ヨ〃鏈� period=bad-period | 鍙嬪ソ鎶ラ敊鎴� 400 | HTTP 500锛堟棤鍏ュ弬鏍¢獙锛涘墠绔负鍥哄畾涓嬫媺锛屾甯歌矾寰勪笉鍙揪锛� | 鍙戠幇缂洪櫡锛堜綆浼樺厛锛� |
+
+## 鍥涖�佸叆搴撴娊鏌ワ紙涓庢簮搴撻�愰」瀵归綈锛�
+- 鍩庡競瀹㈣繍姹囨�诲簳閮ㄥ崟鏈堝潡锛欱14/D14锛堝叕浜� 12974.73 / 87147.68锛夈�丅15/D15锛堝嚭绉� 5860.24 / 34236.60锛夈�丅18/D18锛堣建閬� 11731.83 / 96645.23锛夈�丅19/D19锛堣疆娓� 46.05 / 156.57锛�= SELECT SUM 2026-07 city_bus/city_taxi 閫愰」涓�鑷淬��
+- 鍩庡競瀹㈣繍褰撴湀鍧楀垎甯傚窞锛氭姹� R50 鍏氦 4218.74銆佸嚭绉� 1093.91 = DB 2026-07 姝︽眽甯傚悎璁★紱鍏朵綑 16 甯傚窞鍏氦鍊间笌 DB 閫愬競宸炰竴鑷达紙鎶芥煡 G 鍒� R50-R66锛夈��
+- 鍏矾鏃呭涓彛寰勪笅鍗婂潡 3078.86 涓囦汉 / 141155.32 涓囦汉鍏噷 = 2026-07 褰撴湀婧愬�硷紙绱宸彛寰勶紝涓庢棦鏈夊洖褰掑彛寰勪竴鑷达級銆�
+
+## 浜斻�佸彂鐜扮殑闂涓庡缃�
+1. **璐ц繍涓ゅ紶鎺掑悕琛ㄧ浜岄〉鈥滃綋鏈堚�濆~鍏咃紙宸插疄鐜板苟楠岃瘉锛�2026-09-02 16:40锛�**锛氫笟鍔$‘璁ょ浜岄〉瑕佸綋鏈堝�煎悗锛屽凡瀹炵幇褰撴湀濉厖锛堣揣杩愰噺锛氳涓�=H2032 褰撴湀/鍚堣=妯℃澘褰撴湀鍒�/瑙勪笅=宸�硷紱鍛ㄨ浆閲忥細鎷嗗垎琛� MONTH 琛岋級锛屽苟鎶婄浜岄〉鍒楀ご鍐呭瓨鏇挎崲涓衡�滃綋鏈堝畬鎴愨�濄��2026-07 鍥炲綊涓� DB 閫愰」涓�鑷淬�佹棤閿欒鍏紡銆傛ā鏉挎簮鏂囦欢锛坉ocs/璐ц繍/鐢熸垚_*.xlsx锛夋湰韬粛鍐欌�滅疮璁″畬鎴愨�濆瓧鏍凤紝濡傞渶婧愭枃浠朵竴骞舵敼鍙湪 Excel 涓彟瀛橈紙绋嬪簭瀵煎嚭宸茶嚜鍔ㄦ樉绀轰负鈥滃綋鏈堝畬鎴愨�濓級銆�
+2. **鍩庡競瀹㈣繍褰撴湀鍧� Q 鍧楄〃澶存涔夛紙寰呬笟鍔$‘璁わ級**锛氬綋鏈堝杩愰噺鍧楄〃澶磋 48 Q 鍒楀啓鈥滃叾涓細鍑虹鈥濄�佸綋鏈堝懆杞噺鍧楄〃澶磋 70 Q 鍒楀啓鈥滃叾涓細缃戠害杞︹�濓紝绋嬪簭鎸夆�滅綉绾﹁溅=0 鐣欑┖鈥濆~鍏咃紱闇�纭涓氬姟鍙e緞锛堝凡璁板叆寰呯‘璁ゆ竻鍗曪級銆�
+3. **澧為��/澧為�熸帓鍚嶅垪**锛欵/J/O/T/W/Y 鏃犲幓骞村悓鏈熸暟鎹椂鐣欑┖锛屽叾鎺掑悕鍏紡锛團/K/P/U 绛夛級淇濈暀锛涙棤鍘诲勾鏁版嵁鏃舵帓鍚嶆棤涓氬姟鎰忎箟锛屽緟妯℃澘鍙e緞纭鍚庡喅瀹氭槸鍚︽暣鍒楁竻绌恒��
+4. **闈炴硶 period 杩斿洖 500**锛氭姤琛ㄥ弬鏁版湭鍋氭牸寮忔牎楠岋紝鍓嶇鍥哄畾涓嬫媺涓嶅彲杈撅紝浣庝紭鍏堢骇锛屽缓璁悗缁粺涓�琛ャ��
+
+## 鍏�佺粨璁�
+- 鍏矾鏃呭銆佸煄甯傚杩愭柊鐗堝紡鏀归�犲凡钀藉湴锛氫笂鍗娾�滅疮璁♀��+涓嬪崐鈥滃綋鏈堚�濆弻鍧楃粨鏋勬纭�佸叕寮忚寖鍥存纭�佹暟鍊间笌搴撳唴 2026-07 鏁版嵁閫愰」瀵归綈锛屾棤閿欒鍏紡娈嬬暀 鈫� 鍙敤銆�
+- 璐ц繍涓ゅ紶鎺掑悕琛ㄧ浜岄〉鈥滃綋鏈堚�濆~鍏呭凡瀹炵幇骞堕�氳繃 2026-07 鍥炲綊锛堜笌搴撳唴 H2032 / freight_turnover_import / scale_split MONTH 琛岄�愰」涓�鑷达級銆�
+
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_\350\277\220\346\224\277\350\275\246\350\276\206\344\270\216\350\275\250\350\277\271\351\207\214\347\250\213\345\257\274\345\205\245\345\233\236\345\275\222_2026-09-02.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_\350\277\220\346\224\277\350\275\246\350\276\206\344\270\216\350\275\250\350\277\271\351\207\214\347\250\213\345\257\274\345\205\245\345\233\236\345\275\222_2026-09-02.md"
new file mode 100644
index 0000000..3bcb4d4
--- /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_\350\277\220\346\224\277\350\275\246\350\276\206\344\270\216\350\275\250\350\277\271\351\207\214\347\250\213\345\257\274\345\205\245\345\233\236\345\275\222_2026-09-02.md"
@@ -0,0 +1,33 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡_杩愭斂杞﹁締涓庤建杩归噷绋嬪鍏ュ洖褰抇2026-09-02
+
+## 鍔熻兘璇存槑
+鍥炲綊銆岃繍鏀胯溅杈嗐�嶃�岃建杩归噷绋嬨�嶅鍏ュ姛鑳斤紙瑙f瀽鏂瑰紡宸蹭簬 09-02 鏀逛负"琛ㄥご鍚嶇О鏄犲皠"锛屽垪椤哄簭鍙樺寲涔熻兘姝g‘瀵煎叆锛夈�傜敤 docs 閲岀殑 7 鏈堟暟鎹枃浠舵祴璇� 2026-08 鎶ヨ〃鏈燂紝楠岃瘉姝e悜瀵煎叆銆佸叆搴撳榻愩�佸垪涔卞簭銆侀敊绫诲瀷璐熷悜绛夊満鏅��
+
+## 娴嬭瘯鐜
+- 鍚庣锛歵raffic-audit-server锛圫pring Boot锛�8090锛夛紝13:21 閲嶅惎灏辩华銆�
+- 鏁版嵁搴擄細MySQL 3308 traffic_audit銆�
+- 鎺ュ彛锛歚POST /api/import/transportAuth`锛堣繍鏀胯溅杈嗭級銆乣POST /api/import/trackMileage`锛堣建杩归噷绋嬶級銆�
+- 娴嬭瘯鏂囦欢锛坉ocs 鍐呯湡瀹炴暟鎹揩鐓э級锛�
+ - `docs/璐ц繍/妯℃澘_杩愭斂杞﹁締.xlsx`锛堣〃澶达細浼佷笟鍚嶇О/鎬荤壍寮曡溅鏁�/鎬绘寕杞︽暟/鍏跺畠杞﹁締鏁�/鎸傝溅鎬诲惃浣�(鍚�)/鍏跺畠杞﹁締鎬诲惃浣�(鍚�)锛�635 琛屾暟鎹級
+ - `docs/璐ц繍/妯℃澘_杞ㄨ抗閲岀▼.xlsx`锛堣〃澶达細搴忓彿/浼佷笟鍚嶇О/鏈堝害鎬婚噷绋�(鍏噷)/鏈夐噷绋嬬殑杞﹁締鏁帮紝628 琛屾暟鎹級
+
+## 鐢ㄤ緥琛�
+
+| # | 鐢ㄤ緥 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|------|------|------|------|------|
+| 1 | 姝e悜锛氳繍鏀胯溅杈嗗鍏� | 妯℃澘_杩愭斂杞﹁締.xlsx 鈫� transportAuth, period=2026-08 | 鎴愬姛 635 鏉� | 635 鏉℃垚鍔燂紝0 澶辫触 | 鉁� 閫氳繃 |
+| 2 | 姝e悜锛氳建杩归噷绋嬪鍏� | 妯℃澘_杞ㄨ抗閲岀▼.xlsx 鈫� trackMileage, period=2026-08 | 鎴愬姛 628 鏉� | 628 鏉℃垚鍔燂紝0 澶辫触 | 鉁� 閫氳繃 |
+| 3 | 鍏ュ簱瀵归綈锛堣繍鏀匡級 | 鎶芥煡搴撲腑 2026-08 璁板綍 | 涓庢簮鏂囦欢閫愰」涓�鑷� | 瀹夊悏姹借溅鐗╂祦 0/96/96/1057.708/871.56 绛夊墠 3 瀹朵竴鑷� | 鉁� 閫氳繃 |
+| 4 | 鍏ュ簱瀵归綈锛堣建杩癸級 | 鎶芥煡搴撲腑 2026-08 璁板綍 | 涓庢簮鏂囦欢閫愰」涓�鑷� | 婀栧寳涓崌杩愯緭 150427.03/29 绛夊墠 3 瀹朵竴鑷� | 鉁� 閫氳繃 |
+| 5 | 鍒椾贡搴忎粛鍙鍏ワ紙杩愭斂锛� | 鎵撲贡 6 鍒楅『搴忕殑鍓湰 鈫� transportAuth | 635 鏉℃垚鍔燂紝鏁板�间笉閿欎綅 | 635 鏉℃垚鍔燂紝鎶芥煡鍊间笌婧愭枃浠朵竴鑷达紙骞傜瓑鍏堝垹鍚庢彃锛� | 鉁� 閫氳繃 |
+| 6 | 鍒椾贡搴忎粛鍙鍏ワ紙杞ㄨ抗锛� | 鎵撲贡骞跺幓鎺夊簭鍙峰垪鐨勫壇鏈� 鈫� trackMileage | 628 鏉℃垚鍔燂紝鏁板�间笉閿欎綅 | 628 鏉℃垚鍔燂紝鎶芥煡鍊间笌婧愭枃浠朵竴鑷� | 鉁� 閫氳繃 |
+| 7 | 璐熷悜锛氶敊绫诲瀷鏂囦欢 | 杩愭斂鏂囦欢璋� trackMileage | 鏄庣‘鎶ラ敊銆佸垪鍑虹己鍒� | 鎶�"琛ㄥご缂哄皯蹇呴渶鍒椼�愭湀搴︽�婚噷绋�(鍏噷)銆戙�愭湁閲岀▼鐨勮溅杈嗘暟銆戯紝璇风‘璁ゆ槸鍚﹂�夐敊浜嗘暟鎹被鍨�"锛屾湭璇垹鏁版嵁 | 鉁� 閫氳繃 |
+| 8 | 璐熷悜锛氶敊绫诲瀷鏂囦欢 | 杞ㄨ抗鏂囦欢璋� transportAuth | 鏄庣‘鎶ラ敊銆佸垪鍑虹己鍒� | 鎶�"琛ㄥご缂哄皯蹇呴渶鍒椼�愭�荤壍寮曡溅鏁般�戔��"锛屾湭璇垹鏁版嵁 | 鉁� 閫氳繃 |
+
+## 鍙戠幇鐨勯棶棰樹笌澶勭疆
+- 鏃犳柊澧為棶棰樸�傝鏄庯細娴嬭瘯鐢� 7 鏈堟暟鎹鍏ヤ簡 2026-08 鎶ヨ〃鏈燂紙transport_auth_vehicle / vehicle_track_mileage 鐨� 2026-08 = 635/628 鏉★級锛屽睘鍔熻兘娴嬭瘯鏁版嵁锛屽凡鍛婄煡鐢ㄦ埛锛屽闇�娓呯悊鍙垹闄ゅ搴旀姤琛ㄦ湡璁板綍銆�
+- 瀹樻柟鑳借�楁牸寮忥紙15 鍒�/缁勶紝濡� `閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙2026锛�2瀛e害.xls`锛夋寜鐢ㄦ埛纭鐨�"绯荤粺妯℃澘鏍煎紡"鍙e緞锛氫笉瀹炵幇瀹樻柟鏍煎紡鐩磋锛屽鍏ユ椂鐢辫〃澶村垪浣嶆牎楠屾嫆缁濆苟鎻愮ず"璇蜂娇鐢ㄧ郴缁熸ā鏉裤�婃ā鏉縚閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙2026锛�.xlsx銆嬫暣鐞嗗悗鍐嶅鍏�"锛堝疄娴嬫姤锛氱 22 鍒楀簲涓恒�岃溅鐗屽彿銆嶏紝瀹為檯涓恒�屸憽鍑哄巶骞翠唤锛堝勾锛夈�嶏級銆�
+- 椤哄甫琛ュ锛歚docs/鎶曡祫/杈撳叆/鐗╂祦锛堢墿娴佸洯鍖猴級/6鏈�/鏋楀尯鐗╂祦鎶曡祫鏈堟姤2026.06.xlsx`銆乣7鏈�/鏋楀尯鐗╂祦鎶曡祫鏈堟姤2026.07.24.xlsx` 瀵煎叆 2026-06/2026-07 鍚� 1 鏉℃垚鍔燂紝绁炲啘鏋剁墿娴佸洯 6/7/8 鏈堟暟鎹ˉ鍏紝涓旈獙璇佸 sheet 淇瀵� 6/7 鏈堟枃浠跺悓鏍风敓鏁堬紙7 鏈堟枃浠跺惈 `2026.6` 涓� `2026.7` 涓や釜 sheet锛屾纭�変腑 `2026.7`锛夈��
+
+## 缁撹
+鍏ㄩ儴鐢ㄤ緥閫氳繃銆傝繍鏀胯溅杈�/杞ㄨ抗閲岀▼鎸夎〃澶村悕绉版槧灏勮В鏋愭甯革紝鍒楅『搴忓彉鍖栦笉閿欎綅锛岄敊绫诲瀷鏂囦欢鏄庣‘鎶ラ敊涓嶈鍒犳暟鎹紱瀹樻柟鑳借�楁寜"绯荤粺妯℃澘鏍煎紡"鍙e緞鎷掔粷骞舵彁绀烘暣鐞嗐��
diff --git "a/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\257\274\345\205\245\344\270\216\347\224\237\346\210\220\346\250\241\345\235\227\344\275\223\346\243\200\351\227\256\351\242\230\346\270\205\345\215\225_2026-09-02.md" "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\257\274\345\205\245\344\270\216\347\224\237\346\210\220\346\250\241\345\235\227\344\275\223\346\243\200\351\227\256\351\242\230\346\270\205\345\215\225_2026-09-02.md"
new file mode 100644
index 0000000..3821208
--- /dev/null
+++ "b/docs/\345\212\237\350\203\275\346\265\213\350\257\225\346\212\245\345\221\212/\345\257\274\345\205\245\344\270\216\347\224\237\346\210\220\346\250\241\345\235\227\344\275\223\346\243\200\351\227\256\351\242\230\346\270\205\345\215\225_2026-09-02.md"
@@ -0,0 +1,63 @@
+# 瀵煎叆涓庣敓鎴愭ā鍧椾綋妫�闂娓呭崟锛�2026-09-02锛�
+
+> 鏂瑰紡锛氶潤鎬佷唬鐮佸鏌� + 鏁版嵁搴撳彧璇绘牳瀵癸紙鏈姩妯℃澘銆佹湭閲嶅惎鍚庣锛夈�傛ā鏉挎枃浠舵鍦ㄧ敱鍙︿竴浼氳瘽淇敼锛屾秹鍙婃ā鏉胯仈鍔ㄧ殑闂鏍囨敞銆愬崗浣溿�戙��
+> 鐘舵�佸惈涔夛細P0=浼氶�犳垚瀵煎嚭/瀵煎叆鐩存帴澶辫触鎴栨暟鎹潤榛橀敊璇紱P1=杩濆弽闇�姹傦紙琛屽彿鎻愮ず/鍙拷婧級鎴栧鑷存姤琛ㄥ唴瀹规畫缂猴紱P2=浣撻獙/涓�鑷存��/娼滃湪璇垹銆�
+
+## 涓�銆丳0锛堜細鐩存帴鎸傛垨鏁版嵁闈欓粯閿欙級
+
+### 1.銆愬崗浣溿�戝煄甯傚杩� 6 寮犲鍑虹殑妯℃澘鏂囦欢宸茶鍒犻櫎锛屼唬鐮佸紩鐢ㄦ湭鍚屾
+- 璇佹嵁锛歚docs/鍩庡競瀹㈣繍/瀵煎叆妯℃澘_鍩庡競鍏氦.xlsx`銆乣瀵煎叆妯℃澘_宸℃父鍑虹.xlsx`銆乣瀵煎叆妯℃澘_杞ㄩ亾銆佽疆娓�.xlsx`銆乣瀵煎叆妯℃澘_鍩庡競鍒嗗競宸�.xlsx`銆乣瀵煎叆妯℃澘_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx`銆乣瀵煎叆妯℃澘_鍩庡競姹囨��.xlsx` 宸茶鍙︿竴浼氳瘽鍒犻櫎锛坓it 鏄剧ず D锛夛紝鎹㈡垚 `鐢熸垚_*.xlsx` 绯诲垪銆�
+- 褰卞搷锛歚ReportExportService.java` 浠嶇‖缂栫爜璇诲彇涓婅堪 6 涓枃浠跺悕锛坄resolveTemplate("docs/鍩庡競瀹㈣繍")`锛夛紝鏂囦欢涓嶅瓨鍦ㄦ椂瀵煎嚭鎶涒�滄湭鎵惧埌妯℃澘鏂囦欢鈥濃啋 cityBusDetail/cityTaxiDetail/cityRailFerryDetail/cityPassengerCitySum/cityPassengerDetailSum/cityPassengerSummary 閲嶅惎鍚庡繀 500銆�
+- 澶勭疆锛氭ā鏉夸細璇濆畾绋挎椂鎶婁唬鐮佸紩鐢ㄥ悓姝ヤ负鏂扮殑 `鐢熸垚_*.xlsx`锛堟垨鎭㈠鏃ф枃浠讹級锛屾湰浼氳瘽涓嶉噸澶嶆敼锛涘畾绋垮悗璺� v2 鍥炲綊銆�
+
+### 2. 鏁板�艰В鏋愰潪娉曟枃鏈潤榛樼疆 0锛坓etDecimal/getInt锛�
+- 璇佹嵁锛歚DataImportService.getDecimal()` 鎹曡幏 `NumberFormatException` 鍚庤繑鍥� `0.0`锛沗getInt()` 鍐嶅彇 intValue銆傝繍鏀胯溅杈�/杞ㄨ抗閲岀▼/瑙勪笂瑙勪笅/璐ц繍閲忓懆杞噺绛夊ぇ閲忚蛋 `gd()/gi()`銆�
+- 褰卞搷锛氭簮鏂囦欢鏌愭牸涓洪潪鏁板瓧鏂囨湰锛堝鈥滄湭濉�濃�溾�斺�濓級鏃朵笉鎶ラ敊銆佹棤琛屽彿锛岀洿鎺ュ叆搴� 0锛宻uccess 鐓ц 鈫� 鎶ヨ〃鏁板瓧鎮勬倓閿欙紝杩濊儗鈥滃鍏ュけ璐ユ樉绀鸿鍙封�濈殑瑕佹眰銆�
+- 澶勭疆寤鸿锛氶潪绌轰笖闈炴暟瀛楃殑鍗曞厓鏍兼寜鈥滃け璐ヨ + 琛屽彿 + 鍘熷洜鈥濊褰曪紙涓� H2032/H204 鐨� failDetails 涓�鑷达級锛岃�屼笉鏄潤榛� 0銆�
+
+## 浜屻�丳1
+
+### 3. 6 绫诲鍏ュけ璐ヤ笉璁拌鍙�/鍘熷洜锛坋rrorDetail=null锛�
+- 鑼冨洿锛歍RANSPORT_AUTH銆乀RACK_MILEAGE銆丼CALE_SPLIT銆丗REIGHT_TURNOVER銆両NVEST_SYSTEM銆丆ITY_TAXI_AUTH銆�
+- 璇佹嵁锛歚recordBatch(..., null)`锛涘け璐ヤ粎鍦ㄦ彃鍏� try/catch 涓� `failRows++`銆�
+- 褰卞搷锛氶〉闈⑩�滃鍏ョ粨鏋溾�濆彧鑳界湅鍒扳�滃け璐� N 鏉♀�濓紝鏃犲け璐ヤ綅缃�/鍘熷洜锛堝墠绔厹搴曟樉绀衡�滆鎵规鏃犲け璐ユ槑缁嗏�濓級銆�
+- 澶勭疆寤鸿锛氫笌 H2032/H2031/H204 瀵归綈锛屾敹闆嗚鍙�+浼佷笟鍚�/杞︾墝+鍘熷洜锛汣ITY_TAXI_AUTH 42636 琛屽垎鎵规彃鍏ュ挨鍏堕渶瑕佽绾уけ璐ユ敹闆嗐��
+
+### 4. import_batch_id 浠庢湭鍥炲~锛堟壒娆′笌涓氬姟鏁版嵁鏂摼锛�
+- 璇佹嵁锛歚freight_turnover_import` 18/18銆乣scale_split_transport` 36/36銆乣h2032_enterprise_monthly` 2026 骞� 5088/5088 琛� `import_batch_id` 鍏� NULL锛涗唬鐮佷腑鏃犱换浣� `setImportBatchId` 璋冪敤銆�
+- 褰卞搷锛氭棤娉曞洖绛斺�滆繖鎵规暟鎹潵鑷摢涓枃浠�/鍝瀵煎叆鈥濓紝鏃犳硶鎸夋壒娆¤拷婧笌鍥炴粴锛涙姤琛ㄦ牳瀵瑰彧鑳介潬 import_type+report_period 闂存帴鐚溿��
+- 澶勭疆寤鸿锛歚recordBatch()` 杩斿洖鎵规 id锛屽鍏ユ柟娉曟寜鏈熷洖濉埌涓氬姟琛紙琛ㄧ粨鏋勫凡鍏峰璇ュ垪锛夈��
+
+### 5. 鏈堝害/鍩烘湡鏁版嵁缂哄彛锛堝喅瀹氭姤琛ㄥ畬鏁村害锛岄潪浠g爜缂洪櫡锛�
+- 璇佹嵁锛歚city_bus_monthly`/`city_taxi_monthly` 浠� 2026-06銆�07锛�142/17 琛岋級锛沗h2031_enterprise_monthly` 浠� 2026-03銆�07锛�778/771锛夛紱2025 鍩烘湡鍏ㄥ簱鏃犲煄甯傚杩�/鍏矾鏃呭鏈堝害鏁版嵁銆�
+- 褰卞搷锛氬煄甯傚杩� 1-5 鏈堝垪绌恒�佸悓姣斿垪鍏ㄧ┖锛堝幓骞村熀鏈熺己澶憋級锛宍#REF!` 鍚屾瘮鍏紡鍙兘琚�滄竻绌衡�濆鐞嗭紱涓彛寰�/鍏矾鏃呭鎶ヨ〃澶氭暟鏈堜唤鏃犳暟鎹�傚厛琛ユ暟鎹紝鎶ヨ〃鎵嶆湁鎰忎箟銆�
+- 澶勭疆锛氬煄甯傚杩愭湀搴︼紙U203/U402锛変笌杞ㄩ亾/杞浮 2026 骞� 1-5 鏈堛��8 鏈堚�︽寜婧愭枃浠惰ˉ瀵硷紱鍏矾鏃呭 H2031 琛� 1/2/4/5/6/8 鏈堬紱鍘诲勾鍚屾湡锛�2025 鎴� 2025 鍚屾湡锛夋暟鎹ˉ瀵煎悗鍚屾瘮鑷姩鏈夊�硷紙闇�纭琛ㄧ粨鏋勬敮鎸佸幓骞村垪锛夈��
+
+## 涓夈�丳2
+
+### 6. 鍓嶇鈥滃鍏ヨ繘搴︹�濇槗璇樉绀衡�滄棤鏁版嵁鈥濓紝澶ф枃浠舵棤瀹炴椂杩涘害
+- 璇佹嵁锛歚DataImport.vue loadData()` 鐨� overview 鍙�**姣忎釜绫诲瀷鏈�鏂颁竴鏉℃壒娆�**锛涚┖鎵规锛�0 琛岋紝#177-179/#186 绛夛級浼氳鐩栨樉绀轰负鈥滄棤鏁版嵁鈥濓紱鎵规琛ㄥ彧灞曠ず 50 鏉°�佹棤鍒嗛〉锛涘崟鏂囦欢瀵煎叆浠� `status='uploading'`锛屾棤鐧惧垎姣旓紙42636 琛� 20-40 绉掑叏绋嬫棤鍙嶉锛屼綋鎰熲�滃崱姝�/鏃犺繘搴︹�濓級銆�
+- 澶勭疆寤鸿锛氣憼 overview 缁熻鏀逛负鈥滃悓绫诲瀷鏈�杩戜竴娆� total>0 鐨勬壒娆♀�濇垨鍚堣锛涒憽 鎵规鍒楄〃鍒嗛〉锛涒憿 澶ф枃浠剁粰闃舵鎻愮ず鎴栬疆璇㈣繘搴︼紱鈶� 瑙f瀽鍒� 0 琛岀殑鏂囦欢鏄庣‘鎻愮ず鈥滄枃浠舵棤鏈夋晥鏁版嵁琛屸�濊�岄潪闈欓粯鎴愬姛鎵规銆�
+
+### 7. 鍓嶇鈥滃勾鎶モ�濆垎缁� 11 涓被鍨嬪悗绔棤瀹炵幇
+- 璇佹嵁锛歚DataImport.vue groups` 鍚� annualCompanyBasic/annualEnterpriseFinance/鈥� 11 椤癸紱鍚庣 `DataImportService` switch 涓� Controller 鍧囨棤 annual* 鏀寔銆�
+- 澶勭疆锛氳涔堜粠椤甸潰绉婚櫎/绂佺敤锛堟湭寮�鏀撅級锛岃涔堣ˉ瀹炵幇锛涘惁鍒欑敤鎴风偣鍑诲嵆鈥滀笉鏀寔鐨勫鍏ョ被鍨嬧�濄��
+
+### 8. 杩愭斂杞﹁締/杞ㄨ抗閲岀▼骞傜瓑鍒犻櫎瀹℃牳缁撴灉鑼冨洿杩囧锛堟綔鍦ㄨ鍒狅級
+- 璇佹嵁锛歚importTransportAuth/importTrackMileage` 骞傜瓑澶勭洿鎺� `auditResultMapper.delete(reportPeriod=period)`锛堟湭鎸夎鍒� reportType 杩囨护锛夛紝鍏跺畠绫诲瀷鍧囪蛋 `deleteRuleResults(绫诲瀷,period)`銆�
+- 褰卞搷锛氬悓鎶ヨ〃鏈熻嫢鍏跺畠绫诲瀷宸插畬鎴愬鏍革紝鍐嶅杩愭斂杞﹁締浼氳繛甯︽竻鎺夊綋鏈堝叾瀹冪被鍨嬪鏍哥粨鏋滐紙褰撳墠澶氫负娴嬭瘯鏈熷奖鍝嶅皬锛夈��
+- 澶勭疆寤鸿锛氫笌鍏跺畠绫诲瀷缁熶竴涓烘寜 reportType 鐨勮鍒� id 鍒犻櫎銆�
+
+### 9. 鐢熸垚渚фā鏉胯仈鍔ㄩ闄╃偣锛堜緵妯℃澘浼氳瘽瀵圭収锛屽嬁閬楁紡锛�
+- 鎺掑悕妯℃澘锛氭爣棰樺啓姝� `row0/row22`銆佹暟鎹潡浠� `row3/row25` 璧凤紙freightRank/turnoverRank锛夆啋 澧炲垹琛屼細閿欎綅銆�
+- 璐ц繍鍒嗗競宸炴槑缁嗭細鏁版嵁鍖轰粠 0-based row4 璧凤紝鎸夆�滅渷 6 鎸囨爣 + 17 甯傚窞脳6 鎸囨爣鈥濊繛缁啓 108 琛屻��
+- 鑳借�楁眹鎬伙細鍏嬮殕鍩虹 sheet 鍚庢寜 0-based row2..7 鍐� 6 绉嶇噧鏂欙紙鏌存补/姹芥补/鈥�/鐕冩枡鐢垫睜锛夛紝D/J/L/M 涓哄叕寮忓垪涓嶅姩銆�
+- 涓彛寰勬槑缁嗭細Sheet1 鎸� 琛� 5..94/99..188 浜旀寮忓畾浣嶏紱Sheet2 鍘诲勾鏄庣粏椤垫畫鐣� #REF! 闇�闅忔ā鏉夸慨姝i噸鏂扮‘璁ゃ��
+- 鍩庡競瀹㈣繍锛氭暟鎹尯 鈮�75 琛屽畧鍗紱琛ㄥご鏈堜唤鈥滃湴鍖衡�濊瀹氫綅锛堝墠 20 琛岋級锛涘幓骞村垪浠� 19 璧锋瘡 2 鍒椼��
+- 鍏紡澶勭疆绾﹀畾锛氳法绨�/璺ㄨ〃姹備笉鍑哄�肩殑鍏紡鍙竻绌虹粨鏋滐紙涓嶅垹鍏紡鏂囨湰銆佷笉鏀瑰垪鍚嶏級鈥斺�旀ā鏉胯嫢鎶� #REF! 鏀逛负鐪熷疄寮曠敤锛岄渶鍚屾纭浠g爜鍐欑殑鍒椾綅缃竴鑷淬��
+
+## 鍥涖�佺粨璁�
+- 浠婃棩宸查獙璇佺殑瀵煎叆涓夐摼涓� 22 鎶ヨ〃缁撹浠嶆湁鏁堬紝浣�**鍩庡競瀹㈣繍 6 寮犲鍑轰緷璧栫殑妯℃澘鏂囦欢宸蹭笉鍦�**锛屾ā鏉夸細璇濆畾绋垮悗蹇呴』鍋氬紩鐢ㄥ悓姝� + v2 鍥炲綊锛堣剼鏈凡鐣欐。 outputs/report_check锛夈��
+- 浠g爜灞備紭鍏堜慨锛氶潪娉曟暟鍊奸潤榛� 0锛圥0-2锛夈�佸け璐ヨ鍙疯ˉ榻愶紙P1-3锛夈�佹壒娆� id 鍥炲~锛圥1-4锛夈�佽繍鏀�/杞ㄨ抗瀹℃牳缁撴灉璇垹鑼冨洿锛圥2-8锛夈��
+- 鏁版嵁灞備紭鍏堣ˉ锛氬煄甯傚杩� 1-5 鏈堜笌鍏矾鏃呭缂烘湀銆�2025 鍩烘湡锛圥1-5锛夆�斺�旇繖鏄姤琛ㄢ�滄湀鍒楃┖/鍚屾瘮绌衡�濈殑鏍瑰洜銆�
+- 鍓嶇浣撻獙锛氳繘搴﹀睍绀猴紙P2-6锛夈�佸勾鎶ュ叆鍙o紙P2-7锛夈��
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\237\216\345\270\202\345\256\242\350\277\220\346\225\260\346\215\256\344\274\230\345\214\226.docx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\237\216\345\270\202\345\256\242\350\277\220\346\225\260\346\215\256\344\274\230\345\214\226.docx"
index 8b15a4c..934f03c 100644
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\237\216\345\270\202\345\256\242\350\277\220\346\225\260\346\215\256\344\274\230\345\214\226.docx"
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\237\216\345\270\202\345\256\242\350\277\220\346\225\260\346\215\256\344\274\230\345\214\226.docx"
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\256\242\350\277\220\347\256\200\345\214\226.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\256\242\350\277\220\347\256\200\345\214\226.xlsx"
index f214984..adfe258 100644
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\256\242\350\277\220\347\256\200\345\214\226.xlsx"
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\256\242\350\277\220\347\256\200\345\214\226.xlsx"
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\205\254\344\272\244.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\205\254\344\272\244.xlsx"
deleted file mode 100644
index d482f29..0000000
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\205\254\344\272\244.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\210\206\345\270\202\345\267\236.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\210\206\345\270\202\345\267\236.xlsx"
deleted file mode 100644
index 0c7c749..0000000
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\210\206\345\270\202\345\267\236.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx"
deleted file mode 100644
index ab29de6..0000000
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\346\261\207\346\200\273.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\346\261\207\346\200\273.xlsx"
deleted file mode 100644
index cf67b43..0000000
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\237\216\345\270\202\346\261\207\346\200\273.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\267\241\346\270\270\345\207\272\347\247\237.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\267\241\346\270\270\345\207\272\347\247\237.xlsx"
deleted file mode 100644
index e995990..0000000
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\345\267\241\346\270\270\345\207\272\347\247\237.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\350\275\250\351\201\223\343\200\201\350\275\256\346\270\241.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\350\275\250\351\201\223\343\200\201\350\275\256\346\270\241.xlsx"
deleted file mode 100644
index 14bee3d..0000000
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\345\257\274\345\205\245\346\250\241\346\235\277_\350\275\250\351\201\223\343\200\201\350\275\256\346\270\241.xlsx"
+++ /dev/null
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx"
index ab29de6..efbf925 100644
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx"
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\220\204\345\270\202\345\267\236\346\230\216\347\273\206\350\241\250.xlsx"
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\347\264\257\350\256\241.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\347\264\257\350\256\241.xlsx"
index 0c7c749..8a23731 100644
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\347\264\257\350\256\241.xlsx"
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\347\264\257\350\256\241.xlsx"
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\346\261\207\346\200\273.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\346\261\207\346\200\273.xlsx"
index cf67b43..b272b14 100644
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\346\261\207\346\200\273.xlsx"
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\345\237\216\345\270\202\345\256\242\350\277\220\346\261\207\346\200\273.xlsx"
Binary files differ
diff --git "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\350\275\250\351\201\223\350\275\256\346\270\241\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\346\230\216\347\273\206.xlsx" "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\350\275\250\351\201\223\350\275\256\346\270\241\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\346\230\216\347\273\206.xlsx"
index 14bee3d..c68dc09 100644
--- "a/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\350\275\250\351\201\223\350\275\256\346\270\241\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\346\230\216\347\273\206.xlsx"
+++ "b/docs/\345\237\216\345\270\202\345\256\242\350\277\220/\347\224\237\346\210\220_\350\275\250\351\201\223\350\275\256\346\270\241\345\256\242\350\277\220\351\207\217\345\210\206\345\270\202\345\267\236\346\230\216\347\273\206.xlsx"
Binary files differ
diff --git "a/docs/\345\257\274\345\205\245\345\212\237\350\203\275\344\275\223\346\243\200\346\212\245\345\221\212.md" "b/docs/\345\257\274\345\205\245\345\212\237\350\203\275\344\275\223\346\243\200\346\212\245\345\221\212.md"
new file mode 100644
index 0000000..91ddaef
--- /dev/null
+++ "b/docs/\345\257\274\345\205\245\345\212\237\350\203\275\344\275\223\346\243\200\346\212\245\345\221\212.md"
@@ -0,0 +1,75 @@
+# 瀵煎叆鍔熻兘浣撴鎶ュ憡锛�2026-09-02 寮�濮嬶級
+
+> 鐩殑锛氶�愮被鍨嬮獙璇�"瑙f瀽鍣ㄥ垪浣� 鈫� 瀹樻柟妯℃澘 鈫� 瀹炴祴瀵煎叆鏁版嵁"涓夎�呬竴鑷达紝娑堥櫎"鍏朵粬绫诲瀷浼氫笉浼氬儚鑳借�椾竴鏍峰嚭闂"鐨勭枒铏戙��
+> 鏂规硶锛氣憼闈欐�佸姣旇В鏋愬櫒鍒椾綅涓庡畼鏂规ā鏉胯〃澶� 鈫� 鈶$敤鐪熷疄妯℃澘鏂囦欢瀹炴祴瀵煎叆锛堟祴璇曟姤琛ㄦ湡锛夆啋 鈶㈡娊鏌ュ叆搴撴暟鎹笌婧愭枃浠堕�愰」瀵归綈 鈫� 鈶h褰曠己鍙c��
+
+## 缁撹鎬昏
+
+| 绫诲瀷 | 瑙f瀽鏂瑰紡 | 瀹炴祴 | 缁撹 | 椋庨櫓鐐� |
+|---|---|---|---|---|
+| 鑳借�� H204 瀛f姤 | 鍥哄畾鍒椾綅(18鍒�/缁�) | 7/8/9鏈堝悇1284鏉� 0澶辫触 | 鉁� 宸蹭慨澶�+鍒椾綅鏍¢獙 | 瀹樻柟鏍煎紡(15鍒�/缁�)鏆備笉鏀寔锛岄渶杞ā鏉� |
+| 鎶曡祫锛堝杩愮珯鍦�/鐗╂祦鍥尯锛� | 鍥哄畾鍒椾綅+甯傚窞鏍¢獙 | 6/7鏈堢湡瀹炴枃浠讹紙瀹㈣繍46+鐗╂祦133銆佸熀鍑�148锛� | 鉁� 鍘嗗彶浼氳瘽宸插ぇ閲忓疄娴� | 鍗曡〃"鍏ㄧ渷姹囨�诲ぇ琛�"璺緞寰呭鏍� |
+| 鍩庡競鍏氦 U203 | 鍥哄畾鍒椾綅(0-67) | 2026-04锛�142鏉� 0澶辫触锛涢敊浣嶆枃浠惰鎷� | 鉁� 宸插姞鍒椾綅鏍¢獙 | 鍒楅『搴忓彉鍖栦笉鏀寔锛堟嫆缁濊�岄潪瀵奸敊锛� |
+| 宸℃父鍑虹 U402 | 鍥哄畾鍒椾綅(0-40) | 2026-04锛�17鏉� 0澶辫触锛涢敊浣嶆枃浠惰鎷� | 鉁� 宸插姞鍒椾綅鏍¢獙 | 鍚屼笂 |
+| H2032 璐ц繍鏈堟姤 | 琛ㄥご鍚嶇О鏄犲皠 | 18涓湀涓�鑷存�ф牳瀵归�氳繃 | 鉁� 瀹夊叏 | 鈥� |
+| 鍏矾鏃呭鏈堟姤 H2031 | 琛ㄥご鍚嶇О鏄犲皠 | 7鏈堣ˉ瀵煎叆46鏉� | 鉁� 瀹夊叏 | 鈥� |
+| 杩愭斂杞﹁締 | 琛ㄥご鍚嶇О鏄犲皠锛堟湰娆℃敼閫狅級 | 妯℃澘2琛屸渽 鍒楀簭鎵撲贡鉁� 缂哄垪鎶ラ敊鉁� | 鉁� 涓庤揣杩愭湀鎶ュ悓鏂瑰紡 | 寤鸿鐪熷疄澶ф枃浠跺洖褰� |
+| 杞ㄨ抗閲岀▼ | 琛ㄥご鍚嶇О鏄犲皠锛堟湰娆℃敼閫狅級 | 妯℃澘2琛屸渽 鍒楀簭鎵撲贡鉁� 缂哄垪鎶ラ敊鉁� | 鉁� 涓庤揣杩愭湀鎶ュ悓鏂瑰紡 | 鍚屼笂 |
+| 鎶曡祫绯荤粺瀵煎嚭 | 鍥哄畾鍒椾綅(8鍒�) | 琛ㄥご鏍¢獙姝�/璐熺敤渚嬮�氳繃 | 鉁� 宸插姞鍒椾綅鏍¢獙 | 鍒椾綅鍥哄畾锛岄敊浣嶆嫆缁� |
+| 璐ц繍閲忓懆杞噺 | 鐗规畩甯冨眬(甯傚窞琛�+宸﹀彸骞存) | 2026-06锛�18鏉� 0澶辫触锛涢敊绫诲瀷鏂囦欢琚嫆 | 鉁� 宸茶ˉ琛ㄥご鏍¢獙 | 鍒楁暟闅忔湀浠藉彉鍖栵紝闈犻鍒楀競宸�+琛ㄥご璇嗗埆 |
+| 瑙勪笂瑙勪笅鎷嗗垎 | 鐗规畩甯冨眬(sheet鍚�+瀛愯〃澶�) | 2026-06锛�36鏉� 0澶辫触锛涢敊甯冨眬琚嫆 | 鉁� 宸茶ˉsheet甯冨眬鏍¢獙 | 渚濊禆sheet鍚嶅惈 褰撴湀/绱 |
+| 鍏矾鏃呭杩愭斂杞﹁締鏁� | 琛ㄥご鍚嶇О鏄犲皠 | 2026-06锛�767鏉� 0澶辫触 | 鉁� | 鈥� |
+| 涓綋瀹㈣繍閲� | 琛ㄥご鍚嶇О鏄犲皠 | 琛ㄥご璇嗗埆閫氳繃锛堟ā鏉夸粎琛ㄥご锛� | 鉁� | 鈥� |
+| 鍑虹杞﹁繍鏀胯溅杈� | 鍥哄畾鍒椾綅(0-20) | 琛ㄥご璇嗗埆閫氳繃锛堟ā鏉夸粎琛ㄥご锛� | 鉁� 宸叉湁杞︾墝鍏抽敭瀛楁牎楠� | 鐪熷疄4.2涓囪寤鸿鍥炲綊 |
+
+## 宸叉祴鏄庣粏
+
+### 鍩庡競鍏氦锛圲203 浜や紒缁� 2026骞�7鏈堟枃浠讹級
+- 瀵煎叆娴嬭瘯鎶ヨ〃鏈� 2026-04锛氭垚鍔� 142 鏉★紝澶辫触 0 鏉°��
+- 鎶芥煡锛氭姹変袱姹熻疆娓℃湁闄愯矗浠诲叕鍙� 鈫� 杩愯惀杞︽暟 0 / 瀹㈣繍閲� 0 / 濉〃浜� 浣欑 / 鐢佃瘽 15802725070锛屼笌婧愭枃浠堕�愰」涓�鑷� 鉁�
+
+### 宸℃父鍑虹锛圲402 浜よ缁� 2026鏂囦欢锛�
+- 瀵煎叆娴嬭瘯鎶ヨ〃鏈� 2026-04锛氭垚鍔� 17 鏉★紝澶辫触 0 鏉°��
+- 鎶芥煡锛氭姹夊競 鈫� 杞藉杞︽ 729.27 / 瀹㈣繍閲� 1093.91 / 濉〃浜� 鍒樻壃 / 鐢佃瘽 02768820261锛屼笌婧愭枃浠朵竴鑷� 鉁�
+
+### 杩愭斂杞﹁締锛坉ocs/璐ц繍/妯℃澘_杩愭斂杞﹁締.xlsx锛�
+- 鏈宸蹭粠"鍥哄畾鍒椾綅"鏀逛负"琛ㄥご鍚嶇О鏄犲皠"锛堜笌 H2032 璐ц繍鏈堟姤涓�鑷达級锛屽繀闇� 6 鍒楋細浼佷笟鍚嶇О/鎬荤壍寮曡溅鏁�/鎬绘寕杞︽暟/鍏跺畠杞﹁締鏁�/鎸傝溅鎬诲惃浣�(鍚�)/鍏跺畠杞﹁締鎬诲惃浣�(鍚�)銆�
+- 瀹炴祴锛堟祴璇曟姤琛ㄦ湡 2026-HT锛屾祴鍚庡凡娓呯悊锛夛細妯℃澘鍓� 2 琛屽鍏ユ垚鍔� 2 鏉★紱**鍒楅『搴忔墦涔卞悗浠嶆垚鍔熷鍏� 2 鏉�**锛屽叆搴撳瓧娈典笌妯℃澘閫愰」涓�鑷达紙瀹夊悏姹借溅鐗╂祦锛氱壍寮� 0/鎸� 96/鍏跺畠 96/鎸傝溅鍚ㄤ綅 1057.708/鍏跺畠鍚ㄤ綅 871.56锛夛紱鍒犻櫎銆屾寕杞︽�诲惃浣�(鍚�)銆嶅垪 鈫� 鎶�"琛ㄥご缂哄皯蹇呴渶鍒�"銆�
+
+### 杞ㄨ抗閲岀▼锛坉ocs/璐ц繍/妯℃澘_杞ㄨ抗閲岀▼.xlsx锛�
+- 鏈宸蹭粠"鍥哄畾鍒椾綅"鏀逛负"琛ㄥご鍚嶇О鏄犲皠"锛屽繀闇� 3 鍒楋細浼佷笟鍚嶇О/鏈堝害鎬婚噷绋�(鍏噷)/鏈夐噷绋嬬殑杞﹁締鏁般��
+- 瀹炴祴锛氭ā鏉垮墠 2 琛屽鍏ユ垚鍔� 2 鏉★紱鍒楅『搴忔墦涔卞悗浠嶆垚鍔� 2 鏉★紝鍏ュ簱涓�鑷达紙婀栧寳涓崌杩愯緭锛�150427.03/29锛夛紱鍒楀悕鏀广�屾湀搴﹂噷绋�(鍏噷)銆嶁啋 鎶�"琛ㄥご缂哄皯蹇呴渶鍒�"銆�
+
+### 鍥哄畾鍒椾綅妯″潡"鍒椾綅鏍¢獙"璐熷悜鐢ㄤ緥锛�2026-09-02锛�
+- 鍩庡競鍏氦锛氳〃澶寸 6 鍒楁彃銆岄敊浣嶅垪銆嶁啋 鎷掔粷锛�"绗� 6 鍒楀簲涓恒�屽叕鍏辨苯鐢佃溅_杩愯惀杞︽暟銆嶏紝瀹為檯涓恒�岄敊浣嶅垪銆�"銆�
+- 宸℃父鍑虹锛氳〃澶寸 5 鍒楁彃銆岄敊浣嶅垪銆嶁啋 鎷掔粷锛�"绗� 5 鍒楀簲涓恒�岃浇瀹㈣溅娆℃�绘暟銆嶏紝瀹為檯涓恒�岄敊浣嶅垪銆�"銆�
+- 鎶曡祫绯荤粺瀵煎嚭锛氱 1 鍒椼�岃鍙枫�嶆敼銆屽簭鍙枫�嶁啋 鎷掔粷锛�"绗� 1 鍒楀簲涓恒�岃鍙枫�嶏紝瀹為檯涓恒�屽簭鍙枫��"銆�
+
+### 璐ц繍閲忓懆杞噺 / 瑙勪笂瑙勪笅鎷嗗垎锛坉ocs/璐ц繍锛屾祴璇曟湡 2026-06锛屾祴鍚庡凡娓呯悊锛�
+- 璐ц繍閲忓懆杞噺锛�18 鏉� 0 澶辫触锛涙娊鏌ユ姹夊競 1鏈�=5367.97597銆�6鏈�=5041.04224銆佸幓骞�1鏈�=4656.86022锛屼笌妯℃澘閫愰」涓�鑷� 鉁�
+- 瑙勪笂瑙勪笅鎷嗗垎锛�36 鏉★紙褰撴湀+绱鍚� 18 涓競宸烇級0 澶辫触锛涙娊鏌ユ姹夊競褰撴湀 瑙勪笂=241659.5295/瑙勪笅=445444.355/鍚堣=687103.884锛岀疮璁″垪涓�鑷� 鉁�
+- 宸茶ˉ鏍¢獙锛�2026-09-02锛夛細璐ц繍閲忓懆杞噺妫�鏌ヨ〃澶淬�岃揣杩愰噺(涓囧惃)/1鏈堚�︺�嶏紱瑙勪笂瑙勪笅妫�鏌� sheet 绗�2琛屻�屽競宸�/瑙勪笂浼佷笟杩愯緭閲忋��+ 绗�3琛屻�屽懆杞噺/璐ц繍閲忋�嶅瓙琛ㄥご銆傝礋鍚戠敤渚嬶紙閿欑被鍨嬫枃浠�/閿欏竷灞� sheet锛夊潎琚槑纭嫆缁� 鉁�
+
+### 鍏矾鏃呭杩愭斂杞﹁締鏁� / 涓綋瀹㈣繍閲忥紙docs/鍏矾鏃呭锛屾祴璇曟湡 2026-06锛屾祴鍚庡凡娓呯悊锛�
+- 杩愭斂杞﹁締鏁帮紙妯℃澘_鍏矾鏃呭杩愭斂杞﹁締鏁�.xlsx锛夛細767 鏉� 0 澶辫触锛岃〃澶村悕绉版槧灏� 鉁�
+- 涓綋瀹㈣繍閲忥紙涓綋瀹㈣繍閲忔眹鎬�.xlsx锛屼粎琛ㄥご鏃犳暟鎹锛夛細琛ㄥご璇嗗埆閫氳繃锛屽鍏� 0 鏉� 鉁�
+
+### 鍑虹杞﹁繍鏀胯溅杈嗭紙docs/鍩庡競瀹㈣繍锛屾祴璇曟湡 2026-06锛屾祴鍚庡凡娓呯悊锛�
+- 瀵煎叆妯℃澘_鍑虹杞︿俊鎭�(杩愭斂杞﹁締淇℃伅).xlsx 浠呰〃澶存棤鏁版嵁琛岋細琛ㄥご璇嗗埆閫氳繃锛堝惈"杞︾墝"鍏抽敭瀛楁牎楠岋級锛屽鍏� 0 鏉� 鉁�
+- 2026-08 宸叉湁鐪熷疄 42636 鏉″巻鍙插鍏ユ暟鎹紝鏈疆鏈Е纰般��
+
+## 寰呮祴娓呭崟锛堜笅涓�姝ワ級
+- 鍏ㄩ儴绫诲瀷宸插疄娴嬪畬姣曘�傚墿浣欏缓璁」锛�
+ 1. 鍑虹杞﹁繍鏀� 4.2 涓囪鐪熷疄澶ф枃浠跺洖褰掞紙姝ゅ墠鍘嗗彶瀵煎叆 42636 鏉★紝妯℃澘鏃犳暟鎹鏃犳硶鐢ㄦā鏉垮疄娴嬶級銆�
+
+## 寤鸿锛堟寜浼樺厛绾э級
+1. 鉁� 宸插畬鎴愶細鍥哄畾鍒椾綅绫诲瀷琛�"琛ㄥご鍒椾綅鏍¢獙"锛堣兘鑰�/鍏氦/鍑虹/鎶曡祫绯荤粺瀵煎嚭锛夛紱杩愭斂杞﹁締/杞ㄨ抗閲岀▼鏀逛负"琛ㄥご鍚嶇О鏄犲皠"锛堜笌璐ц繍鏈堟姤涓�鑷达級銆�
+2. 鉁� 宸插畬鎴愶細璐ц繍閲忓懆杞噺/瑙勪笂瑙勪笅琛ヨ〃澶存牎楠岋紝鎵�鏈夊鍏ョ被鍨嬬幇鍦ㄩ兘鏈夌被鍨嬭瘑鍒�/鏍¢獙鍏滃簳銆�
+3. 骞跺彂浜掓枼閿侊細鎸夐渶锛堣兘鑰楀凡鏈夛紱鍏朵粬绫诲瀷鍓嶇宸查槻杩炵偣锛夈��
+4. 瀹樻柟鑳借�楁牸寮忥紙15鍒�/缁勶級瑙f瀽锛氬緟涓氬姟纭鍚庡疄鐜帮紝鏇夸唬杞崲鑴氭湰銆�
+5. 杩愭斂杞﹁締/杞ㄨ抗閲岀▼瑙f瀽鏂瑰紡宸插彉鈥斺�斿缓璁敤鎴锋嬁鐪熷疄鏈堝害澶ф枃浠跺洖褰掍竴娆★紙鍒楅『搴忎笌妯℃澘涓�鑷存椂缁撴灉涓庢棫閫昏緫瀹屽叏鐩稿悓锛夈��
+
+## 娴嬭瘯鏁版嵁璇存槑
+- 2026-04 鎶ヨ〃鏈熺幇鏈夊煄甯傚叕浜� 142 鏉°�佸贰娓稿嚭绉� 17 鏉′负鏈浣撴娴嬭瘯鏁版嵁锛岄潪鐪熷疄鏁版嵁锛堝緟娓呯悊锛夈��
+- 2026-09-02 鏂板鐨� 2026-HT 娴嬭瘯鏈熸暟鎹紙杩愭斂/杞ㄨ抗鍚� 2 鏉� + 瀵煎叆缁撴灉璁板綍锛夊凡娓呯悊瀹屾瘯銆�
+- 2026-06 娴嬭瘯鏈熸暟鎹紙璐ц繍閲� 18 / 瑙勪笂瑙勪笅 36 / 鏃呭杩愭斂 767 + 瀵煎叆缁撴灉璁板綍锛夊凡娓呯悊瀹屾瘯锛屾湭瑙︾ 2026-07/08 鐪熷疄鏁版嵁銆�
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-02.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-02.md"
new file mode 100644
index 0000000..45f0157
--- /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-02.md"
@@ -0,0 +1,55 @@
+# 宸ヤ綔鏃ョ粨_2026-09-02
+
+## 浠婃棩宸ヤ綔
+1. **鑳借�楀鍏ヤ簨鏁呭鐩樹笌澶勭疆锛堜笂鍗堬級**
+ - 鏍瑰洜锛氬畼鏂规牸寮忥紙15 鍒�/缁勶級涓庣郴缁熺畝鍖栨ā鏉匡紙18 鍒�/缁勶級涓嶅尮閰嶏紝鍥哄畾鍒椾綅瑙f瀽瀵艰嚧鏁磋〃閿欎綅銆�
+ - 澶勭疆锛氭竻鐞� 8/9 鏈堥敊浣嶈兘鑰楁暟鎹紙鍚� 1284 鏉★紝7 鏈堜繚鐣欙級锛涘畼鏂规牸寮忚浆妯℃澘鍚庨噸鏂板鍏� 2026-08/09 鍧� 1284 鏉� 0 澶辫触骞堕獙璇佸榻愩��
+2. **瀵煎叆鍔熻兘鍏ㄩ潰浣撴**锛坄docs/瀵煎叆鍔熻兘浣撴鎶ュ憡.md`锛�
+ - 瀹炴祴锛氬煄甯傚叕浜� 142 鏉°�佸贰娓稿嚭绉� 17 鏉°�佸叕璺梾瀹㈣繍鏀� 767 鏉°�佽揣杩愰噺鍛ㄨ浆閲� 18 鏉°�佽涓婅涓� 36 鏉°�佸嚭绉熻溅杩愭斂琛ㄥご璇嗗埆绛夛紝鎶芥煡鍏ュ簱鍧囦笌婧愭枃浠朵竴鑷淬��
+3. **瀵煎叆鏍¢獙澧炲己锛堜唬鐮佹敼鍔紝鏈彁浜�/鏈帹閫侊級**
+ - 鍩庡競鍏氦/宸℃父鍑虹/鎶曡祫绯荤粺瀵煎嚭琛モ�滆〃澶村垪浣嶆牎楠屸�濓紱杩愭斂杞﹁締/杞ㄨ抗閲岀▼鏀逛负鈥滆〃澶村悕绉版槧灏勨�濓紙鍒楅『搴忓彉鍖栦篃鑳藉鍏ワ級锛涜揣杩愰噺鍛ㄨ浆閲�/瑙勪笂瑙勪笅琛ヨ〃澶�/sheet 甯冨眬鏍¢獙銆�
+4. **寤虹珛宸ヤ綔瑙勮寖**
+ - 姣忓畬鎴愪竴涓姛鑳界珛鍗虫祴璇曞苟鍐欍�婂姛鑳芥祴璇曟姤鍛娿�嬶紱姣忓ぉ鍐欍�婂伐浣滄棩缁撱�嬶紙鍛藉悕闄勬棩鏈燂級銆傚凡鍐欏叆 AGENTS.md 骞跺垱寤� `docs/鍔熻兘娴嬭瘯鎶ュ憡/`銆乣docs/宸ヤ綔鏃ョ粨/` 鐩綍銆�
+5. **鎶曡祫瀹℃牳 I004 鍩哄噯缂哄け璇姤淇锛堜唬鐮佹敼鍔紝鏈彁浜�/鏈帹閫侊級**
+ - 闂锛�8 鏈堟姇璧勭墿娴佸洯鍖�/瀹㈣繍绔欏満瀹℃牳鍑虹幇 163 鏉� RULE_I004銆屾姇璧勭郴缁熼」鐩己澶辨牳瀹炪�嶈鎶モ�斺�斿悓鎶ヨ〃鏈熸姇璧勭郴缁熷熀鍑嗭紙2026-08锛夊皻鏈鍏ワ紝搴撻噷鍙湁 7 鏈堝熀鍑嗐��
+ - 淇锛氬悓鎶ヨ〃鏈熷熀鍑嗘暣鏈熺己澶辨椂璺宠繃 I004锛堜笌 I001鈥揑003 涓�鑷达級锛岃鍒欑粺璁℃爣璁� skipped锛涘熀鍑嗗瓨鍦ㄦ椂鎭㈠鐪熷疄妫�娴嬨��
+ - 楠岃瘉锛氶噸璺� 8 鏈堝鏍� 163 鏉� 鈫� 0 鏉★紱瀵煎叆娴嬭瘯鍩哄噯鍚� I004 姝e父鎶� 42 鏉$湡瀹炵己澶憋紱娓呯悊鍚庤繕鍘� 0 鏉°�傛祴璇曟姤鍛婏細`docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫瀹℃牳I004鍩哄噯缂哄け淇濇姢_2026-09-02.md`銆�
+6. **鎶曡祫甯傚窞鏈堟姤澶� sheet 璇嗗埆涓庡簭鍙风┖鏍间慨澶嶏紙浠g爜鏀瑰姩锛屾湭鎻愪氦/鏈帹閫侊級**
+ - 闂锛歚绁炲啘鏋舵灄鍖虹墿娴佹姇璧勬湀鎶�2026.08.xlsx` 鎵撳紑鐪嬫槸绁炲啘鏋舵暟鎹紝鍗磋甯傚窞涓�鑷存�ф牎楠屾嫆缁濄��
+ - 鏍瑰洜 1锛氭枃浠� 46 涓� sheet锛屽墠 24 涓槸鍘嗗彶銆屾綔姹熶紶鍖�1鏈垀2021.8銆嶉仐鐣� sheet锛屾棫閫夎〃閫昏緫鍙湅銆�8鏈堛�嶅瓧鏍凤紝璇�夊巻鍙层�屾綔姹熶紶鍖�8鏈堛�嶁啋 璇诲嚭娼滄睙椤圭洰褰掑睘绁炲啘鏋� 鈫� 鏍¢獙鎷掔粷銆�
+ - 鏍瑰洜 2锛氱湡鏁版嵁 sheet `2026.8` 閲屻�岀鍐滄灦鐗╂祦鍥�嶉」鐩搴忓彿涓虹┖锛屾棫瑙f瀽鎶婄┖搴忓彿琛屼竴寰嬪綋甯傚窞灏忚妭琛岃烦杩囷紝鐪熷疄鏁版嵁浠庢湭鍏ュ簱锛堝簱閲屽彧鏈夊杩愮鍐滄灦鏋㈢航绔欙級銆�
+ - 淇锛氶�� sheet 鏀寔鐐瑰彿鎶ヨ〃鏈熷苟缁欍�屽甫骞翠唤鍓嶇紑銆嶇殑褰撴湡 sheet 鍔犲垎浼樺厛锛涚┖搴忓彿琛岃嫢鍍忛」鐩悕鍒欐寜椤圭洰瑙f瀽锛涙柊澧� `isLikelyInvestProjectName` 鍒ゆ柇銆�
+ - 楠岃瘉锛氱鍐滄灦+娼滄睙涓ゆ枃浠舵壒閲忓鍏� 2 鎴愬姛 0 澶辫触锛涚鍐滄灦鐗╂祦鍥凡鍏ュ簱锛堟�绘姇璧� 7440.35锛�8 鏈� 31/26.1/0/7535.45锛夛紱娼滄睙涓嶅彈褰卞搷銆傛祴璇曟姤鍛婏細`docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫甯傚窞鏈堟姤澶歴heet璇嗗埆涓庡簭鍙风┖鏍糭2026-09-02.md`銆�
+7. **杩愭斂杞﹁締/杞ㄨ抗閲岀▼瀵煎叆鍥炲綊锛堜笅鍗堬紝鏃犱唬鐮佹敼鍔級**
+ - 鐢� docs 7 鏈堟暟鎹紙`妯℃澘_杩愭斂杞﹁締.xlsx` 635 瀹躲�乣妯℃澘_杞ㄨ抗閲岀▼.xlsx` 628 瀹讹級娴� 2026-08 鎶ヨ〃鏈燂細姝e悜 635/628 鎴愬姛锛屽叆搴撲笌婧愭枃浠堕�愰」涓�鑷达紱鏋勯�犲垪涔卞簭鍓湰瀵煎叆浠嶆垚鍔熶笖鏁板�间笉閿欎綅锛堥獙璇佽〃澶村悕绉版槧灏勶級锛涢敊绫诲瀷鏂囦欢鏄庣‘鎶ラ敊鍒楀嚭缂哄垪涓斾笉璇垹鏁版嵁銆�
+ - 瀹樻柟鑳借�楋紙15 鍒�/缁勶級锛氭寜鐢ㄦ埛纭銆岀郴缁熸ā鏉挎牸寮忋�嶅彛寰勶紝瀹炴祴瀹樻柟鏂囦欢琚〃澶村垪浣嶆牎楠屾嫆缁濆苟鎻愮ず鐢ㄦā鏉挎暣鐞嗭紝涓嶅仛瀹樻柟鏍煎紡鐩磋銆�
+ - 琛ュ锛歞ocs 鍐� `鎶曡祫/杈撳叆/鐗╂祦锛堢墿娴佸洯鍖猴級/6鏈堛��7鏈坄 鏋楀尯鐗╂祦鎶曡祫鏈堟姤瀵煎叆 2026-06/2026-07 鎴愬姛锛岀鍐滄灦鐗╂祦鍥� 6/7/8 鏈堟暟鎹ˉ鍏ㄥ苟涓庢簮鏂囦欢鏍稿涓�鑷达紙7 鏈堟枃浠跺惈 `2026.6`/`2026.7` 涓� sheet锛屾纭�変腑 `2026.7`锛夈��
+ - 娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_杩愭斂杞﹁締涓庤建杩归噷绋嬪鍏ュ洖褰抇2026-09-02.md`銆�
+
+
+8. **鐢熸垚妯℃澘鏂扮増寮忔敼閫狅紙鍏矾鏃呭/鍩庡競瀹㈣繍/璐ц繍鎺掑悕锛屼唬鐮佹敼鍔紝鏈彁浜�/鏈帹閫侊級**
+ - 鐢ㄦ埛宸叉寜鏂扮増寮忔墜宸ヨ皟鏁� docs 涓嬨�婄敓鎴恄*.xlsx銆嬶紙涓婂崐鈥滅疮璁♀��+涓嬪崐鈥滃綋鏈堚�濓級锛涚▼搴忔寜鏂扮増寮忚ˉ榻愬~鍏呯偣锛氫腑鍙e緞鍒嗘瀽涓嬪崐鍧楋紙鍗犳瘮鍏紡鏀规寚 B$11/F$11锛夈�佷腑鍙e緞鎺掑悕鍙充晶褰撴湀鍧椼�佸煄甯傚杩愭眹鎬诲簳閮ㄥ崟鏈堝潡銆佸煄甯傚垎甯傚窞绱/鍚勫競宸炴槑缁嗚〃褰撴湀鍧楋紙褰撴湀=绱宸紝RANK/鍗犳瘮/澧為�熸帓鍚嶅叕寮忔敼鎸囧綋鏈堣锛夛紱璐ц繍閲�/鍛ㄨ浆閲忔帓鍚� R23 鏍囬鍘烩�滅疮璁♀�濄��
+ - 鍩庡競瀹㈣繍瀵煎嚭搴曠浠庡凡鍒犻櫎鐨勩�婂鍏ユā鏉縚*銆嬪叏閮ㄦ敼鍥炪�婄敓鎴恄*銆嬶紙鏈嶅姟/鎺у埗鍣�/涓�閿寘鍚屾锛夛紝DataImport.vue 涓嬭浇妯℃澘閾炬帴涓�骞舵敼鎸囥��
+ - 楠岃瘉锛�10 鎺ュ彛 2026-07 鍏� 200銆侀敊璇叕寮� 0 娈嬬暀锛涘煄甯傛眹鎬诲綋鏈堝潡涓庡簱鍐� 2026-07 鍒嗛」鍚堣閫愪綅涓�鑷达紙鍏氦 12974.73 / 鍑虹 5860.24 / 杞ㄩ亾 11731.83 / 杞浮 46.05锛夛紱涓彛寰勪笅鍗婂潡=7 鏈堝綋鏈� 3078.86 涓囦汉 / 141155.32 涓囦汉鍏噷锛涜礋鍚�/杈圭晫锛堟棤鏁版嵁鏈� 2026-05銆佸勾鍒� 2026-01銆佽秴鑼冨洿 2026-13銆侀潪娉� bad-period锛夊凡娴嬪苟鐣欐。銆�
+ - **璐ц繍鎺掑悕涓よ〃绗簩椤碘�滃綋鏈堚�濆~鍏呭凡瀹炵幇锛�16:40 纭鍚庤ˉ鍋氾級**锛歟xportFreightRank/exportTurnoverRank 绗簩椤垫敼濉綋鏈堝�硷紙璐ц繍锛欻2032 褰撴湀瑙勪笂+妯℃澘褰撴湀鍚堣-宸�硷紱鍛ㄨ浆閲忥細鎷嗗垎琛� MONTH 琛岋級锛岀浜岄〉鍒楀ご瀵煎嚭鏃舵敼鈥滃綋鏈堝畬鎴愨�濓紱2026-07 鍥炲綊姝︽眽/鍏ㄧ渷涓� DB 閫愰」涓�鑷淬��0 閿欒鍏紡锛屼骇鐗� `freightRank_褰撴湀鐗坃2026-07.xlsx`銆乣turnoverRank_褰撴湀鐗坃2026-07.xlsx`銆�
+ - 寰呯‘璁わ細鍩庡競瀹㈣繍褰撴湀鍧� Q 鍒楄〃澶粹�滃嚭绉�/缃戠害杞︹�濇涔夛紱妯℃澘婧愭枃浠跺垪澶粹�滅疮璁″畬鎴愨�濆闇�涓�骞惰惤鐩樺彲鍦� Excel 鍙﹀瓨锛堝鍑哄凡鑷姩涓衡�滃綋鏈堝畬鎴愨�濓級銆�
+
+## 娴嬭瘯缁撴灉鎽樿
+- 鍔熻兘娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_瀵煎叆鏍¢獙澧炲己_2026-09-02.md`锛�17 涓/璐熷悜鐢ㄤ緥鍏ㄩ儴閫氳繃锛夈��
+- 鍔熻兘娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫瀹℃牳I004鍩哄噯缂哄け淇濇姢_2026-09-02.md`锛�4 涓敤渚嬪叏閮ㄩ�氳繃锛夈��
+- 鍔熻兘娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鎶曡祫甯傚窞鏈堟姤澶歴heet璇嗗埆涓庡簭鍙风┖鏍糭2026-09-02.md`锛�5 涓敤渚嬪叏閮ㄩ�氳繃锛夈��
+- 鍔熻兘娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_杩愭斂杞﹁締涓庤建杩归噷绋嬪鍏ュ洖褰抇2026-09-02.md`锛�8 涓敤渚嬪叏閮ㄩ�氳繃锛夈��
+- 鍔熻兘娴嬭瘯鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鐢熸垚妯℃澘鏂扮増寮廮2026-09-02.md`锛�10 涓敤渚嬶細姝e悜 6 閫氳繃銆佽礋鍚�/杈圭晫 4 閫氳繃锛屽彟璁板綍 1 澶勪綆浼樼己闄凤細闈炴硶 period 杩斿洖 500 鏃犳牎楠岋級銆�
+- 杩愭斂杞﹁締/杞ㄨ抗閲岀▼ 2026-08锛�635/628 鏉★級涓� 7 鏈堟暟鎹祴璇曠棔杩癸紝淇濈暀涓庡惁寰呯敤鎴风‘璁わ紱鍏朵綑娴嬭瘯鏁版嵁宸叉竻鐞嗭紝鏈Е纰� 2026-06/07 鐪熷疄鎶曡祫鏁版嵁锛堟湰娆¤ˉ瀵间负鐪熷疄鏁版嵁锛夈��
+
+## 閬楃暀闂涓庡緟鍔�
+- 鍑虹杞﹁繍鏀匡細鍙︿竴浼氳瘽淇涓紝淇鍚庨渶鐪熷疄 4.2 涓囪澶ф枃浠跺洖褰掋��
+- 瀹樻柟鑳借�楋紙15 鍒�/缁勶級锛氬凡纭涓嶅疄鐜扮洿璇伙紝鎸夌郴缁熸ā鏉挎牸寮忔暣鐞嗗鍏ワ紙鐜扮姸琛屼负宸插疄娴嬶級銆�
+- 杩愭斂杞﹁締/杞ㄨ抗閲岀▼ 2026-08 鐩墠涓� 7 鏈堟暟鎹祴璇曠棔杩癸紙635/628 鏉★級锛屽闇�淇濈暀鐢ㄤ簬鍚庣画 8 鏈堝姛鑳芥祴璇曡鍛婄煡锛屽惁鍒欐竻鐞嗐��
+- **8 鏈堟姇璧勭郴缁熷鍑烘枃浠跺緟鐢ㄦ埛鎻愪緵**锛氭嬁鍒板悗瀵煎叆锛坕nvestmentSystem / period=2026-08锛夊苟閲嶈窇 8 鏈堝鏍革紝I001鈥揑004 鎭㈠瀹屾暣瀵规瘮銆�
+- 绁炲啘鏋剁墿娴佸洯 6/7/8 鏈堟暟鎹凡鍏ㄩ儴琛ュ叏锛坉ocs 鍐� 6/7 鏈堟枃浠跺凡瀵煎叆锛夈��
+
+## 鏄庡ぉ璁″垝锛堝緟鐢ㄦ埛纭锛�
+- 鐢ㄦ埛鐪熷疄鏂囦欢鎶芥煡鍥炲綊锛涙寜闇�缁х画涓氬姟鍔熻兘寮�鍙戙��
+
+
diff --git "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\346\250\241\345\235\227\345\212\237\350\203\275\351\252\214\350\257\201\347\212\266\346\200\201\347\237\251\351\230\265_2026-09-02.md" "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\346\250\241\345\235\227\345\212\237\350\203\275\351\252\214\350\257\201\347\212\266\346\200\201\347\237\251\351\230\265_2026-09-02.md"
new file mode 100644
index 0000000..b691bb6
--- /dev/null
+++ "b/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\346\250\241\345\235\227\345\212\237\350\203\275\351\252\214\350\257\201\347\212\266\346\200\201\347\237\251\351\230\265_2026-09-02.md"
@@ -0,0 +1,82 @@
+# 妯″潡 鈫� 鍔熻兘 鈫� 楠岃瘉鐘舵�佺煩闃碉紙2026-09-02 蹇収锛�
+
+> 鐘舵�佸彛寰勶細
+> 鉁� 宸查獙璇佸彲鐢紙鐪熷疄鏁版嵁/鍥炲綊璇佹嵁锛岃鈥滆瘉鎹�濆垪锛�
+> 鈿狅笍 鍔熻兘鍙敤浣嗘暟鎹簮鏈夌己鍙o紙缂烘湀/缂烘牸寮忥級锛岃ˉ鏁版嵁鍗冲畬鏁�
+> 馃煛 閮ㄥ垎楠岃瘉 / 鏈仛鍏ㄩ潰鍥炲綊
+> 鏁版嵁鑼冨洿锛氭湰鍦� traffic_audit 搴擄紙127.0.0.1:3308锛�+ 褰撴棩锛�2026-09-02锛�22 鎶ヨ〃鎺ュ彛鍥炲綊銆�
+
+## 璐ц繍锛堟牳蹇冩ā鍧楋紝浠婃棩鍥炲綊锛�
+
+| 鍔熻兘 | 楠岃瘉鐘舵�� | 璇佹嵁 / 澶囨敞 |
+|---|---|---|
+| 璐ц繍閲�/鍛ㄨ浆閲忔湀鎶ュ鍏ワ紙2026-07锛� | 鉁� | 18 琛� 0 澶辫触锛涘煄甯傚悎璁�=婀栧寳鐪� 16285.7105 涓� / 2181925.708 涓囧惃鍏噷锛涙姹� 4940.97/667561.37 |
+| 瑙勪笂瑙勪笅鎷嗗垎锛�2026-07锛� | 鉁� | MONTH/CUM 鍚� 18 琛岋紝鍚堣涓� workbook 涓�鑷达紙姝︽眽 MONTH 204809.56/462751.81/667561.37锛� |
+| H2032 浼佷笟鏈堟姤鏁版嵁 | 鉁� | 2026-01~08 鍚� 636 鎴锋棤閲嶅锛�2025 鍩烘湡 12 涓湀鍚� 664 鎴凤紙鍘诲勾姝e父锛� |
+| 鍒嗗競宸炴槑缁� cityDetail 瀵煎嚭 | 鉁� | 姝︽眽 7 鏈� 4940.97銆佺疮璁� 34306.78锛涙棤閿欒鏍� |
+| 鎺掑悕琛� freightRank / turnoverRank | 鉁� | 涓� scale_split 閫愪綅涓�鑷达紙绱 4357157.34/10864961.11/15222118.45锛� |
+| 璐ц繍绯诲垪 freightSeries锛坺ip锛� | 鉁� | 鍐呭眰 0 閿欒鏍� |
+| 杩愭斂杞﹁締 / 杞ㄨ抗閲岀▼瀵煎叆锛�2026-08锛� | 鉁� | 635 / 628 鏉★紝涔卞簭鍒� + 缂哄垪鎶ラ敊璐熶緥閫氳繃锛�8/31 浣撴鎶ュ憡锛� |
+
+## 鍩庡競瀹㈣繍
+
+| 鍔熻兘 | 楠岃瘉鐘舵�� | 璇佹嵁 / 澶囨敞 |
+|---|---|---|
+| 鍏氦 U203 瀵煎叆 | 鉁� | 2026-04 142 鏉� 0 澶辫触 + 閿欎綅鍒楄鎷掞紙浣撴鎶ュ憡锛� |
+| 宸℃父鍑虹 U402 瀵煎叆 | 鉁� | 2026-04 17 鏉� 0 澶辫触 + 閿欎綅鍒楄鎷� |
+| 鍑虹杩愭斂杞﹁締瀵煎叆锛�2026-07锛� | 鉁� | 42636 鏉� 0 澶辫触銆�17 甯傚窞锛屼笌 2026-08 涓�鑷达紙浠婃棩锛� |
+| 鍏氦 / 鍑虹鍒嗗競宸炴槑缁嗗鍑� | 鉁� | 琛ㄥご 2026 骞� 1-7 鏈堟甯搞��0 閿欒鏍硷紙浠婃棩锛� |
+| 杞ㄩ亾 / 杞浮鍒嗗競宸炴槑缁嗗鍑� | 鉁� | 0 閿欒鏍硷紱鍏ㄧ渷姹傚拰=姝︽眽+榛勭煶锛堟娊鏌ヤ竴鑷达級锛堜粖鏃ワ級 |
+| 杞ㄩ亾 / 杞浮鏈堝害鏁版嵁婧� | 鈿狅笍 | 搴撳唴 2026 骞翠粎 6銆�7 鏈堟湁鍊� 鈫� 鎶ヨ〃 1-5 鏈堜负绌猴紱琛ユ湀婧愭枃浠跺悗鍗冲畬鏁� |
+| 鍩庡競瀹㈣繍姹囨�� / 鍚勫競宸炵疮璁� / 鍩庡競绯诲垪 | 鉁� | 绱鍗犳瘮 #DIV/0! 宸叉竻锛堜粖鏃ワ級锛涚綉绾﹁溅鏃犳簮鐣欑┖ |
+
+## 鍏矾鏃呭
+
+| 鍔熻兘 | 楠岃瘉鐘舵�� | 璇佹嵁 / 澶囨敞 |
+|---|---|---|
+| H2031 鏈堟姤瀵煎叆 | 鉁� | 2026-07 琛ュ 46 鏉� |
+| 涓綋瀹㈣繍閲忥紙鏂板競宸炴眹鎬绘ā鏉匡紝2026-07锛� | 鉁� | 7 鏉� 0 澶辫触锛涘叏鐪佸悎璁� 189998 浜� / 4584040.2 浜哄叕閲� = 婧愯〃锛堜粖鏃ワ級 |
+| 涓綋瀹㈣繍閲忥紙鏃р�滀紒涓氬悕绉扳�濇ā鏉匡級 | 鉁� | 鍙屾ā鏉垮苟瀛橈紝鏃фā鏉垮吋瀹逛繚鐣� |
+| 鍏矾鏃呭杩愭斂杞﹁締鏁板鍏� | 鉁� | 2026-06 767 鏉� |
+| 鍒嗗競宸� / 涓彛寰勬槑缁� / 鎺掑悕 / 鍒嗘瀽瀵煎嚭 | 鉁� | 鏄庣粏鍘诲勾鍚屾湡椤� #REF! 宸叉竻锛堜粖鏃ワ級锛�0 閿欒鏍� |
+| 鍏矾鏃呭绯诲垪 passengerSeries锛坺ip锛� | 鉁� | 鍐呭眰 0 閿欒鏍硷紙浠婃棩锛� |
+| 涓彛寰勬湀搴︽暟鎹鐩� | 鈿狅笍 | 涓庢簮鏂囦欢鏈堜唤瀵归綈鎯呭喌鏈�愭湀鏍革紝瀵煎嚭鏃犻敊浣嗗缓璁ˉ鏁版嵁鍚庡鐪� |
+
+## 鑳借��
+
+| 鍔熻兘 | 楠岃瘉鐘舵�� | 璇佹嵁 / 澶囨敞 |
+|---|---|---|
+| H204 瀛f姤瀵煎叆 | 鉁� | 7/8/9 鏈堝悇 1284 鏉� 0 澶辫触锛堜綋妫�鎶ュ憡锛� |
+| 鑳借�楁眹鎬诲鍑� energySummary | 鉁� | 鏃犲幓骞存暟鎹殑 #DIV/0! 宸叉竻锛堜粖鏃ワ級 |
+
+## 鎶曡祫
+
+| 鍔熻兘 | 楠岃瘉鐘舵�� | 璇佹嵁 / 澶囨敞 |
+|---|---|---|
+| 瀹㈣繍绔欏満 / 鐗╂祦鍥尯瀵煎叆 | 鉁� | 6/7 鏈堢湡瀹炴枃浠讹紙瀹㈣繍 46 + 鐗╂祦 133 / 鍩哄噯 148锛� |
+| 鎶曡祫鎶ヨ〃 investPlan/Billion/County/FiveYear | 馃煛 | HTTP 200銆丒xcel 鍙墦寮�锛汬SSF 鑰佹牸寮忥紙.xls 浜岃繘鍒讹級锛屾湭鍋氶�愭牸鍏紡鎵弿 |
+| 鎶曡祫绯诲垪 investSeries锛坺ip锛� | 鉁� | 鍐呭眰 0 閿欒鏍� |
+
+## 鏁版嵁璐ㄩ噺 / 姹℃煋娓呯悊锛�2026-09-02锛�
+
+| 浜嬮」 | 楠岃瘉鐘舵�� | 璇存槑 |
+|---|---|---|
+| 鎶ヨ〃 #REF! / #DIV/0! 姹℃煋 | 鉁� 宸叉竻 | 鍏氦/鍑虹/杞ㄩ亾杞浮/鍩庡競绱/鑳借��/涓彛寰勬槑缁嗗叏閮� 0 娈嬬暀 |
+| 璐ц繍 2026-07 绌烘礊涓庤礋鍊� | 鉁� 宸蹭慨 | 榛勭煶绛� NULL 琛ラ綈锛涙湀瀛e樊 -323.97 璐熷�兼秷闄� |
+| H2032 2026-07 閲嶅锛�98 鎴�/734 琛岋級 | 鉁� 宸叉秷 | 鐜� 636 鎴� 0 閲嶅 |
+| 绌烘壒娆� #177-179 / #186 | 鈩癸笍 | 0 琛屾棤瀹筹紝淇濈暀瀹¤鍘嗗彶 |
+
+## 绯荤粺 / 鍏朵粬
+
+| 鍔熻兘 | 楠岃瘉鐘舵�� | 璇存槑 |
+|---|---|---|
+| 瀵煎叆鎺ュ彛 + 鎵规钀藉簱 | 鉁� | 浠婃棩涓夋壒锛�#187/#188 绛夛級鍧囪惤搴撳彲鏌� |
+| 瀵煎叆杩涘害 UI 鏄剧ず锛�4.2 涓囪澶ф枃浠讹級 | 馃煛 | 鐢ㄦ埛鍙嶉鈥滄棤鏄剧ず鈥濓紝鏈璧版帴鍙e鍏ユ垚鍔燂紱椤甸潰澶嶇幇鎺掓煡寰呭仛 |
+| 鐧诲綍 / 椤甸潰 / 瀹℃牳锛圓uditEngine锛� | 馃煛 | 涓嶅湪鏈鑼冨洿锛屾湭鍥炲綊 |
+
+## 寰呭姙锛堝缓璁笅涓�姝ワ級
+
+1. 琛ラ綈鍩庡競瀹㈣繍锛堝叕浜�/鍑虹鏈堝害銆佽建閬�/杞浮锛夌己鏈堟簮鏂囦欢骞堕噸鏂板鍏� 鈫� 鎶ヨ〃鏈堜唤鍒楀叏銆�
+2. /import 椤甸潰澶ф枃浠惰繘搴︽潯澶嶇幇鎺掓煡锛堢敤鎴峰彲瑙侀棶棰橈級銆�
+3. 濡傞渶鈥滄姇璧勫洓琛� .xls 鑰佹牸寮忊�濋�愭牸鎵弿锛岄渶瑕� xls 瑙f瀽/杞崲宸ュ叿锛圠ibreOffice 绛夛級銆�
+4. 鏈湴浠g爜鏀瑰姩鏈彁浜わ紙ReportExportService/DataImportService/RegionUtil + 2 浠芥姤鍛婃枃妗o級锛岀‘璁ゅ悗 commit銆�
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"
new file mode 100644
index 0000000..de22431
--- /dev/null
+++ "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"
@@ -0,0 +1,51 @@
+# 寰呬笟鍔$敤鎴风‘璁ゆ竻鍗曪紙鎺掔増/鍙e緞锛�2026-09-02锛�
+
+> 鐢ㄩ�旓細鎵撳嵃鎴栧鐓э紝褰撻潰閫愭潯纭銆傗槄=鎺掔増绫伙紙涓氬姟浣跨敤鑰呭彲鐩存帴鎷嶆澘锛夛紱鈼�=鍙e緞/鏁版嵁绫伙紙闇�涓氬姟/缁熻瑙勫垯纭锛夛紱鈻�=鍔熻兘鑼冨洿銆�
+> 鐘舵�佸垪鐣欑┖寰呭~锛氣枴寰呯‘璁� / 鉁斿凡纭 / 鉁樹笉閲囩撼 / 鈼嬫敼鏈�
+
+## 涓�銆佸叕璺梾瀹紙鍚釜浣撳杩愶級鈽呴噸鐐�
+
+| # | 绫诲埆 | 鐜拌薄锛堢幇鐘惰瘉鎹級 | 闇�瑕佺‘璁ょ殑闂 | 寤鸿榛樿 |
+|---|---|---|---|---|
+| 1 | 鈽呮帓鐗� | 涓綋瀹㈣繍 2026-07 瀵煎叆 7 琛岋紝浣嗗彧瑕嗙洊 6 涓競宸烇紱瀛濇劅鍑虹幇 2 琛岋紙鍚堣绾� 21802/436433锛夛紝鍏朵綑甯傚窞鍚� 1 琛� | 妯℃澘绌剁珶鈥滀竴琛屼竴甯傚窞鈥濊繕鏄厑璁镐竴甯傚窞澶氳锛熷瓭鎰熶袱琛屾槸浠�涔堝彛寰勶紙鍩庡尯/鍘挎媶鍒� or 閲嶅锛夛紵鎶ヨ〃鏄惁瑕佲�滃叏鐪佸悎璁♀�濊锛� | 涓庛�婃ā鏉縚婀栧寳鐪佸叕璺梾瀹㈣繍杈撲釜浣撴埛鏈堝害鐢熶骇鎯呭喌锛�2026.7锛夈�嬪畬鍏ㄤ竴鑷撮�愯灞曠ず锛涜纭瀛濇劅涓よ褰掑睘 |
+| 2 | 鈽呮帓鐗�/鈼忓彛寰� | 涓綋瀹㈣繍鍙湁鈥滃競宸炴眹鎬昏〃鈥濇暟鎹紝绯荤粺鐩墠娌℃湁鍗曠嫭鐨勨�滀釜浣撳杩愬垎甯傚窞鎶ヨ〃鈥濓紱鍏矾鏃呭瀵煎嚭鐨勫垎甯傚窞/涓彛寰勬姤琛ㄥ彧鍚涓婁紒涓� | 涓綋瀹㈣繍鏄惁瑕佸苟鍏モ�滃叕璺梾瀹㈡�婚噺鈥濇姤琛紙瑙勪笂+涓綋鍚堣锛夛紵鑻ヨ锛岀増寮忔�庝箞鎺掞紙瑙勪笂鍧�+涓綋鍧�+鍚堣琛岋級锛涜嫢涓嶈锛屼釜浣撳杩愭暟鎹粎渚涘彴璐�/瀹℃牳锛� | 鍑轰竴浠解�滃叏鐪佹�婚噺=瑙勪笂+涓綋鈥濈殑鏍稿椤垫垨鎶ヨ〃锛屽厛闂笟鍔℃槸鍚︽湰鏈熼渶瑕� |
+| 3 | 鈼忓彛寰� | 浣犳彁鍒扳�滀釜浣撳杩愭暟鎹槸鏍规嵁鍩庡競瀹㈣繍鏁版嵁璁$畻寰楁潵鐨勨�� | 纭鎺ㄥ鍙e緞锛氫釜浣撳杩愰噺/鍛ㄨ浆閲� = 鍩庡競瀹㈣繍鍝釜鎸囨爣锛堝嚭绉燂紵鎬婚噺-鍏氦-杞ㄩ亾-杞浮锛熺郴鏁帮紵锛夛紝渚夸簬绯荤粺鍋氬嬀绋芥牎楠岋紙濡傛姇璧勯偅鏍峰鍏ュ悗寮圭獥鏍稿锛� | 鎻愪緵璁$畻寮忥紱绯荤粺鍔犫�滀釜浣� vs 鍩庡競瀹㈣繍鈥濅竴鑷存�ф牎楠� |
+| 4 | 鈼忔暟鎹� | 搴撳唴 H2031 鍏矾鏃呭浼佷笟鏈堟姤鍙湁 2026-03(778)銆�2026-07(771) | 1/2/4/5/6/8 鏈堟槸鍚﹀凡鏈変笂鎶ユ枃浠堕渶瑕佽ˉ瀵硷紵2025 鍩烘湡鏄惁鎻愪緵锛堝喅瀹氬悓姣斿垪锛夛紵 | 缂烘湀鏂囦欢琛ラ綈鍚庡啀鍑哄畬鏁� 1-N 鏈堟姤琛� |
+
+## 浜屻�佸煄甯傚杩愶紙鎺掔増閲嶇偣锛�
+
+| # | 绫诲埆 | 鐜拌薄 | 闇�瑕佺‘璁ょ殑闂 | 寤鸿榛樿 |
+|---|---|---|---|---|
+| 5 | 鈽呮帓鐗�/鈼忓彛寰� | 8/11銆婂煄甯傚杩愭暟鎹紭鍖栥�嬪啓鏄庘�滅綉绾﹁溅鎷嗗垎=閮ㄧ骇涓嬪彂鎬婚噺鎸夊贰娓稿嚭绉熸瘮渚嬫媶鍒板悇甯傚窞锛孍xcel 閲屾湁鎷嗗垎鍏紡鈥濓紱鑰岀郴缁熷鍑虹殑鍚勫競宸炵疮璁�/鏄庣粏琛ㄦ妸缃戠害杞﹀垪娓呯┖ | 鎶ヨ〃缃戠害杞﹀垪鏈湡瑕佷笉瑕佹寜鎷嗗垎鍏紡濉�硷紵鎷嗗垎鎵�闇�鐨勨�滈儴绾ф�婚噺/璁㈠崟鎬绘暟鈥濈敱璋佹彁渚涳紙鎵嬪伐琛� or 鎺ュ彛锛夛紵 | 鍏堢暀绌哄苟鏍囨敞鈥滄棤鏁版嵁婧愨�濓紱鑻ユ湰鏈熻锛岃鎻愪緵鎷嗗垎琛ㄦ牱鏈� |
+| 6 | 鈽呮帓鐗� | 鍏氦/鍑虹/杞ㄩ亾杞浮妯℃澘鐨勨��2025 骞� 1-12 鏈堚�濆垪涓庡悓姣斿垪鍥犳棤鍘诲勾鍩烘湡鏁版嵁 + 妯℃澘鍏紡 #REF!锛屽鍑鸿娓呯┖ | 鏈湡浜や粯鏄惁闇�瑕佸幓骞村垪涓庡悓姣旓紵闇�瑕佲啋璇锋彁渚� 2025 鍚屾湡鏁版嵁鎴栧幓骞存婧愯〃锛涗笉闇�瑕佲啋妯℃澘鍒犻櫎璇ュ垪锛岀増闈㈡洿骞插噣 | 鍏堟寜鈥滀笉闇�瑕併�佺暀绌衡�濅氦浠橈紝妯℃澘鐢卞彟涓�浼氳瘽鎸夋瑁佸壀 |
+| 7 | 鈼忔暟鎹� | 鍩庡競鍏氦/鍑虹鏈堝害鍙湁 2026-06銆�07锛涜建閬�/杞浮鏁版嵁浠� 6銆�7 鏈� | 1-5 鏈堛��8 鏈堚�︽簮鏂囦欢鍙惁琛ラ綈锛堝喅瀹氭姤琛ㄦ湀浠藉垪瀹屾暣搴︼級锛熻嫢鍙氦 7 鏈堬紝鎶ヨ〃鍙睍绀� 6-7 鏈堝垪鍙帴鍙楋紵 | 琛ラ綈鑳芥嬁鍒扮殑鏈堜唤锛涘叾浣欏垪鐣欑┖ |
+| 8 | 鈽呮帓鐗� | 杞ㄩ亾鍧楁ā鏉垮彧鎺掍簡 鍏ㄧ渷/姝︽眽/榛勭煶锛堥粍鐭� 6 鏈� 34.86銆�7 鏈� 30.09 鏈夊�硷級锛涜疆娓″潡鍙帓 鍏ㄧ渷/姝︽眽 | 鑻ユ湁鍏跺畠甯傚窞杞ㄩ亾/杞浮鏁版嵁锛屾ā鏉胯鏄惁瑕侀鐣�/鑷姩鎵╁睍锛熷綋鍓嶇増寮忔槸鍚︾鍚堜笂鎶ユ牸寮忥紵 | 涓庡畼鏂规牱寮犱竴鑷村嵆鍙紱璇峰綋鍦烘牳瀵规牱寮� |
+| 9 | 鈻查仐鐣� | docs/鍩庡競瀹㈣繍 涓嬫湁 8/14 绌烘枃浠垛�滃杩愰噺鐨勫悓姣旂幆姣旀槸0% 闇�鏍稿疄锛堜富瑕佸嚭鐜板湪鍏氦锛�.txt鈥� | 璇ユ牳瀹為」鏄惁宸插叧闂紵鍏氦鍚屾瘮/鐜瘮 0% 鏄惁浠嶅瓨鍦紙涓庣 6 鏉″幓骞存暟鎹己澶卞悓婧愶級锛� | 宸插叧闂垯鍒犲崰浣嶆枃浠讹紱鏈叧闂垯鍒楀叆瀹℃牳瑙勫垯楠岃瘉 |
+
+## 涓夈�佽揣杩愶紙鎺掔増閲嶇偣锛�
+
+| # | 绫诲埆 | 鐜拌薄 | 闇�瑕佺‘璁ょ殑闂 | 寤鸿榛樿 |
+|---|---|---|---|---|
+| 10 | 鈽呮帓鐗�/鈼忓彛寰� | `鐢熸垚_璐ц繍閲忔帓鍚�/鍛ㄨ浆閲忔帓鍚峘 鍒嗕袱椤碉細绗竴椤碘��1-7鏈堢疮璁♀�︹�濓紱绗簩椤垫爣棰樺凡鍘烩�滅疮璁♀�� | 鉁� 宸茬‘璁わ細绗簩椤靛~褰撴湀鍊硷紱9/2 16:40 宸插疄鐜板苟鍥炲綊锛堢浜岄〉褰撴湀鏁颁笌搴撲竴鑷达紝鍒楀ご瀵煎嚭鏃惰嚜鍔ㄦ敼鈥滃綋鏈堝畬鎴愨�濓級銆傛ā鏉挎簮鏂囦欢濡傞渶涓�骞惰惤鐩樺彲鍦� Excel 鍙﹀瓨 | 瀹屾垚 |
+| 11 | 鈽呮帓鐗� | `璐ц繍閲忓垎甯傚窞鏄庣粏`锛氬叏鐪� 6 鎸囨爣锛堟�婚噺/鍛ㄨ浆閲�/瑙勪笂/瑙勪笅鈥︼級+ 17 甯傚窞脳6 鎸囨爣锛�1-N 鏈�+绱 | 鎸囨爣椤哄簭銆佸崟浣嶏紙涓囧惃/涓囧惃鍏噷锛夈�佽闂磋窛鏄惁绗﹀悎涓婃姤鏍煎紡锛� | 瀵圭収瀹樻柟鏍峰紶纭 |
+| 12 | 鈽呮帓鐗� | 涓彛寰勬槑缁�/鎺掑悕/鍒嗘瀽妯℃澘姝h鍙︿竴浼氳瘽淇敼锛堝惈 Sheet2 鍘诲勾鏄庣粏椤� #REF! 琚竻绌猴級 | 涓彛寰勬姤琛ㄩ噷鐨勨�滃幓骞村悓鏈熼〉鈥濇湰鏈熸槸鍚﹂渶瑕佷繚鐣�/濉厖锛熷幓骞存暟鎹潵婧愶紵 | 鍏堢敱妯℃澘浼氳瘽鎸夆�滀笉闇�瑕佲�濆鐞嗭紝浜や粯鍓嶅啀鐩 |
+
+## 鍥涖�佽兘鑰� / 鎶曡祫
+
+| # | 绫诲埆 | 鐜拌薄 | 闇�瑕佺‘璁ょ殑闂 | 寤鸿榛樿 |
+|---|---|---|---|---|
+| 13 | 鈽呮帓鐗� | 鑳借�楁眹鎬昏〃鏃犲幓骞存暟鎹殑鍚屾瘮/鍗犳瘮鍏紡姹傚�煎け璐ュ悗琚竻绌猴紙濡� D4/J4/L4/M4锛� | 鐣欑┖鏄惁鍙帴鍙楋紵杩樻槸瑕佹樉绀衡�溾�斺�濇垨鈥滄殏鏃犳暟鎹�濆崰浣嶏紵 | 鐣欑┖锛堜笌缂哄幓骞村垪鐨勫叾瀹冩姤琛ㄤ竴鑷达級 |
+| 14 | 鈽呮帓鐗�/鈻� | 鎶曡祫鍥涘紶鎶ヨ〃瀵煎嚭涓鸿�佹牸寮� .xls锛圗xcel 鍙墦寮�锛夛紝鏈仛閫愭牸閿欒鎵弿 | 鏄惁鏈湡蹇呴』浜や粯 .xlsx锛熸帓鐗堟槸鍚︿繚鎸佹ā鏉垮師鏍峰嵆鍙紵 | 淇濇寔鐜扮姸锛屾ā鏉夸細璇濊嫢涓�骞跺鐞嗗垯浠ュ畠鐨勭増鏈负鍑� |
+
+## 浜斻�佸姛鑳借寖鍥� / 浣撻獙
+
+| # | 绫诲埆 | 鐜拌薄 | 闇�瑕佺‘璁ょ殑闂 | 寤鸿榛樿 |
+|---|---|---|---|---|
+| 15 | 鈻� | 瀵煎叆椤碘�滃勾鎶モ�濆垎缁勬湁 11 涓被鍨嬪叆鍙o紝鍚庣鏃犲疄鐜� | 骞存姤瀵煎叆浠婂勾鏄惁瑕佸仛锛� | 涓嶅仛灏遍殣钘�/绂佺敤鍏ュ彛锛岄伩鍏嶈鐐规姤閿� |
+| 16 | 鈻蹭綋楠� | 4.2 涓囪澶ф枃浠跺鍏� 20-40 绉掞紝椤甸潰鍙湁鈥滀笂浼犱腑鈥濇棤鐧惧垎姣旓紱渚ф爮鈥滄湰鏈堝鍏ヨ繘搴︹�濆彲鑳借绌烘壒娆℃樉绀烘垚鈥滄棤鏁版嵁鈥� | 鏈熸湜瀵煎叆涓樉绀衡�滃凡澶勭悊 N/M 琛屸�濆疄鏃惰繘搴︼紝杩樻槸瀹屾垚鍚庡脊绐楁眹鎬诲嵆鍙紵 | 瀹屾垚鍚庡脊绐�+渚ф爮鐘舵�侊紙褰撳墠锛夛紱濡傞渶瀹炴椂杩涘害鍐嶆帓鏈� |
+
+## 澶囨敞
+- 鏈鍙仛鈥滈棶棰樼‘璁も�濓紝浠g爜淇锛堟暟鍊奸潤榛� 0/澶辫触琛屽彿/鎵规鍥炲~/瀹℃牳璇垹绛夛級宸叉寜浣犺姹傚喕缁擄紝绛夊彟涓�浼氳瘽妯℃澘鏀瑰畬鍚庡啀鍋氥��
+- 妯℃澘鏂囦欢姝h鍙︿竴浼氳瘽淇敼锛屼互涓� 鈽呮帓鐗� 椤逛腑娑夊強妯℃澘鏍峰紡鐨勶紙6/8/10/12/14锛夊缓璁互鈥滃彟涓�浼氳瘽瀹氱鍚庣殑鐗堟湰鈥濆啀褰撻潰鏍稿涓�娆★紝閬垮厤閲嶅鏀逛袱閬嶃��
+
+
diff --git "a/docs/\350\203\275\350\200\227/\347\224\237\346\210\220_\350\203\275\350\277\220\346\261\207\346\200\273\350\241\250.xlsx" "b/docs/\350\203\275\350\200\227/\347\224\237\346\210\220_\350\203\275\350\277\220\346\261\207\346\200\273\350\241\250.xlsx"
index 437b561..ecd1b28 100644
--- "a/docs/\350\203\275\350\200\227/\347\224\237\346\210\220_\350\203\275\350\277\220\346\261\207\346\200\273\350\241\250.xlsx"
+++ "b/docs/\350\203\275\350\200\227/\347\224\237\346\210\220_\350\203\275\350\277\220\346\261\207\346\200\273\350\241\250.xlsx"
Binary files differ
diff --git "a/docs/\350\203\275\350\200\227/\350\203\275\350\200\227\347\256\200\345\214\226\357\274\2102026\345\271\264\357\274\211.xlsx" "b/docs/\350\203\275\350\200\227/\350\203\275\350\200\227\347\256\200\345\214\226\357\274\2102026\345\271\264\357\274\211.xlsx"
index d67247f..ac90f31 100644
--- "a/docs/\350\203\275\350\200\227/\350\203\275\350\200\227\347\256\200\345\214\226\357\274\2102026\345\271\264\357\274\211.xlsx"
+++ "b/docs/\350\203\275\350\200\227/\350\203\275\350\200\227\347\256\200\345\214\226\357\274\2102026\345\271\264\357\274\211.xlsx"
Binary files differ
diff --git "a/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\247\204\344\270\212\350\247\204\344\270\213\346\213\206\345\210\206\350\277\220\350\276\223\351\207\217.xlsx" "b/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\247\204\344\270\212\350\247\204\344\270\213\346\213\206\345\210\206\350\277\220\350\276\223\351\207\217.xlsx"
index 9f96679..53fdd8c 100644
--- "a/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\247\204\344\270\212\350\247\204\344\270\213\346\213\206\345\210\206\350\277\220\350\276\223\351\207\217.xlsx"
+++ "b/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\247\204\344\270\212\350\247\204\344\270\213\346\213\206\345\210\206\350\277\220\350\276\223\351\207\217.xlsx"
Binary files differ
diff --git "a/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\217.xlsx" "b/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\217.xlsx"
index 45c8cfa..64af982 100644
--- "a/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\217.xlsx"
+++ "b/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\217.xlsx"
Binary files differ
diff --git "a/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\275\250\350\277\271\351\207\214\347\250\213.xlsx" "b/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\275\250\350\277\271\351\207\214\347\250\213.xlsx"
index 5537734..d9962aa 100644
--- "a/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\275\250\350\277\271\351\207\214\347\250\213.xlsx"
+++ "b/docs/\350\264\247\350\277\220/\346\250\241\346\235\277_\350\275\250\350\277\271\351\207\214\347\250\213.xlsx"
Binary files differ
diff --git "a/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\345\221\250\350\275\254\351\207\217\346\216\222\345\220\215.xlsx" "b/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\345\221\250\350\275\254\351\207\217\346\216\222\345\220\215.xlsx"
index b048f4e..0abfdef 100644
--- "a/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\345\221\250\350\275\254\351\207\217\346\216\222\345\220\215.xlsx"
+++ "b/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\345\221\250\350\275\254\351\207\217\346\216\222\345\220\215.xlsx"
Binary files differ
diff --git "a/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\350\264\247\350\277\220\351\207\217\346\216\222\345\220\215.xlsx" "b/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\350\264\247\350\277\220\351\207\217\346\216\222\345\220\215.xlsx"
index 7195313..a72b2d8 100644
--- "a/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\350\264\247\350\277\220\351\207\217\346\216\222\345\220\215.xlsx"
+++ "b/docs/\350\264\247\350\277\220/\347\224\237\346\210\220_\350\264\247\350\277\220\351\207\217\346\216\222\345\220\215.xlsx"
Binary files differ
diff --git "a/docs/\350\264\247\350\277\220/\350\264\247\350\277\220\347\256\200\345\214\226\345\267\245\344\275\234.xlsx" "b/docs/\350\264\247\350\277\220/\350\264\247\350\277\220\347\256\200\345\214\226\345\267\245\344\275\234.xlsx"
index a24e4e9..911bce8 100644
--- "a/docs/\350\264\247\350\277\220/\350\264\247\350\277\220\347\256\200\345\214\226\345\267\245\344\275\234.xlsx"
+++ "b/docs/\350\264\247\350\277\220/\350\264\247\350\277\220\347\256\200\345\214\226\345\267\245\344\275\234.xlsx"
Binary files differ
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java b/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
index 29bffc1..8d16e0c 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
@@ -631,6 +631,8 @@
.eq(InvestmentSystem::getReportPeriod, reportPeriod))) {
sysMap.computeIfAbsent(normInvestName(s.getProjectName()), k -> new ArrayList<>()).add(s);
}
+ // 鍚屾姤琛ㄦ湡鎶曡祫绯荤粺鍩哄噯鏁存湡缂哄け鏃讹紝涓嶅仛"椤圭洰缂哄け鏍稿疄"锛堢己澶�=鍩哄噯鏈鍏ワ紝涓嶇瓑浜庨」鐩笉瀛樺湪锛夛紝閬垮厤鏁磋〃璇姤
+ boolean benchmarkMissing = sysMap.isEmpty();
// 骞傜瓑锛氬彧娓呴櫎 INVEST 瑙勫垯鐨勬棫瀹℃牳缁撴灉
List<Long> ruleIds = new ArrayList<>();
@@ -647,6 +649,7 @@
String projectName = project == null ? "鏈煡椤圭洰" : project.getProjectName();
InvestmentSystem sys = findInvestSystem(sysMap, projectName);
for (AuditRule rule : rules) {
+ if (benchmarkMissing && "EXISTENCE_SYS".equals(rule.getCompareType())) continue;
AuditResult result = checkInvestRule(rule, monthly, projectName, sys);
if (result != null) {
result.setRuleName(rule.getRuleName());
@@ -1538,6 +1541,7 @@
case "RULE_I001":
case "RULE_I002":
case "RULE_I003":
+ case "RULE_I004":
return investSystemMapper.selectCount(new LambdaQueryWrapper<InvestmentSystem>()
.eq(InvestmentSystem::getReportPeriod, period)) == 0;
default:
@@ -2021,4 +2025,4 @@
result.setStatus("PENDING");
return result;
}
-}
\ No newline at end of file
+}
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/common/util/RegionUtil.java b/traffic-audit-server/src/main/java/com/trafficaudit/common/util/RegionUtil.java
index a804f77..f02c9f1 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/common/util/RegionUtil.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/common/util/RegionUtil.java
@@ -42,6 +42,18 @@
CODE_PREFIX_MAP.put("429006", "澶╅棬甯�");
CODE_PREFIX_MAP.put("429021", "绁炲啘鏋舵灄鍖�");
+ ALIAS_MAP.put("姝︽眽", "姝︽眽甯�");
+ ALIAS_MAP.put("榛勭煶", "榛勭煶甯�");
+ ALIAS_MAP.put("鍗佸牥", "鍗佸牥甯�");
+ ALIAS_MAP.put("瀹滄槍", "瀹滄槍甯�");
+ ALIAS_MAP.put("瑗勯槼", "瑗勯槼甯�");
+ ALIAS_MAP.put("閯傚窞", "閯傚窞甯�");
+ ALIAS_MAP.put("鑽嗛棬", "鑽嗛棬甯�");
+ ALIAS_MAP.put("瀛濇劅", "瀛濇劅甯�");
+ ALIAS_MAP.put("鑽嗗窞", "鑽嗗窞甯�");
+ ALIAS_MAP.put("榛勫唸", "榛勫唸甯�");
+ ALIAS_MAP.put("鍜稿畞", "鍜稿畞甯�");
+ ALIAS_MAP.put("闅忓窞", "闅忓窞甯�");
ALIAS_MAP.put("鎭╂柦", "鎭╂柦宸�");
ALIAS_MAP.put("鎭╂柦甯�", "鎭╂柦宸�");
ALIAS_MAP.put("鎭╂柦鍦熷鏃忚嫍鏃忚嚜娌诲窞", "鎭╂柦宸�");
@@ -103,6 +115,20 @@
return CITY_LIST;
}
+ /** 瑙勮寖甯傚窞鍚� -> 6 浣嶈鏀垮尯鍒掍唬鐮侊紙鏃犲尮閰嶆垨婀栧寳鐪佽繑鍥� null锛� */
+ public static String codeOfCity(String normalizedName) {
+ if (normalizedName == null) return null;
+ String name = normalizeCityName(normalizedName);
+ if (name == null || "婀栧寳鐪�".equals(name)) return null;
+ for (Map.Entry<String, String> e : CODE_PREFIX_MAP.entrySet()) {
+ if (e.getValue().equals(name)) {
+ String code = e.getKey();
+ return code.length() < 6 ? code + "00" : code;
+ }
+ }
+ return null;
+ }
+
/** 鐢熸垚绌哄競宸炵粺璁ap */
public static Map<String, BigDecimalStat> emptyStatMap() {
Map<String, BigDecimalStat> map = new LinkedHashMap<>();
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
index 41b922c..50b64f8 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -407,41 +407,20 @@
- /** 鍏矾鏃呭涓綋瀹㈣繍閲�/鍛ㄨ浆閲忥紙浼佷笟绾夸笅姹囨姤鏁版嵁锛屾寜鎵�灞炲湴鍖哄鍏ワ紝渚涘垎甯傚窞琛ㄤ釜浣撹濉厖锛� */
+ /** 鍏矾鏃呭涓綋瀹㈣繍閲�/鍛ㄨ浆閲忥紙瀵煎叆鍚庢寜甯傚窞姹囨�诲~鍏呭垎甯傚窞琛ㄤ釜浣撹锛夛紝鏀寔涓ょ妯℃澘锛�
+ * 鈶� 浼佷笟绾夸笅姹囨姤鏄庣粏锛堣〃澶村惈銆屼紒涓氬悕绉般�嶏級锛氶�愪紒涓氬叆搴擄紱
+ * 鈶� 鐪佸巺甯傚窞姹囨�昏〃銆婃箹鍖楃渷鍏矾鏃呭杩愯緭涓綋鎴锋湀搴︾敓浜ф儏鍐碉紙YYYY.M锛夈�嬶細
+ * sheet 鍐呬负銆屽叏鐪丯鏈堜釜浣撳杩愰噺姹囨�昏〃銆嶆爣棰樺潡 + 銆屽競宸�/涓綋杞﹁締鏁�/鈥�/涓綋瀹㈣繍閲�/涓綋鏃呭鍛ㄨ浆閲忋�嶈〃澶达紝
+ * 鎸夊競宸為�愯鍏ュ簱锛堝悓涓�甯傚窞澶氳濡� 鍘垮唴鐝嚎+璺ㄥ幙鐝嚎 鍧囧叆搴擄紝鎶ヨ〃渚ф寜甯傚窞鑷姩姹囨�伙級銆� */
public ImportResult importPassengerIndividual(MultipartFile file, String period) throws Exception {
List<PassengerIndividualMonthly> rows = new ArrayList<>();
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
Map<String, Integer> colMap = buildHeaderMap(sheet.getRow(0));
- Integer codeCol = colMap.get("鎵�灞炲湴鍖�");
- Integer entCol = colMap.get("浼佷笟浠g爜");
- Integer nameCol = colMap.get("浼佷笟鍚嶇О");
- Integer passCol = null;
- Integer turnCol = null;
- for (Map.Entry<String, Integer> e : colMap.entrySet()) {
- String k = e.getKey();
- if (k != null && k.contains("涓綋") && k.contains("瀹㈣繍閲�")) passCol = e.getValue();
- if (k != null && k.contains("涓綋") && (k.contains("鍛ㄨ浆閲�") || k.contains("鍛ㄨ浆"))) turnCol = e.getValue();
- }
- if (passCol == null && turnCol == null) {
- throw new RuntimeException("鏈壘鍒般�屼釜浣撳杩愰噺/涓綋鏃呭鍛ㄨ浆閲忋�嶅垪锛岃妫�鏌ユā鏉匡紙鍒楀悕闇�鍖呭惈鈥滀釜浣撳杩愰噺鈥濃�滀釜浣撳懆杞噺鈥濓級");
- }
- for (int r = 1; r <= sheet.getLastRowNum(); r++) {
- Row row = sheet.getRow(r);
- if (row == null) continue;
- String name = nameCol != null ? getString(row, nameCol) : null;
- if (name == null || name.trim().isEmpty()) continue;
- Double pass = passCol != null ? getDecimalOrNull(row, passCol) : null;
- Double turn = turnCol != null ? getDecimalOrNull(row, turnCol) : null;
- if ((pass == null || pass == 0.0) && (turn == null || turn == 0.0)) continue;
- PassengerIndividualMonthly entity = new PassengerIndividualMonthly();
- entity.setReportPeriod(period);
- entity.setRegionCode(codeCol != null ? getString(row, codeCol) : null);
- entity.setEnterpriseCode(entCol != null ? getString(row, entCol) : null);
- entity.setEnterpriseName(name.trim());
- entity.setPassengerCount(pass);
- entity.setTurnover(turn);
- rows.add(entity);
+ if (colMap.containsKey("浼佷笟鍚嶇О")) {
+ parsePassengerIndividualEnterprise(sheet, colMap, period, rows);
+ } else {
+ parsePassengerIndividualCitySheet(sheet, period, rows);
}
} catch (Exception e) {
log.error("Passenger individual parse error", e);
@@ -474,6 +453,101 @@
recordBatch(file.getOriginalFilename(), "PASSENGER_INDIVIDUAL", period, rows.size(), success, failDetails.size(), errorDetail);
log.info("Passenger individual imported: {} rows for {}", success, period);
return new ImportResult(success, failDetails.size(), failDetails);
+ }
+
+ /** 鏃х増涓綋瀹㈣繍閲忔ā鏉匡紙浼佷笟绾夸笅姹囨姤鏄庣粏锛氭墍灞炲湴鍖�/浼佷笟浠g爜/浼佷笟鍚嶇О/鈥︿釜浣撳杩愰噺/鈥︿釜浣撴梾瀹㈠懆杞噺锛� */
+ private void parsePassengerIndividualEnterprise(Sheet sheet, Map<String, Integer> colMap, String period,
+ List<PassengerIndividualMonthly> rows) {
+ Integer codeCol = colMap.get("鎵�灞炲湴鍖�");
+ Integer entCol = colMap.get("浼佷笟浠g爜");
+ Integer nameCol = colMap.get("浼佷笟鍚嶇О");
+ Integer passCol = null;
+ Integer turnCol = null;
+ for (Map.Entry<String, Integer> e : colMap.entrySet()) {
+ String k = e.getKey();
+ if (k != null && k.contains("涓綋") && k.contains("瀹㈣繍閲�")) passCol = e.getValue();
+ if (k != null && k.contains("涓綋") && (k.contains("鍛ㄨ浆閲�") || k.contains("鍛ㄨ浆"))) turnCol = e.getValue();
+ }
+ if (passCol == null && turnCol == null) {
+ throw new RuntimeException("鏈壘鍒般�屼釜浣撳杩愰噺/涓綋鏃呭鍛ㄨ浆閲忋�嶅垪锛岃妫�鏌ユā鏉匡紙鍒楀悕闇�鍖呭惈鈥滀釜浣撳杩愰噺鈥濃�滀釜浣撳懆杞噺鈥濓級");
+ }
+ for (int r = 1; r <= sheet.getLastRowNum(); r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ String name = nameCol != null ? getString(row, nameCol) : null;
+ if (name == null || name.trim().isEmpty()) continue;
+ Double pass = passCol != null ? getDecimalOrNull(row, passCol) : null;
+ Double turn = turnCol != null ? getDecimalOrNull(row, turnCol) : null;
+ if ((pass == null || pass == 0.0) && (turn == null || turn == 0.0)) continue;
+ PassengerIndividualMonthly entity = new PassengerIndividualMonthly();
+ entity.setReportPeriod(period);
+ entity.setRegionCode(codeCol != null ? getString(row, codeCol) : null);
+ entity.setEnterpriseCode(entCol != null ? getString(row, entCol) : null);
+ entity.setEnterpriseName(name.trim());
+ entity.setPassengerCount(pass);
+ entity.setTurnover(turn);
+ rows.add(entity);
+ }
+ }
+
+ /** 鏂扮増甯傚窞姹囨�绘ā鏉匡細銆婂叏鐪丯鏈堜釜浣撳杩愰噺姹囨�昏〃銆嬫爣棰樿 鈫� 琛ㄥご琛岋紙甯傚窞/鈥�/涓綋瀹㈣繍閲�/涓綋鏃呭鍛ㄨ浆閲忥級鈫� 甯傚窞鏁版嵁琛� */
+ private void parsePassengerIndividualCitySheet(Sheet sheet, String period, List<PassengerIndividualMonthly> rows) {
+ int targetMonth;
+ try {
+ targetMonth = Integer.parseInt(period.split("-")[1]);
+ } catch (Exception e) {
+ throw new RuntimeException("鎶ヨ〃鏈熸牸寮忓簲涓� yyyy-MM锛�" + period);
+ }
+ int titleRow = -1;
+ for (int r = 0; r <= sheet.getLastRowNum(); r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ String t = getString(row, 0);
+ if (t == null || !t.contains("鍏ㄧ渷") || !t.contains("鏈�")) continue;
+ java.util.regex.Matcher m = java.util.regex.Pattern.compile("鍏ㄧ渷(\\d+)鏈�").matcher(t);
+ if (!m.find()) continue;
+ if (Integer.parseInt(m.group(1)) == targetMonth) { titleRow = r; break; }
+ if (titleRow < 0) titleRow = r; // 鏍囬涓嶅惈鐩爣鏈堜唤鏃舵殏璁扮涓�涓爣棰樺潡鍏滃簳
+ }
+ if (titleRow < 0) {
+ throw new RuntimeException("鏈壘鍒般�屽叏鐪丯鏈堜釜浣撳杩愰噺姹囨�昏〃銆嶆爣棰樺潡锛岃浣跨敤銆婃ā鏉縚婀栧寳鐪佸叕璺梾瀹㈣繍杈撲釜浣撴埛鏈堝害鐢熶骇鎯呭喌锛圷YYY.M锛夈�嬫暣鐞嗗悗瀵煎叆");
+ }
+ Row header = sheet.getRow(titleRow + 1);
+ if (header == null) {
+ throw new RuntimeException("銆屽叏鐪�" + targetMonth + "鏈堚�︽眹鎬昏〃銆嶆爣棰樺悗缂哄皯琛ㄥご琛岋紙甯傚窞/涓綋瀹㈣繍閲�/涓綋鏃呭鍛ㄨ浆閲忥級");
+ }
+ int cityCol = -1, passCol = -1, turnCol = -1;
+ for (Cell c : header) {
+ String h = FORMATTER.formatCellValue(c).trim();
+ if (h.isEmpty()) continue;
+ if (h.contains("甯傚窞")) cityCol = c.getColumnIndex();
+ else if (h.contains("涓綋") && h.contains("瀹㈣繍閲�")) passCol = c.getColumnIndex();
+ else if (h.contains("涓綋") && (h.contains("鍛ㄨ浆閲�") || h.contains("鍛ㄨ浆"))) turnCol = c.getColumnIndex();
+ }
+ if (cityCol < 0 || (passCol < 0 && turnCol < 0)) {
+ throw new RuntimeException("鏈壘鍒般�屽競宸� / 涓綋瀹㈣繍閲� / 涓綋鏃呭鍛ㄨ浆閲忋�嶅垪锛岃浣跨敤绯荤粺妯℃澘鏁寸悊鍚庡鍏�");
+ }
+ int lastRow = Math.min(sheet.getLastRowNum(), titleRow + 40);
+ for (int r = titleRow + 2; r <= lastRow; r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ String first = getString(row, cityCol);
+ if (first == null) break;
+ String t = first.trim();
+ if (t.isEmpty() || t.contains("鍚堣") || t.contains("鐜瘮") || t.contains("鍏ㄧ渷")) break;
+ String city = RegionUtil.normalizeCityName(t);
+ if (!RegionUtil.cityList().contains(city)) continue;
+ Double pass = passCol >= 0 ? getDecimalOrNull(row, passCol) : null;
+ Double turn = turnCol >= 0 ? getDecimalOrNull(row, turnCol) : null;
+ if ((pass == null || pass == 0.0) && (turn == null || turn == 0.0)) continue;
+ PassengerIndividualMonthly entity = new PassengerIndividualMonthly();
+ entity.setReportPeriod(period);
+ entity.setRegionCode(RegionUtil.codeOfCity(city));
+ entity.setEnterpriseName(city);
+ entity.setPassengerCount(pass);
+ entity.setTurnover(turn);
+ rows.add(entity);
+ }
}
/** 鍏矾鏃呭杩愭斂杞﹁締鏁帮紙鐙珛妯℃澘锛氫紒涓氫唬鐮�/浼佷笟鍚嶇О/杞﹁締鏁�/杞藉浣嶆暟锛� */
@@ -531,6 +605,10 @@
/** 鑳借�楁槑缁嗘瘡缁勫浐瀹�18鍒楋紝杞︾墝鍙疯捣濮嬪垪锛�0-based锛夛細3,21,39,57,75 */
private static final int[] ENERGY_GROUP_COLS = {3, 21, 39, 57, 75};
+ /** 鑳借�楁槑缁嗘ā鏉胯〃澶村叧閿垪锛�0-based锛夛細绋嬪簭鎸夊浐瀹氬垪浣嶈В鏋愶紝瑙f瀽鍓嶆牎楠岃〃澶达紝閿欎綅鐩存帴鎷掔粷 */
+ private static final int[] ENERGY_HEADER_COLS = {3, 4, 5, 21, 39, 57, 75};
+ private static final String[] ENERGY_HEADER_KEYWORDS = {"杞︾墝鍙�", "杞﹁締绫诲瀷", "鐕冩枡绫诲瀷", "杞︾墝鍙�", "杞︾墝鍙�", "杞︾墝鍙�", "杞︾墝鍙�"};
+
/** 鑳借�楀鍏ユ寜鎶ヨ〃鏈熶簰鏂ラ攣锛圚204 鏄庣粏涓庤繍鏀夸俊鎭叡鐢紝閬垮厤鍚屾姤琛ㄦ湡骞跺彂閲嶅浜掔浉瑕嗙洊锛� */
private Object energyLock(String period) {
return energyImportLocks.computeIfAbsent(period == null ? "" : period, k -> new Object());
@@ -543,6 +621,7 @@
// sheet0: 绗簩瀛e害璐ц溅鑳借�楁槑缁嗭紙姣忚宸﹀彸鍚�5缁勮溅杈嗭紝姣忕粍鍥哄畾18鍒楋級
Sheet sheet = wb.getSheetAt(0);
requireHeaderKeyword(sheet, "閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐�", "浼佷笟鍚嶇О", "杞︾墝鍙�");
+ requireEnergyHeaderLayout(sheet);
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
@@ -665,6 +744,12 @@
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
requireHeaderKeyword(sheet, "鑳借�楄溅杈嗚繍鏀夸俊鎭�", "杞︾墝鍙�");
+ Row authHeader = sheet.getRow(0);
+ String authH0 = authHeader == null ? null : FORMATTER.formatCellValue(authHeader.getCell(0)).trim();
+ if (authH0 == null || authH0.isEmpty() || !authH0.contains("杞︾墝鍙�")) {
+ throw new RuntimeException("鑳借�楄溅杈嗚繍鏀夸俊鎭〃澶翠笌绯荤粺妯℃澘涓嶄竴鑷达細绗� 1 鍒楀簲涓恒�岃溅鐗屽彿銆嶏紝瀹為檯涓恒��"
+ + (authH0 == null || authH0.isEmpty() ? "绌�" : authH0) + "銆嶃�傝浣跨敤绯荤粺妯℃澘銆婃ā鏉縚鑳借�楄溅杈嗚繍鏀夸俊鎭�.xlsx銆嬫暣鐞嗗悗鍐嶅鍏�");
+ }
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
@@ -730,25 +815,27 @@
// ========== 杩愭斂杞﹁締 ==========
+ /** 杩愭斂杞﹁締瀵煎叆锛氫笌 H203-2 鏈堟姤涓�鑷达紝鎸夎〃澶村悕绉板畾浣嶅垪锛屽垪椤哄簭鍙樺寲涔熻兘姝g‘瀵煎叆 */
public int importTransportAuth(MultipartFile file, String period) throws Exception {
List<TransportAuthVehicle> list = new ArrayList<>();
int failRows = 0;
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
- requireHeaderKeyword(sheet, "杩愭斂杞﹁締", "浼佷笟鍚嶇О");
+ requireHeaderCols(sheet, "杩愭斂杞﹁締", "浼佷笟鍚嶇О", "鎬荤壍寮曡溅鏁�", "鎬绘寕杞︽暟", "鍏跺畠杞﹁締鏁�", "鎸傝溅鎬诲惃浣�(鍚�)", "鍏跺畠杞﹁締鎬诲惃浣�(鍚�)");
+ Map<String, Integer> colMap = buildHeaderMap(sheet.getRow(0));
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
- String name = getString(row, 0);
+ String name = gs(row, colMap, "浼佷笟鍚嶇О");
if (name == null || name.trim().isEmpty()) continue;
TransportAuthVehicle entity = new TransportAuthVehicle();
entity.setReportPeriod(period);
entity.setEnterpriseName(name);
- entity.setTractorCount(getInt(row, 1));
- entity.setTrailerCount(getInt(row, 2));
- entity.setOtherCount(getInt(row, 3));
- entity.setTrailerTons(getDecimal(row, 4));
- entity.setOtherTons(getDecimal(row, 5));
+ entity.setTractorCount(gi(row, colMap, "鎬荤壍寮曡溅鏁�"));
+ entity.setTrailerCount(gi(row, colMap, "鎬绘寕杞︽暟"));
+ entity.setOtherCount(gi(row, colMap, "鍏跺畠杞﹁締鏁�"));
+ entity.setTrailerTons(gd(row, colMap, "鎸傝溅鎬诲惃浣�(鍚�)"));
+ entity.setOtherTons(gd(row, colMap, "鍏跺畠杞﹁締鎬诲惃浣�(鍚�)"));
list.add(entity);
}
} catch (Exception e) {
@@ -778,21 +865,23 @@
// ========== 杞ㄨ抗閲岀▼ ==========
+ /** 杞ㄨ抗閲岀▼瀵煎叆锛氫笌 H203-2 鏈堟姤涓�鑷达紝鎸夎〃澶村悕绉板畾浣嶅垪锛屽垪椤哄簭鍙樺寲涔熻兘姝g‘瀵煎叆 */
public int importTrackMileage(MultipartFile file, String period) throws Exception {
List<VehicleTrackMileage> list = new ArrayList<>();
int failRows = 0;
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
- requireHeaderKeyword(sheet, "杞ㄨ抗閲岀▼", "浼佷笟鍚嶇О");
+ requireHeaderCols(sheet, "杞ㄨ抗閲岀▼", "浼佷笟鍚嶇О", "鏈堝害鎬婚噷绋�(鍏噷)", "鏈夐噷绋嬬殑杞﹁締鏁�");
+ Map<String, Integer> colMap = buildHeaderMap(sheet.getRow(0));
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
- String name = getString(row, 1);
+ String name = gs(row, colMap, "浼佷笟鍚嶇О");
if (name == null || name.trim().isEmpty()) continue;
VehicleTrackMileage entity = new VehicleTrackMileage();
entity.setEnterpriseName(name);
- entity.setMonthlyMileage(getDecimal(row, 2));
- entity.setTrackedVehicles(getInt(row, 3));
+ entity.setMonthlyMileage(gd(row, colMap, "鏈堝害鎬婚噷绋�(鍏噷)"));
+ entity.setTrackedVehicles(gi(row, colMap, "鏈夐噷绋嬬殑杞﹁締鏁�"));
entity.setReportPeriod(period);
list.add(entity);
}
@@ -842,6 +931,20 @@
if (sheetName.contains("褰撴湀")) periodType = "MONTH";
else if (sheetName.contains("绱")) periodType = "CUMULATIVE";
if (periodType == null) continue;
+
+ // 鏍¢獙 sheet 甯冨眬锛氱2琛屽簲鍚�屽競宸�/瑙勪笂浼佷笟杩愯緭閲忋�嶏紝绗�3琛屽瓙琛ㄥご搴斿惈銆屽懆杞噺銆嶆垨銆岃揣杩愰噺銆嶏紙鎵╁睍甯冨眬锛�
+ Row headRow = sheet.getRow(1);
+ Row subHeadRow = sheet.getRow(2);
+ boolean layoutOk = headRow != null
+ && getString(headRow, 0) != null && getString(headRow, 0).contains("甯傚窞")
+ && getString(headRow, 1) != null && getString(headRow, 1).contains("瑙勪笂")
+ && subHeadRow != null
+ && ("璐ц繍閲�".equals(getString(subHeadRow, 0))
+ || (getString(subHeadRow, 1) != null && getString(subHeadRow, 1).contains("鍛ㄨ浆閲�")));
+ if (!layoutOk) {
+ throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨�愯涓婅涓嬫媶鍒嗐�戜笌鏂囦欢鍐呭涓嶇锛歴heet銆�" + sheetName
+ + "銆嶆湭鎵惧埌銆屽競宸�/瑙勪笂浼佷笟杩愯緭閲�/鍛ㄨ浆閲忋�嶈〃澶达紝璇风‘璁ゆ槸鍚﹂�夐敊浜嗘暟鎹被鍨�");
+ }
// 妫�娴嬪瓙琛ㄥご锛氭槸鍚﹀寘鍚揣杩愰噺鍒楋紙鎵╁睍甯冨眬锛�
Row subHeader = sheet.getRow(2);
@@ -925,6 +1028,12 @@
int monthCount = Integer.parseInt(period.split("-")[1]);
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
+ Row header = sheet.getRow(0);
+ String h0 = header == null ? null : getString(header, 0);
+ String h1 = header == null ? null : getString(header, 1);
+ if (header == null || h0 == null || !h0.contains("璐ц繍閲�") || h1 == null || !h1.contains("鏈�")) {
+ throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨�愯揣杩愰噺鍛ㄨ浆閲忋�戜笌鏂囦欢鍐呭涓嶇锛氳〃澶村簲涓恒�岃揣杩愰噺(涓囧惃)/1鏈堚��12鏈堛�嶅竷灞�锛岃纭鏄惁閫夐敊浜嗘暟鎹被鍨�");
+ }
boolean cityRowFound = false;
for (int r = 1; r <= Math.min(sheet.getLastRowNum(), 30); r++) {
Row rr = sheet.getRow(r);
@@ -1218,6 +1327,43 @@
}
}
throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨��" + typeLabel + "銆戜笌鏂囦欢鍐呭涓嶇锛氳〃澶存湭鍖呭惈銆�" + String.join("銆戙��", keywords) + "銆戠瓑鍒楋紝璇风‘璁ゆ槸鍚﹂�夐敊浜嗘暟鎹被鍨�");
+ }
+
+ /** 鑳借�楁槑缁嗚〃澶村垪浣嶆牎楠岋細绯荤粺妯℃澘涓衡�滃墠3鍒� + 5缁劽�18鍒椻�濓紝绋嬪簭鎸夊浐瀹氬垪浣嶈В鏋愶紝琛ㄥご閿欎綅浼氬鑷存暣琛ㄩ敊涔憋紝閿欎綅鏃剁洿鎺ユ嫆缁� */
+ private void requireEnergyHeaderLayout(Sheet sheet) {
+ Row header = sheet == null ? null : sheet.getRow(0);
+ if (header == null) {
+ throw new RuntimeException("鑳借�楁槑缁嗚〃澶寸己澶憋紝璇蜂娇鐢ㄧ郴缁熸ā鏉裤�婃ā鏉縚閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙2026锛�.xlsx銆嬫暣鐞嗗悗鍐嶅鍏�");
+ }
+ for (int i = 0; i < ENERGY_HEADER_COLS.length; i++) {
+ int col = ENERGY_HEADER_COLS[i];
+ String keyword = ENERGY_HEADER_KEYWORDS[i];
+ Cell cell = header.getCell(col);
+ String hv = cell == null ? null : FORMATTER.formatCellValue(cell).trim();
+ if (hv == null || hv.isEmpty() || !hv.contains(keyword)) {
+ throw new RuntimeException("琛ㄥご涓庣郴缁熸ā鏉夸笉涓�鑷达細绗� " + (col + 1) + " 鍒楀簲涓恒��" + keyword + "銆嶏紝瀹為檯涓恒��"
+ + (hv == null || hv.isEmpty() ? "绌�" : hv) + "銆嶃�傝浣跨敤绯荤粺妯℃澘銆婃ā鏉縚閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙2026锛�.xlsx銆嬫暣鐞嗗悗鍐嶅鍏�");
+ }
+ }
+ }
+
+ /** 閫氱敤琛ㄥご鍒椾綅鏍¢獙锛氱▼搴忔寜鍥哄畾鍒椾綅瑙f瀽锛岃〃澶撮敊浣嶄細瀵艰嚧鏁磋〃閿欎贡锛岄敊浣嶆椂鐩存帴鎷掔粷瀵煎叆 */
+ private void requireHeaderLayout(Sheet sheet, String typeLabel, String templateHint,
+ int[] cols, String[] keywords) {
+ Row header = sheet == null ? null : sheet.getRow(0);
+ if (header == null) {
+ throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨��" + typeLabel + "銆戞枃浠惰〃澶寸己澶憋紝璇蜂娇鐢ㄧ郴缁熸ā鏉裤��" + templateHint + "銆嬫暣鐞嗗悗鍐嶅鍏�");
+ }
+ for (int i = 0; i < cols.length; i++) {
+ int col = cols[i];
+ String keyword = keywords[i];
+ Cell cell = header.getCell(col);
+ String hv = cell == null ? null : FORMATTER.formatCellValue(cell).trim();
+ if (hv == null || hv.isEmpty() || !hv.contains(keyword)) {
+ throw new RuntimeException("琛ㄥご涓庣郴缁熸ā鏉夸笉涓�鑷达細绗� " + (col + 1) + " 鍒楀簲涓恒��" + keyword + "銆嶏紝瀹為檯涓恒��"
+ + (hv == null || hv.isEmpty() ? "绌�" : hv) + "銆嶃�傛墍閫夋暟鎹被鍨嬨��" + typeLabel + "銆戣浣跨敤绯荤粺妯℃澘銆�" + templateHint + "銆嬫暣鐞嗗悗鍐嶅鍏�");
+ }
+ }
}
/** 鎸夎〃澶村悕绉板缓绔嬪垪鍙锋槧灏勶紝鍏煎鏂版棫妯℃澘鍒椾綅宸紓 */
@@ -1792,8 +1938,10 @@
if (name == null || name.isEmpty()) return false;
String norm = name.replace(" ", "");
int month = Integer.parseInt(period.substring(5, 7));
+ String normDash = norm.replace('.', '-'); // "2026.8"/"2026.08" -> "2026-8"/"2026-08"
return norm.contains(month + "鏈�") || norm.contains(String.format("%02d", month) + "鏈�")
- || name.contains(period) || name.contains(period.replace("-0", "-"));
+ || name.contains(period) || name.contains(period.replace("-0", "-"))
+ || normDash.contains(period) || normDash.contains(period.replace("-0", "-"));
}
/** 瑙f瀽鍗曚釜甯傚窞鎶ヨ〃锛氶�� sheet锛堟姤琛ㄦ湡鍚嶄紭鍏� + 鏁版嵁琛屾暟锛夛紝鎸夊垪鍚嶆槧灏勬彁鍙栭」鐩 */
@@ -1808,6 +1956,11 @@
if (col == null) continue;
int cnt = countInvestRows(sh, col);
int score = cnt + (cnt > 0 && investSheetMatchesPeriod(sh, period) ? 1000000 : 0);
+ if (cnt > 0 && investSheetMatchesPeriod(sh, period)) {
+ // 褰撴湡鐪熷疄鎶ヨ〃 sheet 鍚嶉�氬父甯﹀勾浠斤紙濡� 2026.8/2026骞�8鏈堬級锛屽巻鍙瞫heet澶氫负绾湀浠藉悕锛�8鏈堬級锛氬甫骞翠唤鐨勪紭鍏�
+ String norm = sh.getSheetName() == null ? "" : sh.getSheetName().replace(" ", "");
+ if (norm.contains(period.substring(0, 4))) score += 100000;
+ }
if (score > bestScore) {
best = sh;
bestCol = col;
@@ -1852,10 +2005,12 @@
if (seq == null || seq.trim().isEmpty()) {
// 甯傚窞灏忚妭琛岋紙濡� "姝︽眽" "澶� 闂�"锛夛紝鏇存柊褰撳墠甯傚窞
String c = investmentCity(nt);
- if (c != null) currentCity = c;
+ if (c != null) { currentCity = c; continue; }
+ // 搴忓彿涓虹┖鐨勭湡瀹為」鐩锛堥儴鍒嗗競宸炴湀鎶ヤ笉濉簭鍙凤紝濡傜鍐滄灦鐗╂祦鍥級涔熸寜椤圭洰澶勭悊
+ if (!isLikelyInvestProjectName(nt)) continue;
+ } else if (!seq.trim().matches("\\d+(\\.\\d+)?")) {
continue;
}
- if (!seq.trim().matches("\\d+(\\.\\d+)?")) continue;
} else {
// 鏃犲簭鍙峰垪锛堥殢宸炵瓑锛夛細椤圭洰鍚嶉潪绌哄嵆椤圭洰琛岋紝甯傚窞灏忚妭琛岀敤 investmentCity 璇嗗埆
String c = investmentCity(nt);
@@ -1980,7 +2135,11 @@
if (nt.length() > 4) count++;
} else {
String seq = cellStr(row, seqCol);
- if (seq != null && seq.trim().matches("\\d+(\\.\\d+)?")) count++;
+ if (seq != null && seq.trim().matches("\\d+(\\.\\d+)?")) {
+ count++;
+ } else if ((seq == null || seq.trim().isEmpty()) && isLikelyInvestProjectName(nt)) {
+ count++;
+ }
}
}
return count;
@@ -2050,6 +2209,15 @@
log.error("load five year project names error", e);
}
return names;
+ }
+
+ /** 搴忓彿涓虹┖鐨勯潪甯傚窞琛屾槸鍚﹀儚椤圭洰琛岋細闀垮害>4 涓旈潪澶囨敞/璇存槑绛夋潅椤� */
+ private boolean isLikelyInvestProjectName(String nt) {
+ if (nt == null || nt.length() <= 4) return false;
+ if (investmentCity(nt) != null) return false;
+ return !nt.startsWith("澶囨敞") && !nt.startsWith("璇存槑") && !nt.startsWith("娉細")
+ && !nt.startsWith("濉〃") && !nt.startsWith("瀹℃牳") && !nt.startsWith("缁熻")
+ && !nt.startsWith("璐熻矗");
}
/** 椤圭洰鍚嶈鑼冨寲锛氬幓绌虹櫧/鎹㈣/鎷彿鍐呭/鏍囩偣/銆岄」鐩�嶅悗缂�锛岀敤浜庡崄浜斾簲娓呭崟鍖归厤 */
@@ -2228,12 +2396,18 @@
}
}
/** 鎶曡祫绯荤粺瀵煎嚭瀵煎叆锛堝鏍告瘮瀵瑰熀鍑嗭級锛屽浐瀹�8鍒楋細琛屽彿/鍗曚綅/鏃舵湡/璁″垝鎬绘姇璧�/鑷紑濮嬬疮璁�/鏈勾璁″垝/鑷勾鍒濈疮璁�/褰撴湀瀹屾垚 */
+ private static final int[] INVEST_SYSTEM_HEADER_COLS = {0, 1, 2, 3, 4, 5, 6, 7};
+ private static final String[] INVEST_SYSTEM_HEADER_KEYWORDS =
+ {"琛屽彿", "鍗曚綅", "鏃舵湡", "璁″垝鎬绘姇璧�", "鑷紑濮嬪缓璁�", "鏈勾璁″垝鎶曡祫", "鑷勾鍒�", "褰撴湀瀹屾垚鎶曡祫"};
+
public int importInvestmentSystem(MultipartFile file, String period) throws Exception {
List<InvestmentSystem> list = new ArrayList<>();
int failRows = 0;
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
requireHeaderKeyword(sheet, "鎶曡祫绯荤粺瀵煎嚭", "椤圭洰鍚嶇О", "璁″垝鎬绘姇璧�", "鍗曚綅");
+ requireHeaderLayout(sheet, "鎶曡祫绯荤粺瀵煎嚭", "妯℃澘_鏌ヨ缁撴灉(鎶曡祫绯荤粺-瀹㈣繍+鐗╂祦 2026.7).xls",
+ INVEST_SYSTEM_HEADER_COLS, INVEST_SYSTEM_HEADER_KEYWORDS);
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
@@ -2271,15 +2445,18 @@
}
/** 鍩庡競鍏氦鏈堟姤瀵煎叆锛堝煄甯傚叕鍏变氦閫氭湀搴﹁繍钀ユ儏鍐碉紝浼佷笟绾ф槑缁嗭紝鍙栧叕鍏辨苯鐢佃溅瀛楁锛� */
+ /** 鍩庡競鍏氦锛圲203锛夋ā鏉垮叧閿垪浣嶏紙0-based锛夛細鎵�灞炲湴鍖�/浼佷笟浠g爜/浼佷笟鍚嶇О/杩愯惀杞︽暟/瀹㈣繍閲�/杞ㄩ亾瀹㈣繍閲�/杞浮瀹㈣繍閲�/骞冲潎杩愯窛/濉〃浜�/鑱旂郴鐢佃瘽/鎶ュ嚭鏃ユ湡 */
+ private static final int[] CITY_BUS_HEADER_COLS = {0, 1, 2, 5, 8, 13, 17, 19, 24, 25, 26};
+ private static final String[] CITY_BUS_HEADER_KEYWORDS =
+ {"鎵�灞炲湴鍖�", "浼佷笟浠g爜", "浼佷笟鍚嶇О", "鍏叡姹界數杞杩愯惀杞︽暟", "鍏叡姹界數杞瀹㈣繍閲�", "杞ㄩ亾浜ら�歘瀹㈣繍閲�",
+ "鍩庡競瀹㈣繍杞浮_瀹㈣繍閲�", "鍏叡姹界數杞﹀钩鍧囪繍璺�", "濉〃浜�", "鑱旂郴鐢佃瘽", "鎶ュ嚭鏃ユ湡"};
+
public ImportResult importCityBus(MultipartFile file, String period) throws Exception {
List<CityBusRow> rows = new ArrayList<>();
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
- Row header = sheet.getRow(0);
- if (header == null || getString(header, 2) == null
- || !getString(header, 2).contains("浼佷笟鍚嶇О")) {
- throw new RuntimeException("鏈壘鍒拌〃澶磋锛堥渶鍖呭惈 浼佷笟鍚嶇О 鍒楋級");
- }
+ requireHeaderLayout(sheet, "鍩庡競鍏氦", "妯℃澘_浜や紒缁烾203琛╛鍩庡競鍏叡浜ら�氭湀搴﹁繍钀ユ儏鍐碉紙2026骞�7鏈堬級.xls",
+ CITY_BUS_HEADER_COLS, CITY_BUS_HEADER_KEYWORDS);
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
@@ -2383,15 +2560,18 @@
}
/** 宸℃父鍑虹鏈堟姤瀵煎叆锛堝競宸炵骇锛�17 琛岋紱鍚牳瀹炶鏄�/涓婃姤璇存槑/淇敼璁板綍锛� */
+ /** 宸℃父鍑虹锛圲402锛夋ā鏉垮叧閿垪浣嶏紙0-based锛夛細鎵�灞炲湴鍖�/浼佷笟浠g爜/浼佷笟鍚嶇О/杞藉杞︽鎬绘暟/瀹㈣繍閲�/鏃呭鍛ㄨ浆閲�/杩愯惀杞﹁締鏁�/骞冲潎杩愯窛/濉〃浜�/鑱旂郴鐢佃瘽/鎶ュ嚭鏃ユ湡 */
+ private static final int[] CITY_TAXI_HEADER_COLS = {0, 1, 2, 4, 6, 8, 10, 11, 15, 16, 17};
+ private static final String[] CITY_TAXI_HEADER_KEYWORDS =
+ {"鎵�灞炲湴鍖�", "浼佷笟浠g爜", "浼佷笟鍚嶇О", "杞藉杞︽鎬绘暟", "瀹㈣繍閲�", "鏃呭鍛ㄨ浆閲�", "杩愯惀杞﹁締鏁�",
+ "宸℃父鍑虹姹借溅骞冲潎杩愯窛", "濉〃浜�", "鑱旂郴鐢佃瘽", "鎶ュ嚭鏃ユ湡"};
+
public ImportResult importCityTaxi(MultipartFile file, String period) throws Exception {
List<TaxiRow> rows = new ArrayList<>();
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
Sheet sheet = wb.getSheetAt(0);
- Row header = sheet.getRow(0);
- if (header == null || getString(header, 2) == null
- || !getString(header, 2).contains("浼佷笟鍚嶇О")) {
- throw new RuntimeException("鏈壘鍒拌〃澶磋锛堥渶鍖呭惈 浼佷笟鍚嶇О 鍒楋級");
- }
+ requireHeaderLayout(sheet, "宸℃父鍑虹", "妯℃澘_浜よ缁烾402琛�-宸℃父鍑虹姹借溅杩愯惀鏈嶅姟鎯呭喌鏈堟姤(2026).xls",
+ CITY_TAXI_HEADER_COLS, CITY_TAXI_HEADER_KEYWORDS);
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
Row row = sheet.getRow(r);
if (row == null) continue;
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 9594638..6560740 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
@@ -151,7 +151,7 @@
public ResponseEntity<byte[]> exportCityPassengerCitySum(@RequestParam("period") String period,
@RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception {
logExport("鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", period);
- return buildResponse(reportService.exportCityPassengerCitySum("瀵煎叆妯℃澘_鍩庡競鍒嗗競宸�.xlsx", period, mode), "鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx");
+ return buildResponse(reportService.exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", period, mode), "鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx");
}
/** 鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx锛堝煄甯傚杩愬悇甯傚窞鏄庣粏琛╛妯℃澘搴曠锛� */
@@ -159,7 +159,7 @@
public ResponseEntity<byte[]> exportCityPassengerDetailSum(@RequestParam("period") String period,
@RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception {
logExport("鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period);
- return buildResponse(reportService.exportCityPassengerCitySum("瀵煎叆妯℃澘_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode), "鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx");
+ return buildResponse(reportService.exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode), "鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx");
}
/** 鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx锛堝煄甯傛眹鎬籣妯℃澘搴曠锛� */
@@ -275,5 +275,4 @@
.body(data);
}
}
-
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 945a762..c1c3bd1 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
@@ -665,17 +665,58 @@
totalYoy.put(city, freightCumYoy(ftMap.get(city), month));
}
+
+ // ===== 绗簩椤碉紙褰撴湀锛夋暟鎹細瑙勪笂=H2032 褰撴湀銆佸悎璁�=妯℃澘_璐ц繍閲忓懆杞噺褰撴湀鍒椼�佽涓�=宸�硷紱鍚屾瘮=鍘诲勾鍚屾湀 =====
+ Map<String, Map<Integer, Double>> h2032MonthCur = loadH2032FreightByMonth(period);
+ String lastYearPeriod = (Integer.parseInt(year) - 1) + period.substring(4);
+ Map<String, Map<Integer, Double>> h2032MonthLast = loadH2032FreightByMonth(lastYearPeriod);
+ Map<String, Double> monthAbove = new HashMap<>();
+ Map<String, Double> monthBelow = new HashMap<>();
+ Map<String, Double> monthTotal = new HashMap<>();
+ Map<String, Double> monthAboveYoy = new HashMap<>();
+ Map<String, Double> monthBelowYoy = new HashMap<>();
+ Map<String, Double> monthTotalYoy = new HashMap<>();
+ double provMonthAbove = 0.0, provMonthAboveLast = 0.0;
+ for (String city : RegionUtil.cityList()) {
+ Double ma = monthFreightWan(h2032MonthCur, city, month);
+ Double maLast = monthFreightWan(h2032MonthLast, city, month);
+ Double mt = freightMonth(ftMap.get(city), month);
+ Double mtLast = lastFreightMonth(ftMap.get(city), month);
+ if (ma != null) provMonthAbove += ma;
+ if (maLast != null) provMonthAboveLast += maLast;
+ monthAbove.put(city, ma);
+ monthTotal.put(city, mt);
+ monthBelow.put(city, mt == null ? null : round(mt - (ma == null ? 0.0 : ma), 4));
+ monthAboveYoy.put(city, growthYoy(ma, maLast));
+ Double mb = monthBelow.get(city);
+ Double mbLast = mtLast == null ? null : round(mtLast - (maLast == null ? 0.0 : maLast), 4);
+ monthBelowYoy.put(city, growthYoy(mb, mbLast));
+ monthTotalYoy.put(city, freightYoy(ftMap.get(city), month));
+ }
+ Double provMonthAboveWan = provMonthAbove == 0.0 ? null : round(provMonthAbove, 4);
+ Double provMonthTotal = freightMonth(ftMap.get("婀栧寳鐪�"), month);
+ Double provMonthBelow = provMonthTotal == null ? null : round(provMonthTotal - provMonthAbove, 4);
+ Double provMonthAboveYoy = growthYoy(provMonthAbove == 0.0 ? null : provMonthAbove, provMonthAboveLast);
+ Double provMonthTotalLast = lastFreightMonth(ftMap.get("婀栧寳鐪�"), month);
+ Double provMonthBelowLast = provMonthTotalLast == null ? null
+ : round(provMonthTotalLast - provMonthAboveLast, 4);
+ Double provMonthBelowYoy = growthYoy(provMonthBelow, provMonthBelowLast);
+ Double provMonthTotalYoy = freightYoy(ftMap.get("婀栧寳鐪�"), month);
+
// 浠� docs/璐ц繍/鐢熸垚_璐ц繍閲忔帓鍚�.xlsx 涓哄簳绋匡細淇濈暀琛ㄥご/鍚堝苟/鍒楀/鏍峰紡涓� Q/R 鍗犳瘮鍏紡锛屼粎鏇挎崲鏁版嵁
File template = resolveFreightTemplate("鐢熸垚_璐ц繍閲忔帓鍚�.xlsx");
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
Sheet sheet = wb.getSheetAt(0);
sheet.getRow(0).getCell(0).setCellValue(year + "骞�" + cumRange(month) + "鍏ㄧ渷鍒嗗競宸炵疮璁″畬鎴愬叕璺揣杩愰噺鎯呭喌");
- sheet.getRow(22).getCell(0).setCellValue(year + "骞�" + month + "鏈堝叏鐪佸垎甯傚窞绱瀹屾垚鍏矾璐ц繍閲忔儏鍐�");
+ sheet.getRow(22).getCell(0).setCellValue(year + "骞�" + month + "鏈堝叏鐪佸垎甯傚窞瀹屾垚鍏矾璐ц繍閲忔儏鍐�");
fillFreightRankBlock(sheet, 3, above, below, total, aboveYoy, belowYoy, totalYoy,
provAboveWan, provBelow, provTotal, provAboveYoy, provBelowYoy, provTotalYoy);
- fillFreightRankBlock(sheet, 25, above, below, total, aboveYoy, belowYoy, totalYoy,
- provAboveWan, provBelow, provTotal, provAboveYoy, provBelowYoy, provTotalYoy);
+ renameRankMonthHeader(sheet, 24);
+ fillFreightRankBlock(sheet, 25, monthAbove, monthBelow, monthTotal,
+ monthAboveYoy, monthBelowYoy, monthTotalYoy,
+ provMonthAboveWan, provMonthBelow, provMonthTotal,
+ provMonthAboveYoy, provMonthBelowYoy, provMonthTotalYoy);
try {
wb.getCreationHelper().createFormulaEvaluator().evaluateAll();
} catch (Exception e) {
@@ -693,15 +734,27 @@
Map<String, ScaleSplitTransport> cumMap = loadCumulativeMap(period);
ScaleSplitTransport province = getProvinceCumulative(period);
+ // 褰撴湀锛堢浜岄〉锛夛細鍛ㄨ浆閲忔媶鍒嗚〃 MONTH 琛岋紙鍚綋鏈堝悓姣旓級
+ Map<String, ScaleSplitTransport> monthTurnover = new HashMap<>();
+ for (ScaleSplitTransport rec : scaleSplitMapper.selectList(
+ new LambdaQueryWrapper<ScaleSplitTransport>()
+ .eq(ScaleSplitTransport::getPeriodType, "MONTH")
+ .eq(ScaleSplitTransport::getReportPeriod, period))) {
+ String name = RegionUtil.normalizeCityName(rec.getRegionName());
+ if (name != null) monthTurnover.put(name, rec);
+ }
+ ScaleSplitTransport provinceMonth = monthTurnover.remove("婀栧寳鐪�");
+
// 浠� docs/璐ц繍/鐢熸垚_鍛ㄨ浆閲忔帓鍚�.xlsx 涓哄簳绋匡細淇濈暀琛ㄥご/鍚堝苟/鍒楀/鏍峰紡锛屼粎鏇挎崲鏁版嵁锛決/R 鍗犳瘮涓烘ā鏉跨紦瀛樺�硷紝鎸夋柊鏁版嵁閲嶇畻
File template = resolveFreightTemplate("鐢熸垚_鍛ㄨ浆閲忔帓鍚�.xlsx");
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
Sheet sheet = wb.getSheetAt(0);
sheet.getRow(0).getCell(0).setCellValue(year + "骞�" + cumRange(month) + "鍏ㄧ渷鍒嗗競宸炵疮璁″畬鎴愬叕璺揣鐗╄繍杈撳懆杞噺鎯呭喌");
- sheet.getRow(22).getCell(0).setCellValue(year + "骞�" + month + "鏈堝叏鐪佸垎甯傚窞绱瀹屾垚鍏矾璐х墿杩愯緭鍛ㄨ浆閲忔儏鍐�");
+ sheet.getRow(22).getCell(0).setCellValue(year + "骞�" + month + "鏈堝叏鐪佸垎甯傚窞瀹屾垚鍏矾璐х墿杩愯緭鍛ㄨ浆閲忔儏鍐�");
fillTurnoverRankBlock(sheet, 3, cumMap, province);
- fillTurnoverRankBlock(sheet, 25, cumMap, province);
+ renameRankMonthHeader(sheet, 24);
+ fillTurnoverRankBlock(sheet, 25, monthTurnover, provinceMonth);
return toBytes(wb);
}
}
@@ -994,6 +1047,31 @@
setFreightCell(row, cumCol + 1, cumYoy);
}
+ /** H2032 瑙勪笂鏌愭湀鍚堣锛堝惃鈫掍竾鍚級锛涙棤璇ユ湀鏁版嵁杩斿洖 null */
+ private Double monthFreightWan(Map<String, Map<Integer, Double>> byCityMonth, String city, int month) {
+ Map<Integer, Double> byMonth = byCityMonth == null ? null : byCityMonth.get(city);
+ Double v = byMonth == null ? null : byMonth.get(month);
+ return v == null ? null : round(v / 10000.0, 4);
+ }
+
+ /** 鍚屾瘮 = (鏈湡-鍩烘湡)/鍩烘湡锛涗换涓�鏈熺己澶辨垨鍩烘湡涓� 0 杩斿洖 null */
+ private Double growthYoy(Double cur, Double last) {
+ if (cur == null || last == null || last == 0.0) return null;
+ return (cur - last) / last;
+ }
+
+ /** 鎺掑悕琛ㄧ浜岄〉鍒楀ご銆岀疮璁″畬鎴愩�嶁啋銆屽綋鏈堝畬鎴愩�嶏紙浠呭鍑哄唴瀛樻浛鎹紝妯℃澘鏂囦欢涓嶆敼锛� */
+ private void renameRankMonthHeader(Sheet sheet, int headerRowIdx) {
+ Row row = sheet.getRow(headerRowIdx);
+ if (row == null) return;
+ for (int col : new int[]{1, 6, 11}) {
+ Cell c = row.getCell(col);
+ if (c == null || c.getCellType() != CellType.STRING) continue;
+ String s = c.getStringCellValue();
+ if (s != null && s.contains("绱瀹屾垚")) c.setCellValue(s.replace("绱瀹屾垚", "褰撴湀瀹屾垚"));
+ }
+ }
+
/** 璐ц繍閲忔帓鍚嶅潡濉厖锛氭ā鏉� 1-based r4 璧凤紙鍏ㄧ渷+17甯傚窞锛夛紝Q/R 鍗犳瘮鍏紡淇濈暀涓嶅姩 */
private void fillFreightRankBlock(Sheet sheet, int start,
Map<String, Double> above, Map<String, Double> below, Map<String, Double> total,
@@ -1163,9 +1241,12 @@
/** H2032瑙勪笂: city -> month -> 璐ц繍閲�(鍚�) */
private Map<String, Map<Integer, Double>> loadH2032FreightByMonth(String period) {
Map<String, Map<Integer, Double>> result = new HashMap<>();
+ String yearPrefix = period.length() >= 4 ? period.substring(0, 4) : null;
List<H2032EnterpriseMonthly> list = h2032Mapper.selectList(null);
for (H2032EnterpriseMonthly record : list) {
if (record.getReportPeriod() == null || record.getReportPeriod().compareTo(period) > 0) continue;
+ // H2032 琛ㄥ悓鏃跺瓨鏈夊線骞存湀鎶ワ紝缁熻褰撳勾瑙勪笂鍊兼椂鍙彇涓庢姤琛ㄦ湡鍚屽勾鐨勮褰曪紝閬垮厤鍘诲勾鏁版嵁鍙犲姞
+ if (yearPrefix != null && !record.getReportPeriod().startsWith(yearPrefix)) continue;
String city = RegionUtil.cityByCode(record.getRegionCode());
if (city == null) continue;
int month = parseMonth(record.getReportPeriod());
@@ -1178,9 +1259,11 @@
/** H2032瑙勪笂绱: city -> 璐ц繍閲�(鍚�) */
private Map<String, Double> loadH2032FreightCumulative(String period) {
Map<String, Double> result = new HashMap<>();
+ String yearPrefix = period.length() >= 4 ? period.substring(0, 4) : null;
List<H2032EnterpriseMonthly> list = h2032Mapper.selectList(null);
for (H2032EnterpriseMonthly record : list) {
if (record.getReportPeriod() == null || record.getReportPeriod().compareTo(period) > 0) continue;
+ if (yearPrefix != null && !record.getReportPeriod().startsWith(yearPrefix)) continue;
String city = RegionUtil.cityByCode(record.getRegionCode());
if (city == null) continue;
double freight = record.getFreightTotal() == null ? 0.0 : record.getFreightTotal();
@@ -1945,6 +2028,7 @@
// 绱鍚屾瘮鍒楋紙妯℃澘 #REF! 鈫� 搴撳唴鍘诲勾 1..N 鏈堢疮璁″悓姣旀暟鍊硷級
fillMidCumYoyColumn(sheet, mid, currentYear, fillMonths, extended ? 27 : 15);
recalc(wb);
+ clearFormulaErrorsAll(wb); // 鍘诲勾鍚屾湡鏄庣粏椤垫畫鐣� #REF! 鍚屾瘮鍏紡 鈫� 娓呯┖
return toBytes(wb);
}
}
@@ -2195,11 +2279,20 @@
title.getCell(0).setCellValue(currentYear + "骞�1-" + maxMonth + "鏈堝叏鐪佸垎甯傚窞绱瀹屾垚閬撹矾瀹㈣繍鐢熶骇鎯呭喌");
}
}
+ // 鍙冲潡锛堝綋鏈堬級鏍囬 K1
+ if (title != null && title.getCell(10) != null) {
+ title.getCell(10).setCellValue(currentYear + "骞�" + maxMonth + "鏈堝叏鐪佸垎甯傚窞瀹屾垚閬撹矾瀹㈣繍鐢熶骇鎯呭喌");
+ }
// 鍏ㄧ渷琛� r3锛欱3/F3 涓� SUM 鍏紡淇濈暀锛汥3/H3 鍚屾瘮濉�硷紙0-based 鍒� 3/7锛�
setValOrBlank(sheet, 2, 3, yoyOf(midCumClass(mid, currentYear, "婀栧寳鐪�", maxMonth, 0, true),
midCumClass(mid, currentYear - 1, "婀栧寳鐪�", maxMonth, 0, true)));
setValOrBlank(sheet, 2, 7, yoyOf(midCumClass(mid, currentYear, "婀栧寳鐪�", maxMonth, 0, false),
midCumClass(mid, currentYear - 1, "婀栧寳鐪�", maxMonth, 0, false)));
+ // 鍙冲潡鍏ㄧ渷琛� N3/R3锛氬綋鏈堝悓姣旓紙L3/P3 涓� SUM 鍏紡淇濈暀锛�
+ setValOrBlank(sheet, 2, 13, yoyOf(midClassVal(mid, currentYear, maxMonth, "婀栧寳鐪�", 0, true),
+ midClassVal(mid, currentYear - 1, maxMonth, "婀栧寳鐪�", 0, true)));
+ setValOrBlank(sheet, 2, 17, yoyOf(midClassVal(mid, currentYear, maxMonth, "婀栧寳鐪�", 0, false),
+ midClassVal(mid, currentYear - 1, maxMonth, "婀栧寳鐪�", 0, false)));
// 甯傚窞琛� r4-20锛欱/F 绱鍊笺�丏/H 鍚屾瘮锛汣/E/G/I 鎺掑悕鍏紡淇濈暀
List<String> cities = RegionUtil.CITY_LIST;
for (int i = 0; i < cities.size(); i++) {
@@ -2213,6 +2306,15 @@
setValOrBlank(sheet, r0, 3, yoyOf(pass, lastPass));
setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4));
setValOrBlank(sheet, r0, 7, yoyOf(turn, lastTurn));
+ // 鍙冲潡褰撴湀锛歀/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 : round(mPass, 4));
+ setValOrBlank(sheet, r0, 13, mPass == 0 ? null : yoyOf(mPass, mLastPass));
+ setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : round(mTurn, 4));
+ setValOrBlank(sheet, r0, 17, mTurn == 0 ? null : yoyOf(mTurn, mLastTurn));
}
recalc(wb);
return toBytes(wb);
@@ -2277,6 +2379,36 @@
setValOrBlank(sheet, r0, 2, yoyOf(pass, lastPass));
setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4));
setValOrBlank(sheet, r0, 6, yoyOf(turn, lastTurn));
+ }
+ // 涓嬪崐鍧楋紙褰撴湀锛夛細鏍囬琛�9銆佹暟鎹11-15锛�0-based 8銆�10-14锛�
+ Row bottomTitle = sheet.getRow(8);
+ if (bottomTitle != null && bottomTitle.getCell(0) != null) {
+ bottomTitle.getCell(0).setCellValue(currentYear + "骞�" + maxMonth + "鏈堜腑鍙e緞瀹㈣繍閲忓強鍛ㄨ浆閲�");
+ }
+ for (int i = 0; i < names.length; i++) {
+ int r0 = 10 + i;
+ double pass = midClassVal(mid, currentYear, maxMonth, "婀栧寳鐪�", dims[i], true);
+ double turn = midClassVal(mid, currentYear, maxMonth, "婀栧寳鐪�", dims[i], false);
+ double lastPass = midClassVal(mid, currentYear - 1, maxMonth, "婀栧寳鐪�", dims[i], true);
+ double lastTurn = midClassVal(mid, currentYear - 1, maxMonth, "婀栧寳鐪�", dims[i], false);
+ setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4));
+ setValOrBlank(sheet, r0, 2, pass == 0 ? null : yoyOf(pass, lastPass));
+ setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4));
+ setValOrBlank(sheet, r0, 6, turn == 0 ? null : yoyOf(turn, lastTurn));
+ }
+ // 涓嬪崐鍧楀崰姣斿叕寮忕敱鏍蜂緥鎸囧悜涓婂崐鍧楋紙B$3/F$3锛夛紝鏀瑰啓涓烘湰鍧楁�昏锛圔$11/F$11锛夛紝琛�12-15
+ for (int i = 1; i < names.length; i++) {
+ int r0 = 10 + i;
+ Row rr = sheet.getRow(r0);
+ if (rr == null) continue;
+ Cell dc = rr.getCell(3);
+ if (dc != null && dc.getCellType() == CellType.FORMULA) {
+ dc.setCellFormula("B" + (r0 + 1) + "/B$11");
+ }
+ Cell hc = rr.getCell(7);
+ if (hc != null && hc.getCellType() == CellType.FORMULA) {
+ hc.setCellFormula("F" + (r0 + 1) + "/F$11");
+ }
}
recalc(wb);
return toBytes(wb);
@@ -2372,6 +2504,7 @@
fillEnergyTemplateSheet(s, agg);
}
recalc(wb);
+ clearFormulaErrorsAll(wb); // 鏃犲幓骞存暟鎹殑鍚屾瘮/澧為�熷叕寮� #DIV/0! 鈫� 娓呯┖
return toBytes(wb);
}
}
@@ -2508,7 +2641,7 @@
public byte[] exportCityBusDetail(String period, String mode) throws Exception {
int year = Integer.parseInt(period.split("-")[0]);
int month = monthOf(period, mode);
- return exportCityByTemplate("瀵煎叆妯℃澘_鍩庡競鍏氦.xlsx", period, mode,
+ return exportCityByTemplate("鐢熸垚_鍩庡競鍏氦瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx", period, mode,
loadCityBusByMonth(year + "-", month),
loadCityBusByMonth((year - 1) + "-", month));
}
@@ -2562,7 +2695,7 @@
public byte[] exportCityTaxiDetail(String period, String mode) throws Exception {
int year = Integer.parseInt(period.split("-")[0]);
int month = monthOf(period, mode);
- return exportCityByTemplate("瀵煎叆妯℃澘_宸℃父鍑虹.xlsx", period, mode,
+ return exportCityByTemplate("鐢熸垚_宸℃父鍑虹瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx", period, mode,
loadCityTaxiByMonth(year + "-", month),
loadCityTaxiByMonth((year - 1) + "-", month));
}
@@ -2606,7 +2739,7 @@
int year = Integer.parseInt(period.split("-")[0]);
int month = monthOf(period, mode);
Map<Integer, Map<String, double[]>> monthCity = loadCityRailFerryByMonth(year + "-", month);
- File template = resolveTemplate("瀵煎叆妯℃澘_杞ㄩ亾銆佽疆娓�.xlsx");
+ File template = resolveTemplate("鐢熸垚_杞ㄩ亾杞浮瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx");
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
Sheet sheet = wb.getSheetAt(0);
@@ -2616,6 +2749,8 @@
// 杞浮锛氬杩愰噺琛� 13(鍏ㄧ渷)/15(姝︽眽)锛涙寚鏍� 2=杞浮瀹㈣繍閲� 3=杞浮鍛ㄨ浆閲�
fillRailFerryBlock(sheet, monthCity, month, new String[][]{{"鍏ㄧ渷", "12"}, {"姝︽眽甯�", "14"}}, 2);
recalc(wb);
+ clearFormulaErrorCells(sheet, 3, sheet.getLastRowNum(), 1, 39);
+ fixCityMonthHeaderText(sheet);
return toBytes(wb);
}
}
@@ -2704,6 +2839,7 @@
int year = Integer.parseInt(period.split("-")[0]);
int month = monthOf(period, mode);
Map<String, double[]> cum = loadCityPassengerCumulative(year + "-", month);
+ Map<String, double[]> monthMap = loadCityPassengerMonthMap(year + "-", month);
File template = resolveTemplate(templateFileName);
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
@@ -2712,9 +2848,24 @@
List<String> areas = new java.util.ArrayList<>();
areas.add("鍏ㄧ渷");
areas.addAll(RegionUtil.cityList());
- fillCitySumBlock(sheet, cum, areas, 4, 0); // 瀹㈣繍閲忓尯锛堝崟浣嶏細涓囦汉娆★紝POI 0 鍩猴級
- fillCitySumBlock(sheet, cum, areas, 26, 1); // 鍛ㄨ浆閲忓尯锛堝崟浣嶏細涓囦汉娆″叕閲岋紝POI 0 鍩猴級
+ fillCitySumBlock(sheet, cum, areas, 4, 0); // 绱瀹㈣繍閲忓尯锛堝崟浣嶏細涓囦汉娆★紝POI 0 鍩猴紝琛�5-22锛�
+ fillCitySumBlock(sheet, cum, areas, 26, 1); // 绱鍛ㄨ浆閲忓尯锛堝崟浣嶏細涓囦汉娆″叕閲岋紝POI 0 鍩猴紝琛�27-44锛�
+ // 褰撴湀鍧楁爣棰橈紙0鍩鸿44/66锛変笌鏁版嵁锛�0鍩鸿48-65/70-87锛�
+ Row pTitle = sheet.getRow(44);
+ if (pTitle != null && pTitle.getCell(0) != null) {
+ pTitle.getCell(0).setCellValue("鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞" + month + "鏈堟儏鍐�");
+ }
+ Row tTitle = sheet.getRow(66);
+ if (tTitle != null && tTitle.getCell(0) != null) {
+ tTitle.getCell(0).setCellValue("鍩庡競瀹㈣繍瀹㈣繍鍛ㄨ浆閲忓垎甯傚窞" + month + "鏈堟儏鍐�");
+ }
+ fillCitySumBlock(sheet, monthMap, areas, 48, 0); // 褰撴湀瀹㈣繍閲忓尯锛堣49-66锛�
+ fillCitySumBlock(sheet, monthMap, areas, 70, 1); // 褰撴湀鍛ㄨ浆閲忓尯锛堣71-88锛�
+ // 褰撴湀鍧楁帓鍚�/鍗犳瘮鍏紡鐢辩疮璁″潡澶嶅埗鑰屾潵锛孯ANK 鑼冨洿涓庡崰姣斿垎姣嶉渶鏀规寚褰撴湀鍧楄嚜韬
+ repairCityMonthRankShare(sheet, 50, 66, 49);
+ repairCityMonthRankShare(sheet, 72, 88, 71);
recalc(wb);
+ clearFormulaErrorsAll(wb); // 鏃犲幓骞寸疮璁$殑鍗犳瘮/澧為�熷叕寮� #DIV/0! 鈫� 娓呯┖
return toBytes(wb);
}
}
@@ -2744,6 +2895,33 @@
setDataCell(sheet, rowIdx, 24, 0);
rowIdx++;
}
+ }
+
+ /** 褰撴湀鍧楁帓鍚�/鍗犳瘮鍏紡淇锛氭ā鏉垮綋鏈堝潡鐢辩疮璁″潡澶嶅埗鑰屾潵锛孯ANK 鑼冨洿涓庡崰姣斿垎姣嶉渶鏀规寚褰撴湀鍧楄嚜韬 */
+ private void repairCityMonthRankShare(Sheet sheet, int firstDataRow1, int lastDataRow1, int provRow1) {
+ String[] groups = {"B", "G", "L", "Q"};
+ String[] growth = {"E", "J", "O", "T"};
+ for (int r = firstDataRow1; r <= lastDataRow1; r++) {
+ int r0 = r - 1;
+ for (int g = 0; g < 4; g++) {
+ String base = groups[g];
+ String grow = growth[g];
+ setFormulaIfFormula(sheet, r0, 2 + g * 5,
+ "RANK(" + base + r + "," + base + "$" + firstDataRow1 + ":" + base + "$" + lastDataRow1 + ")");
+ setFormulaIfFormula(sheet, r0, 3 + g * 5, base + r + "/" + base + "$" + provRow1);
+ setFormulaIfFormula(sheet, r0, 5 + g * 5,
+ "RANK(" + grow + r + "," + grow + "$" + firstDataRow1 + ":" + grow + "$" + lastDataRow1 + ")");
+ }
+ }
+ }
+
+ /** 鍗曞厓鏍煎師涓哄叕寮忔椂鏀瑰啓鍏紡锛堟帓鍚�/鍗犳瘮鍒楋級锛岄潪鍏紡鍗曞厓鏍间笉鍔紙淇濇寔妯℃澘寮忔牱锛� */
+ private void setFormulaIfFormula(Sheet sheet, int rowIdx, int colIdx, String formula) {
+ Row row = sheet.getRow(rowIdx);
+ if (row == null) return;
+ Cell c = row.getCell(colIdx);
+ if (c == null || c.getCellType() != CellType.FORMULA) return;
+ c.setCellFormula(formula);
}
/** 鏌愬勾 1..limit 鏈堝煄甯傚杩愮疮璁★細city 鈫� [鍏氦瀹㈣繍閲�,鍏氦鍛ㄨ浆閲�,鍑虹瀹㈣繍閲�,鍑虹鍛ㄨ浆閲�,杞ㄩ亾瀹㈣繍閲�,杞ㄩ亾鍛ㄨ浆閲�,杞浮瀹㈣繍閲�,杞浮鍛ㄨ浆閲廬锛屽惈"鍏ㄧ渷" */
@@ -2784,6 +2962,23 @@
return cum;
}
+ /** 鏌愬勾鍗曟湀鍩庡競瀹㈣繍鏁版嵁锛歝ity 鈫� 8 缁存暟缁勶紙鍙e緞鍚岀疮璁★級锛屽惈"鍏ㄧ渷"锛�= month 绱 - (month-1) 绱 */
+ private Map<String, double[]> loadCityPassengerMonthMap(String yearPrefix, int month) {
+ Map<String, double[]> cum = loadCityPassengerCumulative(yearPrefix, month);
+ if (month <= 1) return cum;
+ Map<String, double[]> pre = loadCityPassengerCumulative(yearPrefix, month - 1);
+ Map<String, double[]> out = new HashMap<>();
+ for (Map.Entry<String, double[]> e : cum.entrySet()) {
+ double[] prev = pre.get(e.getKey());
+ double[] d = new double[8];
+ for (int i = 0; i < 8; i++) {
+ d[i] = e.getValue()[i] - (prev == null ? 0 : prev[i]);
+ }
+ out.put(e.getKey(), d);
+ }
+ return out;
+ }
+
// ==================== 鍩庡競瀹㈣繍 鍏ㄧ渷姹囨�伙紙鍩庡競姹囨�籣妯℃澘锛� ====================
/** 鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx锛堜互 鍩庡競姹囨�籣妯℃澘.xlsx 涓哄簳绋匡紱2026 娈靛~搴撳唴 1..N 鏈堢疮璁★紝鍚屾瘮娓呯┖锛�2025/2024 娈典繚鐣欐ā鏉垮巻鍙插弬鑰冨�硷級 */
@@ -2795,7 +2990,7 @@
double taxiPax = prov[2], taxiTurn = prov[3];
double railPax = prov[4], railTurn = prov[5];
double ferryPax = prov[6], ferryTurn = prov[7];
- File template = resolveTemplate("瀵煎叆妯℃澘_鍩庡競姹囨��.xlsx");
+ File template = resolveTemplate("鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx");
try (InputStream in = new FileInputStream(template);
XSSFWorkbook wb = new XSSFWorkbook(in)) {
Sheet sheet = wb.getSheetAt(0);
@@ -2819,7 +3014,36 @@
setDataCell(sheet, r, 2, 0);
setDataCell(sheet, r, 4, 0);
}
+ // 搴曢儴鍗曟湀琛紙鏂扮増寮忥級锛氭爣棰樿11锛�0鍩�10锛夈�佹暟鎹13-19锛�0鍩�12-18锛夛紝濉綋鏈堝畬鎴愰噺
+ Row mTitle = sheet.getRow(10);
+ if (mTitle != null && mTitle.getCell(0) != null) {
+ mTitle.getCell(0).setCellValue(year + "骞�" + month + "鏈堝叏鐪佸畬鎴愬煄甯傚杩愰噺鎯呭喌");
+ }
+ double[] mProv = loadCityPassengerMonthMap(year + "-", month).getOrDefault("鍏ㄧ渷", new double[8]);
+ double mBusPax = mProv[0], mBusTurn = mProv[1];
+ double mTaxiPax = mProv[2], mTaxiTurn = mProv[3];
+ double mRailPax = mProv[4], mRailTurn = mProv[5];
+ double mFerryPax = mProv[6], mFerryTurn = mProv[7];
+ setDataCell(sheet, 12, 1, mBusPax + mTaxiPax + mRailPax + mFerryPax); // B13 鎬诲杩愰噺
+ setDataCell(sheet, 12, 3, mBusTurn + mTaxiTurn + mRailTurn + mFerryTurn); // D13 鎬诲懆杞噺
+ setDataCell(sheet, 13, 1, mBusPax); // B14 鍩庡競鍏氦
+ setDataCell(sheet, 13, 3, mBusTurn); // D14
+ setDataCell(sheet, 14, 1, mTaxiPax); // B15 鍩庡競鍑虹杞�
+ setDataCell(sheet, 14, 3, mTaxiTurn); // D15
+ setDataCell(sheet, 15, 1, mTaxiPax); // B16 鍏朵腑宸℃父鍑虹
+ setDataCell(sheet, 15, 3, mTaxiTurn); // D16
+ setZeroCell(sheet, 16, 1); // B17 鍩庡競缃戠害杞�
+ setZeroCell(sheet, 16, 3); // D17
+ setDataCell(sheet, 17, 1, mRailPax); // B18 杞ㄩ亾
+ setDataCell(sheet, 17, 3, mRailTurn); // D18
+ setDataCell(sheet, 18, 1, mFerryPax); // B19 杞浮
+ setDataCell(sheet, 18, 3, mFerryTurn);// D19
+ for (int r = 12; r <= 18; r++) { // 鍗曟湀琛� C/E 鍚屾瘮锛氭棤涓婂勾鍗曟湀婧� 鈫� 娓呯┖鏍蜂緥
+ setDataCell(sheet, r, 2, 0);
+ setDataCell(sheet, r, 4, 0);
+ }
recalc(wb);
+ clearFormulaErrorsAll(wb); // 鏃犲幓骞存暟鎹殑鍚屾瘮鍏紡 #DIV/0! 鈫� 娓呯┖
return toBytes(wb);
}
}
@@ -2833,8 +3057,8 @@
addZipEntry(zos, "鐢熸垚_鍩庡競鍏氦瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx", exportCityBusDetail(period, mode));
addZipEntry(zos, "鐢熸垚_宸℃父鍑虹瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx", exportCityTaxiDetail(period, mode));
addZipEntry(zos, "鐢熸垚_杞ㄩ亾杞浮瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx", exportCityRailFerryDetail(period, mode));
- addZipEntry(zos, "鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", exportCityPassengerCitySum("瀵煎叆妯℃澘_鍩庡競鍒嗗競宸�.xlsx", period, mode));
- addZipEntry(zos, "鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", exportCityPassengerCitySum("瀵煎叆妯℃澘_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode));
+ addZipEntry(zos, "鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", period, mode));
+ addZipEntry(zos, "鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode));
addZipEntry(zos, "鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx", exportCityPassengerSummary(period, mode));
}
return bos.toByteArray();
@@ -2911,8 +3135,8 @@
case "cityBusDetail": return exportCityBusDetail(period, mode);
case "cityTaxiDetail": return exportCityTaxiDetail(period, mode);
case "cityRailFerryDetail": return exportCityRailFerryDetail(period, mode);
- case "cityPassengerCitySum": return exportCityPassengerCitySum("瀵煎叆妯℃澘_鍩庡競鍒嗗競宸�.xlsx", period, mode);
- case "cityPassengerDetailSum": return exportCityPassengerCitySum("瀵煎叆妯℃澘_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode);
+ case "cityPassengerCitySum": return exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx", period, mode);
+ case "cityPassengerDetailSum": return exportCityPassengerCitySum("鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx", period, mode);
case "cityPassengerSummary": return exportCityPassengerSummary(period, mode);
default: return null;
}
@@ -2996,10 +3220,56 @@
} catch (Exception e) {
log.warn("鍩庡競瀹㈣繍妯℃澘鍏紡姹傚�煎け璐�: {}", e.getMessage());
}
+ clearFormulaErrorCells(sheet, 4, sheet.getLastRowNum(), 3, 39);
+ fixCityMonthHeaderText(sheet);
return toBytes(wb);
}
}
+ /** 娓呯┖姹傚�肩粨鏋滀负閿欒鐨勫叕寮忓崟鍏冩牸锛堟ā鏉胯法绨垮悓姣斿叕寮忔畫鐣� #REF! 鏃剁Щ闄ゅ叕寮忥紝閬垮厤瀵煎嚭鏄剧ず閿欒锛� */
+ private void clearFormulaErrorCells(Sheet sheet, int startRow, int endRow, int startCol, int endCol) {
+ for (int r = startRow; r <= endRow; r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ for (int c = startCol; c <= endCol; c++) {
+ Cell cell = row.getCell(c);
+ if (cell == null || cell.getCellType() != CellType.FORMULA) continue;
+ try {
+ if (cell.getCachedFormulaResultType() == CellType.ERROR) cell.setBlank();
+ } catch (Exception ignore) {
+ // 缂撳瓨绫诲瀷璇诲彇澶辫触鏃跺拷鐣�
+ }
+ }
+ }
+ }
+
+ /** 娓呯┖宸ヤ綔绨垮叏閮ㄥ伐浣滆〃鍐呮眰鍊肩粨鏋滀负閿欒鐨勫叕寮忓崟鍏冩牸锛堣法绨�/璺ㄨ〃 #REF!銆佺己鍘诲勾鏁版嵁 #DIV/0! 绛夛級 */
+ private void clearFormulaErrorsAll(XSSFWorkbook wb) {
+ for (int i = 0; i < wb.getNumberOfSheets(); i++) {
+ Sheet s = wb.getSheetAt(i);
+ clearFormulaErrorCells(s, 2, s.getLastRowNum(), 1, 60);
+ }
+ }
+
+ /** 鍩庡競瀹㈣繍绫绘ā鏉胯〃澶存湀浠藉垪鑻ヤ负鏈牸寮忓寲鏃ユ湡搴忓垪鍙凤紙濡� 46082锛夛紝鏀瑰啓涓恒�孻YYY骞碝鏈堛�嶆枃鏈� */
+ private void fixCityMonthHeaderText(Sheet sheet) {
+ for (int r = 0; r <= Math.min(sheet.getLastRowNum(), 20); r++) {
+ Row row = sheet.getRow(r);
+ if (row == null) continue;
+ Cell nameCell = row.getCell(0);
+ String nameText = nameCell == null ? null : cellText(nameCell);
+ if (nameText == null || !nameText.contains("鍦板尯")) continue;
+ for (int c = 2; c <= 40; c += 2) {
+ Cell cell = row.getCell(c);
+ if (cell == null || cell.getCellType() != CellType.NUMERIC) continue;
+ double v = cell.getNumericCellValue();
+ if (v < 40000 || v > 60000) continue;
+ java.util.Date d = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(v);
+ cell.setCellValue(new java.text.SimpleDateFormat("yyyy骞碝鏈�").format(d));
+ }
+ }
+ }
+
/** 妯℃澘鏂囦欢瀹氫綅锛氶厤缃洰褰� 鈫� user.dir 鈫� user.dir/.. 閫愮骇鍥為�� */
private File resolveTemplate(String fileName) throws Exception {
return resolveAnyTemplate(templateDir, fileName);
diff --git a/traffic-audit-web/src/views/DataImport.vue b/traffic-audit-web/src/views/DataImport.vue
index 12d46de..53ee36b 100644
--- a/traffic-audit-web/src/views/DataImport.vue
+++ b/traffic-audit-web/src/views/DataImport.vue
@@ -272,8 +272,8 @@
passengerIndividual: '鍏矾鏃呭/涓綋瀹㈣繍閲忔眹鎬�.xlsx',
energyMonthly: '鑳借��/妯℃澘_閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙2026锛�.xlsx',
energyAuth: '鑳借��/妯℃澘_鑳借�楄溅杈嗚繍鏀夸俊鎭�.xlsx',
- cityBus: '鍩庡競瀹㈣繍/瀵煎叆妯℃澘_鍩庡競鍏氦.xlsx',
- cityTaxi: '鍩庡競瀹㈣繍/瀵煎叆妯℃澘_宸℃父鍑虹.xlsx',
+ cityBus: '鍩庡競瀹㈣繍/鐢熸垚_鍩庡競鍏氦瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx',
+ cityTaxi: '鍩庡競瀹㈣繍/鐢熸垚_宸℃父鍑虹瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx',
cityTaxiAuth: '鍩庡競瀹㈣繍/瀵煎叆妯℃澘_鍑虹杞︿俊鎭�(杩愭斂杞﹁締淇℃伅).xlsx',
investment: '鎶曡祫/杈撳叆/瀹㈣繍锛堝杩愮珯锛�/鏇存柊_7鏈堝杩愮珯鎶曡祫鏄庣粏琛紙甯傚窞姹囨�诲ぇ琛紝缁欓瀵硷級.xlsx',
investmentLogistics: '鎶曡祫/杈撳叆/鐗╂祦锛堢墿娴佸洯鍖猴級/鏇存柊_7鏈堢墿娴佺珯鍦烘姇璧勬槑缁�.xls',
--
Gitblit v1.9.1