-- 平台共享媒体资源与统一账务升级脚本,可重复执行。 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 '账户类型', -- user / platform account_id BIGINT NOT NULL COMMENT '账户 ID', direction VARCHAR(8) NOT NULL COMMENT '借贷方向', -- credit / debit 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; -- 已部署数据库的新增字段;字段存在时跳过,避免重复执行失败。 DELIMITER $$ DROP PROCEDURE IF EXISTS upgrade_platform_traffic_billing $$ CREATE PROCEDURE upgrade_platform_traffic_billing() BEGIN DECLARE item_count INT DEFAULT 0; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'package_id'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN package_id BIGINT NULL COMMENT '套餐 ID' AFTER user_id; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'package_code'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN package_code VARCHAR(64) NULL COMMENT '套餐编码快照' AFTER package_id; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'amount_bytes'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN amount_bytes BIGINT NOT NULL DEFAULT 0 COMMENT '流量额度(字节)' AFTER amount_gb; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'credit_status'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN credit_status VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT '充值入账状态' AFTER pay_status; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'credit_ledger_id'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN credit_ledger_id BIGINT NULL COMMENT '充值流水 ID' AFTER credit_status; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'payment_idempotency_key'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN payment_idempotency_key VARCHAR(128) NULL COMMENT '支付幂等键' AFTER credit_ledger_id; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND column_name = 'paid_by'; IF item_count = 0 THEN ALTER TABLE traffic_order ADD COLUMN paid_by BIGINT NULL COMMENT '确认支付的操作人 ID' AFTER payment_idempotency_key; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'traffic_order' AND index_name = 'uk_traffic_order_payment_idem'; IF item_count = 0 THEN CREATE UNIQUE INDEX uk_traffic_order_payment_idem ON traffic_order (payment_idempotency_key); END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'download_log' AND column_name = 'idempotency_key'; IF item_count = 0 THEN ALTER TABLE download_log ADD COLUMN idempotency_key VARCHAR(128) NULL COMMENT '下载计费幂等键'; UPDATE download_log SET idempotency_key = CONCAT('legacy:', id) WHERE idempotency_key IS NULL; ALTER TABLE download_log MODIFY COLUMN idempotency_key VARCHAR(128) NOT NULL COMMENT '下载计费幂等键'; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'download_log' AND index_name = 'uk_download_log_idempotency'; IF item_count = 0 THEN CREATE UNIQUE INDEX uk_download_log_idempotency ON download_log (idempotency_key); END IF; SELECT COUNT(*) INTO item_count FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'traffic_usage_log' AND column_name = 'idempotency_key'; IF item_count = 0 THEN ALTER TABLE traffic_usage_log ADD COLUMN idempotency_key VARCHAR(160) NULL COMMENT '消费幂等键' AFTER balance_after; UPDATE traffic_usage_log SET idempotency_key = CONCAT('legacy:', id) WHERE idempotency_key IS NULL; ALTER TABLE traffic_usage_log MODIFY COLUMN idempotency_key VARCHAR(160) NOT NULL COMMENT '消费幂等键'; END IF; SELECT COUNT(*) INTO item_count FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = 'traffic_usage_log' AND index_name = 'uk_traffic_usage_idempotency'; IF item_count = 0 THEN CREATE UNIQUE INDEX uk_traffic_usage_idempotency ON traffic_usage_log (idempotency_key); END IF; END $$ CALL upgrade_platform_traffic_billing() $$ DROP PROCEDURE upgrade_platform_traffic_billing $$ DELIMITER ;