后端目录 - db/:mysql / hydrogen / heatmap 连接与氢能只读 SQL 守卫收拢到一处。 - middleware/:auth(JWT → 注入 user)与 read-only 归位。 - 相关测试随文件移动(middleware/read-only.test.ts、db/hydrogen-read-only.test.ts)。 import 改写由一次性 codemod 完成,未改变任何逻辑。 架构守护 - 新增 src/architecture.test.ts,断言 6 条分层铁律: server 不依赖 modules、前端不依赖 server、shared 为叶子层、 无 vendor 引用、model.ts 不依赖 react、@ts-nocheck 仅限已登记的原型快照。 豁免清单只减不增。 测试基建 - npm test 的 glob 同时匹配 .test.ts 与 .test.tsx(此前 .tsx 测试会被静默漏掉)。 文档 - 新增根 README.md:入口、快速开始、命令、目录、部署注意事项 (JWT_SECRET 必须注入且 >=32 字符,否则拒绝启动)。 - 新增 docs/ARCHITECTURE.md:依赖方向、6 条硬规则、业务域形状、 中间件顺序、新增模块步骤,以及"已知未尽事项"的诚实清单。 lint / test(134) / build 全绿。
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import pool from '../../db/mysql.js';
|
|
|
|
const CREATE_TABLE_SQL = `
|
|
CREATE TABLE IF NOT EXISTS bi_ele_charge_record (
|
|
id BIGINT AUTO_INCREMENT PRIMARY KEY,
|
|
order_no VARCHAR(64) NOT NULL,
|
|
station_no VARCHAR(64) NULL,
|
|
station_name VARCHAR(128) NULL,
|
|
terminal_name VARCHAR(64) NULL,
|
|
region VARCHAR(64) NULL,
|
|
city VARCHAR(64) NULL,
|
|
district VARCHAR(64) NULL,
|
|
operating_company VARCHAR(128) NULL,
|
|
station_type VARCHAR(32) NULL,
|
|
order_status VARCHAR(32) NULL,
|
|
charge_form VARCHAR(32) NULL,
|
|
start_time DATETIME NULL,
|
|
end_time DATETIME NULL,
|
|
duration_min INT NULL,
|
|
kwh DECIMAL(10,3) NULL,
|
|
e_fee DECIMAL(10,2) NULL,
|
|
service_fee DECIMAL(10,2) NULL,
|
|
fee DECIMAL(10,2) NULL,
|
|
plate VARCHAR(32) NULL,
|
|
judged_plate VARCHAR(32) NULL,
|
|
vin VARCHAR(64) NULL,
|
|
customer_name VARCHAR(128) NULL,
|
|
customer_phone VARCHAR(32) NULL,
|
|
enterprise_name VARCHAR(128) NULL,
|
|
matched_truck_id VARCHAR(32) NULL,
|
|
matched_plate VARCHAR(32) NULL,
|
|
vehicle_kind ENUM('internal','external','unknown') NOT NULL DEFAULT 'unknown',
|
|
raw_json JSON NULL,
|
|
batch_id VARCHAR(64) NOT NULL,
|
|
imported_at DATETIME NOT NULL,
|
|
UNIQUE KEY uk_order_no (order_no),
|
|
KEY idx_start_time (start_time),
|
|
KEY idx_batch (batch_id),
|
|
KEY idx_kind (vehicle_kind),
|
|
KEY idx_plate (plate)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
|
|
`;
|
|
|
|
let ensured = false;
|
|
export async function ensureChargeRecordTable(): Promise<void> {
|
|
if (ensured) return;
|
|
await pool.query(CREATE_TABLE_SQL);
|
|
ensured = true;
|
|
}
|