chore(打包): 一键打包脚本(含 jar 去密自检) + 打包模板入库 deploy-templates + 密钥更新脚本;清理含密钥的旧部署包与压缩件
3个文件已修改
11个文件已添加
1156 ■■■■■ 已修改文件
deploy-templates/README-部署说明.txt 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/backend/application.yml 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/backend/start-backend.cmd 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/backend/start-backend.sh 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/db/init.sql 619 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/db/sql_city_bus.sql 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/db/sql_city_taxi.sql 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/db/sql_wyc.sql 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/frontend/nginx.conf.example 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/功能测试报告/功能测试报告_密钥外部化与打包去密_2026-09-26.md 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-26.md 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/打包部署说明.md 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pack-deploy.ps1 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
set-secrets.ps1 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
deploy-templates/README-²¿Êð˵Ã÷.txt
New file
@@ -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 å³å¯ï¼›nginx ä»…为备选方案)
【部署步骤】
  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
     é¢„置账号:admin / 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://<部署机IP>:8090  ï¼ˆå‰ç«¯å·²å†…嵌,页面与接口同源)
     è´¦å·ï¼šadmin / 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. æŠ¥è¡¨å¯¼å‡ºæŠ¥ã€Œæœªæ‰¾åˆ°æ±‡æ€»è¡¨æ¯ç‰ˆã€ŠYYYYå¹´M月道路运输量汇总表.xlsx》」:
     docs/生成汇总大表 ä¸‹ç¼ºå°‘该月份母版;把源机器的该文件拷过去。
  3. 8090 ç«¯å£è¢«å ç”¨ï¼šæ”¹ application.yml çš„ server.port åŽé‡å¯ã€‚
  4. é¡µé¢æ‰“开是空白:确认访问的是 http://<IP>:8090 æ ¹è·¯å¾„,且浏览器强制刷新(Ctrl+F5)。
  5. ä¸Šä¼ å¤§æ–‡ä»¶å¤±è´¥ï¼šåŽç«¯é™åˆ¶ 100MB,已配置;如前面还挂了 nginx,需同步放大 client_max_body_size。
【停止服务】
  Windows:关闭 start-backend.cmd çª—口
  Linux:  Ctrl+C,或 kill å¯¹åº” java è¿›ç¨‹ï¼ˆps -ef | grep java)
deploy-templates/backend/application.yml
New file
@@ -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:
  # å¿…须是「Base64 åˆæ³•字符 + é•¿åº¦æ˜¯ 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
deploy-templates/backend/start-backend.cmd
New file
@@ -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  æ—¥å¿—显示在本窗口,关闭窗口即停止服务
echo ============================================
java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar
pause
deploy-templates/backend/start-backend.sh
New file
@@ -0,0 +1,4 @@
#!/bin/sh
cd "$(dirname "$0")" || exit 1
echo "TrafficAudit å¯åŠ¨ä¸­ï¼šhttp://localhost:8090 ï¼ˆCtrl+C åœæ­¢ï¼‰"
java -jar traffic-audit-server-1.0.0-SNAPSHOT.jar 2>&1 | tee app.log
deploy-templates/db/init.sql
New file
@@ -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 '行政区划代码',
    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;
-- äº¤ä¼ç»ŸH203-2表:道路货物运输月度生产情况(Demo核心表)
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 '企业代码',
    enterprise_name VARCHAR(200) COMMENT '企业名称',
    unified_credit_code VARCHAR(50) COMMENT '统一社会信用代码',
    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='交企统H203-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 '企业代码',
    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;
-- ============================================
-- å…­ã€LLM脱敏映射
-- ============================================
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);
-- ============================================
-- å…«ã€å…¬è·¯æ—…客运输(交企统H203-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 '企业代码',
    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='交企统H203-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 '企业代码',
    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);
-- ============================================
-- ä¹ã€é“路货运能源消耗(交企统H204)扩展模块
-- ============================================
-- é“路货运车辆能源消耗情况(车辆粒度季报)
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 '企业代码',
    enterprise_name VARCHAR(200) COMMENT '企业名称',
    plate_no VARCHAR(30) COMMENT '车牌号',
    vehicle_type_code VARCHAR(10) COMMENT '车辆类型代码',
    vehicle_type VARCHAR(50) COMMENT '车辆类型(中文)',
    fuel_type_code VARCHAR(10) COMMENT '燃料类型代码',
    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='交企统H204表_道路货运车辆能源消耗情况(车辆粒度)';
-- é“路货运能耗_运政车辆信息(车牌粒度)
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 '建成/竣工时间',
    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 '所属地区(行政区划代码)',
  enterprise_code VARCHAR(50) COMMENT '企业代码',
  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='公路旅客个体客运量/周转量';
-- ============================================
-- åã€æŠ¥è¡¨æœŸå®¡æ ¸é€šè¿‡æ ‡è®°ï¼ˆaudit_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='报表期审核通过标记';
deploy-templates/db/sql_city_bus.sql
New file
@@ -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 '市州(由地区代码映射)',
  enterprise_code VARCHAR(50) DEFAULT NULL COMMENT '企业代码',
  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);
deploy-templates/db/sql_city_taxi.sql
New file
@@ -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 '市州(由证号/档案号/地址提取)',
  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 '档案号',
  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);
deploy-templates/db/sql_wyc.sql
New file
@@ -0,0 +1,45 @@
-- åŸŽå¸‚客运网约车月度输入建表(2026-09-04)
-- æ•°æ®æº1:模板_网约车总数.xlsx(月度全省 pin:客运量/其中城市内/周转量/其中城市内周转量)
-- æ•°æ®æº2:模板_网约车订单及全省总量.xlsx(月度输入页:B-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='网约车订单及全省总量月度输入';
deploy-templates/frontend/nginx.conf.example
New file
@@ -0,0 +1,15 @@
# å‰ç«¯ nginx é…ç½®ç¤ºä¾‹ï¼ˆåªæœ‰åœ¨ä¸æƒ³ç”¨ã€Œjar å†…嵌前端」时才需要)
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; }
}
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_ÃÜÔ¿Íⲿ»¯Óë´ò°üÈ¥ÃÜ_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:\试验\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)、frontend(dist+nginx ç¤ºä¾‹)、db、README |
| TC-14 | æ–° jar å†…置配置 | å…¨ä¸º `${...}` å ä½ç¬¦ï¼Œ`含 sk- æ˜Žæ–‡: False` |
| TC-15 | æ–°å‰ç«¯ dist | å«æœ€æ–°åŠŸèƒ½ï¼ˆ`rollupTypes` / ã€ŒæŒ‰å¸‚州汇总」) |
| TC-16 | å…¨ç›˜å¤æŸ¥ï¼ˆä»“库 + `E:\试验`) | å†…置配置带 key çš„ jar:**无**;压缩包含 key:**无**;文本含 key:**无** |
| TC-17 | ä¸€é”®æ‰“包脚本实跑 | è¾“出"[2/5] åŽ»å¯†è‡ªæ£€â€¦é€šè¿‡"并成功产出新包 |
> å”¯ä¸€ä»å¸¦æ˜Žæ–‡ key çš„地方是**用户环境变量**(设计如此,供本机开发用)与**已带出去/服务器上那份旧 jar**——后者需按第 4 èŠ‚è½®æ¢ key æ‰ç®—彻底。
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_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、启动脚本、nginx ç¤ºä¾‹ã€db å»ºè¡¨ 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 æ¡ç”¨ä¾‹å…¨é€šè¿‡ï¼‰ã€‚
docs/´ò°ü²¿Êð˵Ã÷.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. **解压 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: "你的新key"`(留空则页面 AI åˆ†æžä¸å¯ç”¨ï¼Œå…¶ä½™åŠŸèƒ½æ­£å¸¸ï¼‰ï¼›
pack-deploy.ps1
New file
@@ -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) è§£åŽ‹ jar æ£€æŸ¥å†…ç½® application.yml:必须全是占位符(禁止 sk- å¯†é’¥ / æ˜Žæ–‡å£ä»¤ï¼‰ï¼Œä¸åˆæ ¼ç›´æŽ¥ä¸­æ­¢
    3) npm run build æž„建前端 dist(可 -SkipFrontend)
    4) ç»„装 deploy ç›®å½•结构(backend / 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] æž„建后端(mvn 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(sk-…)' }
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 '      é€šè¿‡ï¼šjar å†…置配置全部为占位符,无明文密钥/口令。'
Write-Host '[3/5] æž„建前端(npm 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:运行时模板 + ç”¨æˆ·æ–‡æ¡£ï¼›æŽ’除开发过程文档与缓存/备份(减小体积、避免把内部清单带出去)
$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 å¤åˆ¶å¤±è´¥ï¼ˆrobocopy è¿”回 $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。'
set-secrets.ps1
New file
@@ -0,0 +1,31 @@
<#
  è®¾ç½®/更新本机密钥环境变量(值不落文件)—— è½®æ¢ DeepSeek key åŽè·‘这个
  ç”¨æ³•:powershell -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 '(若后端正在运行,请重启后端:停掉 8090 è¿›ç¨‹åŽé‡æ–°æ‰§è¡Œ start-dev.ps1)'