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.
124 lines
9.0 KiB
124 lines
9.0 KiB
-- 平台共享媒体资源与统一账务升级脚本,可重复执行。
|
|
|
|
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 ;
|
|
|