From a6fb28dc3cb8a6297299011ead8218e49444263a Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期日, 27 九月 2026 09:34:11 +0800
Subject: [PATCH] chore(打包): 一键打包脚本(含 jar 去密自检) + 打包模板入库 deploy-templates + 密钥更新脚本;清理含密钥的旧部署包与压缩件
---
deploy-templates/db/sql_wyc.sql | 45 ++
deploy-templates/db/init.sql | 619 ++++++++++++++++++++++++++++++
docs/工作日结/工作日结_2026-09-26.md | 9
deploy-templates/backend/start-backend.sh | 4
deploy-templates/db/sql_city_bus.sql | 59 ++
deploy-templates/backend/start-backend.cmd | 16
deploy-templates/README-部署说明.txt | 67 +++
deploy-templates/frontend/nginx.conf.example | 15
docs/打包部署说明.md | 24 +
deploy-templates/db/sql_city_taxi.sql | 82 ++++
set-secrets.ps1 | 31 +
docs/功能测试报告/功能测试报告_密钥外部化与打包去密_2026-09-26.md | 31 +
pack-deploy.ps1 | 98 ++++
deploy-templates/backend/application.yml | 56 ++
14 files changed, 1,156 insertions(+), 0 deletions(-)
diff --git "a/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt" "b/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt"
new file mode 100644
index 0000000..7d759e2
--- /dev/null
+++ "b/deploy-templates/README-\351\203\250\347\275\262\350\257\264\346\230\216.txt"
@@ -0,0 +1,67 @@
+TrafficAudit 浜ら�氳揣杩愮粺璁″鏍哥郴缁� 鈥斺�� 閮ㄧ讲鍖咃紙{stamp}锛�
+========================================================
+
+銆愮洰褰曠粨鏋勩��
+ backend/
+ traffic-audit-server-1.0.0-SNAPSHOT.jar 鍚庣绋嬪簭锛堝惈鍏ㄩ儴渚濊禆锛�**宸插唴宓屽墠绔�**锛�
+ docs/ 鎶ヨ〃妯℃澘涓庤繍琛屾暟鎹洰褰曪紙蹇呴渶锛屽嬁鍒狅級
+ application.yml 澶栭儴閰嶇疆锛堟敼杩欓噷鍗冲彲锛屾棤闇�閲嶆柊鎵撳寘锛�
+ start-backend.cmd / start-backend.sh 鍚姩鑴氭湰
+ frontend/
+ dist/ 鍓嶇鏋勫缓浜х墿锛堝鐢細鎯崇敤 nginx 鎵樼鏃剁敤锛�
+ nginx.conf.example nginx 閰嶇疆绀轰緥
+ db/
+ init.sql 寤哄簱寤鸿〃 + 棰勭疆璐﹀彿锛堝繀椤绘墽琛岋級
+ sql_city_bus.sql 鍩庡競瀹㈣繍-鍏氦鏈堝害琛紙蹇呴』鎵ц锛�
+ sql_city_taxi.sql 鍩庡競瀹㈣繍-鍑虹鏈堝害琛�/鍑虹鎺堟潈琛紙蹇呴』鎵ц锛�
+ sql_wyc.sql 缃戠害杞﹀叏鐪佹�婚噺琛�/璁㈠崟鍒嗗競宸炶〃锛堝繀椤绘墽琛岋級
+ README-閮ㄧ讲璇存槑.txt
+
+銆愰儴缃叉満鐜瑕佹眰銆�
+ JDK 8锛堝繀闇�锛�
+ MySQL 5.7 / 8.0锛堝繀闇�锛�
+ **涓嶉渶瑕� Redis**锛堜唬鐮佹湭浣跨敤锛涙棫鐗堣鏄庨噷鐨� Redis 鏄仐鐣欓厤缃紝鍙拷鐣ワ級
+ **涓嶉渶瑕� nginx**锛堝墠绔凡鍐呭祵杩� jar锛岃闂� 8090 鍗冲彲锛沶ginx 浠呬负澶囬�夋柟妗堬級
+
+銆愰儴缃叉楠ゃ��
+ 1. 鍒濆鍖栨暟鎹簱锛�4 涓剼鏈兘瑕佹墽琛岋紝椤哄簭濡備笅锛�
+ mysql --default-character-set=utf8mb4 -u root -p < db/init.sql
+ mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_city_bus.sql
+ mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_city_taxi.sql
+ mysql --default-character-set=utf8mb4 -u root -p traffic_audit < db/sql_wyc.sql
+ 棰勭疆璐﹀彿锛歛dmin / admin123锛堥娆$櫥褰曞悗璇锋敼瀵嗙爜锛�
+
+ 2. 鏀归厤缃� backend/application.yml
+ - spring.datasource.url / username / password 锛氭敼鎴愰儴缃叉満鐨� MySQL锛堥粯璁ょ鍙� 3306锛�
+ - jwt.secret 锛氭敼鎴愪竴涓查殢鏈哄瓧绗︿覆锛�**蹇呴』鏄� Base64 鍚堟硶瀛楃涓旈暱搴︽槸 4 鐨勫�嶆暟**锛屽 32 浣嶅崄鍏繘鍒讹紱濉腑鏂囦細鐧诲綍澶辫触锛�
+ - deepseek.api-key 锛氶渶瑕� AI 鍒嗘瀽鏃跺~锛屼笉闇�瑕佸彲鐣欑┖
+ 娉細application.yml 涓� jar 鍚岀骇鍗崇敓鏁堬紝涓嶇敤閲嶆柊鎵撳寘銆�
+
+ 3. 鍚姩鍚庣锛堝湪 backend 鐩綍涓嬶級
+ Windows锛氬弻鍑� start-backend.cmd
+ Linux锛� sh start-backend.sh
+ 鎴愬姛鏍囧織锛氬嚭鐜� "Started TrafficAuditApplication" 涓� "Tomcat started on port(s): 8090"
+
+ 4. 璁块棶绯荤粺
+ 娴忚鍣ㄦ墦寮� http://<閮ㄧ讲鏈篒P>:8090 锛堝墠绔凡鍐呭祵锛岄〉闈笌鎺ュ彛鍚屾簮锛�
+ 璐﹀彿锛歛dmin / admin123
+
+銆愭暟鎹縼绉伙紙鍙�夛級銆�
+ 鎯虫妸鏈満鏁版嵁涓�骞舵惉鍒版柊鏈哄櫒锛岀敤 mysqldump锛堟湰鏈� MySQL 鑻ヤ笉鍦� 3306锛屾寜瀹為檯绔彛鏀癸級锛�
+ mysqldump -h 127.0.0.1 -P 3306 -u root -p --databases traffic_audit > traffic_audit_full.sql
+ 鍐嶅湪鏂版満鍣ㄦ墽琛岋細
+ mysql -u root -p < traffic_audit_full.sql
+ 娉ㄦ剰锛氬叏閲� dump 浼氬甫涓婃湰鏈虹殑璐﹀彿瀵嗙爜锛岃鐩� init.sql 棰勭疆鐨� admin 璐﹀彿銆�
+
+銆愬父瑙侀棶棰樸��
+ 1. 鍚姩鎶ャ�屾湭鎵惧埌鏁版嵁鐩綍 docs銆�/ 瀵煎嚭鎶ャ�屾湭鎵惧埌妯℃澘鏂囦欢銆嶏細
+ 蹇呴』鍦� backend 鐩綍涓嬪惎鍔紙jar 涓� docs 鍚岀骇锛夛紝涓嶈鍙嫹 jar銆�
+ 2. 鎶ヨ〃瀵煎嚭鎶ャ�屾湭鎵惧埌姹囨�昏〃姣嶇増銆奩YYY骞碝鏈堥亾璺繍杈撻噺姹囨�昏〃.xlsx銆嬨�嶏細
+ docs/鐢熸垚姹囨�诲ぇ琛� 涓嬬己灏戣鏈堜唤姣嶇増锛涙妸婧愭満鍣ㄧ殑璇ユ枃浠舵嫹杩囧幓銆�
+ 3. 8090 绔彛琚崰鐢細鏀� application.yml 鐨� server.port 鍚庨噸鍚��
+ 4. 椤甸潰鎵撳紑鏄┖鐧斤細纭璁块棶鐨勬槸 http://<IP>:8090 鏍硅矾寰勶紝涓旀祻瑙堝櫒寮哄埗鍒锋柊锛圕trl+F5锛夈��
+ 5. 涓婁紶澶ф枃浠跺け璐ワ細鍚庣闄愬埗 100MB锛屽凡閰嶇疆锛涘鍓嶉潰杩樻寕浜� nginx锛岄渶鍚屾鏀惧ぇ client_max_body_size銆�
+
+銆愬仠姝㈡湇鍔°��
+ Windows锛氬叧闂� start-backend.cmd 绐楀彛
+ Linux锛� Ctrl+C锛屾垨 kill 瀵瑰簲 java 杩涚▼锛坧s -ef | grep java锛�
diff --git a/deploy-templates/backend/application.yml b/deploy-templates/backend/application.yml
new file mode 100644
index 0000000..7cf2f24
--- /dev/null
+++ b/deploy-templates/backend/application.yml
@@ -0,0 +1,56 @@
+# ============================================================
+# TrafficAudit 鍚庣澶栭儴閰嶇疆锛堜笌 jar 鍚岀骇鍗冲彲鐢熸晥锛屼紭鍏堢骇楂樹簬 jar 鍐呯疆閰嶇疆锛�
+# 閮ㄧ讲鍒版柊鏈哄櫒鍚庯紝璇�**鑷冲皯**淇敼涓嬮潰鏍囨敞 TODO 鐨勪笁澶勬暟鎹簱閰嶇疆锛�
+# ============================================================
+server:
+ port: 8080
+app:
+ captcha:
+ required: false # 鐢熶骇鐜濡傞渶鍥惧舰楠岃瘉鐮侊紝鏀逛负 true
+spring:
+ datasource:
+ url: jdbc:mysql://127.0.0.1:3306/traffic_audit?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true
+ username: root # TODO 鏀规垚浣犵殑 MySQL 璐﹀彿
+ password: 璇锋敼鎴愪綘鐨勬暟鎹簱瀵嗙爜 # TODO 鏀规垚浣犵殑 MySQL 瀵嗙爜
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ servlet:
+ multipart:
+ max-file-size: 100MB
+ max-request-size: 100MB
+ jackson:
+ date-format: yyyy-MM-dd HH:mm:ss
+ time-zone: Asia/Shanghai
+mybatis-plus:
+ mapper-locations: classpath*:/mapper/**/*.xml
+ type-aliases-package: com.trafficaudit
+ configuration:
+ map-underscore-to-camel-case: true
+ global-config:
+ db-config:
+ id-type: auto
+ logic-delete-field: deleted
+ logic-delete-value: 1
+ logic-not-delete-value: 0
+jwt:
+ # 蹇呴』鏄�孊ase64 鍚堟硶瀛楃 + 闀垮害鏄� 4 鐨勫�嶆暟銆嶏紱涓嬮潰杩欎覆 32 浣嶅崄鍏繘鍒跺彲鐩存帴鐢紝
+ # 鐢熶骇鐜寤鸿鎹㈡垚鑷繁鐨勯殢鏈轰覆锛堝~涓枃鎴栦笉鍚堟硶瀛楃浼氬鑷寸櫥褰� 500锛�
+ secret: 8f2c1d64a7b34e09c5d81f6a2b0e7c93
+ expiration: 86400000
+docs:
+ template-root: docs
+city-passenger:
+ template-dir: docs/鍩庡競瀹㈣繍
+passenger:
+ template-dir: docs/鍏矾鏃呭
+freight:
+ template-dir: docs/璐ц繍
+energy:
+ template-dir: docs/鑳借��
+investment:
+ template-dir: docs/鎶曡祫/妯℃澘
+summary:
+ template-dir: docs/鐢熸垚姹囨�诲ぇ琛� # 姹囨�诲ぇ琛ㄦ瘝鐗堜笌鐗堝紡鍙傜収浠舵墍鍦ㄧ洰褰曪紙蹇呴渶锛�
+deepseek:
+ api-key: "" # AI 鍒嗘瀽鐢紱鐣欑┖鍒� AI 鍒嗘瀽涓嶅彲鐢�
+ api-url: https://api.deepseek.com/v1/chat/completions
+ model: deepseek-chat
diff --git a/deploy-templates/backend/start-backend.cmd b/deploy-templates/backend/start-backend.cmd
new file mode 100644
index 0000000..a95e5c3
--- /dev/null
+++ b/deploy-templates/backend/start-backend.cmd
@@ -0,0 +1,16 @@
+@echo off
+chcp 65001 >nul
+cd /d %~dp0
+where java >nul 2>nul
+if errorlevel 1 (
+ echo [ERROR] 鏈壘鍒� java锛岃鍏堝畨瑁� JDK 8 骞跺姞鍏� PATH
+ pause
+ exit /b 1
+)
+echo ============================================
+echo TrafficAudit 鍚姩涓細http://localhost:8090
+echo 鍓嶇宸插唴宓岋紝鐩存帴璁块棶 8090 鍗冲彲锛堜笉闇�瑕� nginx锛�
+echo 鏃ュ織鏄剧ず鍦ㄦ湰绐楀彛锛屽叧闂獥鍙e嵆鍋滄鏈嶅姟
+echo ============================================
+java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar
+pause
diff --git a/deploy-templates/backend/start-backend.sh b/deploy-templates/backend/start-backend.sh
new file mode 100644
index 0000000..0d84961
--- /dev/null
+++ b/deploy-templates/backend/start-backend.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+cd "$(dirname "$0")" || exit 1
+echo "TrafficAudit 鍚姩涓細http://localhost:8090 锛圕trl+C 鍋滄锛�"
+java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar 2>&1 | tee app.log
diff --git a/deploy-templates/db/init.sql b/deploy-templates/db/init.sql
new file mode 100644
index 0000000..f75c5d7
--- /dev/null
+++ b/deploy-templates/db/init.sql
@@ -0,0 +1,619 @@
+-- 浜ら�氱粺璁℃姤琛ㄥ鏍哥郴缁� - 鏁版嵁搴撳垵濮嬪寲鑴氭湰 v3
+-- Demo鑼冨洿锛氫氦浼佺粺H203-2琛╛閬撹矾璐х墿杩愯緭鏈堝害鐢熶骇鎯呭喌
+
+CREATE DATABASE IF NOT EXISTS traffic_audit DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
+USE traffic_audit;
+
+-- ============================================
+-- 涓�銆佺敤鎴锋潈闄愭ā鍧楋紙鍚笁鍛橈級
+-- ============================================
+
+-- 閮ㄩ棬琛�
+DROP TABLE IF EXISTS sys_dept;
+CREATE TABLE sys_dept (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ dept_name VARCHAR(100) NOT NULL COMMENT '閮ㄩ棬鍚嶇О',
+ dept_code VARCHAR(20) NOT NULL COMMENT '琛屾斂鍖哄垝浠g爜',
+ parent_id BIGINT DEFAULT 0 COMMENT '涓婄骇閮ㄩ棬',
+ dept_level TINYINT COMMENT '1鐪� 2甯� 3鍘�',
+ sort_order INT DEFAULT 0
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- 瑙掕壊琛�
+DROP TABLE IF EXISTS sys_role;
+CREATE TABLE sys_role (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ role_name VARCHAR(50) NOT NULL COMMENT '瑙掕壊鍚�',
+ role_code VARCHAR(50) NOT NULL COMMENT 'SYS_ADMIN/SEC_OFFICER/AUDITOR/PROVINCE/CITY/COUNTY',
+ role_type VARCHAR(20) DEFAULT 'BUSINESS' COMMENT 'SYSTEM(涓夊憳)/BUSINESS(涓氬姟)',
+ role_level TINYINT DEFAULT 1 COMMENT '0涓夊憳 1鐪佸巺 2甯傚眬 3鍘垮尯',
+ is_mutex TINYINT DEFAULT 0 COMMENT '1涓夊憳浜掓枼 0鏅��'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- 鐢ㄦ埛琛�
+DROP TABLE IF EXISTS sys_user;
+CREATE TABLE sys_user (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ username VARCHAR(50) NOT NULL UNIQUE,
+ password VARCHAR(200) NOT NULL COMMENT 'BCrypt',
+ real_name VARCHAR(50),
+ modules VARCHAR(255) DEFAULT NULL COMMENT '璐熻矗鎶ヨ〃妯″潡锛堥�楀彿鍒嗛殧锛�',
+ phone VARCHAR(20),
+ dept_id BIGINT,
+ status TINYINT DEFAULT 1 COMMENT '0绂佺敤 1鍚敤',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- 鐢ㄦ埛瑙掕壊鍏宠仈
+DROP TABLE IF EXISTS sys_user_role;
+CREATE TABLE sys_user_role (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ user_id BIGINT NOT NULL,
+ role_id BIGINT NOT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ============================================
+-- 浜屻�佷笟鍔℃暟鎹ā鍧�
+-- ============================================
+
+-- 娓呯悊鏃х増閬楃暀琛紙v2 schema锛�
+DROP TABLE IF EXISTS report_enterprise_monthly;
+
+-- 浜や紒缁烪203-2琛細閬撹矾璐х墿杩愯緭鏈堝害鐢熶骇鎯呭喌锛圖emo鏍稿績琛級
+DROP TABLE IF EXISTS h2032_enterprise_monthly;
+CREATE TABLE h2032_enterprise_monthly (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-06',
+ 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 '杞﹁締鏁癬鎬昏',
+ tons_total DOUBLE COMMENT '鏍囪鍚ㄤ綅鏁癬鎬昏',
+ vehicle_tractor INT COMMENT '杞﹁締鏁癬鐗靛紩杞�',
+ vehicle_trailer INT COMMENT '杞﹁締鏁癬鎸傝溅',
+ tons_trailer DOUBLE COMMENT '鏍囪鍚ㄤ綅鏁癬鎸傝溅',
+ vehicle_container INT COMMENT '杞﹁締鏁癬闆嗚绠辫溅',
+ tons_container DOUBLE COMMENT '鏍囪鍚ㄤ綅鏁癬闆嗚绠辫溅',
+ vehicle_whole INT COMMENT '杞﹁締鏁癬鏁磋溅',
+ tons_whole DOUBLE COMMENT '鏍囪鍚ㄤ綅鏁癬鏁磋溅',
+
+ -- 璐ц繍閲忎笌鍛ㄨ浆閲�
+ freight_total DOUBLE COMMENT '璐ц繍閲廮鎬昏锛堝惃锛�',
+ turnover_total DOUBLE COMMENT '璐х墿鍛ㄨ浆閲廮鎬昏锛堝惃鍏噷锛�',
+
+ -- 鍒嗚揣绫昏揣杩愰噺
+ freight_container DOUBLE COMMENT '璐ц繍閲廮闆嗚绠憋紙鍚級',
+ freight_coal DOUBLE COMMENT '璐ц繍閲廮鐓ょ偔鍙婂埗鍝侊紙鍚級',
+ freight_oil_gas DOUBLE COMMENT '璐ц繍閲廮鐭虫补澶╃劧姘斿強鍒跺搧锛堝惃锛�',
+ freight_crude_oil DOUBLE COMMENT '璐ц繍閲廮鍏朵腑鍘熸补锛堝惃锛�',
+ freight_metal_ore DOUBLE COMMENT '璐ц繍閲廮閲戝睘鐭跨煶锛堝惃锛�',
+ freight_iron_ore DOUBLE COMMENT '璐ц繍閲廮鍏朵腑閾佺熆鐭筹紙鍚級',
+ freight_building DOUBLE COMMENT '璐ц繍閲廮鐭跨墿鎬у缓绛戞潗鏂欙紙鍚級',
+ freight_grain DOUBLE COMMENT '璐ц繍閲廮绮锛堝惃锛�',
+
+ -- 杩愯惀鎸囨爣
+ avg_tonnage DOUBLE COMMENT '璐ц溅骞冲潎鍚ㄤ綅',
+ avg_tonnage_trailer DOUBLE COMMENT '骞冲潎鍚ㄤ綅_鎸傝溅',
+ avg_tonnage_whole DOUBLE COMMENT '骞冲潎鍚ㄤ綅_鏁磋溅',
+ avg_distance DOUBLE COMMENT '璐ц溅骞冲潎杩愯窛锛堝叕閲岋級',
+ daily_trips_per_ton DOUBLE COMMENT '鍗曞惃鏃ュ潎杞借繍娆℃暟',
+ daily_mileage_per_vehicle DOUBLE COMMENT '鍗曡溅鍗曞ぉ琛岄┒閲岀▼锛堝叕閲岋級',
+ daily_volume_per_vehicle DOUBLE COMMENT '鍗曡溅鏃ュ潎杩愰噺锛堝惃锛�',
+ daily_trips_with_tractor DOUBLE COMMENT '鍗曞惃鏃ュ潎杞借繍娆℃暟锛堢粨鍚堢壍寮曡溅锛�',
+
+ -- 鐜瘮澧為��
+ vehicle_mom_growth DOUBLE COMMENT '杞﹁締鏁�-鎬昏鐜瘮澧為��',
+ tons_mom_growth DOUBLE COMMENT '鏍囪鍚ㄤ綅-鎬昏鐜瘮澧為��',
+ freight_mom_growth DOUBLE COMMENT '璐ц繍閲�-鎬昏鐜瘮澧為��',
+ turnover_mom_growth DOUBLE COMMENT '璐х墿鍛ㄨ浆閲�-鎬昏鐜瘮澧為��',
+ avg_distance_mom_growth DOUBLE COMMENT '璐ц溅骞冲潎杩愯窛-鐜瘮澧為��',
+
+ -- 鍚屾瘮澧為��
+ vehicle_yoy_growth DOUBLE COMMENT '杞﹁締鏁�-鎬昏鍚屾瘮澧為��',
+ tons_yoy_growth DOUBLE COMMENT '鏍囪鍚ㄤ綅-鎬昏鍚屾瘮澧為��',
+ tractor_trailer_ratio DOUBLE COMMENT '鐗靛紩杞︽寕杞︽瘮',
+ freight_yoy_growth DOUBLE COMMENT '璐ц繍閲�-鎬昏鍚屾瘮澧為��',
+ turnover_yoy_growth DOUBLE COMMENT '璐х墿鍛ㄨ浆閲�-鎬昏鍚屾瘮澧為��',
+ avg_distance_yoy_growth DOUBLE COMMENT '璐ц溅骞冲潎杩愯窛-鍚屾瘮澧為��',
+
+ -- 濉姤淇℃伅
+ unit_leader VARCHAR(50) COMMENT '鍗曚綅璐熻矗浜�',
+ stats_leader VARCHAR(50) COMMENT '缁熻璐熻矗浜�',
+ contact_person VARCHAR(50) COMMENT '濉〃浜�',
+ contact_phone VARCHAR(20) COMMENT '鑱旂郴鐢佃瘽',
+ report_date DATE COMMENT '鎶ュ嚭鏃ユ湡',
+ verify_explanation TEXT COMMENT '鏍稿疄鎬у師鍥犺В閲�',
+ report_notes TEXT COMMENT '涓婃姤璇存槑',
+ modify_record TEXT COMMENT '淇敼璁板綍',
+
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='浜や紒缁烪203-2琛╛閬撹矾璐х墿杩愯緭鏈堝害鐢熶骇鎯呭喌';
+
+-- 杩愭斂杞﹁締鏁版嵁
+DROP TABLE IF EXISTS transport_auth_vehicle;
+CREATE TABLE transport_auth_vehicle (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈�',
+ enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ tractor_count INT DEFAULT 0 COMMENT '鎬荤壍寮曡溅鏁�',
+ trailer_count INT DEFAULT 0 COMMENT '鎬绘寕杞︽暟',
+ other_count INT DEFAULT 0 COMMENT '鍏跺畠杞﹁締鏁�',
+ trailer_tons DOUBLE COMMENT '鎸傝溅鎬诲惃浣�(鍚�)',
+ other_tons DOUBLE COMMENT '鍏跺畠杞﹁締鎬诲惃浣�(鍚�)',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='杩愭斂杞﹁締鏁版嵁';
+
+-- 杞﹁締杞ㄨ抗閲岀▼鏁版嵁
+DROP TABLE IF EXISTS vehicle_track_mileage;
+CREATE TABLE vehicle_track_mileage (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ monthly_mileage DOUBLE COMMENT '鏈堝害鎬婚噷绋�(鍏噷)',
+ tracked_vehicles INT DEFAULT 0 COMMENT '鏈夐噷绋嬬殑杞﹁締鏁�',
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈�',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='杞﹁締杞ㄨ抗閲岀▼鏁版嵁';
+
+-- 瑙勪笂瑙勪笅鎷嗗垎杩愯緭閲忥紙鐢ㄦ埛鎵嬪姩涓婁紶锛�
+DROP TABLE IF EXISTS scale_split_transport;
+CREATE TABLE scale_split_transport (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-06',
+ period_type VARCHAR(10) NOT NULL COMMENT 'MONTH褰撴湀/CUMULATIVE绱',
+ region_name VARCHAR(50) COMMENT '甯傚窞鍚嶇О',
+
+ -- 瑙勪笂
+ above_scale_freight DOUBLE COMMENT '瑙勪笂璐ц繍閲�',
+ above_scale_turnover DOUBLE COMMENT '瑙勪笂鍛ㄨ浆閲�',
+ above_scale_rank INT COMMENT '瑙勪笂鎺掑悕',
+ above_scale_yoy DOUBLE COMMENT '瑙勪笂鍚屾瘮',
+ above_scale_yoy_rank INT COMMENT '瑙勪笂澧為�熸帓鍚�',
+
+ -- 瑙勪笅
+ below_scale_freight DOUBLE COMMENT '瑙勪笅璐ц繍閲�',
+ below_scale_turnover DOUBLE COMMENT '瑙勪笅鍛ㄨ浆閲�',
+ below_scale_rank INT COMMENT '瑙勪笅鎺掑悕',
+ below_scale_yoy DOUBLE COMMENT '瑙勪笅鍚屾瘮',
+ below_scale_yoy_rank INT COMMENT '瑙勪笅澧為�熸帓鍚�',
+
+ -- 鍚堣
+ total_freight DOUBLE COMMENT '杩愯緭閲忓悎璁�-璐ц繍閲�',
+ total_turnover DOUBLE COMMENT '杩愯緭閲忓悎璁�-鍛ㄨ浆閲�',
+ total_rank INT COMMENT '鍚堣鎺掑悕',
+ total_yoy DOUBLE COMMENT '鍚堣鍚屾瘮',
+ total_yoy_rank INT COMMENT '鍚堣澧為�熸帓鍚�',
+
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='瑙勪笂瑙勪笅鎷嗗垎杩愯緭閲�';
+
+-- 妯℃澘_璐ц繍閲忓懆杞噺锛堟瘡鏈堝鍏ワ細宸﹀崐浠婂勾1-N鏈堬紝鍙冲崐鍘诲勾1-12鏈堬紝N=鎶ヨ〃鏈熸湀浠斤級
+DROP TABLE IF EXISTS freight_turnover_import;
+CREATE TABLE freight_turnover_import (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-06',
+ region_name VARCHAR(50) NOT NULL COMMENT '甯傚窞鎴栨箹鍖楃渷',
+
+ -- 浠婂勾1-12鏈堣揣杩愰噺锛堝乏鍗婏紝浠�1-N鏈堟湁鍊硷級
+ freight_m01 DOUBLE COMMENT '1鏈堣揣杩愰噺(涓囧惃)',
+ freight_m02 DOUBLE COMMENT '2鏈堣揣杩愰噺(涓囧惃)',
+ freight_m03 DOUBLE COMMENT '3鏈堣揣杩愰噺(涓囧惃)',
+ freight_m04 DOUBLE COMMENT '4鏈堣揣杩愰噺(涓囧惃)',
+ freight_m05 DOUBLE COMMENT '5鏈堣揣杩愰噺(涓囧惃)',
+ freight_m06 DOUBLE COMMENT '6鏈堣揣杩愰噺(涓囧惃)',
+ freight_m07 DOUBLE COMMENT '7鏈堣揣杩愰噺(涓囧惃)',
+ freight_m08 DOUBLE COMMENT '8鏈堣揣杩愰噺(涓囧惃)',
+ freight_m09 DOUBLE COMMENT '9鏈堣揣杩愰噺(涓囧惃)',
+ freight_m10 DOUBLE COMMENT '10鏈堣揣杩愰噺(涓囧惃)',
+ freight_m11 DOUBLE COMMENT '11鏈堣揣杩愰噺(涓囧惃)',
+ freight_m12 DOUBLE COMMENT '12鏈堣揣杩愰噺(涓囧惃)',
+
+ -- 鍘诲勾1-12鏈堣揣杩愰噺锛堝彸鍗婏紝鍥哄畾12涓湀锛岀畻鍚屾瘮鐢級
+ last_freight_m01 DOUBLE COMMENT '鍘诲勾1鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m02 DOUBLE COMMENT '鍘诲勾2鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m03 DOUBLE COMMENT '鍘诲勾3鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m04 DOUBLE COMMENT '鍘诲勾4鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m05 DOUBLE COMMENT '鍘诲勾5鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m06 DOUBLE COMMENT '鍘诲勾6鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m07 DOUBLE COMMENT '鍘诲勾7鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m08 DOUBLE COMMENT '鍘诲勾8鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m09 DOUBLE COMMENT '鍘诲勾9鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m10 DOUBLE COMMENT '鍘诲勾10鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m11 DOUBLE COMMENT '鍘诲勾11鏈堣揣杩愰噺(涓囧惃)',
+ last_freight_m12 DOUBLE COMMENT '鍘诲勾12鏈堣揣杩愰噺(涓囧惃)',
+
+ -- 浠婂勾1-12鏈堝懆杞噺锛堝乏鍗婏紝浠�1-N鏈堟湁鍊硷紝瀵煎叆瀛樻。锛屾姤琛ㄧ敤鎷嗗垎琛級
+ turnover_m01 DOUBLE COMMENT '1鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m02 DOUBLE COMMENT '2鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m03 DOUBLE COMMENT '3鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m04 DOUBLE COMMENT '4鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m05 DOUBLE COMMENT '5鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m06 DOUBLE COMMENT '6鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m07 DOUBLE COMMENT '7鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m08 DOUBLE COMMENT '8鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m09 DOUBLE COMMENT '9鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m10 DOUBLE COMMENT '10鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m11 DOUBLE COMMENT '11鏈堝懆杞噺(涓囧惃鍏噷)',
+ turnover_m12 DOUBLE COMMENT '12鏈堝懆杞噺(涓囧惃鍏噷)',
+
+ -- 鍘诲勾1-12鏈堝懆杞噺锛堝彸鍗婏紝鍥哄畾12涓湀锛�
+ last_turnover_m01 DOUBLE COMMENT '鍘诲勾1鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m02 DOUBLE COMMENT '鍘诲勾2鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m03 DOUBLE COMMENT '鍘诲勾3鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m04 DOUBLE COMMENT '鍘诲勾4鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m05 DOUBLE COMMENT '鍘诲勾5鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m06 DOUBLE COMMENT '鍘诲勾6鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m07 DOUBLE COMMENT '鍘诲勾7鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m08 DOUBLE COMMENT '鍘诲勾8鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m09 DOUBLE COMMENT '鍘诲勾9鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m10 DOUBLE COMMENT '鍘诲勾10鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m11 DOUBLE COMMENT '鍘诲勾11鏈堝懆杞噺(涓囧惃鍏噷)',
+ last_turnover_m12 DOUBLE COMMENT '鍘诲勾12鏈堝懆杞噺(涓囧惃鍏噷)',
+
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='妯℃澘_璐ц繍閲忓懆杞噺瀵煎叆';
+
+-- ============================================
+-- 涓夈�佸鏍歌鍒欐ā鍧�
+-- ============================================
+
+DROP TABLE IF EXISTS audit_rule;
+CREATE TABLE audit_rule (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ rule_name VARCHAR(100) NOT NULL COMMENT '瑙勫垯鍚嶇О',
+ rule_code VARCHAR(50) NOT NULL COMMENT '瑙勫垯缂栫爜',
+ description TEXT COMMENT '瑙勫垯鎻忚堪',
+ check_field VARCHAR(200) COMMENT '妫�鏌ュ瓧娈�',
+ compare_type VARCHAR(20) COMMENT 'DIFF/RATIO/MOM/YOY/NULL_CHECK/RANGE',
+ threshold VARCHAR(50) COMMENT '闃堝��',
+ alert_level VARCHAR(10) DEFAULT 'YELLOW' COMMENT 'RED/YELLOW',
+ report_type VARCHAR(50) DEFAULT 'H2032' COMMENT '閫傜敤鎶ヨ〃琛ㄥ彿',
+ is_enabled TINYINT DEFAULT 1,
+ llm_raw_input TEXT COMMENT 'LLM缈昏瘧鍘熷杈撳叆',
+ sort_order INT DEFAULT 0,
+ created_by BIGINT,
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- 棰勭疆6鏉″鏍歌鍒欙紙Demo锛�
+INSERT INTO audit_rule (rule_name, rule_code, description, check_field, compare_type, threshold, alert_level, report_type, is_enabled, sort_order) VALUES
+('杞﹁締鏁拌繍鏀垮姣�', 'RULE_001', '浼佷笟涓婃姤杞﹁締鏁颁笌杩愭斂鏁版嵁瀵规瘮锛屽樊璺�>5鍙伴渶鏍稿疄', 'vehicleTotal', 'DIFF', '5', 'RED', 'H2032', 1, 1),
+('鍚ㄤ綅杩愭斂瀵规瘮', 'RULE_002', '浼佷笟涓婃姤鍚ㄤ綅涓庤繍鏀挎暟鎹姣旓紝宸窛>50闇�鏍稿疄', 'tonsTotal', 'DIFF', '50', 'RED', 'H2032', 1, 2),
+('鍛ㄨ浆閲忚建杩瑰姣�', 'RULE_003', '涓婃姤鍛ㄨ浆閲忎笌杞ㄨ抗娴嬬畻鍛ㄨ浆閲忓姣旓紝楂樺嚭30%闇�鏍稿疄', 'turnoverTotal,trackMileage', 'RATIO', '1.3', 'RED', 'H2032', 1, 3),
+('璐ц繍绫诲瀷鐜瘮', 'RULE_004', '涓婃湀鏃狅紝鏈湀鏂板锛屾彁閱掞紱涓婃湀鏈夛紝鏈湀鏃狅紝鎻愰啋锛堣揣杩愮被鍨嬬幆姣旓級', 'freightContainer,freightCoal,freightOilGas,freightCrudeOil,freightMetalOre,freightIronOre,freightBuilding,freightGrain', 'MOM', '0', 'YELLOW', 'H2032', 1, 4),
+('闆嗚绠卞紓甯�', 'RULE_005', '鏃犻泦瑁呯杞︿絾鏈夐泦瑁呯璐ц繍閲忛渶鏍稿疄', 'freightContainer,vehicleContainer', 'NULL_CHECK', '0', 'RED', 'H2032', 1, 5),
+('鏁磋溅鍚ㄤ綅鑼冨洿', 'RULE_006', '鏁磋溅鍚ㄤ綅涓嶅湪4-40鍚ㄤ箣闂�', 'tonsWhole', 'OUT_RANGE', '4,40', 'YELLOW', 'H2032', 1, 6);
+
+-- ============================================
+-- 鍥涖�佸鏍哥粨鏋滄ā鍧�
+-- ============================================
+
+DROP TABLE IF EXISTS audit_result;
+CREATE TABLE audit_result (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ rule_id BIGINT NOT NULL COMMENT 'FK -> audit_rule',
+ report_id BIGINT NOT NULL COMMENT 'FK -> h2032_enterprise_monthly',
+ enterprise_code VARCHAR(50) COMMENT '浼佷笟浠g爜',
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈�',
+ actual_value VARCHAR(200) COMMENT '瀹為檯鍊�',
+ threshold_value VARCHAR(200) COMMENT '闃堝��',
+ deviation VARCHAR(200) COMMENT '鍋忓樊',
+ status VARCHAR(20) DEFAULT 'PENDING' COMMENT 'PENDING/CONFIRMED/IGNORED',
+ reviewer_id BIGINT COMMENT '瀹℃牳浜�',
+ review_comment TEXT COMMENT '瀹℃牳鎰忚',
+ reviewed_at DATETIME,
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+DROP TABLE IF EXISTS audit_explanation;
+CREATE TABLE audit_explanation (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ audit_result_id BIGINT NOT NULL COMMENT 'FK -> audit_result',
+ explanation_text TEXT COMMENT '涓婃姤浜鸿В閲�',
+ llm_suggestion TEXT COMMENT 'LLM寤鸿',
+ llm_confidence DECIMAL(5,2) COMMENT '缃俊搴�',
+ llm_status VARCHAR(20) DEFAULT 'PENDING' COMMENT 'PENDING/PROCESSED/FAILED'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ============================================
+-- 浜斻�佺郴缁熸棩蹇椾笌瀵煎叆鎵规
+-- ============================================
+
+DROP TABLE IF EXISTS sys_operation_log;
+CREATE TABLE sys_operation_log (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ user_id BIGINT COMMENT '鎿嶄綔浜�',
+ module VARCHAR(50) COMMENT '妯″潡',
+ action VARCHAR(50) COMMENT '鎿嶄綔',
+ detail TEXT COMMENT '璇︽儏JSON',
+ ip_address VARCHAR(50) COMMENT 'IP鍦板潃',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+DROP TABLE IF EXISTS import_batch;
+CREATE TABLE import_batch (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ file_name VARCHAR(200) COMMENT '鏂囦欢鍚�',
+ import_type VARCHAR(50) COMMENT 'H2032/TRANSPORT_AUTH/TRACK_MILEAGE/SCALE_SPLIT',
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈�',
+ total_rows INT DEFAULT 0,
+ success_rows INT DEFAULT 0,
+ fail_rows INT DEFAULT 0,
+ error_detail TEXT COMMENT '閿欒璇︽儏',
+ created_by BIGINT COMMENT '瀵煎叆浜�',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ============================================
+-- 鍏�丩LM鑴辨晱鏄犲皠
+-- ============================================
+
+DROP TABLE IF EXISTS llm_desensitize_map;
+CREATE TABLE llm_desensitize_map (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ original_value VARCHAR(200) COMMENT '鍘熷鍊�',
+ masked_value VARCHAR(200) COMMENT '鑴辨晱鍊�',
+ mask_type VARCHAR(20) COMMENT 'ENTERPRISE/REGION',
+ call_id VARCHAR(50) COMMENT '璋冪敤ID'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- ============================================
+-- 涓冦�侀缃暟鎹�
+-- ============================================
+
+-- 棰勭疆閮ㄩ棬锛堟箹鍖楃渷锛�
+INSERT INTO sys_dept (dept_name, dept_code, dept_level) VALUES ('婀栧寳鐪佷氦閫氳繍杈撳巺', '420000', 1);
+
+-- 棰勭疆瑙掕壊
+INSERT INTO sys_role (role_name, role_code, role_type, role_level, is_mutex) VALUES
+('绯荤粺绠$悊鍛�', 'SYS_ADMIN', 'SYSTEM', 0, 1),
+('瀹夊叏淇濆瘑鍛�', 'SEC_OFFICER', 'SYSTEM', 0, 1),
+('瀹夊叏瀹¤鍛�', 'AUDITOR', 'SYSTEM', 0, 1),
+('鐪佸巺涓氬姟鍛�', 'PROVINCE', 'BUSINESS', 1, 0);
+
+-- 棰勭疆绠$悊鍛樿处鍙� admin / admin123
+INSERT INTO sys_user (username, password, real_name, dept_id) VALUES
+('admin', '$2b$10$aqN02Pwvzzuta/66V9MpGerfUH6favtq8av3cc/gueg6lQ9E4CH8u', '绯荤粺绠$悊鍛�', 1);
+
+INSERT INTO sys_user_role (user_id, role_id) VALUES (1, 1);
+
+
+-- ============================================
+-- 鍏�佸叕璺梾瀹㈣繍杈擄紙浜や紒缁烪203-1锛夋墿灞曟ā鍧�
+-- ============================================
+
+DROP TABLE IF EXISTS h2031_enterprise_monthly;
+CREATE TABLE h2031_enterprise_monthly (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-06',
+ region_code VARCHAR(20) COMMENT '鎵�灞炲湴鍖�',
+ enterprise_code VARCHAR(50) COMMENT '浼佷笟浠g爜',
+ enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ vehicle_total INT COMMENT '瀹㈣繍杞﹁締_鎬昏',
+ seat_total INT COMMENT '鏍稿畾杞藉浣峗鎬昏',
+ vehicle_schedule INT COMMENT '杞﹁締鏁癬瀹㈣繍鐝溅锛堝惈瀹氱嚎鏃呮父瀹㈣繍瀹㈣溅锛�',
+ seat_schedule INT COMMENT '鏍稿畾杞藉浣峗瀹㈣繍鐝溅锛堝惈瀹氱嚎鏃呮父瀹㈣繍瀹㈣溅锛�',
+ vehicle_charter INT COMMENT '杞﹁締鏁癬瀹㈣繍鍖呰溅锛堝惈闈炲畾绾挎梾娓稿杩愬杞︼級',
+ seat_charter INT COMMENT '鏍稿畾杞藉浣峗瀹㈣繍鍖呰溅锛堝惈闈炲畾绾挎梾娓稿杩愬杞︼級',
+ passenger_total DOUBLE COMMENT '瀹㈣繍閲廮鎬昏锛堜汉锛�',
+ turnover_total DOUBLE COMMENT '鏃呭鍛ㄨ浆閲廮鎬昏锛堜汉鍏噷锛�',
+ passenger_class1 DOUBLE COMMENT '瀹㈣繍閲廮涓�绫诲杩愮彮绾匡紙鍚畾绾挎梾娓革級',
+ turnover_class1 DOUBLE COMMENT '鏃呭鍛ㄨ浆閲廮涓�绫诲杩愮彮绾匡紙鍚畾绾挎梾娓革級',
+ passenger_class2 DOUBLE COMMENT '瀹㈣繍閲廮浜岀被瀹㈣繍鐝嚎锛堝惈瀹氱嚎鏃呮父锛�',
+ turnover_class2 DOUBLE COMMENT '鏃呭鍛ㄨ浆閲廮浜岀被瀹㈣繍鐝嚎锛堝惈瀹氱嚎鏃呮父锛�',
+ passenger_class3 DOUBLE COMMENT '瀹㈣繍閲廮涓夌被瀹㈣繍鐝嚎锛堝惈瀹氱嚎鏃呮父锛�',
+ turnover_class3 DOUBLE COMMENT '鏃呭鍛ㄨ浆閲廮涓夌被瀹㈣繍鐝嚎锛堝惈瀹氱嚎鏃呮父锛�',
+ passenger_class4 DOUBLE COMMENT '瀹㈣繍閲廮鍥涚被瀹㈣繍鐝嚎锛堝惈瀹氱嚎鏃呮父锛�',
+ turnover_class4 DOUBLE COMMENT '鏃呭鍛ㄨ浆閲廮鍥涚被瀹㈣繍鐝嚎锛堝惈瀹氱嚎鏃呮父锛�',
+ passenger_charter DOUBLE COMMENT '瀹㈣繍閲廮瀹㈣繍鍖呰溅锛堝惈闈炲畾绾挎梾娓革級',
+ turnover_charter DOUBLE COMMENT '鏃呭鍛ㄨ浆閲廮瀹㈣繍鍖呰溅锛堝惈闈炲畾绾挎梾娓革級',
+ avg_distance_total DOUBLE COMMENT '瀹㈣繍骞冲潎杩愯窛锛堝叕閲岋級',
+ avg_distance_class1 DOUBLE COMMENT '涓�绫诲杩愮彮绾垮钩鍧囪繍璺濓紙鍏噷锛�',
+ avg_distance_class2 DOUBLE COMMENT '浜岀被瀹㈣繍鐝嚎骞冲潎杩愯窛锛堝叕閲岋級',
+ avg_distance_class3 DOUBLE COMMENT '涓夌被瀹㈣繍鐝嚎骞冲潎杩愯窛锛堝叕閲岋級',
+ avg_distance_class4 DOUBLE COMMENT '鍥涚被瀹㈣繍鐝嚎骞冲潎杩愯窛锛堝叕閲岋級',
+ avg_distance_charter DOUBLE COMMENT '鏃呮父銆佸寘杞﹀钩鍧囪繍璺濓紙鍏噷锛�',
+ verify_explanation TEXT COMMENT '鏍稿疄鎬у師鍥犺В閲�',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='浜や紒缁烪203-1琛╛鍏矾鏃呭杩愯緭鏈堝害鐢熶骇鎯呭喌';
+
+DROP TABLE IF EXISTS passenger_auth_vehicle;
+CREATE TABLE passenger_auth_vehicle (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈�',
+ enterprise_code VARCHAR(50) COMMENT '浼佷笟浠g爜',
+ enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ vehicle_count INT DEFAULT 0 COMMENT '杞﹁締鏁�',
+ seat_count INT DEFAULT 0 COMMENT '杞藉浣嶆暟',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鍏矾鏃呭杩愭斂杞﹁締鏁版嵁';
+
+-- H203-1 棰勭疆瀹℃牳瑙勫垯锛�4缁�8鏉★紝report_type=H2031锛�
+INSERT INTO audit_rule (rule_name, rule_code, description, check_field, compare_type, threshold, alert_level, report_type, is_enabled, sort_order) VALUES
+('杞﹁締鏁拌繍鏀垮姣�(鏃呭)', 'RULE_P001', '瀹㈣繍杞﹁締鏁颁笌杩愭斂杞﹁締鏁板姣旓紝宸窛>3鍙伴渶鏍稿疄', 'vehicleTotal', 'DIFF', '3', 'RED', 'H2031', 1, 21),
+('杞藉浣嶆暟杩愭斂瀵规瘮(鏃呭)', 'RULE_P002', '鏍稿畾杞藉浣嶆暟涓庤繍鏀胯浇瀹綅鏁板姣旓紝宸窛>50闇�鏍稿疄', 'seatTotal', 'DIFF', '50', 'RED', 'H2031', 1, 22),
+('瀹㈣繍閲忕幆姣�=0鏍稿疄', 'RULE_P003', '涓�绫�/浜岀被/涓夌被/鍥涚被/鍖呰溅瀹㈣繍閲忕幆姣斾笂涓湀绛変簬0闇�鏍稿疄', 'passengerClass1,passengerClass2,passengerClass3,passengerClass4,passengerCharter', 'MOM_EQ_ZERO', '0', 'YELLOW', 'H2031', 1, 23),
+('鏃呭鍛ㄨ浆閲忕幆姣�=0鏍稿疄', 'RULE_P004', '涓�绫�/浜岀被/涓夌被/鍥涚被/鍖呰溅鏃呭鍛ㄨ浆閲忕幆姣斾笂涓湀绛変簬0闇�鏍稿疄', 'turnoverClass1,turnoverClass2,turnoverClass3,turnoverClass4,turnoverCharter', 'MOM_EQ_ZERO', '0', 'YELLOW', 'H2031', 1, 24),
+('骞冲潎杩愯窛鐜瘮瓒吢�20%鏍稿疄', 'RULE_P005', '涓�绫�/浜岀被/涓夌被/鍥涚被骞冲潎杩愯窛鐜瘮涓婁釜鏈堣秴杩嚶�20%闇�鏍稿疄', 'avgDistanceClass1,avgDistanceClass2,avgDistanceClass3,avgDistanceClass4', 'MOM_PCT', '20', 'YELLOW', 'H2031', 1, 25),
+('鍖呰溅骞冲潎杩愯窛绛変簬涓婃湀鏍稿疄', 'RULE_P006', '鏃呮父鍖呰溅骞冲潎杩愯窛绛変簬涓婁釜鏈堥渶鏍稿疄', 'avgDistanceCharter', 'MOM_EQ', '0', 'YELLOW', 'H2031', 1, 26),
+('鏃犵彮绾挎湁鐝嚎瀹㈣繍閲忔牳瀹�', 'RULE_P007', '鏃犲杩愮彮杞︼紙鐝嚎杞﹁締鏁颁负0锛変絾鏈夌彮绾垮杩愰噺闇�鏍稿疄', 'vehicleSchedule,passengerClass1,passengerClass2,passengerClass3,passengerClass4', 'EXISTENCE', '0', 'RED', 'H2031', 1, 27),
+('鏃犲寘杞︽湁鍖呰溅瀹㈣繍閲忔牳瀹�', 'RULE_P008', '鏃犲杩愬寘杞︼紙鍖呰溅杞﹁締鏁颁负0锛変絾鏈夊寘杞﹀杩愰噺闇�鏍稿疄', 'vehicleCharter,passengerCharter', 'EXISTENCE', '0', 'RED', 'H2031', 1, 28);
+
+
+-- ============================================
+-- 涔濄�侀亾璺揣杩愯兘婧愭秷鑰楋紙浜や紒缁烪204锛夋墿灞曟ā鍧�
+-- ============================================
+
+-- 閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙杞﹁締绮掑害瀛f姤锛�
+DROP TABLE IF EXISTS h204_vehicle_quarterly;
+CREATE TABLE h204_vehicle_quarterly (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-06锛堝搴︽湯鏈堬級',
+ region_code VARCHAR(20) COMMENT '鎵�灞炲湴鍖�',
+ enterprise_code VARCHAR(50) COMMENT '浼佷笟浠g爜',
+ enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ plate_no VARCHAR(30) COMMENT '杞︾墝鍙�',
+ vehicle_type_code VARCHAR(10) COMMENT '杞﹁締绫诲瀷浠g爜',
+ vehicle_type VARCHAR(50) COMMENT '杞﹁締绫诲瀷锛堜腑鏂囷級',
+ fuel_type_code VARCHAR(10) COMMENT '鐕冩枡绫诲瀷浠g爜',
+ fuel_type VARCHAR(50) COMMENT '鐕冩枡绫诲瀷锛堜腑鏂囷級',
+ manufacture_year INT COMMENT '鍑哄巶骞翠唤',
+ marked_tonnage DOUBLE COMMENT '鏍囪鍚ㄤ綅锛堝惃锛�',
+ total_mileage DOUBLE COMMENT '鎬昏绋嬶紙鍏噷锛�',
+ loaded_mileage DOUBLE COMMENT '杞借揣閲岀▼锛堝叕閲岋級',
+ empty_mileage DOUBLE COMMENT '绌洪┒閲岀▼锛堝叕閲岋級',
+ freight DOUBLE COMMENT '璐ц繍閲忥紙鍚級',
+ turnover DOUBLE COMMENT '璐х墿鍛ㄨ浆閲忥紙鍚ㄥ叕閲岋級',
+ trip_count INT COMMENT '瓒熸鏁帮紙涓級',
+ fuel_unit VARCHAR(20) COMMENT '鐕冩枡1璁¢噺鍗曚綅',
+ fuel_consumption DOUBLE COMMENT '鐕冩枡1娑堣�楅噺',
+ avg_distance DOUBLE COMMENT '骞冲潎杩愯窛锛堝叕閲岋級',
+ avg_loaded_tonnage DOUBLE COMMENT '骞冲潎杞借揣鍚ㄤ綅锛堝惃锛�',
+ avg_trip_mileage DOUBLE COMMENT '鍗曡稛骞冲潎閲岀▼锛堝叕閲岋級',
+ fuel_per_100km DOUBLE COMMENT '鐧惧叕閲屽崟鑰�',
+ turnover_fuel DOUBLE COMMENT '鍛ㄨ浆閲忓崟鑰�',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_period_plate (report_period, plate_no),
+ KEY idx_period_ent (report_period, enterprise_code)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='浜や紒缁烪204琛╛閬撹矾璐ц繍杞﹁締鑳芥簮娑堣�楁儏鍐碉紙杞﹁締绮掑害锛�';
+
+-- 閬撹矾璐ц繍鑳借�梍杩愭斂杞﹁締淇℃伅锛堣溅鐗岀矑搴︼級
+DROP TABLE IF EXISTS h204_auth_vehicle;
+CREATE TABLE h204_auth_vehicle (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈�',
+ plate_no VARCHAR(30) NOT NULL COMMENT '杞︾墝鍙�',
+ vehicle_type VARCHAR(50) COMMENT '杞﹁締绫诲瀷',
+ fuel_type VARCHAR(50) COMMENT '鐕冩枡绫诲瀷',
+ marked_tonnage DOUBLE COMMENT '鏍囪鍚ㄤ綅锛堝惃锛�',
+ traction_quality DOUBLE COMMENT '鍑嗙壍寮曡川閲忥紙鐗靛紩杞︽爣璁板惃浣嶏級',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_period_plate (report_period, plate_no)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='閬撹矾璐ц繍鑳借�梍杩愭斂杞﹁締淇℃伅锛堣溅鐗岀矑搴︼級';
+
+-- H204 棰勭疆瀹℃牳瑙勫垯锛�4鏉★紝report_type=H204锛�
+INSERT INTO audit_rule (rule_name, rule_code, description, check_field, compare_type, threshold, alert_level, report_type, is_enabled, sort_order) VALUES
+('杞﹁締绫诲瀷涓庤繍鏀垮姣�', 'RULE_E001', '鑳借�楁槑缁嗚溅杈嗙被鍨嬩笌杩愭斂杞﹁締淇℃伅涓嶄竴鑷撮渶鏍稿疄', 'vehicleType', 'CROSS_DIFF', '0', 'RED', 'H204', 1, 31),
+('鐕冩枡绫诲瀷涓庤繍鏀垮姣�', 'RULE_E002', '鑳借�楁槑缁嗙噧鏂欑被鍨嬩笌杩愭斂杞﹁締淇℃伅涓嶄竴鑷撮渶鏍稿疄', 'fuelType', 'CROSS_DIFF', '0', 'RED', 'H204', 1, 32),
+('鏍囪鍚ㄤ綅涓庤繍鏀垮姣�', 'RULE_E003', '鑳借�楁槑缁嗘爣璁板惃浣嶄笌杩愭斂瀵规瘮锛屽樊璺�>0.05鍚ㄩ渶鏍稿疄锛堢壍寮曡溅瀵规瘮鍑嗙壍寮曡川閲忥級', 'markedTonnage', 'CROSS_DIFF', '0.05', 'YELLOW', 'H204', 1, 33),
+('杩愭斂杞﹁締淇℃伅缂哄け', 'RULE_E004', '鑳借�楁槑缁嗚溅鐗屽彿鍦ㄨ繍鏀胯溅杈嗕俊鎭腑涓嶅瓨鍦ㄩ渶鏍稿疄', 'plateNo', 'EXISTENCE_AUTH', '0', 'RED', 'H204', 1, 34),
+('杞借揣閲岀▼鍗犳瘮涓庡崟瓒熼噷绋嬫瘮鏍稿疄', 'RULE_E005', '杞借揣閲岀▼/鎬昏绋� 涓� 骞冲潎杩愯窛/鍗曡稛骞冲潎閲岀▼ 鐩稿樊卤10%闇�鏍稿疄', 'loadedMileage,totalMileage,avgDistance,avgTripMileage', 'LOADED_RATIO_DIFF', '0.1', 'YELLOW', 'H204', 1, 35),
+('鐧惧叕閲屽崟鑰楄秴鑼冨洿鏍稿疄', 'RULE_E006', '鐧惧叕閲屽崟鑰楀亸绂诲悓鐕冩枡绫诲瀷涓綅鏁拌秴杩�50%闇�鏍稿疄', 'fuelPer100km,fuelTypeCode', 'FUEL_RANGE', '0.5', 'YELLOW', 'H204', 1, 36),
+('鐧惧叕閲屽崟鑰楃幆姣斿彉鍖栨牳瀹�', 'RULE_E007', '鍚屼竴杈嗚溅鐧惧叕閲屽崟鑰楃幆姣斿彉鍖栬秴杩嚶�50%闇�鏍稿疄', 'fuelPer100km,plateNo', 'FUEL_MOM', '0.5', 'YELLOW', 'H204', 1, 37),
+('鑳借�楅噺涓庤揣杩愭湀鎶ュ姣旀牳瀹�', 'RULE_E008', '浼佷笟鑳借�楄揣杩愰噺/鍛ㄨ浆閲忎箣鍜屽ぇ浜庤揣杩愭湀鎶�50%闇�鏍稿疄', 'freight,turnover,enterpriseName', 'FREIGHT_VS_H2032', '0.5', 'RED', 'H204', 1, 38),
+('骞冲潎杩愯窛涓庤揣杩愭湀鎶ュ姣旀牳瀹�', 'RULE_E009', '杞﹁締骞冲潎杩愯窛涓庤揣杩愭湀鎶ュ钩鍧囪繍璺濈浉宸�60%闇�鏍稿疄', 'avgDistance,enterpriseName', 'AVG_DIST_VS_H2032', '0.6', 'YELLOW', 'H204', 1, 39),
+('骞冲潎杞借揣鍚ㄤ綅涓庢爣璁板惃浣嶆瘮鍊兼牳瀹�', 'RULE_E010', '骞冲潎杞借揣鍚ㄤ綅/鏍囪鍚ㄤ綅 灏忎簬0.5鎴栧ぇ浜�1闇�鏍稿疄', 'avgLoadedTonnage,markedTonnage', 'LOADED_TON_RATIO', '0.5,1', 'YELLOW', 'H204', 1, 40);
+
+-- ============================================
+-- 鍗併�佹姇璧勬ā鍧楋紙瀹㈣繍绔欏満/鐗╂祦鍥尯锛夋墿灞�
+-- ============================================
+
+-- 鎶曡祫椤圭洰涓绘。锛堟寜 椤圭洰鍚�+绫诲埆 鍞竴锛�
+DROP TABLE IF EXISTS investment_project;
+CREATE TABLE investment_project (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ project_name VARCHAR(200) NOT NULL COMMENT '椤圭洰鍚嶇О',
+ category VARCHAR(20) NOT NULL COMMENT '绫诲埆锛氬杩愮珯鍦�/鐗╂祦鍥尯',
+ city VARCHAR(50) COMMENT '甯傚窞',
+ county VARCHAR(100) COMMENT '鍘匡紙甯傘�佸尯锛�',
+ builder_name VARCHAR(200) COMMENT '鎶曡祫寤鸿鍗曚綅',
+ construct_nature VARCHAR(50) COMMENT '寤鸿鎬ц川',
+ start_time VARCHAR(20) COMMENT '寮�宸ユ椂闂�',
+ end_time VARCHAR(20) COMMENT '寤烘垚/绔e伐鏃堕棿',
+ total_investment DOUBLE COMMENT '璁″垝鎬绘姇璧勶紙涓囧厓锛�',
+ approval_gk VARCHAR(500) COMMENT '宸ュ彲鎵瑰',
+ approval_cs VARCHAR(500) COMMENT '鍒濊鎵瑰',
+ building_area DOUBLE COMMENT '寤虹瓚闈㈢Н锛堝钩鏂圭背锛�',
+ is_billion TINYINT DEFAULT 0 COMMENT '浜垮厓鎶曡祫椤圭洰鏍囪',
+ is_county TINYINT DEFAULT 0 COMMENT '缁忔祹寮哄幙椤圭洰鏍囪',
+ is_five_year TINYINT DEFAULT 0 COMMENT '鍗佷簲浜旈噸鐐圭墿娴侀」鐩爣璁�',
+ source VARCHAR(50) COMMENT '鏁版嵁鏉ユ簮',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+ UNIQUE KEY uk_name_category (project_name, category)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鎶曡祫椤圭洰涓绘。';
+
+-- 鎶曡祫椤圭洰鏈堝害瀹屾垚鎯呭喌
+DROP TABLE IF EXISTS investment_monthly;
+CREATE TABLE investment_monthly (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-07',
+ project_id BIGINT NOT NULL COMMENT '椤圭洰涓绘。ID',
+ year_plan DOUBLE COMMENT '鏈勾璁″垝鎶曡祫锛堜竾鍏冿級',
+ year_cum DOUBLE COMMENT '鑷勾鍒濈疮璁″畬鎴愭姇璧勶紙涓囧厓锛�',
+ month_done DOUBLE COMMENT '鍏朵腑锛氭湰鏈堝畬鎴愭姇璧勶紙涓囧厓锛�',
+ start_cum DOUBLE COMMENT '鑷紑濮嬪缓璁剧疮璁″畬鎴愭姇璧勶紙涓囧厓锛�',
+ progress_stage VARCHAR(100) COMMENT '寤鸿闃舵',
+ progress_desc VARCHAR(2000) COMMENT '褰㈣薄杩涘害',
+ building_area DOUBLE COMMENT '寤虹瓚闈㈢Н锛堝钩鏂圭背锛�',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_period (report_period),
+ KEY idx_project (project_id)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鎶曡祫椤圭洰鏈堝害瀹屾垚鎯呭喌';
+
+-- 鎶曡祫绯荤粺鏌ヨ瀵煎嚭锛堝鏍告瘮瀵瑰熀鍑嗭級
+DROP TABLE IF EXISTS investment_system;
+CREATE TABLE investment_system (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-07',
+ project_name VARCHAR(200) NOT NULL COMMENT '椤圭洰鍚嶇О锛堝崟浣嶏級',
+ total_investment DOUBLE COMMENT '璁″垝鎬绘姇璧勶紙涓囧厓锛�',
+ start_cum DOUBLE COMMENT '鑷紑濮嬪缓璁捐嚦鏈湀绱瀹屾垚鎶曡祫锛堜竾鍏冿級',
+ year_plan DOUBLE COMMENT '鏈勾璁″垝鎶曡祫锛堜竾鍏冿級',
+ year_cum DOUBLE COMMENT '鑷勾鍒濈疮璁″畬鎴愭姇璧勶紙涓囧厓锛�',
+ month_done DOUBLE COMMENT '褰撴湀瀹屾垚鎶曡祫锛堜竾鍏冿級',
+ import_batch_id BIGINT COMMENT '瀵煎叆鎵规',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_period (report_period)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鎶曡祫绯荤粺鏌ヨ瀵煎嚭锛堝鏍告瘮瀵瑰熀鍑嗭級';
+
+-- INVEST 棰勭疆瀹℃牳瑙勫垯锛�4鏉★紝report_type=INVEST锛�
+INSERT INTO audit_rule (rule_name, rule_code, description, check_field, compare_type, threshold, alert_level, report_type, is_enabled, sort_order) VALUES
+('鑷紑濮嬬疮璁′笌鎶曡祫绯荤粺瀵规瘮', 'RULE_I001', '鑷紑濮嬪缓璁剧疮璁″畬鎴愭姇璧勪笌鎶曡祫绯荤粺瀵煎嚭宸紓瓒呴槇鍊奸渶鏍稿疄', 'startCum', 'CROSS_DIFF', '100|5', 'YELLOW', 'INVEST', 1, 41),
+('鑷勾鍒濈疮璁′笌鎶曡祫绯荤粺瀵规瘮', 'RULE_I002', '鑷勾鍒濈疮璁″畬鎴愭姇璧勪笌鎶曡祫绯荤粺瀵煎嚭宸紓瓒呴槇鍊奸渶鏍稿疄', 'yearCum', 'CROSS_DIFF', '50|5', 'YELLOW', 'INVEST', 1, 42),
+('鏈湀瀹屾垚涓庢姇璧勭郴缁熷姣�', 'RULE_I003', '鏈湀瀹屾垚鎶曡祫涓庢姇璧勭郴缁熷鍑哄樊寮傝秴闃堝�奸渶鏍稿疄', 'monthDone', 'CROSS_DIFF', '30|30', 'YELLOW', 'INVEST', 1, 43),
+('鎶曡祫绯荤粺椤圭洰缂哄け鏍稿疄', 'RULE_I004', '姹囨�诲ぇ琛ㄩ」鐩湪鎶曡祫绯荤粺瀵煎嚭涓笉瀛樺湪闇�鏍稿疄', 'projectName', 'EXISTENCE_SYS', '0', 'YELLOW', 'INVEST', 1, 44);
+
+
+-- ============================================
+-- 涔濄�佸叕璺梾瀹釜浣撳杩愰噺/鍛ㄨ浆閲忥紙浼佷笟绾夸笅姹囨姤锛�
+-- ============================================
+DROP TABLE IF EXISTS passenger_individual_monthly;
+CREATE TABLE passenger_individual_monthly (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈� 2026-07',
+ region_code VARCHAR(20) COMMENT '鎵�灞炲湴鍖猴紙琛屾斂鍖哄垝浠g爜锛�',
+ enterprise_code VARCHAR(50) COMMENT '浼佷笟浠g爜',
+ enterprise_name VARCHAR(200) COMMENT '浼佷笟鍚嶇О',
+ passenger_count DOUBLE COMMENT '鍏朵腑涓綋瀹㈣繍閲忥紙浜猴級',
+ turnover DOUBLE COMMENT '鍏朵腑涓綋鏃呭鍛ㄨ浆閲忥紙浜哄叕閲岋級',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_period (report_period)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鍏矾鏃呭涓綋瀹㈣繍閲�/鍛ㄨ浆閲�';
+
+-- ============================================
+-- 鍗併�佹姤琛ㄦ湡瀹℃牳閫氳繃鏍囪锛坅udit_run锛�
+-- ============================================
+DROP TABLE IF EXISTS audit_run;
+CREATE TABLE audit_run (
+ id BIGINT AUTO_INCREMENT PRIMARY KEY,
+ report_type VARCHAR(50) COMMENT '鎶ヨ〃绫诲瀷',
+ report_period VARCHAR(20) COMMENT '鎶ヨ〃鏈�',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ KEY idx_type_period (report_type, report_period)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鎶ヨ〃鏈熷鏍搁�氳繃鏍囪';
diff --git a/deploy-templates/db/sql_city_bus.sql b/deploy-templates/db/sql_city_bus.sql
new file mode 100644
index 0000000..97ba0c8
--- /dev/null
+++ b/deploy-templates/db/sql_city_bus.sql
@@ -0,0 +1,59 @@
+-- 鍩庡競瀹㈣繍绗�1姝ワ紙鍏氦锛夊缓琛� + 瀹℃牳瑙勫垯
+-- 鏁版嵁婧愶細瀵煎叆_鍩庡競鍏叡浜ら�氭湀搴﹁繍钀ユ儏鍐碉紙2026骞�7鏈堬級.xls锛堜紒涓氱骇鏄庣粏锛屽惈鍏叡姹界數杞�/杞ㄩ亾/杞浮涓夌被锛屾湰琛ㄥ彧鍙栧叕鍏辨苯鐢佃溅瀛楁锛�
+
+CREATE TABLE IF NOT EXISTS city_bus_monthly (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-07',
+ region_code VARCHAR(20) DEFAULT NULL COMMENT '鎵�灞炲湴鍖轰唬鐮�',
+ city VARCHAR(50) DEFAULT NULL COMMENT '甯傚窞锛堢敱鍦板尯浠g爜鏄犲皠锛�',
+ enterprise_code VARCHAR(50) DEFAULT NULL COMMENT '浼佷笟浠g爜',
+ enterprise_name VARCHAR(200) DEFAULT NULL COMMENT '浼佷笟鍚嶇О',
+ op_vehicles DOUBLE DEFAULT NULL COMMENT '鍏叡姹界數杞﹁繍钀ヨ溅鏁�',
+ stop_total DOUBLE DEFAULT NULL COMMENT '杩愯惀绔欑偣鎬讳釜鏁�',
+ stop_city DOUBLE DEFAULT NULL COMMENT '鍏朵腑锛氬煄甯傚唴杩愯惀绔欑偣',
+ passenger_volume DOUBLE DEFAULT NULL COMMENT '鍏叡姹界數杞﹀杩愰噺锛堜竾浜烘锛�',
+ passenger_city DOUBLE DEFAULT NULL COMMENT '鍏朵腑锛氬煄甯傚唴瀹㈣繍閲忥紙涓囦汉娆★級',
+ turnover DOUBLE DEFAULT NULL COMMENT '鍏叡姹界數杞︽梾瀹㈠懆杞噺锛堜竾浜哄叕閲岋級',
+ turnover_city DOUBLE DEFAULT NULL COMMENT '鍏朵腑锛氬煄甯傚唴鏃呭鍛ㄨ浆閲忥紙涓囦汉鍏噷锛�',
+ avg_distance DOUBLE DEFAULT NULL COMMENT '鍏叡姹界數杞﹀钩鍧囪繍璺濓紙鍏噷锛�',
+ avg_distance_city DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呭钩鍧囪繍璺濓紙鍏噷锛�',
+ passenger_chengxiang DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂瀹㈣繍閲忥紙涓囦汉娆★級',
+ turnover_chengxiang DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂鏃呭鍛ㄨ浆閲忥紙涓囦汉鍏噷锛�',
+ avg_distance_chengxiang DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂骞冲潎杩愯窛锛堝叕閲岋級',
+ rate_op_vehicles_mom DOUBLE DEFAULT NULL COMMENT '杩愯惀杞︽暟鐜瘮澧為��',
+ rate_passenger_mom DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲忕幆姣斿閫�',
+ rate_passenger_city_mom DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呭杩愰噺鐜瘮',
+ rate_chengxiang_mom DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂瀹㈣繍閲忕幆姣斿閫�',
+ rate_chengxiang_turnover_mom DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂鏃呭鍛ㄨ浆閲忕幆姣斿閫�',
+ rate_turnover_mom DOUBLE DEFAULT NULL COMMENT '鏃呭鍛ㄨ浆閲忕幆姣斿閫�',
+ avg_distance_mom_change DOUBLE DEFAULT NULL COMMENT '骞冲潎杩愯窛鐜瘮澧炲噺锛堝叕閲岋級',
+ avg_distance_city_mom_change DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呭钩鍧囪繍璺濈幆姣斿鍑忥紙鍏噷锛�',
+ daily_passenger_per_vehicle DOUBLE DEFAULT NULL COMMENT '鍗曡溅鏃ュ潎瀹㈣繍閲�',
+ rate_op_vehicles_yoy DOUBLE DEFAULT NULL COMMENT '杩愯惀杞︽暟鍚屾瘮澧為��',
+ rate_passenger_yoy DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲忓悓姣斿閫�',
+ rate_passenger_city_yoy DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呭杩愰噺鍚屾瘮澧為��',
+ rate_chengxiang_yoy DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂瀹㈣繍閲忓悓姣斿閫�',
+ rate_chengxiang_turnover_yoy DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂鏃呭鍛ㄨ浆閲忓悓姣斿閫�',
+ rate_turnover_yoy DOUBLE DEFAULT NULL COMMENT '鏃呭鍛ㄨ浆閲忓悓姣斿閫�',
+ stop_city_ratio DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呰繍钀ョ珯鐐瑰崰姣�',
+ passenger_city_ratio DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呭杩愰噺鍗犳瘮',
+ chengxiang_ratio DOUBLE DEFAULT NULL COMMENT '鍩庨檯鍩庝埂瀹㈣繍閲忓崰姣�',
+ contact_person VARCHAR(100) DEFAULT NULL COMMENT '濉〃浜�',
+ contact_phone VARCHAR(50) DEFAULT NULL COMMENT '鑱旂郴鐢佃瘽',
+ report_date VARCHAR(20) DEFAULT NULL COMMENT '鎶ュ嚭鏃ユ湡',
+ verify_explanation TEXT COMMENT '鏍稿疄鎬у師鍥犺В閲�',
+ report_note TEXT COMMENT '涓婃姤璇存槑',
+ modify_record TEXT COMMENT '淇敼璁板綍',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (id),
+ KEY idx_period (report_period),
+ KEY idx_city (city),
+ KEY idx_enterprise (enterprise_name)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鍩庡競鍏氦浼佷笟鏈堝害鏁版嵁锛堝煄甯傚叕鍏变氦閫氭湀搴﹁繍钀ユ儏鍐碉級';
+
+-- 鍩庡競鍏氦 4 缁勫鏍歌鍒欙紙report_type=CITY_BUS锛�
+INSERT IGNORE INTO audit_rule (rule_name, rule_code, description, check_field, compare_type, threshold, alert_level, report_type, is_enabled, sort_order) VALUES
+ ('鍩庡競鍐呬笌鍩庨檯鍩庝埂瀹㈣繍閲忚秼鍔夸竴鑷存牳瀹�', 'RULE_B001', '鍩庡競鍐呭杩愰噺鐜瘮/鍚屾瘮涓庡煄闄呭煄涔″杩愰噺鐜瘮/鍚屾瘮瓒嬪娍涓嶄竴鑷翠笖澧為��>2%闇�鏍稿疄', 'passengerCityMom,passengerChengxiangMom,passengerCityYoy,passengerChengxiangYoy', 'TREND_CONSISTENCY', '0.02', 'YELLOW', 'CITY_BUS', 1, 51),
+ ('瀹㈣繍閲忎笌鏃呭鍛ㄨ浆閲忚秼鍔夸竴鑷存牳瀹�', 'RULE_B002', '瀹㈣繍閲忓悓姣�/鐜瘮涓庢梾瀹㈠懆杞噺鍚屾瘮/鐜瘮瓒嬪娍涓嶄竴鑷撮渶鏍稿疄', 'passengerMom,turnoverMom,passengerYoy,turnoverYoy', 'TREND_CONSISTENCY', '0.02', 'YELLOW', 'CITY_BUS', 1, 52),
+ ('鍩庡競鍐�/鍩庨檯鍩庝埂瀹㈣繍閲忓崰姣斿彉鍖栨牳瀹�', 'RULE_B003', '鍩庡競鍐呭杩愰噺鍗犳瘮鍜屽煄闄呭煄涔″杩愰噺鍗犳瘮涓庝笂鏈堢浉姣斿彉鍖�>1%闇�鏍稿疄', 'passengerCityRatio,chengxiangRatio', 'RATIO_CHANGE', '0.01', 'YELLOW', 'CITY_BUS', 1, 53),
+ ('骞冲潎杩愯窛鍙樺寲骞呭害鏍稿疄', 'RULE_B004', '骞冲潎杩愯窛涓庝笂鏈堢浉姣斿彉鍖栧箙搴﹁秴杩�3鍏噷闇�鏍稿疄锛堢壒鍒槸鍩庨檯鍩庝埂锛�', 'avgDistanceMomChange,avgDistanceCityMomChange,avgDistanceChengxiang', 'AVG_DIST_CHANGE', '3', 'YELLOW', 'CITY_BUS', 1, 54);
diff --git a/deploy-templates/db/sql_city_taxi.sql b/deploy-templates/db/sql_city_taxi.sql
new file mode 100644
index 0000000..824bf62
--- /dev/null
+++ b/deploy-templates/db/sql_city_taxi.sql
@@ -0,0 +1,82 @@
+-- 鍩庡競瀹㈣繍绗�2姝ワ紙宸℃父鍑虹锛夊缓琛� + 瀹℃牳瑙勫垯
+-- 鏁版嵁婧�1锛氬鍏宸℃父鍑虹姹借溅杩愯惀鏈嶅姟鎯呭喌鏈堟姤锛�2026骞�7鏈堬級.xls锛堝競宸炵骇锛�17琛岋級
+-- 鏁版嵁婧�2锛氳緭鍏鍑虹杞︿俊鎭�(杩愭斂杞﹁締淇℃伅).xls锛堣溅杈嗙骇鏄庣粏 42636 琛岋級
+
+CREATE TABLE IF NOT EXISTS city_taxi_monthly (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-07',
+ region_code VARCHAR(20) DEFAULT NULL COMMENT '鎵�灞炲湴鍖轰唬鐮�',
+ city VARCHAR(50) DEFAULT NULL COMMENT '甯傚窞',
+ trip_total DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鎬绘暟',
+ trip_city DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鎬绘暟_鍩庡競鍐�',
+ passenger_volume DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲忥紙涓囦汉娆★級',
+ passenger_city DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲廮鍏朵腑鍩庡競鍐�',
+ turnover DOUBLE DEFAULT NULL COMMENT '鏃呭鍛ㄨ浆閲忥紙涓囦汉鍏噷锛�',
+ turnover_city DOUBLE DEFAULT NULL COMMENT '鏃呭鍛ㄨ浆閲廮鍩庡競鍐�',
+ op_vehicles DOUBLE DEFAULT NULL COMMENT '杩愯惀杞﹁締鏁�',
+ avg_distance DOUBLE DEFAULT NULL COMMENT '宸℃父鍑虹姹借溅骞冲潎杩愯窛锛堝叕閲岋級',
+ avg_distance_city DOUBLE DEFAULT NULL COMMENT '鍩庡競鍐呭钩鍧囪繍璺濓紙鍏噷锛�',
+ daily_trips_per_vehicle DOUBLE DEFAULT NULL COMMENT '鍗曡溅鏃ュ潎杞藉杞︽',
+ daily_passenger_per_vehicle DOUBLE DEFAULT NULL COMMENT '鍗曡溅鏃ュ潎瀹㈣繍閲�',
+ passengers_per_trip DOUBLE DEFAULT NULL COMMENT '鍗曡溅娆¤浇瀹汉鏁�',
+ passengers_per_trip_city DOUBLE DEFAULT NULL COMMENT '鍗曡溅娆¤浇瀹汉鏁癬鍩庡競鍐�',
+ passengers_per_trip_chengxiang DOUBLE DEFAULT NULL COMMENT '鍗曡溅娆¤浇瀹汉鏁癬鍩庨檯鍩庝埂',
+ rate_op_vehicles_mom DOUBLE DEFAULT NULL COMMENT '杩愯惀杞︽暟鐜瘮澧為��',
+ rate_op_vehicles_yoy DOUBLE DEFAULT NULL COMMENT '杩愯惀杞︽暟鍚屾瘮澧為��',
+ rate_trip_mom DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鎬绘暟鐜瘮澧為��',
+ rate_trip_yoy DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鍚屾瘮澧為��',
+ rate_passenger_mom DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲忕幆姣斿閫�',
+ rate_passenger_yoy DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲忓悓姣斿閫�',
+ avg_distance_mom_change DOUBLE DEFAULT NULL COMMENT '骞冲潎杩愯窛鐜瘮澧炲噺锛堝叕閲岋級',
+ avg_distance_city_mom_change DOUBLE DEFAULT NULL COMMENT '骞冲潎杩愯窛_鍩庡競鍐呯幆姣斿鍑忥紙鍏噷锛�',
+ rate_trip_city_mom DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鎬绘暟鐜瘮澧為�焈鍩庡競鍐�',
+ rate_passenger_city_mom DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲忕幆姣斿閫焈鍩庡競鍐�',
+ rate_trip_chengxiang_mom DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鎬绘暟_鍩庨檯鍩庝埂鐜瘮澧為��',
+ rate_passenger_chengxiang_mom DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲廮鍩庨檯鍩庝埂鐜瘮澧為��',
+ avg_distance_chengxiang DOUBLE DEFAULT NULL COMMENT '骞冲潎杩愯窛_鍩庨檯鍩庝埂锛堝叕閲岋級',
+ trip_city_ratio DOUBLE DEFAULT NULL COMMENT '杞藉杞︽鎬绘暟_鍩庡競鍐呭崰姣�',
+ passenger_city_ratio DOUBLE DEFAULT NULL COMMENT '瀹㈣繍閲廮鍩庡競鍐呭崰姣�',
+ contact_person VARCHAR(100) DEFAULT NULL COMMENT '濉〃浜�',
+ contact_phone VARCHAR(50) DEFAULT NULL COMMENT '鑱旂郴鐢佃瘽',
+ report_date VARCHAR(20) DEFAULT NULL COMMENT '鎶ュ嚭鏃ユ湡',
+ verify_explanation TEXT COMMENT '鏍稿疄鎬у師鍥犺В閲�',
+ report_note TEXT COMMENT '涓婃姤璇存槑',
+ modify_record TEXT COMMENT '淇敼璁板綍',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (id),
+ KEY idx_period (report_period),
+ KEY idx_city (city)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宸℃父鍑虹姹借溅杩愯惀鏈嶅姟鎯呭喌鏈堟姤锛堝競宸炵骇锛�';
+
+CREATE TABLE IF NOT EXISTS city_taxi_auth (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� 2026-07',
+ city VARCHAR(50) DEFAULT NULL COMMENT '甯傚窞锛堢敱璇佸彿/妗f鍙�/鍦板潃鎻愬彇锛�',
+ plate_no VARCHAR(30) DEFAULT NULL COMMENT '杞︾墝鍙风爜',
+ vehicle_type VARCHAR(50) DEFAULT NULL COMMENT '杞﹁締绫诲瀷',
+ biz_type VARCHAR(50) DEFAULT NULL COMMENT '缁忚惀绫诲瀷',
+ owner_name VARCHAR(100) DEFAULT NULL COMMENT '杞︿富鍚嶇О',
+ license_no VARCHAR(100) DEFAULT NULL COMMENT '缁忚惀鏉冨彿',
+ archive_no VARCHAR(100) DEFAULT NULL COMMENT '妗f鍙�',
+ road_cert_no VARCHAR(100) DEFAULT NULL COMMENT '閬撹矾杩愯緭璇佸瓧鍙�',
+ fuel_type VARCHAR(50) DEFAULT NULL COMMENT '鐕冩枡绫诲瀷',
+ operator_name VARCHAR(200) DEFAULT NULL COMMENT '涓氭埛鍚嶇О',
+ operator_addr VARCHAR(300) DEFAULT NULL COMMENT '涓氭埛鍦板潃',
+ op_status VARCHAR(20) DEFAULT NULL COMMENT '钀ヨ繍鐘舵��',
+ cert_status VARCHAR(20) DEFAULT NULL COMMENT '璇佷欢鐘舵��',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (id),
+ KEY idx_period (report_period),
+ KEY idx_city (city),
+ KEY idx_period_city (report_period, city)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='鍑虹杞﹁繍鏀胯溅杈嗕俊鎭紙杞﹁締绾ф槑缁嗭級';
+
+-- 鍩庡競瀹㈣繍绗�2姝ワ細宸℃父鍑虹 7 缁勫鏍歌鍒欙紙report_type=CITY_TAXI锛�
+INSERT IGNORE INTO audit_rule (rule_name, rule_code, description, check_field, compare_type, threshold, alert_level, report_type, is_enabled, sort_order) VALUES
+ ('杩愯惀杞︽暟涓庤繍鏀跨郴缁熷姣旀牳瀹�', 'RULE_T001', '鏈堟姤杩愯惀杞﹁締鏁颁笌杩愭斂绯荤粺杞﹁締鏁板樊璺�>3%闇�鏍稿疄', 'opVehicles', 'CROSS_DIFF_PCT', '3', 'RED', 'CITY_TAXI', 1, 61),
+ ('鍩庡競鍐呬笌鍩庨檯鍩庝埂瀹㈣繍閲忚秼鍔夸竴鑷存牳瀹�', 'RULE_T002', '鍩庡競鍐呭杩愰噺鐜瘮涓庡煄闄呭煄涔″杩愰噺鐜瘮瓒嬪娍涓嶄竴鑷翠笖澧為��>2%闇�鏍稿疄', 'passengerCityMom,passengerChengxiangMom', 'TREND_CONSISTENCY', '0.02', 'YELLOW', 'CITY_TAXI', 1, 62),
+ ('瀹㈣繍閲忎笌鏃呭鍛ㄨ浆閲忚秼鍔夸竴鑷存牳瀹�', 'RULE_T003', '瀹㈣繍閲忕幆姣斾笌鏃呭鍛ㄨ浆閲忕幆姣旓紙鐢卞钩鍧囪繍璺濇帹瀵硷級瓒嬪娍涓嶄竴鑷撮渶鏍稿疄', 'passengerMom,turnoverMomDerived', 'TREND_CONSISTENCY', '0.02', 'YELLOW', 'CITY_TAXI', 1, 63),
+ ('鍩庡競鍐呭杩愰噺鍗犳瘮鍙樺寲鏍稿疄', 'RULE_T004', '鍩庡競鍐呭杩愰噺鍗犳瘮涓庝笂鏈堢浉姣斿彉鍖�>1%闇�鏍稿疄', 'passengerCityRatio', 'RATIO_CHANGE', '0.01', 'YELLOW', 'CITY_TAXI', 1, 64),
+ ('骞冲潎杩愯窛鍙樺寲骞呭害鏍稿疄', 'RULE_T005', '骞冲潎杩愯窛涓庝笂鏈堢浉姣斿彉鍖栬秴杩�3鍏噷闇�鏍稿疄锛堢壒鍒槸鍩庨檯鍩庝埂锛�', 'avgDistanceMomChange,avgDistanceCityMomChange,avgDistanceChengxiang', 'AVG_DIST_CHANGE', '3', 'YELLOW', 'CITY_TAXI', 1, 65),
+ ('鍗曡溅娆¤浇瀹汉鏁扮郴鏁板彉鍖栨牳瀹�', 'RULE_T006', '鍗曡溅娆¤浇瀹汉鏁�=瀹㈣繍閲�/杞藉杞︽鎬绘暟锛屼笌涓婃湀鐩告瘮鍙樺寲>0.2闇�鏍稿疄', 'passengersPerTrip', 'PAX_PER_TRIP_CHANGE', '0.2', 'YELLOW', 'CITY_TAXI', 1, 66),
+ ('杞藉杞︽鎬绘暟涓庡杩愰噺瓒嬪娍涓�鑷存牳瀹�', 'RULE_T007', '杞藉杞︽鎬绘暟鐜瘮/鍚屾瘮涓庡杩愰噺鐜瘮/鍚屾瘮瓒嬪娍涓嶄竴鑷撮渶鏍稿疄', 'tripMom,passengerMom,tripYoy,passengerYoy', 'TREND_CONSISTENCY', '0.01', 'YELLOW', 'CITY_TAXI', 1, 67);
diff --git a/deploy-templates/db/sql_wyc.sql b/deploy-templates/db/sql_wyc.sql
new file mode 100644
index 0000000..2a1ee6b
--- /dev/null
+++ b/deploy-templates/db/sql_wyc.sql
@@ -0,0 +1,45 @@
+-- 鍩庡競瀹㈣繍缃戠害杞︽湀搴﹁緭鍏ュ缓琛紙2026-09-04锛�
+-- 鏁版嵁婧�1锛氭ā鏉縚缃戠害杞︽�绘暟.xlsx锛堟湀搴﹀叏鐪� pin锛氬杩愰噺/鍏朵腑鍩庡競鍐�/鍛ㄨ浆閲�/鍏朵腑鍩庡競鍐呭懆杞噺锛�
+-- 鏁版嵁婧�2锛氭ā鏉縚缃戠害杞﹁鍗曞強鍏ㄧ渷鎬婚噺.xlsx锛堟湀搴﹁緭鍏ラ〉锛欱-E 鍏ㄧ渷 pin + F 璁㈠崟鍚堣 + G-W 17甯傚窞璁㈠崟锛�
+
+CREATE TABLE IF NOT EXISTS wyc_total_monthly (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� yyyy-MM',
+ pin_k DOUBLE DEFAULT NULL COMMENT '鍏ㄧ渷缃戠害杞﹀杩愰噺(涓囦汉娆�)',
+ pin_ck DOUBLE DEFAULT NULL COMMENT '鍏朵腑鍩庡競鍐呭杩愰噺',
+ pin_z DOUBLE DEFAULT NULL COMMENT '鍏ㄧ渷瀹㈣繍鍛ㄨ浆閲�(涓囦汉鍏噷)',
+ pin_cz DOUBLE DEFAULT NULL COMMENT '鍏朵腑鍩庡競鍐呭懆杞噺',
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (id),
+ UNIQUE KEY uk_wyc_total_period (report_period)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缃戠害杞︽湀搴﹀叏鐪� pin 杈撳叆';
+
+CREATE TABLE IF NOT EXISTS wyc_order_monthly (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ report_period VARCHAR(20) NOT NULL COMMENT '鎶ヨ〃鏈� yyyy-MM',
+ pin_k DOUBLE DEFAULT NULL,
+ pin_ck DOUBLE DEFAULT NULL,
+ pin_z DOUBLE DEFAULT NULL,
+ pin_cz DOUBLE DEFAULT NULL,
+ order_sum DOUBLE DEFAULT NULL COMMENT '璁㈠崟鍚堣锛堝崟锛�',
+ order_wuhan DOUBLE DEFAULT NULL,
+ order_huangshi DOUBLE DEFAULT NULL,
+ order_shiyan DOUBLE DEFAULT NULL,
+ order_yichang DOUBLE DEFAULT NULL,
+ order_xiangyang DOUBLE DEFAULT NULL,
+ order_ezhou DOUBLE DEFAULT NULL,
+ order_jingmen DOUBLE DEFAULT NULL,
+ order_xiaogan DOUBLE DEFAULT NULL,
+ order_jingzhou DOUBLE DEFAULT NULL,
+ order_huanggang DOUBLE DEFAULT NULL,
+ order_xianning DOUBLE DEFAULT NULL,
+ order_suizhou DOUBLE DEFAULT NULL,
+ order_enshi DOUBLE DEFAULT NULL,
+ order_xiantao DOUBLE DEFAULT NULL,
+ order_qianjiang DOUBLE DEFAULT NULL,
+ order_tianmen DOUBLE DEFAULT NULL,
+ order_shennong DOUBLE DEFAULT NULL,
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (id),
+ UNIQUE KEY uk_wyc_order_period (report_period)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='缃戠害杞﹁鍗曞強鍏ㄧ渷鎬婚噺鏈堝害杈撳叆';
diff --git a/deploy-templates/frontend/nginx.conf.example b/deploy-templates/frontend/nginx.conf.example
new file mode 100644
index 0000000..4df1301
--- /dev/null
+++ b/deploy-templates/frontend/nginx.conf.example
@@ -0,0 +1,15 @@
+# 鍓嶇 nginx 閰嶇疆绀轰緥锛堝彧鏈夊湪涓嶆兂鐢ㄣ�宩ar 鍐呭祵鍓嶇銆嶆椂鎵嶉渶瑕侊級
+server {
+ listen 8080;
+ server_name localhost;
+ root /opt/traffic-audit/frontend/dist; # 鏀规垚瀹為檯璺緞
+ index index.html;
+ location /api/ {
+ proxy_pass http://127.0.0.1:8090;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_read_timeout 300s;
+ }
+ location / { try_files $uri $uri/ /index.html; }
+}
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\206\351\222\245\345\244\226\351\203\250\345\214\226\344\270\216\346\211\223\345\214\205\345\216\273\345\257\206_2026-09-26.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\206\351\222\245\345\244\226\351\203\250\345\214\226\344\270\216\346\211\223\345\214\205\345\216\273\345\257\206_2026-09-26.md"
index f465b04..5885e38 100644
--- "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\206\351\222\245\345\244\226\351\203\250\345\214\226\344\270\216\346\211\223\345\214\205\345\216\273\345\257\206_2026-09-26.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\206\351\222\245\345\244\226\351\203\250\345\214\226\344\270\216\346\211\223\345\214\205\345\216\273\345\257\206_2026-09-26.md"
@@ -72,3 +72,34 @@
| TC-12 | `traffic-audit-server/config/application.yml` | 鏃犳槑鏂� | 浠呮敞閲婅鏄庯紙鍊艰蛋鐜鍙橀噺锛� | 閫氳繃 |
> 璇存槑锛氱幆澧冨彉閲忔湰韬粛鏄湰鏈烘槑鏂囷紙瀛樺湪娉ㄥ唽琛� `HKCU\Environment`锛夛紝閫傚悎鍗曟満寮�鍙戯紱鍗忎綔/鐢熶骇璇风敤閮ㄧ讲鏈哄閮ㄩ厤缃垨瀵嗛挜绠$悊宸ュ叿銆傝疆鎹� key 浠嶆槸鏍规不娉勯湶鐨勫敮涓�鎵嬫銆�
+
+## 涓冦�佺涓夎疆锛�2026-09-27锛夛細妯℃澘鍏ュ簱 + 涓�閿墦鍖� + 娓呯悊鏃у寘
+
+1. **鎵撳寘妯℃澘鍏ュ簱**锛氬師鍏堟墦鍖呯敤鐨勬ā鏉夸欢锛堝閮� `application.yml`銆乣start-backend.cmd/.sh`銆乣nginx.conf.example`銆乣README-閮ㄧ讲璇存槑.txt`銆乣db` 鐨� 4 涓缓琛ㄨ剼鏈級鍙瓨鍦ㄦ湭璺熻釜鐨勬棫閮ㄧ讲鍖呯洰褰曢噷锛屽垹鍖呭嵆涓€�佷笖涓嶅湪鐗堟湰搴撱��
+ 鐜扮粺涓�鎼埌 **`deploy-templates/`**锛堝彲鎻愪氦銆佸凡鍏ュ簱锛夛紝`pack-deploy.ps1` 鏀逛负浠庤鐩綍缁勮銆�
+2. **涓�閿墦鍖呰剼鏈� `pack-deploy.ps1`**锛氭瀯寤� jar 鈫� **瑙e帇鑷锛堝崰浣嶇鏍¢獙锛屽懡涓湡瀹炲瘑閽ユ垨鏄庢枃鍙d护鍗充腑姝級** 鈫� 閲嶅缓鍓嶇 鈫� 缁勮瀹屾暣閮ㄧ讲鍖呭埌 `E:\璇曢獙\traffic-audit-deploy-<yyyyMMdd>`銆�
+3. **瀵嗛挜鏇存柊鑴氭湰 `set-secrets.ps1`**锛氫氦浜掑紡鏇存柊 `DEEPSEEK_API_KEY` / `TRAFFIC_DB_PASSWORD` 鐢ㄦ埛鐜鍙橀噺锛堝�间笉钀芥枃浠讹級銆�
+4. **娓呯悊鏃у寘**锛堢敤鎴风‘璁ゅ悗鎵ц锛夛細
+
+| 鍒犻櫎瀵硅薄 | 璇存槑 |
+| --- | --- |
+| `E:\璇曢獙\traffic-audit-deploy-20260913`锛�246 鏂囦欢 / 81.5 MB锛� | 鏃ч儴缃插寘鐩綍锛堝惈甯﹀瘑閽� jar锛� |
+| `E:\璇曢獙\traffic-audit-deploy-20260913.zip`锛�69.9 MB锛� | 鏃у寘鍘嬬缉浠讹紙鍚甫瀵嗛挜 jar锛� |
+| `deploy\traffic-audit-deploy-20260913`锛�245 鏂囦欢 / 81.5 MB锛� | 浠撳簱鍐呮棫鍖呭壇鏈� |
+| `_deploytest`锛�201 鏂囦欢 / 78.1 MB锛� | 鏃х殑閮ㄧ讲娴嬭瘯鐩綍 |
+| `out`锛堢┖鐩綍锛夈�乣deploy`锛堟竻绌哄悗鐨勭┖鐩綍锛� | 鏃犵敤绌虹洰褰� |
+| `traffic-audit-server\target\*.jar`锛堟棫锛� | 琚� `mvn clean` 瑕嗙洊涓烘柊鏋勫缓 |
+
+> 娉細杩欎簺鐩綍閲岀殑鏂囦欢甯﹀彧璇诲睘鎬э紝`Remove-Item -Force` 琚幆澧冪瓥鐣ユ嫤鎴紝鏀逛负**鍏堟竻灞炴�у啀 `Remove-Item -Recurse`**銆�
+
+### 绗笁杞獙璇�
+
+| 缂栧彿 | 妫�鏌� | 缁撴灉 |
+| --- | --- | --- |
+| TC-13 | 鏂板寘 `E:\璇曢獙\traffic-audit-deploy-20260927` | 336 鏂囦欢 / 95.95 MB锛屽惈 backend(fresh jar+妯℃澘+docs)銆乫rontend(dist+nginx 绀轰緥)銆乨b銆丷EADME |
+| TC-14 | 鏂� jar 鍐呯疆閰嶇疆 | 鍏ㄤ负 `${...}` 鍗犱綅绗︼紝`鍚� sk- 鏄庢枃: False` |
+| TC-15 | 鏂板墠绔� dist | 鍚渶鏂板姛鑳斤紙`rollupTypes` / 銆屾寜甯傚窞姹囨�汇�嶏級 |
+| TC-16 | 鍏ㄧ洏澶嶆煡锛堜粨搴� + `E:\璇曢獙`锛� | 鍐呯疆閰嶇疆甯� key 鐨� jar锛�**鏃�**锛涘帇缂╁寘鍚� key锛�**鏃�**锛涙枃鏈惈 key锛�**鏃�** |
+| TC-17 | 涓�閿墦鍖呰剼鏈疄璺� | 杈撳嚭"[2/5] 鍘诲瘑鑷鈥﹂�氳繃"骞舵垚鍔熶骇鍑烘柊鍖� |
+
+> 鍞竴浠嶅甫鏄庢枃 key 鐨勫湴鏂规槸**鐢ㄦ埛鐜鍙橀噺**锛堣璁″姝わ紝渚涙湰鏈哄紑鍙戠敤锛変笌**宸插甫鍑哄幓/鏈嶅姟鍣ㄤ笂閭d唤鏃� jar**鈥斺�斿悗鑰呴渶鎸夌 4 鑺傝疆鎹� key 鎵嶇畻褰诲簳銆�
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-26.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-26.md"
index cedef57..03d2dec 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-26.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-26.md"
@@ -28,6 +28,15 @@
- 娓呯悊浠撳簱鍐呭惈 key 鐨勬湭璺熻釜鏂囦欢锛歚_shots/all_events.json`锛�13 澶勶級銆乣_dep_readme.txt`锛�1 澶勶級鈫� 鏇挎崲涓� `sk-REDACTED`锛屽叏浠撳鏌ユ棤鏄庢枃锛�
- 褰撳墠鏈嶅姟宸茬敤鏂版柟寮忛噸鍚細鐧诲綍 OK + AI 鍥炵瓟"鏀跺埌"锛屽姛鑳芥棤鍥炲綊銆�
+### 5. 鎵撳寘妯℃澘鍏ュ簱 + 涓�閿墦鍖� + 娓呯悊鏃у寘锛�2026-09-27 缁級
+
+- 鏂板 `pack-deploy.ps1`锛堟瀯寤� 鈫� **jar 鍘诲瘑鑷** 鈫� 閲嶅缓鍓嶇 鈫� 缁勮瀹屾暣閮ㄧ讲鍖咃級涓� `set-secrets.ps1`锛堜氦浜掑紡鏇存柊鏈満瀵嗛挜鐜鍙橀噺锛屽�间笉钀芥枃浠讹級锛�
+- 鎵撳寘妯℃澘浠讹紙澶栭儴 application.yml銆佸惎鍔ㄨ剼鏈�乶ginx 绀轰緥銆乨b 寤鸿〃 sql銆侀儴缃� README锛変粠鏃у寘鎼埌 **`deploy-templates/`** 骞跺叆搴擄紙鍘熷厛鍙湪鏈窡韪殑鍖呯洰褰曢噷锛屽垹鍖呭嵆涓級锛�
+- 宸蹭骇鍑哄共鍑�鏂板寘 **`E:\璇曢獙\traffic-audit-deploy-20260927`**锛�336 鏂囦欢 / 95.95 MB锛屽墠绔惈鏈�鏂�"鎸夊競宸炴眹鎬�"鍔熻兘锛夛紱
+- 鎸夌敤鎴风‘璁ゆ竻鐞嗘棫鍖咃細`E:\璇曢獙\traffic-audit-deploy-20260913`锛堢洰褰� + 69.9 MB 鐨� zip锛夈�乣deploy\traffic-audit-deploy-20260913`銆乣_deploytest`銆佺┖鐨� `out`/`deploy`锛屼互鍙婅瑕嗙洊鐨勬棫 `target` jar锛�
+- 鍏ㄧ洏澶嶆煡锛堜粨搴� + E:\璇曢獙锛夛細**宸叉棤浠讳綍鍚槑鏂� key 鐨� jar / 鍘嬬缉鍖� / 鏂囨湰鏂囦欢**锛�
+- 鍧戯細鏃у寘鏂囦欢甯﹀彧璇诲睘鎬э紝`Remove-Item -Force` 琚幆澧冪瓥鐣ユ嫤 鈫� 鏀逛负鍏堟竻灞炴�у啀 `Remove-Item -Recurse`銆�
+
## 浜屻�佹祴璇曠粨鏋滄憳瑕�
- 鎶ュ憡锛歚docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_瀵嗛挜澶栭儴鍖栦笌鎵撳寘鍘诲瘑_2026-09-26.md`锛�7 鏉$敤渚嬪叏閫氳繃锛夈��
diff --git "a/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md" "b/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md"
index 05c977c..9535176 100644
--- "a/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md"
+++ "b/docs/\346\211\223\345\214\205\351\203\250\347\275\262\350\257\264\346\230\216.md"
@@ -255,6 +255,30 @@
python -c "import zipfile;print(zipfile.ZipFile('traffic-audit-server/target/traffic-audit-server-1.0.0-SNAPSHOT.jar').read('BOOT-INF/classes/application.yml').decode('utf-8'))" | Select-String "password:|api-key:"
```
+
+### 涓�閿墦鍖咃紙鎺ㄨ崘锛�2026-09-27 璧凤級
+
+```powershell
+powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1
+# 鍙�夊弬鏁帮細 -OutRoot "E:\璇曢獙" -SkipFrontend
+```
+
+鑴氭湰鍋氬洓浠朵簨锛�
+1. `mvn clean package -DskipTests` 鏋勫缓鍚庣 jar锛�
+2. **瑙e帇 jar 鑷**锛氭鏌� `BOOT-INF/classes/application.yml` 鏄惁鍏ㄤ负鍗犱綅绗︹�斺�斾竴鏃﹀彂鐜� `sk-` 鎴栨槑鏂囧彛浠�**鐩存帴涓鎵撳寘**锛�
+3. `npm run build` 閲嶅缓鍓嶇 `dist`锛�
+4. 鎸� `deploy-templates/` 缁勮瀹屾暣閮ㄧ讲鍖咃紙backend / frontend / db / README-閮ㄧ讲璇存槑.txt锛夛紝杈撳嚭鍒� `<OutRoot>\traffic-audit-deploy-<yyyyMMdd>`銆�
+
+妯℃澘浠剁粺涓�鏀惧湪 **`deploy-templates/`**锛堝凡鍏ュ簱锛夛細澶栭儴 `application.yml`銆乣start-backend.cmd/.sh`銆乣nginx.conf.example`銆乣db\{init.sql,sql_city_bus,sql_city_taxi,sql_wyc}.sql`銆乣README-閮ㄧ讲璇存槑.txt`銆傛敼妯℃澘鍗虫敼鎵撳寘浜х墿銆�
+
+### 杞崲瀵嗛挜鍚庡悓姝ユ湰鏈�
+
+```powershell
+powershell -NoProfile -ExecutionPolicy Bypass -File set-secrets.ps1
+```
+
+浜や簰寮忚緭鍏ワ紙鍥炶溅璺宠繃鏌愪竴椤癸級锛岃嚜鍔� `setx` 鍒扮敤鎴风幆澧冨彉閲忓苟鎻愮ず閲嶅惎鍚庣锛涘�间笉浼氬啓鍏ヤ换浣曟枃浠躲��
+
### 閮ㄧ讲鏈轰笂鍔�/鎹� DeepSeek key
1. 鎵撳寘涓婁紶鍚庯紝缂栬緫 **jar 鍚岀骇**鐨� `backend/application.yml`锛歚deepseek.api-key: "浣犵殑鏂発ey"`锛堢暀绌哄垯椤甸潰 AI 鍒嗘瀽涓嶅彲鐢紝鍏朵綑鍔熻兘姝e父锛夛紱
diff --git a/pack-deploy.ps1 b/pack-deploy.ps1
new file mode 100644
index 0000000..42cc00d
--- /dev/null
+++ b/pack-deploy.ps1
@@ -0,0 +1,98 @@
+锘�<#
+ 涓�閿墦鍖呴儴缃插寘锛堝惈"鍘诲瘑鑷"锛夆�斺�� 2026-09-27 鏂板
+ 鐢ㄦ硶锛�
+ powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1
+ powershell -NoProfile -ExecutionPolicy Bypass -File pack-deploy.ps1 -OutRoot "E:\璇曢獙" -SkipFrontend
+ 鍋氬洓浠朵簨锛�
+ 1) mvn clean package 鏋勫缓鍚庣 jar
+ 2) 瑙e帇 jar 妫�鏌ュ唴缃� application.yml锛氬繀椤诲叏鏄崰浣嶇锛堢姝� sk- 瀵嗛挜 / 鏄庢枃鍙d护锛夛紝涓嶅悎鏍肩洿鎺ヤ腑姝�
+ 3) npm run build 鏋勫缓鍓嶇 dist锛堝彲 -SkipFrontend锛�
+ 4) 缁勮 deploy 鐩綍缁撴瀯锛坆ackend / frontend / db / README-閮ㄧ讲璇存槑.txt锛夛紝杈撳嚭鍒� <OutRoot>\traffic-audit-deploy-<yyyyMMdd>
+#>
+param(
+ [string]$OutRoot = 'E:\璇曢獙',
+ [switch]$SkipFrontend
+)
+
+$ErrorActionPreference = 'Stop'
+$root = Split-Path -Parent $MyInvocation.MyCommand.Path
+$tplDir = Join-Path $root 'deploy-templates' # 鎵撳寘妯℃澘浠讹紙宸插叆搴擄紝2026-09-27 璧凤級
+$jarRel = 'traffic-audit-server\target\traffic-audit-server-1.0.0-SNAPSHOT.jar'
+$jar = Join-Path $root $jarRel
+
+Write-Host '[1/5] 鏋勫缓鍚庣锛坢vn clean package -DskipTests锛�...'
+Push-Location $root
+cmd /c "mvn.cmd -q clean package -DskipTests -f traffic-audit-server\pom.xml > pack-build.log 2>&1"
+$rc = $LASTEXITCODE
+Pop-Location
+if ($rc -ne 0) { throw '鍚庣鏋勫缓澶辫触锛岃瑙� pack-build.log' }
+if (-not (Test-Path $jar)) { throw "鏈壘鍒版瀯寤轰骇鐗╋細$jar" }
+Write-Host (" 浜х墿锛歿0:N1} MB" -f ((Get-Item $jar).Length / 1MB))
+
+Write-Host '[2/5] 鍘诲瘑鑷锛氳В鍘� jar 妫�鏌� BOOT-INF/classes/application.yml ...'
+Add-Type -AssemblyName System.IO.Compression.FileSystem
+$zip = [System.IO.Compression.ZipFile]::OpenRead($jar)
+try {
+ $entry = $zip.Entries | Where-Object { $_.FullName -eq 'BOOT-INF/classes/application.yml' }
+ if (-not $entry) { throw 'jar 鍐呯己灏� BOOT-INF/classes/application.yml' }
+ $sr = New-Object System.IO.StreamReader($entry.Open())
+ $text = $sr.ReadToEnd()
+ $sr.Close()
+} finally { $zip.Dispose() }
+
+$bad = @()
+if ($text -match 'sk-[A-Za-z0-9]{16,}') { $bad += '鐤戜技鏄庢枃 API key锛坰k-鈥︼級' }
+foreach ($line in ($text -split "`n")) {
+ if ($line -match '^\s*(password|api-key|secret)\s*:\s*(.+)$') {
+ $v = $matches[2].Trim().Trim('"')
+ if ($v -and -not $v.StartsWith('${')) { $bad += ("$($matches[1]) 涓嶆槸鍗犱綅绗�") }
+ }
+}
+if ($bad.Count -gt 0) {
+ throw ('鍘诲瘑鑷鏈�氳繃锛�' + ($bad -join '锛�') + '銆傝妫�鏌� traffic-audit-server\src\main\resources\application.yml')
+}
+Write-Host ' 閫氳繃锛歫ar 鍐呯疆閰嶇疆鍏ㄩ儴涓哄崰浣嶇锛屾棤鏄庢枃瀵嗛挜/鍙d护銆�'
+
+Write-Host '[3/5] 鏋勫缓鍓嶇锛坣pm run build锛屽彲 -SkipFrontend 璺宠繃锛�...'
+if (-not $SkipFrontend) {
+ Push-Location (Join-Path $root 'traffic-audit-web')
+ cmd /c "npm.cmd run build > ..\pack-front.log 2>&1"
+ $rc2 = $LASTEXITCODE
+ Pop-Location
+ if ($rc2 -ne 0) { throw '鍓嶇鏋勫缓澶辫触锛岃瑙� pack-front.log' }
+ Write-Host ' 鍓嶇 dist 宸查噸寤�'
+}
+
+Write-Host '[4/5] 缁勮閮ㄧ讲鐩綍...'
+$stamp = Get-Date -Format 'yyyyMMdd'
+$dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp)
+$n = 2
+while (Test-Path $dest) { $dest = Join-Path $OutRoot ("traffic-audit-deploy-" + $stamp + "-" + $n); $n++ }
+New-Item -ItemType Directory -Force -Path (Join-Path $dest 'backend'), (Join-Path $dest 'frontend'), (Join-Path $dest 'db') | Out-Null
+
+Copy-Item $jar (Join-Path $dest 'backend') -Force
+Copy-Item (Join-Path $tplDir 'backend\application.yml') (Join-Path $dest 'backend') -Force
+Copy-Item (Join-Path $tplDir 'backend\start-backend.cmd') (Join-Path $dest 'backend') -Force
+Copy-Item (Join-Path $tplDir 'backend\start-backend.sh') (Join-Path $dest 'backend') -Force
+Copy-Item (Join-Path $root 'traffic-audit-web\dist') (Join-Path $dest 'frontend') -Recurse -Force
+Copy-Item (Join-Path $tplDir 'frontend\nginx.conf.example') (Join-Path $dest 'frontend') -Force
+Copy-Item (Join-Path $tplDir 'db\*.sql') (Join-Path $dest 'db') -Force
+
+# docs锛氳繍琛屾椂妯℃澘 + 鐢ㄦ埛鏂囨。锛涙帓闄ゅ紑鍙戣繃绋嬫枃妗d笌缂撳瓨/澶囦唤锛堝噺灏忎綋绉�侀伩鍏嶆妸鍐呴儴娓呭崟甯﹀嚭鍘伙級
+$docsDest = Join-Path $dest 'backend\docs'
+New-Item -ItemType Directory -Force -Path $docsDest | Out-Null
+cmd /c "robocopy `"$root\docs`" `"$docsDest`" /E /NFL /NDL /NJH /NJS /NP /XD _cache 宸ヤ綔鏃ョ粨 鍔熻兘娴嬭瘯鎶ュ憡 闂姹囨�� /XF 鐢熸垚_*.xlsx _bak_* >nul"
+if ($LASTEXITCODE -ge 8) { throw "docs 澶嶅埗澶辫触锛坮obocopy 杩斿洖 $LASTEXITCODE锛�" }
+# db 鑴氭湰涔熸斁涓�浠藉埌 docs锛堜笌鏃у寘涓�鑷达細docs/init.sql 绛夛級
+Copy-Item (Join-Path $tplDir 'db\init.sql'), (Join-Path $tplDir 'db\sql_city_bus.sql'), (Join-Path $tplDir 'db\sql_city_taxi.sql'), (Join-Path $tplDir 'db\sql_wyc.sql') $docsDest -Force -ErrorAction SilentlyContinue
+
+# README锛氱敤鏃у寘妯℃澘骞舵浛鎹㈡棩鏈熷崰浣�
+$readme = Get-Content (Join-Path $tplDir 'README-閮ㄧ讲璇存槑.txt') -Raw -Encoding UTF8
+$readme = $readme.Replace('{stamp}', $stamp)
+Set-Content -LiteralPath (Join-Path $dest 'README-閮ㄧ讲璇存槑.txt') -Value $readme -Encoding UTF8
+
+Write-Host '[5/5] 姹囨��...'
+$files = Get-ChildItem $dest -Recurse -File
+Write-Host (" 杈撳嚭鐩綍锛歿0}" -f $dest)
+Write-Host (" 鏂囦欢鏁帮細{0}銆�鍚堣锛歿1:N2} MB" -f $files.Count, (($files | Measure-Object Length -Sum).Sum / 1MB))
+Write-Host ' 鎻愰啋锛氭妸鍖呮嫹鍒伴儴缃叉満鍚庯紝鍙渶鏀� backend\application.yml 閲岀殑鏁版嵁搴撲笁澶� + 闇�瑕佹椂濉� deepseek.api-key銆�'
diff --git a/set-secrets.ps1 b/set-secrets.ps1
new file mode 100644
index 0000000..892ab56
--- /dev/null
+++ b/set-secrets.ps1
@@ -0,0 +1,31 @@
+锘�<#
+ 璁剧疆/鏇存柊鏈満瀵嗛挜鐜鍙橀噺锛堝�间笉钀芥枃浠讹級鈥斺�� 杞崲 DeepSeek key 鍚庤窇杩欎釜
+ 鐢ㄦ硶锛歱owershell -NoProfile -ExecutionPolicy Bypass -File set-secrets.ps1
+ 锛堝洖杞﹁烦杩囨煇涓�椤癸紝琛ㄧず涓嶆敼锛�
+#>
+$ErrorActionPreference = 'Stop'
+
+function Read-Secret([string]$prompt) {
+ $sec = Read-Host -Prompt $prompt -AsSecureString
+ if ($null -eq $sec) { return '' }
+ $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($sec)
+ try { return [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr) }
+ finally { [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) }
+}
+
+foreach ($name in @('DEEPSEEK_API_KEY', 'TRAFFIC_DB_PASSWORD')) {
+ $cur = [Environment]::GetEnvironmentVariable($name, 'User')
+ $hint = if ($cur) { '锛堝凡璁剧疆锛岄暱搴� ' + $cur.Length + '锛�' } else { '锛堝綋鍓嶆湭璁剧疆锛�' }
+ $val = Read-Secret ("杈撳叆 " + $name + " " + $hint + "锛岀洿鎺ュ洖杞﹁烦杩�")
+ if ([string]::IsNullOrWhiteSpace($val)) { Write-Host (" 璺宠繃 " + $name); continue }
+ & setx.exe $name $val | Out-Null
+ if ($LASTEXITCODE -eq 0) {
+ [Environment]::SetEnvironmentVariable($name, $val, 'Process')
+ Write-Host (" 宸叉洿鏂� " + $name)
+ } else {
+ Write-Host (" 鏇存柊澶辫触锛�" + $name)
+ }
+}
+Write-Host ''
+Write-Host '瀹屾垚銆傜敓鏁堟柟寮忥細鏂板紑鐨勭粓绔嚜鍔ㄥ甫涓婏紱鐢� start-dev.ps1 鍚姩涔熶細鑷姩浠庢敞鍐岃〃杞藉叆銆�'
+Write-Host '锛堣嫢鍚庣姝e湪杩愯锛岃閲嶅惎鍚庣锛氬仠鎺� 8090 杩涚▼鍚庨噸鏂版墽琛� start-dev.ps1锛�'
--
Gitblit v1.9.1