From 24b4c282a1e91143d66f1eeed2cabffa654c7c13 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期三, 16 九月 2026 13:41:57 +0800
Subject: [PATCH] feat(h2031): 适配模板新增「统一社会信用代码/填报单位」两列并入库;fix(import): 补录 2023 年货运量周转量;fix(login/report): 验证码容错、预览指标对齐、弹窗可拖动圆角、失败提示细分;docs: 新增问题与注意事项汇总
---
traffic-audit-web/src/views/ReportExport.vue | 59 +++++
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java | 4
docs/功能测试报告/功能测试报告_H2031模板新增列适配_2026-09-16.md | 53 +++++
docs/问题汇总/问题与注意事项汇总_2026-09-16.md | 181 ++++++++++++++++++
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java | 3
docs/init.sql | 2
traffic-audit-web/src/directives/dialogDrag.js | 61 ++++++
docs/功能测试报告/功能测试报告_货运量周转量2023年数据补录_2026-09-16.md | 49 ++++
docs/公路旅客/模板_交企统H203-1表_公路旅客运输月度生产情况.xlsx | 0
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java | 2
docs/database.md | 2
traffic-audit-web/src/views/Login.vue | 10
docs/工作日结/工作日结_2026-09-16.md | 72 +++++++
traffic-audit-web/src/main.js | 2
docs/功能测试报告/功能测试报告_登录验证码容错与报表预览整改_2026-09-16.md | 51 +++++
15 files changed, 538 insertions(+), 13 deletions(-)
diff --git a/docs/database.md b/docs/database.md
index 9f98141..2282345 100644
--- a/docs/database.md
+++ b/docs/database.md
@@ -222,6 +222,8 @@
| region_code | varchar(20) | 鎵�灞炲湴鍖猴紙琛屾斂鍖哄垝浠g爜锛� |
| enterprise_code | varchar(50) | 浼佷笟浠g爜 |
| enterprise_name | varchar(200) | 浼佷笟鍚嶇О |
+| unified_credit_code | varchar(50) | 缁熶竴绀句細淇$敤浠g爜锛堟柊鐗堟ā鏉挎柊澧炲垪锛涜�佹ā鏉挎棤姝ゅ垪鏃朵负 NULL锛� |
+| report_unit | varchar(200) | 濉姤鍗曚綅锛堟柊鐗堟ā鏉挎柊澧炲垪锛涜�佹ā鏉挎棤姝ゅ垪鏃朵负 NULL锛� |
| vehicle_total | int | 瀹㈣繍杞﹁締_鎬昏 |
| seat_total | int | 鏍稿畾杞藉浣峗鎬昏 |
| vehicle_schedule | int | 杞﹁締鏁癬瀹㈣繍鐝溅锛堝惈瀹氱嚎鏃呮父锛� |
diff --git a/docs/init.sql b/docs/init.sql
index f75c5d7..7edbe73 100644
--- a/docs/init.sql
+++ b/docs/init.sql
@@ -399,6 +399,8 @@
region_code VARCHAR(20) COMMENT '鎵�灞炲湴鍖�',
enterprise_code VARCHAR(50) COMMENT '浼佷笟浠g爜',
enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ unified_credit_code VARCHAR(50) COMMENT '缁熶竴绀句細淇$敤浠g爜',
+ report_unit VARCHAR(200) COMMENT '濉姤鍗曚綅',
vehicle_total INT COMMENT '瀹㈣繍杞﹁締_鎬昏',
seat_total INT COMMENT '鏍稿畾杞藉浣峗鎬昏',
vehicle_schedule INT COMMENT '杞﹁締鏁癬瀹㈣繍鐝溅锛堝惈瀹氱嚎鏃呮父瀹㈣繍瀹㈣溅锛�',
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 d94e4d9..3273564 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\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_H2031\346\250\241\346\235\277\346\226\260\345\242\236\345\210\227\351\200\202\351\205\215_2026-09-16.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_H2031\346\250\241\346\235\277\346\226\260\345\242\236\345\210\227\351\200\202\351\205\215_2026-09-16.md"
new file mode 100644
index 0000000..dc24353
--- /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_H2031\346\250\241\346\235\277\346\226\260\345\242\236\345\210\227\351\200\202\351\205\215_2026-09-16.md"
@@ -0,0 +1,53 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛欻203-1 妯℃澘鏂板銆岀粺涓�绀句細淇$敤浠g爜 / 濉姤鍗曚綅銆嶄袱鍒楅�傞厤
+
+- 鏃ユ湡锛�2026-09-16
+- 妯″潡锛氭暟鎹鍏� / 鏁版嵁鏌ョ湅 / 鏁版嵁搴撹〃缁撴瀯
+- 缁撹锛�**閫氳繃**锛堟鍚� 4 鏉°�佽礋鍚� 2 鏉°�佸吋瀹� 2 鏉°�佸叆搴撴娊鏌� 814脳2 椤瑰叏閮ㄥ榻愶級
+
+## 涓�銆佸姛鑳借鏄�
+
+鐢ㄦ埛淇敼浜嗐�婃ā鏉縚浜や紒缁烪203-1琛╛鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌銆嬫ā鏉匡紝鍦ㄣ�屼紒涓氬悕绉般�嶄箣鍚�**鎻掑叆涓ゅ垪**锛歚缁熶竴绀句細淇$敤浠g爜`銆乣濉姤鍗曚綅`锛屽叾浣� 48 鍒楁暣浣撳彸绉伙紝鎬诲垪鏁扮敱 50 鈫� 52銆傛湰娆℃敼鍔ㄨ鍚庣鑳借鍙栧苟鍏ュ簱杩欎袱鍒楋紝鍚屾椂淇濊瘉鑰佹牸寮忔枃浠跺吋瀹广��
+
+鏀瑰姩娓呭崟锛�
+| 灞� | 鏂囦欢 | 鏀瑰姩 |
+|----|------|------|
+| 鏁版嵁搴� | `h2031_enterprise_monthly` | `ADD COLUMN unified_credit_code VARCHAR(50) NULL AFTER enterprise_name`銆乣ADD COLUMN report_unit VARCHAR(200) NULL AFTER unified_credit_code` |
+| 寤鸿〃鑴氭湰 | `docs/init.sql` | 鍚屾琛ヤ袱鍒� |
+| 鏁版嵁瀛楀吀 | `docs/database.md` | 鍚屾琛ヤ袱鍒楄鏄� |
+| 瀹炰綋 | `PassengerEnterpriseMonthly.java` | 鏂板 `unifiedCreditCode`銆乣reportUnit` |
+| 瀵煎叆瑙f瀽 | `DataImportService.java` | `importPassengerMonthly` 鍐呮寜琛ㄥご鍚嶅彇鍊� |
+| 鍓嶇鍒楅厤缃� | `DataViewController.java` | `H2031_COLUMNS` 鏂板涓ゅ垪锛堟暟鎹煡鐪嬮〉鍙锛� |
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 鍚庣锛歚Started TrafficAuditApplication` / `Tomcat started on port(s): 8090`锛堥噸鍚悗鏂扮紪璇戯紝13:30锛�
+- 鍓嶇锛�8080 宸插氨缁紙鏈鏈敼鍓嶇锛屾湭閲嶅惎锛�
+- 鏁版嵁搴擄細`traffic_audit` @ 127.0.0.1:3308
+- 鏂版ā鏉匡細`docs\鍏矾鏃呭\妯℃澘_浜や紒缁烪203-1琛╛鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌.xlsx`锛圫heet1锛�816脳52锛�
+- 鑰佹牸寮忥細`D:\妗岄潰\娴嬭瘯鏁版嵁\鍏矾鏃呭\鍏湀\鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌锛�2026锛塤2026-09-09 09_18_45.xls`锛圫heet0锛�769脳52锛�
+
+## 涓夈�佺敤渚嬭〃
+
+| # | 鍦烘櫙 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|------|------|------|------|------|
+| 1 | 姝e悜-鏂版ā鏉垮鍏� | 鏂版ā鏉� 鈫� `POST /api/import/passengerMonthly?period=2099-07` | 鎴愬姛涓旀潯鏁颁笌婧愭枃浠朵竴鑷� | `鎴愬姛 814 鏉★紝澶辫触 0 鏉 | 閫氳繃 |
+| 2 | 姝e悜-鏂板垪鍏ュ簱 | 鏌� `unified_credit_code` / `report_unit` | 814 琛屽叏閮ㄦ湁鍊� | `count=814, c1=814, c2=814` | 閫氳繃 |
+| 3 | 鍏ュ簱鎶芥煡-棣栬 | 婧愮 1 琛� vs 搴撶 1 琛� | 閫愬瓧娈典竴鑷� | 搴擄細`enterprise_code=91420105MA4F5Q3R68`銆乣unified_credit_code=91420105MA4F5Q3R68`銆乣report_unit=姝︽眽甯傚畯骞茬嚎鍏矾瀹㈣繍鏈夐檺鍏徃閲戝湴鍒嗗叕鍙竊銆乣vehicle_total=26`銆乣passenger_total=12835`锛屼笌 Excel 瀹屽叏涓�鑷� | 閫氳繃 |
+| 4 | 鍏ュ簱鎶芥煡-姹囨�诲垪 | 婧愭枃浠舵眹鎬� vs 搴撴眹鎬� | 涓�鑷� | 瀹㈣繍杞﹁締 24584銆佹牳瀹氳浇瀹綅 711018銆佸杩愰噺 16371625銆佸懆杞噺 1023386179锛屽洓椤瑰叏绛� | 閫氳繃 |
+| 5 | 鍏煎-鑰佹牸寮忓鍏� | 鑰� `.xls` 鈫� `period=2099-09` | 鎴愬姛涓旀柊鍒楁湁鍊硷紙鑰佹枃浠朵篃鍚繖涓ゅ垪锛� | `鎴愬姛 767 鏉★紝澶辫触 0 鏉锛沗c1=767, c2=767` | 閫氳繃 |
+| 6 | 鍏煎-鑰佹牸寮忔暟鍊间笉鍙� | 2099-09 vs 鏃㈡湁 2026-08锛堝悓婧愬悓鍐呭锛� | 瀹屽叏涓�鑷� | n=767 / v=22091 / p=16286506 / t=1158473501锛屽洓椤瑰叏绛� | 閫氳繃 |
+| 7 | 鍏煎-鑰佹牸寮忛琛屾娊鏌� | Excel COM 璇� `.xls` 绗� 2 琛� vs 搴� | 涓�鑷� | 婧愶細`914201005519761659 / 914201005519761659 / 姝︽眽鎹峰畨椤鸿揪姹借溅鏈嶅姟鏈夐檺鍏徃 / 24 / 54330`锛涘簱鍚� | 閫氳繃 |
+| 8 | 璐熷悜-閫夐敊鏁版嵁绫诲瀷 | `H203_1_2026-鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌锛�2026锛�.xlsx` 鈫� passengerMonthly | 鏄庣‘鎶ラ敊銆佷笉鍐欏簱 | `瀵煎叆澶辫触: 鎵�閫夋暟鎹被鍨嬨�愬叕璺梾瀹㈣繍杈撴湀搴︾敓浜ф儏鍐点�戜笌鏂囦欢鍐呭涓嶇锛氳〃澶寸己灏戝繀闇�鍒椼�愪紒涓氬悕绉般�戙�愬杩愰噺_鎬昏銆慲 | 閫氳繃 |
+| 9 | 璐熷悜-鍒楀彸绉讳笉褰卞搷鏃у瓧娈� | 鏂版ā鏉匡紙鏁翠綋鍙崇Щ 2 鍒楋級 | 浼佷笟浠g爜/浼佷笟鍚嶇О/杞﹁締/瀹㈣繍閲忕瓑鏃у瓧娈靛彇鍊间笉鍙� | 瑙f瀽鎸夎〃澶村悕 `buildHeaderMap` 鍙栧�硷紝814 鏉� 0 澶辫触锛屾眹鎬诲洓椤逛笌婧愭枃浠朵竴鑷达紙瑙佺敤渚� 4锛� | 閫氳繃 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+1. **鑰佹牸寮忔枃浠跺叾瀹炰篃甯﹁繖涓ゅ垪**锛坄缁熶竴绀句細淇$敤浠g爜`銆乣濉姤鍗曚綅`锛夛紝姝ゅ墠浠g爜鏈鍙� 鈫� 鏈湡涓�骞跺紑濮嬪叆搴撱�傝繖涔熸剰鍛崇潃 2026-01 ~ 2026-08 鐨勫瓨閲忔暟鎹繖涓ゅ垪涓虹┖锛�**闇�瑕侀噸瀵煎搴旀枃浠舵墠鑳藉洖濉�**锛堝凡鍒楀叆寰呭姙锛岀瓑鐢ㄦ埛纭锛夈��
+2. **琛ㄧ粨鏋勫彉鏇村繀椤诲悓姝ヤ笁澶�**锛氭湰娆¢娆″彧鏀逛簡搴撲笌瀹炰綋锛屾紡浜� `docs/init.sql` / `docs/database.md`锛屽凡琛ラ綈銆�
+3. **鏇挎崲閿氱偣涓嶅敮涓�瀵艰嚧鏀归敊鏂囨。**锛歚docs/database.md` 涓� `| enterprise_name | varchar(200) | 浼佷笟鍚嶇О |` 鍑虹幇 4 娆★紝棣栨鎵归噺鏇挎崲璇敼浜� H203-2 绛� 3 寮犺〃锛屽凡 `git checkout` 鍥為��骞舵敼涓恒�屽厛鎴彇 h2031 绔犺妭鍐嶆浛鎹€�嶃��
+
+## 浜斻�佺粨璁�
+
+- 鏂版ā鏉夸笌鑰佹牸寮�**鍙屽悜鍏煎**锛屽鍏� 0 澶辫触锛屾娊鏌ュ垪閫愰」瀵归綈锛涙棫瀛楁鏈彈鍒楀彸绉诲奖鍝嶃��
+- 鏁版嵁搴撱�佸缓琛ㄨ剼鏈�佹暟鎹瓧鍏搞�佸疄浣撱�佸鍏ヨВ鏋愩�佸墠绔垪閰嶇疆**鍏涓�鑷�**銆�
+- 閬楃暀锛氬瓨閲忔湀浠斤紙2026-01 ~ 2026-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_\347\231\273\345\275\225\351\252\214\350\257\201\347\240\201\345\256\271\351\224\231\344\270\216\346\212\245\350\241\250\351\242\204\350\247\210\346\225\264\346\224\271_2026-09-16.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\231\273\345\275\225\351\252\214\350\257\201\347\240\201\345\256\271\351\224\231\344\270\216\346\212\245\350\241\250\351\242\204\350\247\210\346\225\264\346\224\271_2026-09-16.md"
new file mode 100644
index 0000000..4f8392e
--- /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\231\273\345\275\225\351\252\214\350\257\201\347\240\201\345\256\271\351\224\231\344\270\216\346\212\245\350\241\250\351\242\204\350\247\210\346\225\264\346\224\271_2026-09-16.md"
@@ -0,0 +1,51 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氱櫥褰曢獙璇佺爜瀹归敊 + 鎶ヨ〃棰勮鏁存敼锛堟寚鏍囬敊浣� / 寮圭獥鎷栧姩鍦嗚 / 澶辫触鎻愮ず锛�
+
+- 鏃ユ湡锛�2026-09-16
+- 妯″潡锛氱櫥褰曢〉銆佹姤琛ㄧ敓鎴�-姹囨�诲ぇ琛ㄩ瑙�
+- 缁撹锛�**閫氳繃**锛�4 涓棶棰樺叏閮ㄤ慨澶嶏紝娴忚鍣ㄥ疄娴嬪彇璇侊級
+
+## 涓�銆佸姛鑳借鏄�
+
+鐢ㄦ埛鍙嶉 3 涓棶棰橈細
+
+| # | 鐢ㄦ埛鎻忚堪 | 鏍瑰洜 | 淇 |
+|---|----------|------|------|
+| 1 | 鎹� WiFi 鍚庣櫥褰曢〉鍑虹幇楠岃瘉鐮佺櫧鑹叉柟妗嗐�佹彁绀恒�岄獙璇佺爜鍔犺浇澶辫触锛岃妫�鏌ョ綉缁溿�� | 鍚庣 `app.captcha.required=false` 宸茬鐢ㄩ獙璇佺爜锛屼絾鍓嶇 `Login.vue` 鐨� `captchaRequired` 榛樿鍊兼槸 `true`锛屼笖 `/api/auth/captcha-config` 璇锋眰澶辫触鏃� `.catch(() => {})` **闈欓粯蹇界暐**锛岄〉闈㈡畫鐣欎竴涓姞杞戒笉鍑烘潵鐨勯獙璇佺爜妗� | 榛樿鍊兼敼 `false`锛涙敼涓� fail-safe锛氫粎褰撳悗绔槑纭繑鍥� `code===200 && data.required===true` 鎵嶆樉绀洪獙璇佺爜锛岃姹傚紓甯镐竴寰嬫寜銆屼笉闇�瑕侀獙璇佺爜銆嶅鐞� |
+| 2 | 鎶ヨ〃鐢熸垚-姹囨�诲ぇ琛ㄩ瑙堬細鐐瑰嚮鍚庡脊銆屽鍑哄け璐ワ紝璇风‘璁ゅ鍏ユ暟鎹紝鎴栨煡鐪嬪悗绔棩蹇椼�� | 鍓嶇 `failWith(err, action)` 鎶�**鎵�鏈�**寮傚父锛堝惈缃戠粶/浠g悊灞傚け璐ワ級閮芥覆鏌撴垚鍚屼竴鍙ョ缁熸枃妗堬紝榛樿 action 杩樻槸銆屽鍑恒�嶏紝璇璇绘垚鏁版嵁闂 | 閲嶅啓 `failWith` + 鏂板 `errReason(raw)`锛氬尯鍒嗐�岃繛涓嶄笂鏈嶅姟鍣ㄣ�嶄笌銆屽悗绔湡瀹炲師鍥犮�嶏紱棰勮璋冪敤浼� `action='棰勮'`锛汢lob 閿欒鍝嶅簲鍏� `text()` 鍐嶈В鏋� |
+| 3 | 棰勮寮圭獥鎸囨爣閿欎綅锛堟寚鏍囧帇鍦ㄣ�屽綋鏈堣揣杩愰噺銆嶄笂锛夛紱寮圭獥涓嶅彲鎷栧姩銆佹棤鍦嗚 | 琛ㄥご鏄� 3 鍒楋紙鎸囨爣/鏁版嵁/鍚屾瘮锛夛紝涓� 4 鍒楁暟鎹锛堝垎绫�/鎸囨爣/鏁版嵁/鍚屾瘮锛変笉鍖归厤锛汦lement UI 2.15.14 **娌℃湁** `draggable` 灞炴�э紙閭f槸 Element Plus锛� | 琛ㄥご琛ヤ负 4 鍒� `鍒嗙被/鎸囨爣/鏁版嵁/鍚屾瘮`锛涙柊澧� `v-dialog-drag` 鎸囦护瀹炵幇鎷栧姩锛堝彧鏀� `.el-dialog` 鐨� `transform`锛屽叧闂椂澶嶄綅锛夛紝鍔� `border-radius:10px` |
+
+鏀瑰姩鏂囦欢锛歚traffic-audit-web/src/views/Login.vue`銆乣traffic-audit-web/src/views/ReportExport.vue`銆佹柊澧� `traffic-audit-web/src/directives/dialogDrag.js`銆乣traffic-audit-web/src/main.js`锛堟敞鍐屾寚浠わ級銆�
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 鍓嶇锛歚http://localhost:8080`锛坴ue-cli-service serve锛宒ev 鏋勫缓锛�
+- 鍚庣锛�8090锛坄Started TrafficAuditApplication`锛岄噸鍚悗鏂扮紪璇戯級
+- 娴忚鍣細Codex 鍐呭祵娴忚鍣紙瑙嗗彛绾� 319脳790锛夛紝鍙栬瘉鏂瑰紡 `tab.playwright.evaluate()` 鐩磋 DOM + 鎴浘
+
+## 涓夈�佺敤渚嬭〃
+
+| # | 鍦烘櫙 | 杈撳叆/鎿嶄綔 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|------|-----------|------|------|------|
+| 1 | 楠岃瘉鐮�-鍚庣宸插叧闂� | 鏂板紑鏍囩璁块棶 `#/login`锛堝悗绔笉鍙敤鏃跺悓鏍烽獙璇侊級 | 涓嶅嚭鐜伴獙璇佺爜鏂规锛屼笉鍑虹幇銆岄獙璇佺爜鍔犺浇澶辫触銆� | 椤甸潰鏃� `.captcha-box`锛屾彁绀恒�屾祴璇曟ā寮忥細琛屼负楠岃瘉鐮佸凡璺宠繃銆� | 閫氳繃 |
+| 2 | 楠岃瘉鐮�-鎺ュ彛姝e父 | `GET /api/auth/captcha-config` | `required=false` | `{"code":200,"message":"success","data":{"required":false}}` | 閫氳繃 |
+| 3 | 棰勮-琛ㄥご鍒楁暟 | 鎵撳紑棰勮寮圭獥璇� `thead th` | 4 鍒椾笖椤哄簭涓� 鍒嗙被/鎸囨爣/鏁版嵁/鍚屾瘮 | `['鍒嗙被','鎸囨爣','鏁版嵁','鍚屾瘮']` | 閫氳繃 |
+| 4 | 棰勮-鎸囨爣瀵归綈 | 璇婚琛屽悇鍗曞厓鏍� x 鍧愭爣 | 鍒嗙被瀵归綈銆岄亾璺揣杩愩�嶃�佹寚鏍囧榻愩�屽綋鏈堣揣杩愰噺(涓囧惃)銆嶃�佹暟鎹榻� 16888.76銆佸悓姣斿湪鏁版嵁鍙充晶 | 鍒嗙被 x=35銆佹寚鏍� x=118銆佹暟鎹� x=394銆佸悓姣� x=587锛坄16888.76` 鍦� x=394锛� | 閫氳繃 |
+| 5 | 棰勮-寮圭獥鍦嗚 | 璇� `.el-dialog` 璁$畻鏍峰紡 | 鏈夊渾瑙� | `borderRadius=10px`銆乣overflow=hidden` | 閫氳繃 |
+| 6 | 棰勮-寮圭獥鎷栧姩 | `tab.drag([150,60],[270,220])` 鎷栨爣棰樻爮 | 寮圭獥璺熼殢绉诲姩 | 鐢� `(0,40)` 鈫� `(120,200)`锛宍transform=matrix(1,0,0,1,120,160)`锛屼綅绉婚噺绛変簬鎷栨嫿澧為噺 | 閫氳繃 |
+| 7 | 棰勮-鍏抽棴澶嶄綅 | 鍏抽棴寮圭獥鍚庤 transform | 澶嶄綅涓� none | `transform=none`銆乣visible=false` | 閫氳繃 |
+| 8 | 棰勮-涓彛寰勪箣鍚庢棤琛ㄦ牸 | 璇诲脊绐楀唴 `table` 鏁伴噺涓庡唴瀹� | 鏈変笖浠呮湁 1 寮犳寚鏍囪〃 | 寮圭獥鍐� 1 寮犺〃锛�12 琛屾寚鏍囷紝鍚腑鍙e緞 4 琛岋級锛岃〃涓嬩粎涓ゆ潯鍚屾瘮缂哄け鎻愮ず涓庛�屽叧闂�嶆寜閽� | 閫氳繃 |
+| 9 | 澶辫触鎻愮ず-缃戠粶寮傚父 | 鍚庣鍋滄帀鏃剁偣棰勮 | 鏄庣‘鎻愮ず缃戠粶/鏈嶅姟鏈惎鍔紝鑰岄潪銆屽鍑哄け璐ワ紝璇风‘璁ゅ鍏ユ暟鎹�� | `棰勮澶辫触锛氭棤娉曡繛鎺ユ湇鍔″櫒锛岃妫�鏌ョ綉缁滆繛鎺ワ紝鎴栫‘璁ゅ悗绔湇鍔℃槸鍚﹀凡鍚姩` | 閫氳繃 |
+| 10 | 瀵煎嚭-姝e父璺緞 | 鐐广�屽鍑恒�� | 涓嬭浇鎴愬姛鎻愮ず | `鎶ヨ〃瀵煎嚭鎴愬姛` | 閫氳繃 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+1. **銆屽鍑哄け璐ワ紝璇风‘璁ゅ鍏ユ暟鎹紝鎴栨煡鐪嬪悗绔棩蹇椼�嶄笉鏄暟鎹棶棰�**锛氱敤 API 閫愭湀鐩磋繛 `/api/report/preview` 涓� `/api/report/export/summaryWorkbook` 鍏ㄩ儴杩斿洖 200锛�2026-08 瀵煎嚭 950747 瀛楄妭锛夈�傝鏂囨鍙湪**缃戠粶/浠g悊灞傚け璐�**鏃跺嚭鐜帮紙鎹� WiFi 鍚庤姹傛墦涓嶅埌鍚庣锛夛紝灞炰簬鎻愮ず璇銆傜幇宸叉敼涓哄尯鍒嗗叿浣撳師鍥犮��
+2. **Element UI 2.15.14 涓嶆敮鎸� `draggable`**锛氬脊绐楁嫋鍔ㄥ彧鑳借嚜宸卞疄鐜帮紝宸茬敤 `v-dialog-drag` 鎸囦护锛沗<style>` 蹇呴』**闈� scoped**锛坋l-dialog 榛樿 append-to-body锛夈��
+3. **娴忚鍣ㄨ嚜鍔ㄥ寲鍙栬瘉鐨勫潙**锛歚tab.click(index)` 鐨勭储寮曞湪椤甸潰鍒锋柊鍚庝細澶辨晥锛屾浘璇偣鍒般�屾姇璧勬姤琛ㄣ�峊ab锛汸laywright locator 鐐� Element UI 琛ㄦ牸鍐呮寜閽細瓒呮椂锛沗tab.drag` 鍧愭爣蹇呴』鍦ㄨ鍙e唴銆備互涓婂潎宸茶鍏ャ�婇棶棰樹笌娉ㄦ剰浜嬮」姹囨�汇�嬨��
+4. 棰勮寮圭獥鏍囬鍦ㄦ湭鎵撳紑鏃舵樉绀轰负銆岄瑙堟暟鎹� - 锛堬級銆嶏紝灞炴湭璧嬪�肩姸鎬侊紝涓嶅奖鍝嶄娇鐢ㄣ��
+
+## 浜斻�佺粨璁�
+
+- 4 涓棶棰樺叏閮ㄤ慨澶嶅苟鏈夋祻瑙堝櫒瀹炴祴璇佹嵁锛堣〃澶� 4 鍒椾笖 x 鍧愭爣瀵归綈銆佸渾瑙� 10px銆佹嫋鍔ㄤ綅绉� 120/160銆佸叧闂浣嶃�佹棤绗簩寮犺〃銆佸け璐ユ彁绀哄凡缁嗗垎锛夈��
+- 銆屼腑鍙e緞涔嬪悗涓嶅啀娓叉煋琛ㄦ牸銆嶇殑涓撻」楠岃瘉瑙併�婂姛鑳芥祴璇曟姤鍛奯姹囨�诲ぇ琛ㄩ瑙堝垹闄や腑鍙e緞鍚庢槑缁嗚〃_2026-09-16.md銆嬨��
+- 閬楃暀锛氶瑙堝脊绐楀唴銆屽叡 0 琛屻�嶄笌銆屾湀搴﹁鐩栵細1~8鏈堝潎鏈夋暟鎹�嶄袱涓彛寰勬枃妗堜笉鍚岋紝鏄撹瑙o紝绛夌敤鎴风‘璁ゅ悗璋冩暣銆�
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\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\2172023\345\271\264\346\225\260\346\215\256\350\241\245\345\275\225_2026-09-16.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\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\2172023\345\271\264\346\225\260\346\215\256\350\241\245\345\275\225_2026-09-16.md"
new file mode 100644
index 0000000..106356e
--- /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\264\247\350\277\220\351\207\217\345\221\250\350\275\254\351\207\2172023\345\271\264\346\225\260\346\215\256\350\241\245\345\275\225_2026-09-16.md"
@@ -0,0 +1,49 @@
+# 鍔熻兘娴嬭瘯鎶ュ憡锛氳揣杩愰噺/鍛ㄨ浆閲� 2023 骞存暟鎹ˉ褰曞叆搴�
+
+- 鏃ユ湡锛�2026-09-16
+- 妯″潡锛氭暟鎹鍏� / 璐ц繍閲忓懆杞噺
+- 缁撹锛�**閫氳繃**锛堟鍚� 1 鏉°�佸叆搴撴娊鏌� 216 椤瑰叏瀵归綈銆佷笂骞村悓鏈� 1 鏉°�佸箓绛�/鍥炲綊 2 鏉★級
+
+## 涓�銆佸姛鑳借鏄�
+
+鐢ㄦ埛鍙嶉銆�2023 骞存湁 12 鏈堢殑鏁版嵁銆嶏紝鑰屼笂杞叆搴撲娇鐢ㄧ殑 8 鏈堟簮鏂囦欢**缂� 2023 骞� Sheet**锛堝彧鏈� `2026骞�/2025骞�/2024骞�/2022骞�/2021骞碻锛夛紝鍥犳搴撻噷娌℃湁 `2023-12`銆�
+
+鎺掓煡鍚庡湪 7 鏈堟簮鏂囦欢涓壘鍒� 2023 骞存暟鎹紝灏嗗叾琛ュ綍鍏ュ簱锛�
+| 椤� | 鍐呭 |
+|----|------|
+| 鏁版嵁鏉ユ簮 | `D:\05_鏁版嵁鍒嗙被\璐ц繍\7鏈圽瀹氱-婀栧寳鐪佸悇甯傚窞杩愯緭閲忔暟鎹紙2026骞�1-7鏈堬級.xlsx` 鐨� `2023` Sheet |
+| 琛ュ綍鏂瑰紡 | 鍙﹀瓨涓存椂宸ヤ綔绨� `_2023_import_tmp.xlsx`锛堜粎淇濈暀 `2023` + `2022骞碻 涓や釜 Sheet锛屾弧瓒冲骞村害宸ヤ綔绨裤�岃嚦灏� 2 涓� Sheet銆嶈鍒欙級锛岃蛋 `POST /api/import/freightTurnover?period=2023-12` |
+| 缁撴灉 | `璐ц繍閲忓懆杞噺瀵煎叆鎴愬姛, 鍏� 36 鏉¤褰昤锛�18 鍦板競 脳 2 涓姤琛ㄦ湡锛�2022-12 閲嶅啓 + 2023-12 鏂板锛� |
+
+**涓轰粈涔堝甫涓� 2022 骞� Sheet**锛歚2023` 鐨勪笂骞村悓鏈熷彇鑷�屼笂涓�骞村害 Sheet銆嶏紝鍙斁 2023 浼氬鑷� 2023 鐨� `last_*` 涓虹┖锛涘悓鏃堕伩鍏嶆暣鏈鍏� 7 鏈堟枃浠惰�屽鍑烘棤鐢ㄧ殑 `2026-07` 鎶ヨ〃鏈熴��
+
+## 浜屻�佹祴璇曠幆澧�
+
+- 鍚庣锛氶噸鍚悗鏂扮紪璇戯紝`Tomcat started on port(s): 8090`锛孭ID 31384
+- 鏁版嵁搴擄細`traffic_audit.freight_turnover_import`
+- 婧愭枃浠讹細7 鏈堟枃浠� `2023` Sheet锛圓1:N48锛歚璐ц繍閲�(涓囧惃)` 鍧� + `鍛ㄨ浆閲�(涓囧惃鍏噷)` 鍧楋紝1鈥�12 鏈� + 绱鍒楋級
+
+## 涓夈�佺敤渚嬭〃
+
+| # | 鍦烘櫙 | 杈撳叆 | 棰勬湡 | 瀹為檯 | 缁撹 |
+|---|------|------|------|------|------|
+| 1 | 姝e悜-2023 鍏ュ簱 | `_2023_import_tmp.xlsx` 鈫� freightTurnover | 鐢熸垚 `2023-12`锛�18 琛� | `鍏� 36 鏉¤褰昤锛沗SELECT report_period,COUNT(*)` 鍑虹幇 `2023-12 = 18` | 閫氳繃 |
+| 2 | 鍏ュ簱鎶芥煡-閫愭牸姣斿 | 2023 Sheet 璐ц繍閲忓潡 + 鍛ㄨ浆閲忓潡锛�18 鍦板競 脳 12 鏈� 脳 2 鎸囨爣 = 432 椤癸級 | 涓庡簱涓� `freight_m01..m12` / `turnover_m01..m12` 瀹屽叏涓�鑷� | **mismatches = 0**锛�18 涓湴鍖哄叏閮ㄥ尮閰嶏級 | 閫氳繃 |
+| 3 | 涓婂勾鍚屾湡 | 鏌� 2023-12 鐨� `last_freight_*` / `last_turnover_*` | 绛変簬 2022 骞村悓鏈堝�� | 姝︽眽 `last_freight_m01=3527.89407360113`銆乣last_freight_m12=4334.42636773157`銆乣last_turnover_m12=608823.495390257`锛屼笌 `2022-12` 琛岄�愬�肩浉鍚� | 閫氳繃 |
+| 4 | 鎶ヨ〃鏈熸竻鍗曞洖褰� | 鏌ュ叏閮ㄦ姤琛ㄦ湡 | 鏃犻噸澶嶃�佹棤 2099 娈嬬暀 | 2021-12 / 2022-12 / **2023-12** / 2024-12 / 2025-12 / 2026-01鈥�2026-08锛屾瘡鏈� 18 琛� | 閫氳繃 |
+| 5 | 鍘嗗彶鏈熸湭琚薄鏌� | 2022-12 閲嶅啓鍚庝笌鍘熷�兼瘮杈� | 瀹屽叏涓�鑷� | 涓庢敼鍔ㄥ墠 2022-12 閫愬�肩浉鍚� | 閫氳繃 |
+
+## 鍥涖�佸彂鐜扮殑闂涓庡缃�
+
+| # | 闂 | 澶勭疆 |
+|---|------|------|
+| 1 | 8 鏈堟簮鏂囦欢鏃� 2023 骞� Sheet锛屽鑷村簱閲岄暱鏈熺己 `2023-12`銆佷笖 `2024-12` 鏃犱笂骞村悓鏈� | 浠� 7 鏈堟簮鏂囦欢琛ュ綍 `2023-12`锛沗2024-12` 鐨勪笂骞村悓鏈熸湰娆�**鏈噸绠�**锛堥渶閲嶅 2024 鎵嶄細鐢熸晥锛夛紝濡傞渶鍙彟琛岃ˉ瀵� |
+| 2 | 7 鏈堟枃浠朵笌 8 鏈堟枃浠剁殑 2021/2022/2024 涓夊勾鏁版嵁鏄惁涓�鑷存棤娉曠‘瀹� | 閫愭牸姣斿锛歚onlyJuly/onlyAug/differ` 鍏ㄩ儴涓虹┖锛�**涓夊勾 0 澶勫樊寮�**锛屽洜姝よˉ瀵� 2022 涓嶄細寮曞叆鍋忓樊 |
+| 3 | 鑻ユ暣鏈鍏� 7 鏈堟枃浠朵細澶氬嚭 `2026-07` 鎶ヨ〃鏈� | 鏀逛负鍙繚鐣� `2023 + 2022骞碻 涓や釜 Sheet 鐨勪复鏃跺伐浣滅翱锛岄伩鍏嶄骇鐢熸棤鐢ㄦ湡娆� |
+| 4 | 鍗� Sheet 鏂囦欢涓嶄細琚瘑鍒负澶氬勾搴﹀伐浣滅翱 | 宸插湪鏈姤鍛婁笌銆婇棶棰樹笌娉ㄦ剰浜嬮」姹囨�汇�嬩腑璁板綍璇ヨ鍒欙紝渚涘悗缁ˉ鏁板弬鑰� |
+
+## 浜斻�佺粨璁�
+
+- 2023 骞磋揣杩愰噺/鍛ㄨ浆閲忓凡瀹屾暣鍏ュ簱锛�18 鍦板競 脳 12 鏈堬級锛�**432 椤归�愭牸姣斿闆跺樊寮�**锛屼笂骞村悓鏈熸纭彇鑷� 2022 骞淬��
+- 鎶ヨ〃鏈熸竻鍗曡繛璐細2021-12 鈫� 2026-08 鍏� 13 鏈燂紝姣忔湡 18 琛屻��
+- 閬楃暀锛歚2024-12` 鐨勪笂骞村悓鏈燂紙2023 骞村�硷級鏈洖濉紝濡傞渶瑕佸彲閲嶅 2024 骞存暟鎹��
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-16.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-16.md"
index c214d53..a4c4f85 100644
--- "a/docs/\345\267\245\344\275\234\346\227\245\347\273\223/\345\267\245\344\275\234\346\227\245\347\273\223_2026-09-16.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-16.md"
@@ -77,4 +77,74 @@
1. 涓庣敤鎴风‘璁� `2021-12` / `2022-12` 绛夈�屾暣骞存姤琛ㄦ湡銆嶇殑涓氬姟鍙e緞锛屼互鍙婃槸鍚﹂渶瑕佹妸骞村害鏁版嵁鎷嗘垚閫愭湀鎶ヨ〃鏈熴��
2. 纭鏄惁闇�瑕佽ˉ 2023 骞存暟鎹�佷互鍙� `2026-01`~`2026-07` 鐨勪笂骞村悓鏈熸槸鍚﹂渶瑕佽ˉ榻愩��
3. 瑙嗙敤鎴锋剰瑙佸鐞嗛瑙堝脊绐椼�屽叡 0 琛屻�嶆枃妗堛��
-4. 缃戠粶鎭㈠鍚庤ˉ鎺ㄥ叕鍙� gitea銆�
\ No newline at end of file
+4. 缃戠粶鎭㈠鍚庤ˉ鎺ㄥ叕鍙� gitea銆�
+---
+
+## 鍗併�佸倣鏅氳拷鍔狅紙绗� 3 杞敤鎴峰弽棣� 6 鏉★紝2026-09-16锛�
+
+鐢ㄦ埛鏈疆鎻愬嚭 6 鏉″弽棣堬紝閫愭潯澶勭悊缁撴灉濡備笅锛�
+
+| # | 鐢ㄦ埛鍙嶉 | 澶勭悊缁撴灉 |
+|---|----------|----------|
+| 1 | 21鈥�26 骞磋揣杩愰噺鍛ㄨ浆閲忚〃鏁版嵁鍏ュ簱 | 涓婅疆宸插畬鎴愶紙`0cfd6e0`锛夛紝鏈疆琛ラ綈 2023 骞达紙瑙� #2锛� |
+| 2 | 鐢ㄦ埛鏍稿疄銆�23 骞存湁 12 鏈堢殑鏁版嵁銆� | **灞炲疄**銆�8 鏈堟簮鏂囦欢纭疄娌℃湁 2023 骞� Sheet锛屼絾 7 鏈堟枃浠� `D:\05_鏁版嵁鍒嗙被\璐ц繍\7鏈圽瀹氱-婀栧寳鐪佸悇甯傚窞杩愯緭閲忔暟鎹紙2026骞�1-7鏈堬級.xlsx` 閲屾湁涓�涓悕涓� `2023` 鐨� Sheet銆傚凡鍙﹀瓨 `_2023_import_tmp.xlsx`锛坄2023` + `2022骞碻 涓や釜 Sheet锛夊鍏ワ紝鐢熸垚 `2023-12`锛�18 琛岋級锛�**432 椤归�愭牸姣斿闆跺樊寮�** |
+| 3 | 瑕佷竴浠姐�屾墍鏈夎娉ㄦ剰鐨勭偣銆嶇殑姹囨�绘枃妗� | 鏂板缓 `docs/闂姹囨��/闂涓庢敞鎰忎簨椤规眹鎬籣2026-09-16.md`锛�11 绔� + 閫熸煡琛紝鍚惎鍔�/杩涚▼銆佹棩蹇楅獙璇併�佹暟鎹簱銆佸鍏ヨ矾寰勪笌鏈熸绾﹀畾銆佹姤琛ㄣ�侀獙璇佺爜銆佹枃浠剁紪鐮併�佹祻瑙堝櫒鍙栬瘉銆乬it 鍙屼粨搴撱�侀仐鐣欓棶棰橈級 |
+| 4 | 鎹� WiFi 鍚庣櫥褰曢〉鍑虹幇楠岃瘉鐮佺櫧妗� + 銆岄獙璇佺爜鍔犺浇澶辫触銆� | 宸蹭慨澶嶏紙鍓嶇榛樿鍊� + fail-safe锛夛紝鏈疆娴忚鍣ㄥ娴嬮�氳繃 |
+| 5 | 棰勮鐐逛竴涓嬪脊銆屽鍑哄け璐ワ紝璇风‘璁ゅ鍏ユ暟鎹�� | 宸蹭慨澶嶆彁绀洪�昏緫锛堝尯鍒嗙綉缁�/鍚庣鍘熷洜锛夛紱鍙﹀涓ゅ皬椤癸紙鎸囨爣閿欎綅銆佸脊绐楁嫋鍔ㄥ渾瑙掞級鏈疆娴忚鍣ㄥ疄娴嬮�氳繃 |
+| 6 | 鍏矾鏃呭 H203-1 妯℃澘琚慨鏀� | 宸查�傞厤骞堕獙璇侊細鏂板 `缁熶竴绀句細淇$敤浠g爜` / `濉姤鍗曚綅` 涓ゅ垪鍏ュ簱锛屾柊鑰佹牸寮忓弻鍚戝吋瀹� |
+
+### 1. 2023 骞磋揣杩愭暟鎹ˉ褰曪紙鐢ㄦ埛绗� 2 鏉★級
+
+- **鎺掓煡杩囩▼**锛氬厛纭 8 鏈堟簮鏂囦欢 5 涓� Sheet 鍏ㄤ负鍙銆佹棤 2023锛涘啀鍏ㄧ洏鎼滅储 `*杩愯緭閲�*`銆乣*23骞�*`銆乣*璐ц繍閲�*` 鏂囦欢鍚嶏紱鏈�鍚庢壂鎻� `D:\05_鏁版嵁鍒嗙被` 涓� `D:\妗岄潰` 涓嬫墍鏈� `.xlsx` 鐨� **Sheet 鍚�**锛屽懡涓� 7 鏈堟枃浠剁殑 `2023` Sheet銆�
+- **涓�鑷存�ч妫�**锛�7 鏈堜笌 8 鏈堟枃浠剁殑 `2021骞� / 2022骞� / 2024骞碻 涓夊勾鏁版嵁閫愭牸姣斿锛宍onlyJuly / onlyAug / differ` 鍏ㄤ负绌� 鈫� 涓夊勾**闆跺樊寮�**锛屽彲瀹夊叏鐢� 7 鏈堟枃浠惰ˉ 2022锛堜綔涓� 2023 鐨勪笂骞村悓鏈熸潵婧愶級銆�
+- **瀵煎叆**锛歚POST /api/import/freightTurnover?period=2023-12`锛岃繑鍥炪�屽叡 36 鏉¤褰曘�嶃��
+- **楠岃瘉**锛歚2023-12` 18 琛岋紱璐ц繍閲� + 鍛ㄨ浆閲忓叡 432 椤逛笌 Excel 閫愭牸姣斿 **mismatches=0**锛沗last_*` 涓� `2022-12` 閫愬�肩浉鍚岋紱鍏ㄩ儴鎶ヨ〃鏈� 2021-12 鈫� 2026-08 鍏� 13 鏈熴�佹瘡鏈� 18 琛屻��
+- 璇﹁銆婂姛鑳芥祴璇曟姤鍛奯璐ц繍閲忓懆杞噺2023骞存暟鎹ˉ褰昣2026-09-16.md銆嬨��
+
+### 2. H203-1 妯℃澘鏂板鍒楅�傞厤锛堢敤鎴风 6 鏉★級
+
+- **妯℃澘 diff 缁撹**锛歋heet1 鐢� 773脳50 鈫� 816脳52锛涘湪銆屼紒涓氬悕绉般�嶅悗鎻掑叆 `缁熶竴绀句細淇$敤浠g爜`銆乣濉姤鍗曚綅` 涓ゅ垪锛屽叾浣� 48 鍒楁暣浣撳彸绉汇��
+- **鏀瑰姩 6 澶�**锛氬簱 DDL銆乣docs/init.sql`銆乣docs/database.md`銆乣PassengerEnterpriseMonthly.java`銆乣DataImportService.java`銆乣DataViewController.java`锛堟暟鎹煡鐪嬮〉鍒楋級銆�
+- **楠岃瘉**锛氭柊妯℃澘瀵煎叆 814 鏉� 0 澶辫触锛屽洓椤规眹鎬伙紙瀹㈣繍杞﹁締 24584 / 鏍稿畾杞藉浣� 711018 / 瀹㈣繍閲� 16371625 / 鍛ㄨ浆閲� 1023386179锛変笌婧愭枃浠跺叏绛夛紱鑰佹牸寮� `.xls` 瀵煎叆 767 鏉� 0 澶辫触涓旀柊鍒楁湁鍊硷紙**鑰佹枃浠跺叾瀹炰篃甯﹁繖涓ゅ垪**锛夛紝鏁板�间笌鏃㈡湁 2026-08 瀹屽叏涓�鑷达紱璐熷悜鐢ㄤ緥锛堥�夐敊绫诲瀷锛夋姤閿欐竻鏅般��
+- **杩囩▼涓殑澶辫**锛歚docs/database.md` 閲� `| enterprise_name | varchar(200) | 浼佷笟鍚嶇О |` 鍑虹幇 4 娆★紝棣栨鎵归噺鏇挎崲璇敼 3 寮犺〃锛屽凡 `git checkout` 鍥為��鍚庢敼涓恒�屾埅鍙栫珷鑺傚啀鏇挎崲銆嶃��
+- 璇﹁銆婂姛鑳芥祴璇曟姤鍛奯H2031妯℃澘鏂板鍒楅�傞厤_2026-09-16.md銆嬨��
+
+### 3. 鐧诲綍楠岃瘉鐮佸閿� + 鎶ヨ〃棰勮鏁存敼锛堢敤鎴风 4銆�5 鏉★級
+
+- **楠岃瘉鐮�**锛歚Login.vue` 榛樿 `captchaRequired=false`锛屾敼涓� fail-safe锛堜粎鍚庣鏄庣‘杩斿洖 `required===true` 鎵嶆樉绀猴級锛涙崲 WiFi/鍚庣涓嶅彲杈炬椂涓嶅啀娈嬬暀楠岃瘉鐮佺櫧妗嗐��
+- **澶辫触鎻愮ず**锛歚failWith(err, action)` + `errReason(raw)` 閲嶅啓锛屽尯鍒嗐�岃繛涓嶄笂鏈嶅姟鍣ㄣ�嶄笌銆屽悗绔湡瀹炲師鍥犮�嶏紱棰勮璋冪敤甯� `action='棰勮'`锛汢lob 閿欒鍏� `text()` 鍐嶈В鏋愩��
+- **鎸囨爣閿欎綅**锛氶瑙堣〃澶寸敱 3 鍒楄ˉ涓� 4 鍒楋紙鍒嗙被/鎸囨爣/鏁版嵁/鍚屾瘮锛夛紝瀹炴祴 x 鍧愭爣 35 / 118 / 394 / 587锛宍16888.76` 钀藉湪銆屾暟鎹�嶅垪銆�
+- **寮圭獥鎷栧姩 + 鍦嗚**锛氭柊澧� `dialogDrag.js` 鎸囦护锛圗lement UI 2.15.14 鏃� `draggable`锛夛紝`border-radius:10px`锛涘疄娴嬫嫋鍔� `(0,40) 鈫� (120,200)`锛宍transform=matrix(1,0,0,1,120,160)`锛屽叧闂悗澶嶄綅 `none`銆�
+- 銆屼腑鍙e緞涔嬪悗涓嶅啀娓叉煋琛ㄦ牸銆嶄笂杞凡淇紝鏈疆澶嶆牳寮圭獥鍐�**鏈変笖浠呮湁涓�寮犺〃**銆�
+- 璇﹁銆婂姛鑳芥祴璇曟姤鍛奯鐧诲綍楠岃瘉鐮佸閿欎笌鎶ヨ〃棰勮鏁存敼_2026-09-16.md銆嬨��
+
+### 4. 娉ㄦ剰浜嬮」姹囨�绘枃妗o紙鐢ㄦ埛绗� 3 鏉★級
+
+鏂板缓 `docs/闂姹囨��/闂涓庢敞鎰忎簨椤规眹鎬籣2026-09-16.md`锛屽叡 11 绔狅細
+閫熸煡琛紙10 鏉★級銆佸惎鍔ㄤ笌杩涚▼绠$悊銆佹湇鍔$姸鎬侀獙璇併�佹暟鎹簱銆佹暟鎹鍏ワ紙璺緞 + 鏈熸绾﹀畾 + 澶氬勾搴﹀伐浣滅翱璇嗗埆瑙勫垯锛夈�佹姤琛ㄧ敓鎴愩�佺櫥褰曚笌楠岃瘉鐮併�佹枃浠跺啓鍏ヤ笌鏂囨湰澶勭悊鐨勫潙銆佹祻瑙堝櫒鑷姩鍖栧彇璇佺殑鍧戙�丟it 鍙屼粨搴撳伐浣滄祦銆佸綋鍓嶅凡鐭ラ仐鐣欓棶棰樸��
+
+## 鍗佷竴銆佹祴璇曠粨鏋滄憳瑕侊紙鍌嶆櫄杩藉姞閮ㄥ垎锛�
+
+- **2023 琛ュ綍**锛�5 鏉$敤渚嬶級锛氭鍚戝叆搴撱��432 椤归�愭牸姣斿闆跺樊寮傘�佷笂骞村悓鏈熷彇鑷� 2022銆佹姤琛ㄦ湡娓呭崟鏃犻噸澶�/鏃犳畫鐣欍��2022-12 閲嶅啓鍚庨�愬�间笉鍙� 鈥斺�� 鍏ㄩ儴閫氳繃銆�
+- **H203-1 鏂板鍒�**锛�9 鏉$敤渚嬶級锛氭柊妯℃澘 814 鏉� 0 澶辫触銆佷袱鍒� 814/814 鏈夊�笺�侀琛屼笌姹囨�诲洓椤逛笌婧愭枃浠跺叏绛夈�佽�佹牸寮� 767 鏉� 0 澶辫触涓旀暟鍊间笌 2026-08 鍏ㄧ瓑銆丒xcel COM 鎶芥煡棣栬涓�鑷淬�佽礋鍚戦�夐敊绫诲瀷鎶ラ敊娓呮櫚銆佸垪鍙崇Щ涓嶅奖鍝嶆棫瀛楁 鈥斺�� 鍏ㄩ儴閫氳繃銆�
+- **鐧诲綍楠岃瘉鐮� + 棰勮鏁存敼**锛�10 鏉$敤渚嬶級锛氭棤楠岃瘉鐮佺櫧妗嗐�佹帴鍙� `required=false`銆佽〃澶� 4 鍒椾笖 x 鍧愭爣瀵归綈銆佸渾瑙� 10px銆佹嫋鍔ㄤ綅绉� 120/160銆佸叧闂浣嶃�佸脊绐楀唴浠� 1 寮犺〃銆佸け璐ユ彁绀哄凡缁嗗垎銆佸鍑烘垚鍔� 鈥斺�� 鍏ㄩ儴閫氳繃銆�
+- **娴嬭瘯鏁版嵁娓呯悊**锛欻203-1 瀵煎叆楠岃瘉浜х敓鐨� `2099-06 / 2099-07 / 2099-09` 涓変釜娴嬭瘯鏈燂紙鍏� 2395 琛岋級鍙婂叾 `import_batch` 璁板綍宸插垹闄わ紝`h2031_enterprise_monthly` 鎭㈠涓� 2026-01 ~ 2026-08 鍏� 8 鏈燂紱`freight_turnover_import` 涓� 13 鏈� 脳 18 琛屻��
+
+## 鍗佷簩銆侀仐鐣欓棶棰樹笌寰呭姙锛堝倣鏅氭洿鏂帮級
+
+| # | 闂 | 鐘舵�� |
+|---|------|------|
+| 1 | 8 鏈堟簮鏂囦欢缂� 2023 骞� Sheet | **宸茶В鍐�**锛堢敤 7 鏈堟枃浠惰ˉ褰� `2023-12`锛� |
+| 2 | `2026-01` ~ `2026-07` 鐨� `last_*` 涓虹┖ | 寰呯敤鎴风‘璁ゆ槸鍚﹁ˉ |
+| 3 | `2026-01` ~ `2026-08` 鐨� H203-1 `unified_credit_code` / `report_unit` 涓虹┖锛堟鍓嶄唬鐮佹湭璇昏繖涓ゅ垪锛� | **寰呯敤鎴风‘璁ゆ槸鍚﹂噸瀵煎巻鍙叉枃浠跺洖濉�** |
+| 4 | `2024-12` 鐨勪笂骞村悓鏈熸湭鍥炲~锛堥渶閲嶅 2024 骞存暟鎹級 | 寰呯敤鎴风‘璁� |
+| 5 | 棰勮寮圭獥銆屽叡 0 琛屻�嶄笌銆屾湀搴﹁鐩栵細1~8鏈堝潎鏈夋暟鎹�嶅彛寰勬枃妗堜笉鍚� | 寰呯敤鎴风‘璁ゆ敼鏂囨 |
+| 6 | `2021-12` 绛夈�屾暣骞存姤琛ㄦ湡銆嶇殑涓氬姟鍙e緞 | 寰呯敤鎴风‘璁� |
+| 7 | 鍏徃 gitea 鎺ㄩ�侊紙缃戠粶鏃犲搷搴旓級 | 寰呰ˉ鎺紝**绂佸己鎺�** |
+| 8 | 浠撳簱鏍圭洰褰曞ぇ閲� `_*.*` 涓存椂鏂囦欢 | 缁忕敤鎴峰悓鎰忓悗鍐嶆竻鐞� |
+
+## 鍗佷笁銆佷笅涓�姝ヨ鍒掞紙鍌嶆櫄鏇存柊锛�
+
+1. 绛夌敤鎴风‘璁� 3 浠朵簨锛氭槸鍚﹂噸瀵� 2026 骞村巻鍙� H203-1 鏂囦欢鍥炲~涓ゅ垪銆佹槸鍚﹁ˉ `last_*` / `2024-12` 涓婂勾鍚屾湡銆侀瑙堝脊绐楁枃妗堟槸鍚﹁皟鏁淬��
+2. 缃戠粶鎭㈠鍚庤ˉ鎺ㄥ叕鍙� gitea锛堝厛 fetch 鍚堝苟锛岀寮烘帹锛夈��
+3. 瑙嗙敤鎴锋剰瑙佹竻鐞嗕粨搴撴牴鐩綍 `_*.*` 涓存椂鏂囦欢銆�
diff --git "a/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\351\227\256\351\242\230\344\270\216\346\263\250\346\204\217\344\272\213\351\241\271\346\261\207\346\200\273_2026-09-16.md" "b/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\351\227\256\351\242\230\344\270\216\346\263\250\346\204\217\344\272\213\351\241\271\346\261\207\346\200\273_2026-09-16.md"
new file mode 100644
index 0000000..e66d226
--- /dev/null
+++ "b/docs/\351\227\256\351\242\230\346\261\207\346\200\273/\351\227\256\351\242\230\344\270\216\346\263\250\346\204\217\344\272\213\351\241\271\346\261\207\346\200\273_2026-09-16.md"
@@ -0,0 +1,181 @@
+# 浜ら�氳揣杩愮粺璁″鏍哥郴缁� 鈥� 闂涓庢敞鎰忎簨椤规眹鎬�
+
+> 鐢ㄩ�旓細鎶婇」鐩繍琛屻�佹暟鎹鍏ャ�佹姤琛ㄧ敓鎴愩�佷粨搴撳崗浣滀腑鎵�鏈夈�岃俯杩囩殑鍧戙�嶉泦涓褰曪紝渚涘悗缁紑鍙戜笌杩愮淮蹇�熸煡闃呫��
+> 缁存姢鏂瑰紡锛氭柊鍙戠幇闂璇风洿鎺ュ湪鏈枃浠惰拷鍔狅紝骞舵敞鏄庢棩鏈熴��
+> 鏈�鍚庢洿鏂帮細2026-09-16
+
+---
+
+## 涓�銆侀�熸煡琛紙鏈�甯歌鐨� 10 鏉★級
+
+| # | 浜嬮」 | 姝g‘鍋氭硶 |
+|---|------|----------|
+| 1 | 鍚姩鍓嶅悗绔� | 椤圭洰鏍圭洰褰曟墽琛� `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1` |
+| 2 | 绔彛鍗犵敤鍒ゆ柇 | 鐪� `backend.log` / `traffic-audit-web/frontend.log`锛�**涓嶈**渚濊禆 `Get-NetTCPConnection` |
+| 3 | 鍚庣灏辩华鏍囧織 | 鏃ュ織鍑虹幇 `Started TrafficAuditApplication` + `Tomcat started on port(s): 8090` |
+| 4 | 鍓嶇灏辩华鏍囧織 | 鏃ュ織鍑虹幇 `Compiled successfully` + `App running at:` |
+| 5 | 杩炴暟鎹簱 | `mysql.exe --host=127.0.0.1 --port=3308 --user=root --default-character-set=utf8mb4 -D traffic_audit` |
+| 6 | 鍋滄棫杩涚▼ | 鎸� PID 绮剧‘鍋� `cmd 鈫� java(maven) 鈫� java(app)` 閾撅紱**涓嶈鏉� node_repl 鍜岀敤鎴疯嚜宸辩殑 cmd 绐楀彛** |
+| 7 | 鑴氭湰鎶ャ�屽凡娣诲姞浜嗗叿鏈夌浉鍚岄敭鐨勯」銆� | 鏈満鍚屾椂瀛樺湪 `Path` 涓� `PATH`锛屾敼鐢� `cmd.exe /c ... > log 2>&1`锛�**涓ョ鐢� `Start-Process`** |
+| 8 | 鍐欎腑鏂囨枃浠� | 鐢� UTF-8锛沗main.js` 甯� BOM 蹇呴』鍐欏洖 BOM锛涙敼鏂囦欢鍓嶅厛纭鍘熸枃浠舵槸 CRLF 杩樻槸 LF |
+| 9 | 鎻愪氦鍓� | 鍏堟祴璇� + 鍐欍�婂姛鑳芥祴璇曟姤鍛娿��+ 鏇存柊銆婂伐浣滄棩缁撱�嬶紝鍐� fetch/鍚堝苟/鎺ㄩ�� |
+| 10 | 鎺ㄥ叕鍙� gitea | 鍏� `git fetch gitea` 涓庤繙绔� `main` 鍚堝苟锛�**绂佹寮烘帹** |
+
+---
+
+## 浜屻�佸惎鍔ㄤ笌杩涚▼绠$悊
+
+| 闂 | 鍘熷洜 | 澶勭疆 |
+|------|------|------|
+| `Start-Process` 鎶ャ�屽凡娣诲姞浜嗗叿鏈夌浉鍚岄敭鐨勯」銆� | 鐜鍙橀噺鍚屾椂瀛樺湪 `Path` 涓� `PATH`锛堝�肩浉鍚岋級 | 缁熶竴鐢� `cmd.exe /c ... > log 2>&1` 鎴� `ProcessStartInfo` 鍚姩 |
+| 鍓嶇鍦ㄦ矙绠卞唴璧蜂笉鏉ワ紙`EPERM: lstat`锛� | node 璁块棶鐢ㄦ埛鐩綍琚矙绠辨嫤鎴� | `start-dev.ps1` 鏁翠綋鍦ㄦ矙绠卞鎵ц |
+| 宓屽 `powershell.exe -Command` 寮曞彿琚牬鍧� | 澶栧眰 shell 鍏堣В鏋愪竴灞傚紩鍙� | 鐩存帴杩愯 `.ps1` 鏂囦欢锛屼笉鍋氬祵濂� |
+| 閲嶅惎鏃惰鏉� Codex 鍐呮牳 | 鎸夊悕瀛楁潃 `node.exe` 浼氬懡涓� `node_repl` | 鎸� PID 绮剧‘鍋滃悗绔摼 `cmd 鈫� java(maven) 鈫� java(app)`銆佸墠绔摼 `cmd 鈫� node(npm) 鈫� cmd 鈫� node(vue-cli-service)` |
+| 鍓嶇鏃ュ織鎵句笉鍒� | 鏃ュ織鍦ㄥ瓙鐩綍 | `traffic-audit-web/frontend.log`锛涘悗绔� `backend.log` 鍦ㄤ粨搴撴牴鐩綍 |
+
+**閲嶅惎鏍囧噯娴佺▼**锛氬垪鍑� `java.exe` 杩涚▼ 鈫� 鍋� `app` 鈫� `maven` 鈫� `cmd` 鈫� 杩愯 `start-dev.ps1`锛堣剼鏈嚜鍔ㄨ烦杩囧凡鍦ㄧ洃鍚殑绔彛锛夈��
+
+---
+
+## 涓夈�佹湇鍔$姸鎬侀獙璇�
+
+- 娌欑鍐� `Get-NetTCPConnection` 浼氬洜鏉冮檺銆屾嫆缁濊闂�嶈��**闈欓粯澶辫触**锛屾嵁姝ゅ垽瀹氱鍙f湭鐩戝惉鏄敊鐨勩��
+- 鍒ゆ柇鏈嶅姟鐘舵�佷竴寰嬩互鏃ュ織涓哄噯锛汬TTP 鎺㈡椿鐢細
+ - 鍚庣锛歚GET http://127.0.0.1:8090/api/auth/captcha-config`锛堣繑鍥� `{"code":200,...}` 鍗抽�氾級
+ - 鍓嶇锛歚http://localhost:8080/#/login`
+- 鍓嶇鏃ュ織鍑虹幇 `Proxy error: Could not proxy request /api/... (ECONNREFUSED)` 璇存槑**鍚庣褰撴椂娌¤捣鏉�**锛屼笉鏄墠绔棶棰樸��
+
+---
+
+## 鍥涖�佹暟鎹簱
+
+- 杩炴帴锛堟湰鍦板紑鍙戝簱锛夛細
+ `& 'C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe' --host=127.0.0.1 --port=3308 --user=root --password=<瑙� AGENTS.md> --default-character-set=utf8mb4 -D traffic_audit`
+- **蹇呴』鍐� `--host=127.0.0.1`**锛氬啓鎴� `-h127.0.0.1` 浼氳瑙f瀽鎴� host `127`锛岃繛鎺ュけ璐ャ��
+- 杈撳嚭杩囨护 `2>&1 | Select-String -NotMatch 'Warning'` 鍙睆钄藉瘑鐮佽鍛娿��
+- 甯哥敤琛ㄤ笌鍏抽敭鍒楋細
+
+| 琛� | 璇存槑 | 鍏抽敭鍒� |
+|----|------|--------|
+| `freight_turnover_import` | 璐ц繍閲�/鍛ㄨ浆閲� | `report_period`銆乣region_name`銆乣freight_m01..m12`銆乣turnover_m01..m12`銆乣last_*` |
+| `h2031_enterprise_monthly` | 鍏矾鏃呭 H203-1 鏈堟姤 | `report_period`銆乣enterprise_code`銆乣unified_credit_code`銆乣report_unit` |
+| `import_batch` | 瀵煎叆鎵规 | `import_type`銆乣report_period`銆乣file_name`銆乣success_rows` |
+| `audit_result` / `audit_run` | 瀹℃牳缁撴灉/杩愯 | `report_period` |
+
+- 鎺掓煡銆屾煇鏈熸暟鎹湪涓嶅湪銆嶏細`SELECT report_period, COUNT(*) FROM <琛�> GROUP BY report_period ORDER BY report_period;`
+- 鎺掓煡銆屾煇鏈熷鍏ユ潵鑷摢涓枃浠躲�嶏細鏌� `import_batch` 鐨� `file_name`銆�
+- **琛ㄧ粨鏋勫彉鏇磋鍚屾涓夊**锛氬疄闄呭簱 DDL銆乣docs/init.sql`銆乣docs/database.md`銆�
+- 娴嬭瘯鐢ㄦ姤琛ㄦ湡寤鸿鐢� `2099-xx`锛屾祴瀹岀敤 `POST /api/import/clear?period=...` 鎴栫洿鎺� DELETE 娓呯悊锛岄伩鍏嶆薄鏌撶湡瀹炴湀浠戒笅鎷夐」銆�
+
+---
+
+## 浜斻�佹暟鎹鍏ワ細鏂囦欢璺緞涓庢湡娆$害瀹�
+
+### 5.1 璐ц繍閲�/鍛ㄨ浆閲忥紙`/api/import/freightTurnover`锛�
+
+| 婧愭枃浠� | 瑕嗙洊鏈熸 | 澶囨敞 |
+|--------|----------|------|
+| `D:\05_鏁版嵁鍒嗙被\楂橀�焅瀹氱-婀栧寳鐪佸悇甯傚窞杩愯緭閲忔暟鎹紙2026骞�1-8鏈堬級.xlsx` | 2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08 | **鏃� 2023 骞� Sheet** |
+| `D:\05_鏁版嵁鍒嗙被\璐ц繍\7鏈圽瀹氱-婀栧寳鐪佸悇甯傚窞杩愯緭閲忔暟鎹紙2026骞�1-7鏈堬級.xlsx` | 澶氫竴涓� `2023` Sheet | 2023 骞存暟鎹殑鏉ユ簮锛�2021/2022/2024 涓� 8 鏈堟枃浠堕�愬�间竴鑷� |
+
+- 澶氬勾搴﹀伐浣滅翱璇嗗埆瑙勫垯锛坄detectYearSheets`锛夛細
+ 1. **鑷冲皯 2 涓� Sheet**锛堝崟 Sheet 鏂囦欢涓嶈瘑鍒负澶氬勾搴﹀伐浣滅翱锛屼細璧拌�佺殑鏈堝害妯℃澘璺緞锛夛紱
+ 2. 姣忎釜 Sheet 鍚嶅尮閰� `^\d{4}\s*骞�?$`锛坄2023骞碻銆乣2023` 閮藉彲浠ワ級锛�
+ 3. 姣忎釜 Sheet 棣栬 A1 鍚�岃揣杩愰噺銆嶃�丅1 鍚�屾湀銆嶃��
+ 浠讳竴鏉′欢涓嶆弧瓒� 鈫� 鏁翠綋鍥為��鑰佺殑鏈堝害妯℃澘瑙f瀽銆�
+- 姣忎釜骞村害 Sheet 鐨勭粨鏋勶細涓婃柟鏄�岃揣杩愰噺(涓囧惃)銆嶅潡锛堢害 20 琛岋級锛屼笅鏂规槸銆屽懆杞噺(涓囧惃鍏噷)銆嶅潡锛�**鍚屼竴甯傚窞鍚嶇浜屾鍑虹幇鍗宠涓哄懆杞噺鍧�**銆�
+- 鎶ヨ〃鏈熻涔夛細**`2021-12` 杩欑被鏈熸斁鐨勬槸璇ュ勾 1鈥�12 鏈堢殑鍏ㄥ勾鏁版嵁**锛坄m01..m12` 鍏ㄩ儴鏈夊�硷級锛屼笉鏄� 12 鏈堝崟鏈堛�傝骞存渶鍚庢湁鏁版嵁鐨勬湀浠藉喅瀹氭湡鍙凤紙2026 骞村彧鏈� 1鈥�8 鏈� 鈫� `2026-08`锛夈��
+- 涓婂勾鍚屾湡锛氬骞村害鏂囦欢閲岃嚜鍔ㄥ彇**涓婁竴骞村害 Sheet**锛涜嫢涓婁竴骞村害涓嶅瓨鍦紙濡� 2021 鏃� 2020 Sheet锛夛紝`last_*` 涓虹┖銆�
+- 鍙ˉ鏌愪竴骞存椂锛屽彲鍙﹀瓨涓�涓彧鍚骞� + 涓婁竴骞寸殑涓存椂宸ヤ綔绨垮啀瀵煎叆锛堟敞鎰忋�岃嚦灏� 2 涓� Sheet銆嶈鍒欙級銆�
+
+### 5.2 鍏矾鏃呭 H203-1锛坄/api/import/passengerMonthly`锛�
+
+| 婧愭枃浠� | 澶囨敞 |
+|--------|------|
+| `docs\鍏矾鏃呭\妯℃澘_浜や紒缁烪203-1琛╛鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌.xlsx` | 鐢ㄦ埛淇敼鍚庣殑妯℃澘 |
+| `D:\妗岄潰\娴嬭瘯鏁版嵁\鍏矾鏃呭\鍏湀\鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌锛�2026锛塤2026-09-09 09_18_45.xls` | 绯荤粺瀵煎嚭鐨勮�佹牸寮忔牱渚� |
+| `D:\闇�瑕佸鍏ョ殑鏁版嵁\鍏矾鏃呭\*.xls` | 鍘嗗彶鍚勬湀瀵煎嚭鏂囦欢 |
+- 瑙f瀽**鎸夎〃澶村悕鍙栧��**锛坄buildHeaderMap`锛夛紝鍥犳妯℃澘鍦ㄤ腑闂存彃鍒�/鏁翠綋鍙崇Щ**涓嶄細**鐮村潖鍏跺畠瀛楁銆�
+- 鏂版ā鏉垮湪銆屼紒涓氬悕绉般�嶅悗鏂板 2 鍒楋細`缁熶竴绀句細淇$敤浠g爜`銆乣濉姤鍗曚綅`锛涜�佹牸寮忔枃浠跺叾瀹炰篃甯﹁繖涓ゅ垪锛堟鍓嶄唬鐮佹湭璇诲彇锛夈��
+- 蹇呴渶鍒楃己澶变細鐩存帴鎶ラ敊锛屼緥濡傞�夐敊绫诲瀷鏃舵彁绀恒�岃〃澶寸己灏戝繀闇�鍒椼�愪紒涓氬悕绉般�戙�愬杩愰噺_鎬昏銆戙�嶃��
+
+### 5.3 鍏跺畠
+
+- 瀵煎叆澶辫触蹇呴』鍦ㄩ〉闈㈡樉绀�**琛屽彿**锛堢敤鎴疯姹傦級锛屾柊澧炶В鏋愰�昏緫鏃朵笉瑕佸悶鎺夎鍙蜂俊鎭��
+
+---
+
+## 鍏�佹姤琛ㄧ敓鎴�
+
+- 銆屾眹鎬诲ぇ琛ㄣ�嶉瑙堝脊绐楃敱 `ReportExport.vue` 娓叉煋锛�
+ - 寮圭獥鍐�**鍙繚鐣欎竴寮犳寚鏍囪〃**锛堝垎绫� / 鎸囨爣 / 鏁版嵁 / 鍚屾瘮锛夛紝銆屼腑鍙e緞銆嶄箣鍚庝笉鍐嶆覆鏌撲换浣曡〃鏍硷紱
+ - 寮圭獥鏀寔鎷栧姩锛坄v-dialog-drag` 鎸囦护锛屾嫋鏍囬鏍忥級+ 10px 鍦嗚銆�
+- 瀵煎嚭渚濊禆**姣嶇増妯℃澘鏂囦欢**锛歚docs/鐢熸垚姹囨�诲ぇ琛�/YYYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx`銆傜己澶辨椂鎶ャ�屾瘝鐗堝畾浣嶅け璐ワ細鏈壘鍒版ā鏉挎枃浠躲�嶏紝**涓嶆槸鏁版嵁闂**銆�
+- 鎺ュ彛灞傞潰鑷煡锛堢粫杩囧墠绔紝瀹氫綅鏄墠绔繕鏄悗绔棶棰橈級锛�
+ - 棰勮锛歚GET /api/report/preview?period=2026-08&mode=month&types=summaryWorkbook`
+ - 瀵煎嚭锛歚GET /api/report/export/summaryWorkbook?...`
+- 澶辫触鎻愮ず宸茬粏鍒嗭細鑳藉尯鍒嗐�岃繛涓嶄笂鏈嶅姟鍣ㄣ�嶅拰銆屽悗绔繑鍥炵殑鍏蜂綋鍘熷洜銆嶏紱瀵煎嚭鎺ュ彛鏄� `responseType:'blob'`锛屾姤閿欐椂 `data` 涔熸槸 Blob锛屽繀椤诲厛 `text()` 鍐嶈В鏋愩��
+
+---
+
+## 涓冦�佺櫥褰曚笌楠岃瘉鐮�
+
+| 闂 | 鍘熷洜 | 澶勭疆 |
+|------|------|------|
+| 鐧诲綍椤靛嚭鐜扮┖鐧芥柟妗� + 銆岄獙璇佺爜鍔犺浇澶辫触锛岃妫�鏌ョ綉缁溿�� | 鍓嶇 `captchaRequired` 榛樿 `true`锛岃鍙� `/api/auth/captcha-config` 澶辫触鏃堕潤榛樺拷鐣ワ紝椤甸潰娈嬬暀鍔犺浇涓嶅嚭鏉ョ殑楠岃瘉鐮佹 | 榛樿鍊兼敼 `false`锛屾敼涓� fail-safe锛氬彧鏈夊悗绔槑纭繑鍥� `required === true` 鎵嶆樉绀猴紱璇锋眰澶辫触鎸夈�屼笉闇�瑕侀獙璇佺爜銆嶅鐞� |
+| 寮�鍏充綅缃� | 鍚庣 `application.yml` 鐨� `app.captcha.required` | 鍏虫帀鍚庡簲鏄剧ず銆屾祴璇曟ā寮忥細琛屼负楠岃瘉鐮佸凡璺宠繃銆� |
+| 鎹㈢綉缁�/鎹� IP 鍚庢帴鍙� 403 | 璺ㄥ煙鐧藉悕鍗� | CORS 闇�鏀捐鍐呯綉缃戞锛堝凡淇 `0d2a5fc`锛� |
+
+---
+
+## 鍏�佹枃浠跺啓鍏ヤ笌鏂囨湰澶勭悊鐨勫潙
+
+- 鏈満鏂囦欢**鎹㈣绗︿笉缁熶竴**锛歚Login.vue`銆乣main.js` 鏄� CRLF锛沗ReportExport.vue`銆乣DataImportService.java`銆乣docs/*.md` 鏄� LF銆傜敤 `[System.IO.File]::WriteAllText` 鏃跺繀椤诲尮閰嶅師鎹㈣绗︼紝鍚﹀垯鍚庣画 `-replace` / 瀛楃涓插尮閰嶄細澶辫触銆�
+- `main.js` 甯� BOM锛坄EF BB BF`锛夛紝鏀瑰啓鏃惰鐢� `New-Object System.Text.UTF8Encoding($true)`銆�
+- **`git checkout -- <鏂囦欢>` 浼氭妸 LF 杞垚 CRLF**锛堟湰浠撳簱 `core.autocrlf=true`锛夛紝浼氳鍚庣画鍩轰簬 LF 鐨勬浛鎹㈠け鏁堬紱鎿嶄綔鍓嶅厛纭鐪熷疄鎹㈣绗︺��
+- PowerShell 澶氳涓枃鏇挎崲寤鸿鍐� `*.py` 鑴氭湰鐢� `python` 鎵ц锛坄apply_patch` 鍦ㄦ湰鏈轰笉鍙敤锛夈��
+- 瀛楃涓叉浛鎹�**娉ㄦ剰閿氱偣鍞竴鎬�**锛歚| enterprise_name | varchar(200) | 浼佷笟鍚嶇О |` 鍦� `docs/database.md` 鍑虹幇 4 娆★紝鐩存帴 replace 浼氭敼閿欒〃锛涘繀椤诲厛鎴彇鐩爣绔犺妭鍐嶆浛鎹€��
+- 璇� `.xls`锛氭湰鏈� python 鏃� `xlrd`锛屽彲鐢� Excel COM锛坄New-Object -ComObject Excel.Application` 鈫� `Workbooks.Open` 鈫� `Cells.Item(r,c).Text`锛岃寰� `Quit()` + `ReleaseComObject`锛夈��
+
+---
+
+## 涔濄�佹祻瑙堝櫒鑷姩鍖栧彇璇佺殑鍧�
+
+- `tab.playwright.evaluate()` 璇� DOM 鎵嶅彲淇★紱AX 鏍戝彲鑳借鍒扮紦瀛樸��
+- Playwright locator 瀵� Element UI 琛ㄦ牸鍐呮寜閽�**浼氳秴鏃�**锛坄isVisible()` 鎭掍负 false锛夛紱鏀圭敤 AX 绱㈠紩 `tab.click(index)`銆�
+- `tab.drag([x1,y1],[x2,y2])` 鎷栨嫿鏃讹紝鍧愭爣蹇呴』钀藉湪**褰撳墠瑙嗗彛**鍐咃紙鏈満鍐呭祵娴忚鍣ㄨ鍙e緢灏忥紝绾� 319脳790锛夛紝鍚﹀垯鎶� `Coordinate is outside the active tab content viewport`銆�
+- `tab.click` 鐨� AX 绱㈠紩**鍦ㄩ〉闈㈠埛鏂板悗浼氬け鏁�**锛屽彲鑳藉懡涓埆鐨勬帶浠讹紱姣忔鎿嶄綔鍓嶉噸鏂� `cua.getTab(...)` 鍙栨柊绱㈠紩銆�
+- 鎴浘锛歚const fs = await import('fs'); fs.writeFileSync(path, Buffer.from(await tab.getScreenshot()))`锛坄require` 涓嶅彲鐢級銆�
+- 鏀� `.vue` 鍚庨渶瑕� `tab.reload()`銆�
+- 涓存椂鑴氭湰/鏂囦欢锛坄_*.*`锛夋湭缁忕敤鎴峰悓鎰�**涓嶈鍒�**銆�
+
+---
+
+## 鍗併�丟it 鍙屼粨搴撳伐浣滄祦
+
+| 浠撳簱 | remote | 鍒嗘敮 | 鍦板潃 |
+|------|--------|------|------|
+| 涓汉 | `origin` | `master` | `https://gitee.com/zhizhijie/traffic-audit.git` |
+| 鍏徃 | `gitea` | `main` | `http://61.183.254.94:3000/r/trafficAudit.git`锛堣处鍙� zyj锛� |
+
+姣忔鏀瑰姩鐨勫浐瀹氶『搴忥細
+1. 娴嬭瘯 + 鍐欍�婂姛鑳芥祴璇曟姤鍛娿�� + 鏇存柊銆婂伐浣滄棩缁撱�嬶紱
+2. `git fetch origin` 鈫� 鍚堝苟涓汉浠撳簱鏂版彁浜わ紙閬垮厤瑕嗙洊鐢ㄦ埛鏀瑰姩锛夛紱
+3. `git fetch gitea` 鈫� 涓庤繙绔� `main` 瀵规瘮鍚堝苟 鈫� **绂佹寮烘帹**锛�
+4. `git commit` 鈫� `git push`銆�
+
+- 鍑嵁鍙蛋鏈満 git/涓存椂 askpass锛�**绂佹鍐欒繘浠撳簱浠讳綍鏂囦欢**銆�
+- 鍏徃 gitea 缃戠粶涓嶉�氭椂璁板綍涓洪仐鐣欓棶棰橈紝**涓嶈**鐢ㄥ己鎺ㄧ粫杩囥��
+
+---
+
+## 鍗佷竴銆佸綋鍓嶅凡鐭ラ仐鐣欓棶棰橈紙鎴嚦 2026-09-16锛�
+
+| # | 闂 | 褰卞搷 | 鐘舵�� |
+|---|------|------|------|
+| 1 | 8 鏈堟簮鏂囦欢缂� 2023 骞� Sheet | 宸茬敤 7 鏈堟枃浠惰ˉ褰� `2023-12` 瑙e喅 | 宸茶В鍐� |
+| 2 | 2026-01 ~ 2026-07 鐨� `last_*` 涓虹┖ | 杩欏嚑鏈熸敼鍔ㄥ墠鍗充负绌猴紝闈炴湰娆″紩鍏� | 寰呯敤鎴风‘璁ゆ槸鍚﹁ˉ |
+| 3 | 2026-01 ~ 2026-07 鐨� H203-1 `unified_credit_code` / `report_unit` 涓虹┖ | 鏂板垪鏈湡鎵嶈鍙栵紝鍘嗗彶鏈熸湭鍥炲~ | 寰呯敤鎴风‘璁ゆ槸鍚﹂噸瀵� |
+| 4 | 棰勮寮圭獥銆屽叡 0 琛屻�嶄笌銆屾湀搴﹁鐩栵細1~8鏈堝潎鏈夋暟鎹�嶅彛寰勪笉鍚� | 鏄撹瑙� | 寰呯敤鎴风‘璁ゆ敼鏂囨 |
+| 5 | 鍏徃 gitea 鎺ㄩ�� | 缃戠粶鏃犲搷搴旓紝鏈帹鎴愬姛 | 寰呰ˉ鎺� |
+| 6 | 浠撳簱鏍圭洰褰曞ぇ閲� `_*.*` 涓存椂鏂囦欢 | 浣撶Н/鍙鎬� | 缁忕敤鎴峰悓鎰忓悗鍐嶆竻鐞� |
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
index 6755650..fea9403 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
@@ -359,6 +359,8 @@
H2031_COLUMNS.add(col("regionCode", "鎵�灞炲湴鍖�", 100));
H2031_COLUMNS.add(col("enterpriseCode", "浼佷笟浠g爜", 130));
H2031_COLUMNS.add(col("enterpriseName", "浼佷笟鍚嶇О", 220));
+ H2031_COLUMNS.add(col("unifiedCreditCode", "缁熶竴绀句細淇$敤浠g爜", 180));
+ H2031_COLUMNS.add(col("reportUnit", "濉姤鍗曚綅", 160));
H2031_COLUMNS.add(col("vehicleTotal", "瀹㈣繍杞﹁締鍚堣", 110));
H2031_COLUMNS.add(col("seatTotal", "鏍稿畾杞藉浣嶅悎璁�", 130));
H2031_COLUMNS.add(col("vehicleSchedule", "鐝嚎杞﹁締鏁�", 110));
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java
index 1a690af..35a7d5a 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java
@@ -22,6 +22,10 @@
private String enterpriseCode;
/** 浼佷笟鍚嶇О */
private String enterpriseName;
+ /** 缁熶竴绀句細淇$敤浠g爜 */
+ private String unifiedCreditCode;
+ /** 濉姤鍗曚綅 */
+ private String reportUnit;
/** 瀹㈣繍杞﹁締_鎬昏 */
private Integer vehicleTotal;
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 9b5d0d1..1f6ca46 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
@@ -319,6 +319,9 @@
entity.setRegionCode(gs(row, colMap, "鎵�灞炲湴鍖�"));
entity.setEnterpriseCode(gs(row, colMap, "浼佷笟浠g爜"));
entity.setEnterpriseName(name.trim());
+ // 鏂扮増妯℃澘鍦ㄣ�屼紒涓氬悕绉般�嶅悗鏂板浜嗕袱鍒楋紙缁熶竴绀句細淇$敤浠g爜/濉姤鍗曚綅锛夛紝鎸夎〃澶村彇鍊硷紝鑰佹ā鏉挎棤璇ュ垪鏃朵负 null
+ entity.setUnifiedCreditCode(gs(row, colMap, "缁熶竴绀句細淇$敤浠g爜"));
+ entity.setReportUnit(gs(row, colMap, "濉姤鍗曚綅"));
entity.setVehicleTotal(gi(row, colMap, "瀹㈣繍杞﹁締_鎬昏"));
entity.setSeatTotal(gi(row, colMap, "鏍稿畾杞藉浣峗鎬昏"));
entity.setVehicleSchedule(gi(row, colMap, "杞﹁締鏁癬瀹㈣繍鐝溅锛堝惈瀹氱嚎鏃呮父瀹㈣繍瀹㈣溅锛�"));
diff --git a/traffic-audit-web/src/directives/dialogDrag.js b/traffic-audit-web/src/directives/dialogDrag.js
new file mode 100644
index 0000000..90a6221
--- /dev/null
+++ b/traffic-audit-web/src/directives/dialogDrag.js
@@ -0,0 +1,61 @@
+/**
+ * v-dialog-drag锛氳 Element UI 2.x 鐨� el-dialog 鑳界敤鏍囬鏍忔嫋鍔ㄣ��
+ * Element UI 2.x 鐨� el-dialog 娌℃湁 draggable 灞炴�э紙閭f槸 Element Plus 鐨勫姛鑳斤級锛�
+ * 鎵�浠ヨ繖閲岀敤鎸囦护瀹炵幇锛氬彧鏀� .el-dialog 鐨� transform锛屼笉鏀瑰竷灞�锛�
+ * 寮圭獥鍏抽棴锛坵rapper 琚疆涓� display:none锛夋椂鑷姩澶嶄綅锛屼笅娆℃墦寮�浠嶅湪鍘熶綅銆�
+ * 鐢ㄦ硶锛�<el-dialog v-dialog-drag custom-class="xxx">
+ */
+export default {
+ inserted(el) {
+ const dialog = el.querySelector('.el-dialog')
+ const header = el.querySelector('.el-dialog__header')
+ if (!dialog || !header) return
+ let startX = 0
+ let startY = 0
+ let baseX = 0
+ let baseY = 0
+ let curX = 0
+ let curY = 0
+ let dragging = false
+
+ const reset = () => {
+ curX = 0
+ curY = 0
+ dialog.style.transform = ''
+ }
+ const onMove = (e) => {
+ if (!dragging) return
+ curX = baseX + (e.clientX - startX)
+ curY = baseY + (e.clientY - startY)
+ dialog.style.transform = 'translate(' + curX + 'px, ' + curY + 'px)'
+ if (e.preventDefault) e.preventDefault()
+ }
+ const onUp = () => {
+ if (!dragging) return
+ dragging = false
+ document.removeEventListener('mousemove', onMove)
+ document.removeEventListener('mouseup', onUp)
+ }
+ const onDown = (e) => {
+ if (e.button !== 0) return
+ const t = e.target
+ if (t && t.closest && t.closest('.el-dialog__headerbtn')) return
+ dragging = true
+ startX = e.clientX
+ startY = e.clientY
+ baseX = curX
+ baseY = curY
+ document.addEventListener('mousemove', onMove)
+ document.addEventListener('mouseup', onUp)
+ if (e.preventDefault) e.preventDefault()
+ }
+
+ header.addEventListener('mousedown', onDown)
+ if (typeof MutationObserver !== 'undefined') {
+ const mo = new MutationObserver(() => {
+ if (el.style.display === 'none') reset()
+ })
+ mo.observe(el, { attributes: true, attributeFilter: ['style'] })
+ }
+ }
+}
\ No newline at end of file
diff --git a/traffic-audit-web/src/main.js b/traffic-audit-web/src/main.js
index 44e467e..7937fbf 100644
--- a/traffic-audit-web/src/main.js
+++ b/traffic-audit-web/src/main.js
@@ -3,8 +3,10 @@
import 'element-ui/lib/theme-chalk/index.css'
import App from './App.vue'
import router from './router'
+import dialogDrag from './directives/dialogDrag'
Vue.use(ElementUI)
+Vue.directive('dialog-drag', dialogDrag) // 璁� el-dialog 鍙嫋鍔紙Element UI 2.x 鏃� draggable 灞炴�э級
Vue.config.productionTip = false
// 鍏ㄥ眬鐧诲嚭锛氭竻闄ょ櫥褰曟�佸苟鍥炵櫥褰曢〉锛堝悇椤甸潰渚ц竟鏍忋�岄��鍑虹櫥褰曘�嶈彍鍗曞叡鐢級
diff --git a/traffic-audit-web/src/views/Login.vue b/traffic-audit-web/src/views/Login.vue
index 19ca936..fbe98ac 100644
--- a/traffic-audit-web/src/views/Login.vue
+++ b/traffic-audit-web/src/views/Login.vue
@@ -40,16 +40,20 @@
captchaId: '',
clickIds: [],
loggingIn: false,
- captchaRequired: true
+ captchaRequired: false
}
},
created() {
+ // 楠岃瘉鐮佹槸鍚﹀惎鐢ㄤ竴寰嬩互鍚庣 /api/auth/captcha-config 涓哄噯锛�
+ // 榛樿涓嶆樉绀猴紝鍙湁鍚庣鏄庣‘杩斿洖 required=true 鎵嶆覆鏌撻獙璇佺爜缁勪欢銆�
+ // 淇锛氭鍓嶉粯璁� true 涓旇姹傚け璐ユ椂闈欓粯蹇界暐锛屽垏鎹㈢綉缁滃悗璇ラ厤缃涓嶅埌锛�
+ // 鐧诲綍椤靛氨浼氭畫鐣欎竴涓姞杞戒笉鍑烘潵鐨勯獙璇佺爜鐧芥骞舵彁绀衡�滈獙璇佺爜鍔犺浇澶辫触锛岃妫�鏌ョ綉缁溾�濄��
axios.get('/api/auth/captcha-config', { timeout: 10000 })
.then(res => {
const d = res.data
- if (d && d.code === 200) this.captchaRequired = d.data.required !== false
+ this.captchaRequired = !!(d && d.code === 200 && d.data && d.data.required === true)
})
- .catch(() => {})
+ .catch(() => { this.captchaRequired = false })
},
methods: {
onCaptchaVerified(payload) {
diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index f313a49..12f42d0 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -99,7 +99,8 @@
</div>
</el-alert>
</div>
- <el-dialog :title="'棰勮鏁版嵁 - ' + previewModule + '锛�' + previewPeriod + '锛�'" :visible.sync="previewVisible" width="760px">
+ <el-dialog :title="'棰勮鏁版嵁 - ' + previewModule + '锛�' + previewPeriod + '锛�'" :visible.sync="previewVisible" width="760px"
+ top="5vh" custom-class="pv-dialog" v-dialog-drag>
<div class="preview-body">
<div v-for="it in previewItems" :key="it.key" class="preview-item">
<div class="preview-head">
@@ -114,7 +115,7 @@
</div>
<table class="preview-summary wb-table" v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length">
<thead>
- <tr><th style="width:44%">鎸囨爣</th><th style="width:30%">鏁版嵁</th><th>鍚屾瘮</th></tr>
+ <tr><th style="width:12%">鍒嗙被</th><th style="width:40%">鎸囨爣</th><th style="width:28%">鏁版嵁</th><th>鍚屾瘮</th></tr>
</thead>
<tbody>
<template v-for="(sec, si) in wbRows(it.summary)">
@@ -388,7 +389,7 @@
this.previewVisible = true
this.loading = ''
})
- .catch(err => this.failWith(err))
+ .catch(err => this.failWith(err, '棰勮'))
},
fmtVal(v) {
if (v === null || v === undefined || v === '') return '鈥�'
@@ -505,13 +506,45 @@
})
.catch(() => doExport())
},
- failWith(err) {
+ // 棰勮/瀵煎嚭澶辫触缁熶竴鎻愮ず锛氬尯鍒嗏�滆繛涓嶄笂鏈嶅姟鍣ㄢ�濅笌鈥滃悗绔繑鍥炵殑閿欒鍘熷洜鈥濄��
+ // 瀵煎嚭鎺ュ彛鐢� responseType: 'blob'锛屾姤閿欐椂 data 涔熸槸 Blob锛屽繀椤诲厛璇绘枃鏈啀瑙f瀽锛�
+ // 鍚﹀垯鎷夸笉鍒板悗绔湡瀹炲師鍥狅紝鍙細鏄剧ず绗肩粺鐨勨�滆纭宸插鍏ュ搴旀暟鎹�濄��
+ failWith(err, action) {
if (err && err._toast) { this.loading = ''; return }
- let msg = ''
- const d = err && err.response && err.response.data
- if (d && typeof d === 'object' && d.message) msg = d.message
- this.$message.error('瀵煎嚭澶辫触锛�' + (msg || '璇风‘璁ゅ凡瀵煎叆瀵瑰簲鏁版嵁锛屾垨鏌ョ湅鍚庣鏃ュ織'))
- this.loading = ''
+ const act = action || '瀵煎嚭'
+ const finish = (reason) => {
+ this.$message.error(act + '澶辫触锛�' + reason)
+ this.loading = ''
+ }
+ if (!err || !err.response) {
+ if (err && err.code === 'ECONNABORTED') { finish('璇锋眰瓒呮椂锛岃绋嶅悗閲嶈瘯'); return }
+ finish('鏃犳硶杩炴帴鏈嶅姟鍣紝璇锋鏌ョ綉缁滆繛鎺ワ紝鎴栫‘璁ゅ悗绔湇鍔℃槸鍚﹀凡鍚姩')
+ return
+ }
+ const d = err.response.data
+ const fallback = '璇风‘璁ゅ凡瀵煎叆瀵瑰簲鏁版嵁锛屾垨鏌ョ湅鍚庣鏃ュ織'
+ if (d && typeof d.text === 'function') {
+ Promise.resolve(d.text()).then(txt => finish(this.errReason(txt) || fallback)).catch(() => finish(fallback))
+ return
+ }
+ finish(this.errReason(typeof d === 'string' ? d : (d && d.message)) || fallback)
+ },
+ // 鍚庣寮傚父鍝嶅簲鍙兘鏄� JSON/HTML/绾枃鏈紝灏介噺鎻愬彇鍑哄彲璇荤殑鍘熷洜
+ errReason(raw) {
+ if (!raw) return ''
+ let text = String(raw).trim()
+ if (text.charAt(0) === '{' || text.charAt(0) === '[') {
+ try {
+ const j = JSON.parse(text)
+ if (j && j.message) return j.message
+ } catch (e) { /* 闈� JSON锛屾寜绾枃鏈鐞� */ }
+ }
+ text = text.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim()
+ // 寮�鍙戜唬鐞�/缃戠粶灞傛姤閿欒浆鎴愪汉璇濓紝閬垮厤鐩存帴鎶� ECONNREFUSED 涔嬬被鎶涚粰鐢ㄦ埛
+ if (/ECONNREFUSED|ECONNRESET|Proxy error|socket hang up|Network Error|Failed to fetch/i.test(text)) {
+ return '鏃犳硶杩炴帴鏈嶅姟鍣紝璇锋鏌ョ綉缁滆繛鎺ワ紝鎴栫‘璁ゅ悗绔湇鍔℃槸鍚﹀凡鍚姩'
+ }
+ return text.length > 200 ? text.slice(0, 200) + '鈥�' : text
},
downloadBlob(res, fileName) {
const isZip = /\.zip$/.test(fileName)
@@ -579,3 +612,11 @@
.wb-yoy.yoy-empty { color:#C0C4CC; }
.wb-note { color:#E6A23C; font-size:12px; margin:2px 0 8px; }
</style>
+
+<style>
+/* 棰勮鏁版嵁寮圭獥锛氬渾瑙� + 鍙�氳繃鏍囬鏍忔嫋鍔紙v-dialog-drag 鎸囦护锛夈��
+ 涓嶈兘鍐欒繘 scoped锛歟l-dialog 榛樿 append-to-body锛孌OM 鎸傚湪 body 涓婏紝scoped 閫夋嫨鍣ㄥ尮閰嶄笉鍒般�� */
+.pv-dialog { border-radius: 10px; overflow: hidden; }
+.pv-dialog .el-dialog__header { cursor: move; user-select: none; -webkit-user-select: none; }
+.pv-dialog .el-dialog__headerbtn { cursor: pointer; }
+</style>
\ No newline at end of file
--
Gitblit v1.9.1