-- ============================================================= -- 嘉谷低空智控平台 数据库初始化脚本 -- 引擎: 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, 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 '', status VARCHAR(32) DEFAULT 'offline', 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 '', status VARCHAR(32) DEFAULT 'offline', 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 'paid', 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;