低空智控平台 后端go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

359 lines
14 KiB

-- =============================================================
-- 嘉谷低空智控平台 数据库初始化脚本
-- 引擎: InnoDB / 字符集: utf8mb4
-- 说明: 所有 BIGINT 主键均为 Snowflake 雪花 ID,无 AUTO_INCREMENT
-- =============================================================
CREATE DATABASE IF NOT EXISTS laic DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE laic;
-- ---------------------------------------------------------------
-- 5.1 用户
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS `user` (
id BIGINT PRIMARY KEY,
name VARCHAR(32) NOT NULL,
phone VARCHAR(32) NOT NULL,
email VARCHAR(64),
password VARCHAR(64) NOT NULL,
role VARCHAR(16) DEFAULT 'user', -- admin / user
traffic_balance BIGINT DEFAULT 0, -- 云媒体剩余流量(字节),慢快照,权威在 Redis
status TINYINT DEFAULT 1, -- 1 正常 / 0 禁用
last_login DATETIME,
password_changed_at DATETIME,
created_at DATETIME,
updated_at DATETIME,
UNIQUE KEY idx_phone (phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.2 机巢 & 无人机
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS dock (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
dock_id VARCHAR(64) NOT NULL, -- MQTT dockId (dock-xxx)
name VARCHAR(64) DEFAULT '',
code VARCHAR(32) DEFAULT '',
sn VARCHAR(64) DEFAULT '',
iccid VARCHAR(32) DEFAULT '', -- 冗余,权威见 sim_card.iccid
longitude DOUBLE DEFAULT 0,
latitude DOUBLE DEFAULT 0,
altitude DOUBLE DEFAULT 0,
location VARCHAR(128) DEFAULT '',
register_status VARCHAR(16) DEFAULT 'pending', -- pending/registered
dock_id_source VARCHAR(32) DEFAULT '',
software_ver VARCHAR(16) DEFAULT '',
protocol_ver VARCHAR(8) DEFAULT '1.0',
created_at DATETIME,
updated_at DATETIME,
UNIQUE KEY idx_dock_id (dock_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS drone (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
drone_sn VARCHAR(32) NOT NULL, -- 飞控 HW_SN_NUM
dock_id VARCHAR(64) NOT NULL, -- 绑定的机巢 dock_id(1:1)
name VARCHAR(64) DEFAULT '',
code VARCHAR(32) DEFAULT '',
model VARCHAR(32) DEFAULT '',
battery INT DEFAULT 0,
firmware_ver VARCHAR(16) DEFAULT '',
created_at DATETIME,
updated_at DATETIME,
UNIQUE KEY idx_drone_sn (drone_sn),
UNIQUE KEY idx_drone_dock (dock_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.3 告警
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS alarm_code (
id BIGINT PRIMARY KEY,
code VARCHAR(64) NOT NULL,
category VARCHAR(32) NOT NULL, -- dock / drone
message_cn VARCHAR(256) NOT NULL,
level VARCHAR(16) DEFAULT 'critical',
source VARCHAR(128) DEFAULT '',
created_at DATETIME,
updated_at DATETIME,
UNIQUE KEY idx_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS alarm (
id BIGINT PRIMARY KEY,
dock_id VARCHAR(64) NOT NULL,
code VARCHAR(64) NOT NULL,
device_type VARCHAR(8) NOT NULL, -- dock / drone
message_cn VARCHAR(256) NOT NULL,
level VARCHAR(16) NOT NULL,
status VARCHAR(16) DEFAULT 'active', -- active / acknowledged / resolved
triggered_at DATETIME,
resolved_at DATETIME,
created_at DATETIME,
KEY idx_alarm_dock (dock_id, status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.4 指令 & 工作流
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS device_command_log (
id BIGINT PRIMARY KEY, -- = commandId (Snowflake)
dock_id VARCHAR(64) NOT NULL,
command_type VARCHAR(64) NOT NULL, -- dock.open / drone.takeoff / workflow.start_task
params JSON,
drone_sn VARCHAR(32),
request_id VARCHAR(64),
ttl_ms INT DEFAULT 30000,
ack_accepted TINYINT,
ack_result_code VARCHAR(64),
status VARCHAR(16) DEFAULT 'sent', -- sent / acked / timeout / terminal
retry_count INT DEFAULT 0,
sent_at DATETIME,
acked_at DATETIME,
created_at DATETIME,
KEY idx_cmd_log_dock (dock_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS workflow_state (
id BIGINT PRIMARY KEY,
dock_id VARCHAR(64) NOT NULL,
command_id VARCHAR(64),
type VARCHAR(64),
task_id VARCHAR(128),
mission_id VARCHAR(128),
state VARCHAR(16) NOT NULL, -- idle / running / succeeded / failed / cancelled
step VARCHAR(64) NOT NULL,
result_code VARCHAR(64),
updated_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.5 固件管理
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS firmware (
id BIGINT PRIMARY KEY,
component VARCHAR(32) NOT NULL, -- 固定 dock-edge-agent
version VARCHAR(32) NOT NULL, -- 1.3.0
description VARCHAR(512) DEFAULT '',
file_url VARCHAR(512) NOT NULL,
sha256 VARCHAR(128) NOT NULL,
signature TEXT NOT NULL,
file_size BIGINT DEFAULT 0,
mandatory TINYINT DEFAULT 0,
status VARCHAR(16) DEFAULT 'draft', -- draft/released/deprecated
created_by BIGINT NOT NULL,
created_at DATETIME,
updated_at DATETIME,
UNIQUE KEY idx_component_ver (component, version)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.6 任务 & 航线
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS task_plan (
id VARCHAR(128) PRIMARY KEY,
user_id BIGINT NOT NULL,
name VARCHAR(128) NOT NULL,
dock_id VARCHAR(64) NOT NULL,
route_id BIGINT,
schedule_type VARCHAR(16) DEFAULT 'once', -- once / cron
schedule_cron VARCHAR(32),
video_policy VARCHAR(16) DEFAULT 'raw',
status VARCHAR(16) DEFAULT 'draft',
created_by BIGINT,
created_at DATETIME,
updated_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS task_execution (
id BIGINT PRIMARY KEY,
task_id VARCHAR(128),
command_id VARCHAR(64),
dock_id VARCHAR(64) NOT NULL,
drone_sn VARCHAR(32),
start_time DATETIME,
end_time DATETIME,
status VARCHAR(16) DEFAULT 'pending',
trajectory_json JSON,
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS route (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
name VARCHAR(128) NOT NULL,
description VARCHAR(256),
created_at DATETIME,
updated_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS route_waypoint (
id BIGINT PRIMARY KEY,
route_id BIGINT NOT NULL,
seq INT NOT NULL,
longitude DOUBLE,
latitude DOUBLE,
altitude DOUBLE,
speed DOUBLE,
yaw DOUBLE,
hold_sec INT DEFAULT 0,
created_at DATETIME,
UNIQUE KEY uk_route_seq (route_id, seq)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.7 媒体
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS live_session (
id VARCHAR(128) PRIMARY KEY, -- streamSessionId
dock_id VARCHAR(64) NOT NULL,
provider VARCHAR(16) DEFAULT 'aliyun',
stream_name VARCHAR(128) NOT NULL, -- 直播流名(每次会话唯一)
push_url_hash VARCHAR(128),
expires_at BIGINT NOT NULL,
max_bitrate_bps BIGINT DEFAULT 1500000,
phase VARCHAR(16) DEFAULT 'idle',
stop_reason VARCHAR(32),
error_code VARCHAR(64),
requested_by BIGINT,
stop_deadline DATETIME,
device_state_version BIGINT DEFAULT 0,
device_event_id VARCHAR(128),
device_updated_at BIGINT DEFAULT 0,
cloud_confirmed_at DATETIME,
started_at DATETIME,
stopped_at DATETIME,
created_at DATETIME,
updated_at DATETIME,
active_dock_id VARCHAR(64) GENERATED ALWAYS AS (
CASE WHEN phase IN ('starting', 'streaming', 'reconnecting', 'stopping') THEN dock_id ELSE NULL END
) STORED,
KEY idx_live_session_dock_phase (dock_id, phase, created_at),
KEY idx_live_session_phase_deadline (phase, stop_deadline),
UNIQUE KEY uk_live_session_device_event (device_event_id),
UNIQUE KEY uk_live_session_active_dock (active_dock_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS live_viewer_lease (
id BIGINT PRIMARY KEY,
stream_session_id VARCHAR(128) NOT NULL,
viewer_id BIGINT NOT NULL,
expires_at DATETIME NOT NULL,
released_at DATETIME NULL,
created_at DATETIME NULL,
updated_at DATETIME NULL,
UNIQUE KEY uk_live_viewer (stream_session_id, viewer_id),
KEY idx_live_lease_expire (stream_session_id, expires_at),
KEY idx_live_lease_active (stream_session_id, released_at, expires_at),
CONSTRAINT fk_live_lease_session FOREIGN KEY (stream_session_id) REFERENCES live_session(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS video (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
drone_sn VARCHAR(32),
execution_id BIGINT,
file_name VARCHAR(256),
file_size BIGINT,
duration INT,
oss_key VARCHAR(256),
oss_bucket VARCHAR(128), -- 预签名上传的目标 bucket
thumbnail_key VARCHAR(256),
status VARCHAR(16) DEFAULT 'uploading',
upload_expire_at DATETIME, -- 预签名 PUT URL 过期时间
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS download_log (
id BIGINT PRIMARY KEY,
video_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
bytes BIGINT NOT NULL,
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 5.8 计费
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS traffic_order (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
amount_gb INT NOT NULL, -- 购买流量(GB)
unit_price DECIMAL(6,2),
total_price DECIMAL(10,2),
pay_status VARCHAR(16) DEFAULT 'unpaid', -- unpaid/paid/cancelled
created_at DATETIME,
paid_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS traffic_usage_log (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
source_type VARCHAR(16), -- live / replay / download
source_id BIGINT,
bytes_used BIGINT,
balance_before BIGINT, -- 扣减前余额(字节)
balance_after BIGINT, -- 扣减后余额(字节)
created_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS sim_card (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
dock_id VARCHAR(64),
carrier VARCHAR(16), -- 移动/联通/电信
phone VARCHAR(16),
iccid VARCHAR(32), -- 权威字段(查询/充值的入参)
plan_gb INT,
used_gb DECIMAL(10,4) DEFAULT 0,
expired_at DATE,
status VARCHAR(16) DEFAULT 'active', -- 平台业务态: active/expired
carrier_status VARCHAR(16) DEFAULT 'normal', -- 运营商侧状态: normal/suspended/arrears/cancelled
last_sync_at DATETIME,
created_at DATETIME,
updated_at DATETIME
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS sim_recharge_log (
id BIGINT PRIMARY KEY,
sim_card_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
amount_gb INT NOT NULL,
unit_price DECIMAL(6,2),
total_price DECIMAL(10,2),
pay_status VARCHAR(16) DEFAULT 'unpaid',
recharge_status VARCHAR(16) DEFAULT 'pending', -- pending/success/failed
recharge_msg VARCHAR(256) DEFAULT '',
idempotent_key VARCHAR(64) NOT NULL, -- 平台充值单号,超时重试去重
created_at DATETIME,
UNIQUE KEY uk_recharge_idem (idempotent_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS sim_usage_record (
id BIGINT PRIMARY KEY,
sim_card_id BIGINT NOT NULL,
plan_gb INT,
used_gb DECIMAL(10,4),
remain_gb DECIMAL(10,4),
carrier_status VARCHAR(16),
synced_at DATETIME,
KEY idx_record_sim (sim_card_id, synced_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ---------------------------------------------------------------
-- 7.7 操作日志
-- ---------------------------------------------------------------
CREATE TABLE IF NOT EXISTS operation_log (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
user_name VARCHAR(32),
module VARCHAR(32), -- 模块(用户管理/机巢管理/任务管理...)
action VARCHAR(64), -- 动作(新增/修改/删除/下发指令...)
detail VARCHAR(256), -- 详情(请求路径)
result VARCHAR(16), -- success / failed
ip VARCHAR(64),
created_at DATETIME,
KEY idx_op_user (user_id, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;