-- ============================================================= -- 嘉谷低空智控平台 数据库初始化脚本 -- 引擎: 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 COMMENT '主键 ID', name VARCHAR(32) NOT NULL COMMENT '名称', phone VARCHAR(32) NOT NULL COMMENT '手机号', email VARCHAR(64) COMMENT '电子邮箱', password VARCHAR(64) NOT NULL COMMENT '密码哈希', role VARCHAR(16) DEFAULT 'user' COMMENT '用户角色', -- admin / user traffic_balance BIGINT DEFAULT 0 COMMENT '云媒体剩余流量(字节)', -- 云媒体剩余流量(字节),慢快照,权威在 Redis status TINYINT DEFAULT 1 COMMENT '业务状态', -- 1 正常 / 0 禁用 last_login DATETIME COMMENT '最后登录时间', password_changed_at DATETIME COMMENT '密码最后修改时间', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', UNIQUE KEY idx_phone (phone) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- --------------------------------------------------------------- -- 5.2 机巢 & 无人机 -- --------------------------------------------------------------- CREATE TABLE IF NOT EXISTS dock ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', -- MQTT dockId (dock-xxx) name VARCHAR(64) DEFAULT '' COMMENT '名称', code VARCHAR(32) DEFAULT '' COMMENT '业务编码', sn VARCHAR(64) DEFAULT '' COMMENT '设备序列号', iccid VARCHAR(32) DEFAULT '' COMMENT 'SIM 卡 ICCID', -- 冗余,权威见 sim_card.iccid longitude DOUBLE DEFAULT 0 COMMENT '经度', latitude DOUBLE DEFAULT 0 COMMENT '纬度', altitude DOUBLE DEFAULT 0 COMMENT '海拔高度(米)', location VARCHAR(128) DEFAULT '' COMMENT '位置描述', register_status VARCHAR(16) DEFAULT 'pending' COMMENT '注册状态', -- pending/registered dock_id_source VARCHAR(32) DEFAULT '' COMMENT '机巢标识来源', software_ver VARCHAR(16) DEFAULT '' COMMENT '软件版本', protocol_ver VARCHAR(8) DEFAULT '1.0' COMMENT '协议版本', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', UNIQUE KEY idx_dock_id (dock_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS drone ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', drone_sn VARCHAR(32) NOT NULL COMMENT '无人机序列号', -- 飞控 HW_SN_NUM dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', -- 绑定的机巢 dock_id(1:1) name VARCHAR(64) DEFAULT '' COMMENT '名称', code VARCHAR(32) DEFAULT '' COMMENT '业务编码', model VARCHAR(32) DEFAULT '' COMMENT '设备型号', battery INT DEFAULT 0 COMMENT '电池电量(百分比)', firmware_ver VARCHAR(16) DEFAULT '' COMMENT '固件版本', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', 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 COMMENT '主键 ID', code VARCHAR(64) NOT NULL COMMENT '业务编码', category VARCHAR(32) NOT NULL COMMENT '告警类别', -- dock / drone message_cn VARCHAR(256) NOT NULL COMMENT '中文告警信息', level VARCHAR(16) DEFAULT 'critical' COMMENT '告警级别', source VARCHAR(128) DEFAULT '' COMMENT '告警来源', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', UNIQUE KEY idx_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS alarm ( id BIGINT PRIMARY KEY COMMENT '主键 ID', dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', code VARCHAR(64) NOT NULL COMMENT '业务编码', device_type VARCHAR(8) NOT NULL COMMENT '设备类型', -- dock / drone message_cn VARCHAR(256) NOT NULL COMMENT '中文告警信息', level VARCHAR(16) NOT NULL COMMENT '告警级别', status VARCHAR(16) DEFAULT 'active' COMMENT '业务状态', -- active / acknowledged / resolved triggered_at DATETIME COMMENT '触发时间', resolved_at DATETIME COMMENT '解决时间', created_at DATETIME COMMENT '创建时间', 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 COMMENT '主键 ID', -- = commandId (Snowflake) dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', command_type VARCHAR(64) NOT NULL COMMENT '指令类型', -- dock.open / drone.takeoff / workflow.start_task params JSON COMMENT '指令参数 JSON', drone_sn VARCHAR(32) COMMENT '无人机序列号', request_id VARCHAR(64) COMMENT '请求 ID', ttl_ms INT DEFAULT 30000 COMMENT '指令有效期(毫秒)', ack_accepted TINYINT COMMENT '设备是否接受指令', ack_result_code VARCHAR(64) COMMENT '确认结果码', status VARCHAR(16) DEFAULT 'sent' COMMENT '业务状态', -- sent / acked / timeout / terminal retry_count INT DEFAULT 0 COMMENT '重试次数', sent_at DATETIME COMMENT '发送时间', acked_at DATETIME COMMENT '确认时间', created_at DATETIME COMMENT '创建时间', 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 COMMENT '主键 ID', dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', command_id VARCHAR(64) COMMENT '指令 ID', type VARCHAR(64) COMMENT '工作流类型', task_id VARCHAR(128) COMMENT '任务计划 ID', mission_id VARCHAR(128) COMMENT '任务航线 ID', state VARCHAR(16) NOT NULL COMMENT '工作流状态', -- idle / running / succeeded / failed / cancelled step VARCHAR(64) NOT NULL COMMENT '当前步骤', result_code VARCHAR(64) COMMENT '执行结果码', updated_at DATETIME COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- --------------------------------------------------------------- -- 5.5 固件管理 -- --------------------------------------------------------------- CREATE TABLE IF NOT EXISTS firmware ( id BIGINT PRIMARY KEY COMMENT '主键 ID', component VARCHAR(32) NOT NULL COMMENT '固件组件', -- 固定 dock-edge-agent version VARCHAR(32) NOT NULL COMMENT '固件版本号', -- 1.3.0 description VARCHAR(512) DEFAULT '' COMMENT '描述信息', file_url VARCHAR(512) NOT NULL COMMENT '固件文件地址', sha256 VARCHAR(128) NOT NULL COMMENT '文件 SHA-256 摘要', signature TEXT NOT NULL COMMENT '文件签名', file_size BIGINT DEFAULT 0 COMMENT '文件大小(字节)', mandatory TINYINT DEFAULT 0 COMMENT '是否强制升级', status VARCHAR(16) DEFAULT 'draft' COMMENT '业务状态', -- draft/released/deprecated created_by BIGINT NOT NULL COMMENT '创建人 ID', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', 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 COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', name VARCHAR(128) NOT NULL COMMENT '名称', dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', route_id BIGINT COMMENT '航线 ID', schedule_type VARCHAR(16) DEFAULT 'once' COMMENT '调度类型', -- once / cron schedule_cron VARCHAR(32) COMMENT 'Cron 调度表达式', video_policy VARCHAR(16) DEFAULT 'raw' COMMENT '视频策略', status VARCHAR(16) DEFAULT 'draft' COMMENT '业务状态', created_by BIGINT COMMENT '创建人 ID', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS task_execution ( id BIGINT PRIMARY KEY COMMENT '主键 ID', task_id VARCHAR(128) COMMENT '任务计划 ID', command_id VARCHAR(64) COMMENT '指令 ID', dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', drone_sn VARCHAR(32) COMMENT '无人机序列号', start_time DATETIME COMMENT '开始时间', end_time DATETIME COMMENT '结束时间', status VARCHAR(16) DEFAULT 'pending' COMMENT '业务状态', result_code VARCHAR(64) COMMENT '执行结果码', trajectory_json JSON COMMENT '轨迹 JSON', created_at DATETIME COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS route ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', name VARCHAR(128) NOT NULL COMMENT '名称', description VARCHAR(256) COMMENT '描述信息', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS route_waypoint ( id BIGINT PRIMARY KEY COMMENT '主键 ID', route_id BIGINT NOT NULL COMMENT '航线 ID', seq INT NOT NULL COMMENT '航点序号', longitude DOUBLE COMMENT '经度', latitude DOUBLE COMMENT '纬度', altitude DOUBLE COMMENT '海拔高度(米)', speed DOUBLE COMMENT '飞行速度', yaw DOUBLE COMMENT '偏航角', hold_sec INT DEFAULT 0 COMMENT '航点停留时间(秒)', created_at DATETIME COMMENT '创建时间', 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 COMMENT '主键 ID', -- streamSessionId dock_id VARCHAR(64) NOT NULL COMMENT '机巢标识', provider VARCHAR(16) DEFAULT 'aliyun' COMMENT '流媒体服务商', stream_name VARCHAR(128) NOT NULL COMMENT '直播流名称', -- 直播流名(每次会话唯一) push_url_hash VARCHAR(128) COMMENT '推流地址哈希', expires_at BIGINT NOT NULL COMMENT '过期时间戳', max_bitrate_bps BIGINT DEFAULT 1500000 COMMENT '最大码率(比特/秒)', phase VARCHAR(16) DEFAULT 'idle' COMMENT '直播会话阶段', stop_reason VARCHAR(32) COMMENT '停止原因', error_code VARCHAR(64) COMMENT '错误码', requested_by BIGINT COMMENT '请求人用户 ID', stop_deadline DATETIME COMMENT '停止截止时间', device_state_version BIGINT DEFAULT 0 COMMENT '设备状态版本', device_event_id VARCHAR(128) COMMENT '设备事件 ID', device_updated_at BIGINT DEFAULT 0 COMMENT '设备更新时间戳', device_streaming TINYINT(1) NOT NULL DEFAULT 0 COMMENT '设备是否正在推流', cloud_online TINYINT(1) NOT NULL DEFAULT 0 COMMENT '云端是否在线', cloud_checked_at DATETIME COMMENT '云端检查时间', cloud_confirmed_at DATETIME COMMENT '云端确认时间', started_at DATETIME COMMENT '开始时间', stopped_at DATETIME COMMENT '停止时间', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', active_dock_id VARCHAR(64) GENERATED ALWAYS AS ( CASE WHEN phase IN ('starting', 'streaming', 'reconnecting', 'stopping') THEN dock_id ELSE NULL END ) STORED COMMENT '活动机巢标识(生成列)', 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 COMMENT '主键 ID', stream_session_id VARCHAR(128) NOT NULL COMMENT '直播会话 ID', viewer_id BIGINT NOT NULL COMMENT '观看用户 ID', expires_at DATETIME NOT NULL COMMENT '过期时间戳', released_at DATETIME NULL COMMENT '释放时间', created_at DATETIME NULL COMMENT '创建时间', updated_at DATETIME NULL COMMENT '更新时间', 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 live_callback_event ( event_id VARCHAR(256) PRIMARY KEY COMMENT '回调事件 ID', stream_name VARCHAR(128) NOT NULL COMMENT '直播流名称', event_type VARCHAR(32) NOT NULL COMMENT '回调事件类型', payload_hash CHAR(64) NOT NULL COMMENT '回调载荷哈希', received_at DATETIME NOT NULL COMMENT '接收时间', processed_at DATETIME NULL COMMENT '处理时间', KEY idx_live_callback_stream (stream_name, event_type, received_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS video ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', drone_sn VARCHAR(32) COMMENT '无人机序列号', execution_id BIGINT COMMENT '任务执行 ID', file_name VARCHAR(256) COMMENT '视频文件名', file_size BIGINT COMMENT '文件大小(字节)', duration INT COMMENT '视频时长(秒)', oss_key VARCHAR(256) COMMENT '对象存储文件键', oss_bucket VARCHAR(128) COMMENT '对象存储 Bucket', -- 预签名上传的目标 bucket thumbnail_key VARCHAR(256) COMMENT '缩略图文件键', status VARCHAR(16) DEFAULT 'uploading' COMMENT '业务状态', upload_expire_at DATETIME COMMENT '预签名上传地址过期时间', -- 预签名 PUT URL 过期时间 created_at DATETIME COMMENT '创建时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS download_log ( id BIGINT PRIMARY KEY COMMENT '主键 ID', video_id BIGINT NOT NULL COMMENT '视频 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', bytes BIGINT NOT NULL COMMENT '传输字节数', idempotency_key VARCHAR(128) NOT NULL COMMENT '下载计费幂等键', created_at DATETIME COMMENT '创建时间', UNIQUE KEY uk_download_log_idempotency (idempotency_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- --------------------------------------------------------------- -- 5.8 计费 -- --------------------------------------------------------------- CREATE TABLE IF NOT EXISTS traffic_order ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', package_id BIGINT COMMENT '套餐 ID', package_code VARCHAR(64) COMMENT '套餐编码快照', amount_gb INT NOT NULL COMMENT '流量额度(GB)', -- 购买流量(GB) amount_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '流量额度(字节)', unit_price DECIMAL(6,2) COMMENT '单价', total_price DECIMAL(10,2) COMMENT '总价', pay_status VARCHAR(16) DEFAULT 'unpaid' COMMENT '支付状态', -- unpaid/paid/cancelled credit_status VARCHAR(16) DEFAULT 'pending' COMMENT '充值入账状态', credit_ledger_id BIGINT COMMENT '充值流水 ID', payment_idempotency_key VARCHAR(128) COMMENT '支付幂等键', paid_by BIGINT COMMENT '确认支付的操作人 ID', created_at DATETIME COMMENT '创建时间', paid_at DATETIME COMMENT '支付时间', UNIQUE KEY uk_traffic_order_payment_idem (payment_idempotency_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS traffic_usage_log ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', source_type VARCHAR(16) COMMENT '流量来源类型', -- live / replay / download source_id BIGINT COMMENT '来源记录 ID', bytes_used BIGINT COMMENT '使用流量(字节)', balance_before BIGINT COMMENT '扣减前余额(字节)', -- 扣减前余额(字节) balance_after BIGINT COMMENT '扣减后余额(字节)', -- 扣减后余额(字节) idempotency_key VARCHAR(160) NOT NULL COMMENT '消费幂等键', created_at DATETIME COMMENT '创建时间', UNIQUE KEY uk_traffic_usage_idempotency (idempotency_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- --------------------------------------------------------------- -- 5.8.1 平台共享资源与统一账务 -- --------------------------------------------------------------- CREATE TABLE IF NOT EXISTS platform_resource_pool ( id BIGINT PRIMARY KEY COMMENT '主键 ID', total_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '累计采购资源(字节)', available_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '可用共享资源(字节)', consumed_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '已消费共享资源(字节)', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '资源池状态', version BIGINT NOT NULL DEFAULT 0 COMMENT '乐观版本号', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS platform_resource_purchase ( id BIGINT PRIMARY KEY COMMENT '主键 ID', batch_no VARCHAR(64) NOT NULL COMMENT '采购批次号', provider VARCHAR(32) NOT NULL COMMENT '资源供应商', total_bytes BIGINT NOT NULL COMMENT '采购资源量(字节)', unit_cost DECIMAL(12,6) COMMENT '单位成本(元/字节)', total_cost DECIMAL(14,2) COMMENT '采购总成本(元)', expires_at DATETIME COMMENT '资源到期时间', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '批次状态', remark VARCHAR(256) COMMENT '备注', created_by BIGINT NOT NULL COMMENT '操作人 ID', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', UNIQUE KEY uk_resource_purchase_batch (batch_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS traffic_package ( id BIGINT PRIMARY KEY COMMENT '主键 ID', code VARCHAR(64) NOT NULL COMMENT '套餐编码', name VARCHAR(128) NOT NULL COMMENT '套餐名称', amount_bytes BIGINT NOT NULL COMMENT '套餐额度(字节)', price DECIMAL(10,2) NOT NULL COMMENT '销售价格(元)', validity_days INT COMMENT '有效期(天)', status VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT '套餐状态', sort INT NOT NULL DEFAULT 0 COMMENT '显示排序', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间', UNIQUE KEY uk_traffic_package_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS traffic_ledger ( id BIGINT PRIMARY KEY COMMENT '主键 ID', account_type VARCHAR(16) NOT NULL COMMENT '账户类型', account_id BIGINT NOT NULL COMMENT '账户 ID', direction VARCHAR(8) NOT NULL COMMENT '借贷方向', amount_bytes BIGINT NOT NULL COMMENT '变动金额(字节)', balance_before BIGINT NOT NULL COMMENT '变动前余额(字节)', balance_after BIGINT NOT NULL COMMENT '变动后余额(字节)', source_type VARCHAR(32) NOT NULL COMMENT '业务来源类型', source_id VARCHAR(128) COMMENT '业务来源 ID', idempotency_key VARCHAR(128) NOT NULL COMMENT '全局幂等键', operator_id BIGINT COMMENT '操作人 ID', remark VARCHAR(256) COMMENT '备注', created_at DATETIME COMMENT '创建时间', UNIQUE KEY uk_traffic_ledger_idempotency (idempotency_key), KEY idx_traffic_ledger_account (account_type, account_id, created_at), KEY idx_traffic_ledger_source (source_type, source_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS live_billing_segment ( id BIGINT PRIMARY KEY COMMENT '主键 ID', session_id VARCHAR(128) NOT NULL COMMENT '直播会话 ID', user_id BIGINT NOT NULL COMMENT '扣费用户 ID', period_start DATETIME NOT NULL COMMENT '计费开始时间', period_end DATETIME NOT NULL COMMENT '计费结束时间', bytes BIGINT NOT NULL COMMENT '计费流量(字节)', status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '结算状态', idempotency_key VARCHAR(160) NOT NULL COMMENT '结算幂等键', created_at DATETIME COMMENT '创建时间', settled_at DATETIME COMMENT '结算时间', UNIQUE KEY uk_live_billing_segment_period (session_id, period_start, period_end), UNIQUE KEY uk_live_billing_segment_idempotency (idempotency_key), KEY idx_live_billing_segment_session (session_id, period_start) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS sim_card ( id BIGINT PRIMARY KEY COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', dock_id VARCHAR(64) COMMENT '机巢标识', carrier VARCHAR(16) COMMENT '运营商', -- 移动/联通/电信 phone VARCHAR(16) COMMENT '手机号', iccid VARCHAR(32) COMMENT 'SIM 卡 ICCID', -- 权威字段(查询/充值的入参) plan_gb INT COMMENT '套餐流量(GB)', used_gb DECIMAL(10,4) DEFAULT 0 COMMENT '已使用流量(GB)', expired_at DATE COMMENT '到期日期', status VARCHAR(16) DEFAULT 'active' COMMENT '业务状态', -- 平台业务态: active/expired carrier_status VARCHAR(16) DEFAULT 'normal' COMMENT '运营商侧状态', -- 运营商侧状态: normal/suspended/arrears/cancelled last_sync_at DATETIME COMMENT '最后同步时间', created_at DATETIME COMMENT '创建时间', updated_at DATETIME COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS sim_recharge_log ( id BIGINT PRIMARY KEY COMMENT '主键 ID', sim_card_id BIGINT NOT NULL COMMENT 'SIM 卡记录 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', amount_gb INT NOT NULL COMMENT '流量额度(GB)', unit_price DECIMAL(6,2) COMMENT '单价', total_price DECIMAL(10,2) COMMENT '总价', pay_status VARCHAR(16) DEFAULT 'unpaid' COMMENT '支付状态', recharge_status VARCHAR(16) DEFAULT 'pending' COMMENT '充值状态', -- pending/success/failed recharge_msg VARCHAR(256) DEFAULT '' COMMENT '充值结果信息', idempotent_key VARCHAR(64) NOT NULL COMMENT '幂等业务单号', -- 平台充值单号,超时重试去重 created_at DATETIME COMMENT '创建时间', UNIQUE KEY uk_recharge_idem (idempotent_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE IF NOT EXISTS sim_usage_record ( id BIGINT PRIMARY KEY COMMENT '主键 ID', sim_card_id BIGINT NOT NULL COMMENT 'SIM 卡记录 ID', plan_gb INT COMMENT '套餐流量(GB)', used_gb DECIMAL(10,4) COMMENT '已使用流量(GB)', remain_gb DECIMAL(10,4) COMMENT '剩余流量(GB)', carrier_status VARCHAR(16) COMMENT '运营商侧状态', synced_at DATETIME COMMENT '同步时间', 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 COMMENT '主键 ID', user_id BIGINT NOT NULL COMMENT '所属用户 ID', user_name VARCHAR(32) COMMENT '用户名称', module VARCHAR(32) COMMENT '业务模块', -- 模块(用户管理/机巢管理/任务管理...) action VARCHAR(64) COMMENT '操作动作', -- 动作(新增/修改/删除/下发指令...) detail VARCHAR(256) COMMENT '操作详情', -- 详情(请求路径) result VARCHAR(16) COMMENT '操作结果', -- success / failed ip VARCHAR(64) COMMENT '客户端 IP 地址', created_at DATETIME COMMENT '创建时间', KEY idx_op_user (user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;