2026-05-26 01:02:12 +08:00

989 lines
58 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 使用 utf8mb4 连接字符集,保证中文注释、中文名称和 emoji 在导入时不被降级。
CREATE DATABASE IF NOT EXISTS hyapp_wallet DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE hyapp_wallet;
CREATE TABLE IF NOT EXISTS wallet_accounts (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
user_id BIGINT NOT NULL COMMENT '用户 ID',
asset_type VARCHAR(32) NOT NULL COMMENT '钱包资产类型',
available_amount BIGINT NOT NULL COMMENT '可用数量',
frozen_amount BIGINT NOT NULL COMMENT '冻结数量',
version BIGINT NOT NULL COMMENT '版本号',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, user_id, asset_type)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包账户余额表';
CREATE TABLE IF NOT EXISTS wallet_transactions (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
command_id VARCHAR(128) NOT NULL COMMENT '业务命令幂等 ID',
biz_type VARCHAR(64) NOT NULL COMMENT '业务类型',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
request_hash VARCHAR(128) NOT NULL COMMENT '请求哈希值',
external_ref VARCHAR(128) NOT NULL DEFAULT '' COMMENT '外部引用',
metadata_json JSON NULL COMMENT '扩展元数据 JSON',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, transaction_id),
UNIQUE KEY uk_wallet_tx_command (app_code, command_id),
KEY idx_wallet_tx_biz_time (app_code, biz_type, created_at_ms),
KEY idx_wallet_tx_external_ref (app_code, external_ref)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包交易主表';
CREATE TABLE IF NOT EXISTS wallet_entries (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
entry_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '流水 ID',
transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
asset_type VARCHAR(32) NOT NULL COMMENT '钱包资产类型',
available_delta BIGINT NOT NULL COMMENT '可用变动',
frozen_delta BIGINT NOT NULL COMMENT '冻结变动',
available_after BIGINT NOT NULL COMMENT '可用后',
frozen_after BIGINT NOT NULL COMMENT '冻结后',
counterparty_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '交易对手用户 ID',
room_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '房间 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
KEY idx_wallet_entries_user_time (app_code, user_id, created_at_ms),
KEY idx_wallet_entries_tx (app_code, transaction_id),
KEY idx_wallet_entries_asset_time (app_code, asset_type, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包复式流水表';
CREATE TABLE IF NOT EXISTS wallet_outbox (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
event_id VARCHAR(128) NOT NULL COMMENT '事件幂等 ID',
event_type VARCHAR(64) NOT NULL COMMENT '事件类型',
transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
command_id VARCHAR(128) NOT NULL COMMENT '业务命令幂等 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
asset_type VARCHAR(32) NOT NULL COMMENT '钱包资产类型',
available_delta BIGINT NOT NULL COMMENT '可用变动',
frozen_delta BIGINT NOT NULL COMMENT '冻结变动',
payload JSON NOT NULL COMMENT '业务负载快照',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
worker_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'MQ 投递 worker ID',
lock_until_ms BIGINT NULL COMMENT 'MQ 投递锁过期时间UTC epoch ms',
retry_count INT NOT NULL DEFAULT 0 COMMENT '重试次数',
next_retry_at_ms BIGINT NULL COMMENT '下一次 MQ 投递重试时间UTC epoch ms',
last_error TEXT NULL COMMENT '最后一次失败原因',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, event_id),
KEY idx_wallet_outbox_pending (app_code, status, next_retry_at_ms, created_at_ms),
KEY idx_wallet_outbox_claim (app_code, status, lock_until_ms, created_at_ms),
KEY idx_wallet_outbox_tx (app_code, transaction_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包事件 outbox 表';
-- 老环境可能已经存在 wallet_outboxCREATE TABLE IF NOT EXISTS 不会补齐后续新增的投递锁字段。
-- 这里用 information_schema 生成幂等 ALTER保证重复执行 initdb 时不会因重复列名失败。
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_outbox' AND COLUMN_NAME = 'worker_id') = 0,
'ALTER TABLE wallet_outbox ADD COLUMN worker_id VARCHAR(128) NOT NULL DEFAULT '''' COMMENT ''MQ 投递 worker ID'' AFTER status',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 投递锁过期时间用于多实例 claim outbox老库缺这个列时会导致 worker 查询直接 1054。
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_outbox' AND COLUMN_NAME = 'lock_until_ms') = 0,
'ALTER TABLE wallet_outbox ADD COLUMN lock_until_ms BIGINT NULL COMMENT ''MQ 投递锁过期时间UTC epoch ms'' AFTER worker_id',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 下一次重试时间让失败 outbox 可延迟重投;老库缺列时待投递扫描会直接失败。
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_outbox' AND COLUMN_NAME = 'next_retry_at_ms') = 0,
'ALTER TABLE wallet_outbox ADD COLUMN next_retry_at_ms BIGINT NULL COMMENT ''下一次 MQ 投递重试时间UTC epoch ms'' AFTER retry_count',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- pending 索引的列顺序跟 outbox 扫描条件绑定;为兼容历史索引,存在就先删除再按当前结构重建。
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_outbox' AND INDEX_NAME = 'idx_wallet_outbox_pending') > 0,
'ALTER TABLE wallet_outbox DROP INDEX idx_wallet_outbox_pending',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := 'ALTER TABLE wallet_outbox ADD INDEX idx_wallet_outbox_pending (app_code, status, next_retry_at_ms, created_at_ms)';
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- claim 索引用于查找锁过期的消息;仅在缺失时添加,避免重复执行 initdb 报重复索引。
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_outbox' AND INDEX_NAME = 'idx_wallet_outbox_claim') = 0,
'ALTER TABLE wallet_outbox ADD INDEX idx_wallet_outbox_claim (app_code, status, lock_until_ms, created_at_ms)',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
CREATE TABLE IF NOT EXISTS wallet_gift_prices (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
gift_id VARCHAR(96) NOT NULL COMMENT '礼物 ID',
price_version VARCHAR(64) NOT NULL COMMENT '价格版本',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
charge_asset_type VARCHAR(32) NOT NULL DEFAULT 'COIN' COMMENT '扣费资产类型',
coin_price BIGINT NOT NULL COMMENT '金币价格',
gift_point_amount BIGINT NOT NULL COMMENT '礼物积分数量',
heat_value BIGINT NOT NULL COMMENT '热度值',
effective_at_ms BIGINT NOT NULL COMMENT '生效时间UTC epoch ms',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, gift_id, price_version),
KEY idx_wallet_gift_prices_effective (app_code, gift_id, status, effective_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包礼物价格表';
CREATE TABLE IF NOT EXISTS wallet_recharge_policies (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
policy_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '策略 ID',
region_id BIGINT NOT NULL COMMENT '区域 ID',
policy_version VARCHAR(64) NOT NULL COMMENT '策略版本',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
currency_code VARCHAR(3) NOT NULL DEFAULT 'USD' COMMENT '币种编码',
coin_amount BIGINT NOT NULL COMMENT '金币数量',
usd_minor_amount BIGINT NOT NULL COMMENT '美元最小单位数量',
effective_from_ms BIGINT NOT NULL COMMENT '生效开始时间UTC epoch ms',
effective_to_ms BIGINT NULL COMMENT '生效结束时间UTC epoch ms',
created_by_user_id BIGINT NULL COMMENT '创建人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
KEY idx_wallet_recharge_policies_active (app_code, region_id, status, effective_from_ms),
UNIQUE KEY uk_wallet_recharge_policy_version (app_code, region_id, policy_version)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包充值策略表';
CREATE TABLE IF NOT EXISTS wallet_recharge_records (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
recharge_sequence BIGINT NOT NULL DEFAULT 0 COMMENT '该用户成功充值序号,从 1 开始',
seller_user_id BIGINT NOT NULL COMMENT '商户用户 ID',
seller_region_id BIGINT NOT NULL COMMENT '商户区域 ID',
target_region_id BIGINT NOT NULL COMMENT '目标区域 ID',
policy_id BIGINT NOT NULL COMMENT '策略 ID',
policy_version VARCHAR(64) NOT NULL COMMENT '策略版本',
currency_code VARCHAR(3) NOT NULL COMMENT '币种编码',
coin_amount BIGINT NOT NULL COMMENT '金币数量',
usd_minor_amount BIGINT NOT NULL COMMENT '美元最小单位数量',
exchange_coin_amount BIGINT NOT NULL COMMENT '兑换金币数量',
exchange_usd_minor_amount BIGINT NOT NULL COMMENT '兑换美元最小单位数量',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
PRIMARY KEY (app_code, transaction_id),
KEY idx_wallet_recharge_records_user_time (app_code, user_id, created_at_ms),
KEY idx_wallet_recharge_records_seller_time (app_code, seller_user_id, created_at_ms),
KEY idx_wallet_recharge_records_region_time (app_code, target_region_id, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包充值记录表';
CREATE TABLE IF NOT EXISTS wallet_user_recharge_stats (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
user_id BIGINT NOT NULL COMMENT '用户 ID',
recharge_count BIGINT NOT NULL DEFAULT 0 COMMENT '成功充值次数',
first_transaction_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '首笔充值交易 ID',
first_recharged_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '首笔充值时间UTC epoch ms',
total_coin_amount BIGINT NOT NULL DEFAULT 0 COMMENT '累计充值金币',
total_usd_minor_amount BIGINT NOT NULL DEFAULT 0 COMMENT '累计充值美元最小单位金额',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户充值统计表';
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_recharge_records' AND COLUMN_NAME = 'recharge_sequence') = 0,
'ALTER TABLE wallet_recharge_records ADD COLUMN recharge_sequence BIGINT NOT NULL DEFAULT 0 COMMENT ''该用户成功充值序号,从 1 开始'' AFTER user_id',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
CREATE TABLE IF NOT EXISTS wallet_recharge_products (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
product_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '商品 ID',
product_code VARCHAR(128) NULL COMMENT '商品编码',
product_name VARCHAR(128) NOT NULL COMMENT '商品名称',
description VARCHAR(512) NOT NULL DEFAULT '' COMMENT '描述信息',
platform VARCHAR(16) NOT NULL COMMENT '平台',
channel VARCHAR(32) NOT NULL COMMENT '渠道',
currency_code VARCHAR(8) NOT NULL DEFAULT 'USDT' COMMENT '币种编码',
amount_micro BIGINT NOT NULL COMMENT '微单位金额',
coin_amount BIGINT NOT NULL COMMENT '金币数量',
resource_asset_type VARCHAR(32) NOT NULL DEFAULT 'COIN' COMMENT '资源资产类型',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_by_user_id BIGINT NULL COMMENT '创建人用户 ID',
updated_by_user_id BIGINT NULL COMMENT '更新人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_wallet_recharge_products_code (app_code, product_code),
KEY idx_wallet_recharge_products_scope (app_code, platform, status, amount_micro, product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包充值商品表';
CREATE TABLE IF NOT EXISTS wallet_recharge_product_regions (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
product_id BIGINT NOT NULL COMMENT '商品 ID',
region_id BIGINT NOT NULL COMMENT '区域 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
PRIMARY KEY (app_code, product_id, region_id),
KEY idx_wallet_recharge_product_regions_region (app_code, region_id, product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包充值商品区域表';
CREATE TABLE IF NOT EXISTS payment_orders (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
payment_order_id VARCHAR(96) NOT NULL COMMENT '平台支付订单 ID',
provider VARCHAR(32) NOT NULL COMMENT '支付提供方',
channel VARCHAR(32) NOT NULL COMMENT '充值渠道',
status VARCHAR(32) NOT NULL COMMENT '订单状态',
command_id VARCHAR(128) NOT NULL COMMENT '客户端确认命令幂等 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
product_id BIGINT NOT NULL COMMENT '后台充值商品 ID',
product_code VARCHAR(128) NOT NULL COMMENT 'Google Play 商品 ID',
package_name VARCHAR(256) NOT NULL DEFAULT '' COMMENT 'Google Play 包名',
provider_order_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT 'Google Play orderId',
purchase_token_hash VARCHAR(128) NOT NULL COMMENT 'Google purchase token SHA256不落明文 token',
purchase_state VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'Google purchase state',
consume_state VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'Google consume 状态',
wallet_transaction_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '钱包交易 ID',
coin_amount BIGINT NOT NULL COMMENT '到账金币数量',
currency_code VARCHAR(8) NOT NULL DEFAULT '' COMMENT '商品币种编码',
amount_micro BIGINT NOT NULL DEFAULT 0 COMMENT '商品金额微单位',
provider_payload JSON NULL COMMENT 'Google Play 校验返回快照',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, payment_order_id),
UNIQUE KEY uk_payment_orders_token (app_code, provider, purchase_token_hash),
UNIQUE KEY uk_payment_orders_command (app_code, command_id),
KEY idx_payment_orders_user_time (app_code, user_id, created_at_ms),
KEY idx_payment_orders_provider_order (app_code, provider, provider_order_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付订单与 provider 审计表';
CREATE TABLE IF NOT EXISTS coin_seller_stock_records (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
stock_id VARCHAR(96) NOT NULL COMMENT '库存 ID',
transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
command_id VARCHAR(128) NOT NULL COMMENT '业务命令幂等 ID',
seller_user_id BIGINT NOT NULL COMMENT '商户用户 ID',
stock_type VARCHAR(32) NOT NULL COMMENT '库存类型',
counts_as_seller_recharge BOOLEAN NOT NULL COMMENT '数量as商户充值',
coin_amount BIGINT NOT NULL COMMENT '金币数量',
paid_currency_code VARCHAR(8) NOT NULL DEFAULT '' COMMENT '付款币种编码',
paid_amount_micro BIGINT NOT NULL DEFAULT 0 COMMENT '付款数量微单位',
payment_ref VARCHAR(128) NULL COMMENT '支付外部引用',
evidence_ref VARCHAR(256) NOT NULL DEFAULT '' COMMENT '凭证外部引用',
operator_user_id BIGINT NOT NULL COMMENT '操作人用户 ID',
reason VARCHAR(512) NOT NULL DEFAULT '' COMMENT '原因',
balance_after BIGINT NOT NULL COMMENT '余额后',
metadata_json JSON NULL COMMENT '扩展元数据 JSON',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
PRIMARY KEY (app_code, stock_id),
UNIQUE KEY uk_coin_seller_stock_command (app_code, command_id),
UNIQUE KEY uk_coin_seller_stock_payment_ref (app_code, stock_type, payment_ref),
KEY idx_coin_seller_stock_seller_time (app_code, seller_user_id, created_at_ms),
KEY idx_coin_seller_stock_type_time (app_code, stock_type, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='金币商户库存记录表';
CREATE TABLE IF NOT EXISTS resources (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
resource_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '资源 ID',
resource_code VARCHAR(96) NOT NULL COMMENT '资源编码',
resource_type VARCHAR(32) NOT NULL COMMENT '资源类型',
name VARCHAR(128) NOT NULL COMMENT '名称',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
grantable BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否允许发放',
manager_grant_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '管理端是否允许发放',
grant_strategy VARCHAR(32) NOT NULL COMMENT '发放策略',
wallet_asset_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '钱包资产类型',
wallet_asset_amount BIGINT NOT NULL DEFAULT 0 COMMENT '钱包资产数量',
price_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '资源价格类型coin/free',
coin_price BIGINT NOT NULL DEFAULT 0 COMMENT '资源金币价格',
gift_point_amount BIGINT NOT NULL DEFAULT 0 COMMENT '资源礼物积分',
usage_scope_json JSON NOT NULL COMMENT '使用范围 JSON 配置或快照',
asset_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '资产 URL',
preview_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '预览 URL',
animation_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '动画 URL',
metadata_json JSON NULL COMMENT '扩展元数据 JSON',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '创建人用户 ID',
updated_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '更新人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_resources_code (app_code, resource_code),
KEY idx_resources_type_status (app_code, resource_type, status, sort_order),
KEY idx_resources_manager_grant (app_code, manager_grant_enabled, status, grantable, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源表';
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'resources' AND COLUMN_NAME = 'manager_grant_enabled') = 0,
'ALTER TABLE resources ADD COLUMN manager_grant_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT ''管理端是否允许发放'' AFTER grantable',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'resources' AND COLUMN_NAME = 'price_type') = 0,
'ALTER TABLE resources ADD COLUMN price_type VARCHAR(32) NOT NULL DEFAULT '''' COMMENT ''资源价格类型coin/free'' AFTER wallet_asset_amount',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'resources' AND COLUMN_NAME = 'coin_price') = 0,
'ALTER TABLE resources ADD COLUMN coin_price BIGINT NOT NULL DEFAULT 0 COMMENT ''资源金币价格'' AFTER price_type',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'resources' AND COLUMN_NAME = 'gift_point_amount') = 0,
'ALTER TABLE resources ADD COLUMN gift_point_amount BIGINT NOT NULL DEFAULT 0 COMMENT ''资源礼物积分'' AFTER coin_price',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'resources' AND INDEX_NAME = 'idx_resources_manager_grant') = 0,
'ALTER TABLE resources ADD KEY idx_resources_manager_grant (app_code, manager_grant_enabled, status, grantable, sort_order)',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
CREATE TABLE IF NOT EXISTS resource_groups (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
group_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '分组 ID',
group_code VARCHAR(96) NOT NULL COMMENT '分组编码',
name VARCHAR(128) NOT NULL COMMENT '名称',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
description VARCHAR(512) NOT NULL DEFAULT '' COMMENT '描述信息',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '创建人用户 ID',
updated_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '更新人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_resource_groups_code (app_code, group_code),
KEY idx_resource_groups_status (app_code, status, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源分组表';
CREATE TABLE IF NOT EXISTS resource_group_items (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
group_item_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '分组明细 ID',
group_id BIGINT NOT NULL COMMENT '分组 ID',
item_type VARCHAR(32) NOT NULL DEFAULT 'resource' COMMENT '明细类型',
resource_id BIGINT NOT NULL DEFAULT 0 COMMENT '资源 ID',
wallet_asset_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '钱包资产类型',
wallet_asset_amount BIGINT NOT NULL DEFAULT 0 COMMENT '钱包资产数量',
quantity BIGINT NOT NULL DEFAULT 1 COMMENT '数量',
duration_ms BIGINT NOT NULL DEFAULT 0 COMMENT '持续时长,毫秒',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_resource_group_items_member (app_code, group_id, item_type, resource_id, wallet_asset_type),
KEY idx_resource_group_items_group (app_code, group_id, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源分组明细表';
CREATE TABLE IF NOT EXISTS gift_type_configs (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
type_code VARCHAR(32) NOT NULL COMMENT '礼物类型编码,供 gift_configs 引用',
name VARCHAR(64) NOT NULL COMMENT '后台展示名称',
tab_key VARCHAR(32) NOT NULL COMMENT 'App 礼物面板 tab 展示 key',
status VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT 'tab 状态active 才在 App 面板展示',
sort_order INT NOT NULL DEFAULT 0 COMMENT 'tab 排序权重,数值越小越靠前',
created_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '创建人用户 ID',
updated_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '更新人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, type_code),
UNIQUE KEY uk_gift_type_configs_tab_key (app_code, tab_key),
KEY idx_gift_type_configs_status_sort (app_code, status, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='礼物类型和 App 面板 tab 配置表';
CREATE TABLE IF NOT EXISTS gift_configs (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
gift_id VARCHAR(96) NOT NULL COMMENT '礼物 ID',
resource_id BIGINT NOT NULL COMMENT '资源 ID',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
name VARCHAR(128) NOT NULL COMMENT '名称',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
presentation_json JSON NULL COMMENT '展示配置 JSON 配置或快照',
gift_type_code VARCHAR(32) NOT NULL DEFAULT 'normal' COMMENT '礼物类型编码',
effective_from_ms BIGINT NOT NULL DEFAULT 0 COMMENT '生效开始时间UTC epoch ms',
effective_to_ms BIGINT NOT NULL DEFAULT 0 COMMENT '生效结束时间UTC epoch ms',
effect_types_json JSON NULL COMMENT '礼物特效类型 JSON 配置',
created_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '创建人用户 ID',
updated_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '更新人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, gift_id),
KEY idx_gift_configs_resource (app_code, resource_id),
KEY idx_gift_configs_status_sort (app_code, status, sort_order),
KEY idx_gift_configs_effective (app_code, status, effective_from_ms, effective_to_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='礼物配置表';
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'wallet_gift_prices' AND COLUMN_NAME = 'charge_asset_type') = 0,
'ALTER TABLE wallet_gift_prices ADD COLUMN charge_asset_type VARCHAR(32) NOT NULL DEFAULT ''COIN'' COMMENT ''扣费资产类型'' AFTER status',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'gift_type_code') = 0,
'ALTER TABLE gift_configs ADD COLUMN gift_type_code VARCHAR(32) NOT NULL DEFAULT ''normal'' COMMENT ''礼物类型编码'' AFTER presentation_json',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'effective_from_ms') = 0,
'ALTER TABLE gift_configs ADD COLUMN effective_from_ms BIGINT NOT NULL DEFAULT 0 COMMENT ''生效开始时间UTC epoch ms'' AFTER gift_type_code',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'effective_to_ms') = 0,
'ALTER TABLE gift_configs ADD COLUMN effective_to_ms BIGINT NOT NULL DEFAULT 0 COMMENT ''生效结束时间UTC epoch ms'' AFTER effective_from_ms',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gift_configs' AND COLUMN_NAME = 'effect_types_json') = 0,
'ALTER TABLE gift_configs ADD COLUMN effect_types_json JSON NULL COMMENT ''礼物特效类型 JSON 配置'' AFTER effective_to_ms',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
CREATE TABLE IF NOT EXISTS gift_config_regions (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
gift_id VARCHAR(96) NOT NULL COMMENT '礼物 ID',
region_id BIGINT NOT NULL COMMENT '区域 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, gift_id, region_id),
KEY idx_gift_config_regions_region (app_code, region_id, gift_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='礼物配置区域表';
CREATE TABLE IF NOT EXISTS user_gift_wall (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
user_id BIGINT NOT NULL COMMENT '用户 ID',
gift_id VARCHAR(96) NOT NULL COMMENT '礼物 ID',
gift_name VARCHAR(128) NOT NULL COMMENT '礼物名称',
resource_id BIGINT NOT NULL DEFAULT 0 COMMENT '资源 ID',
resource_snapshot_json JSON NOT NULL COMMENT '资源快照 JSON',
gift_type_code VARCHAR(32) NOT NULL DEFAULT 'normal' COMMENT '礼物类型编码',
presentation_json JSON NULL COMMENT '展示配置 JSON 配置或快照',
gift_count BIGINT NOT NULL DEFAULT 0 COMMENT '礼物数量',
total_value BIGINT NOT NULL DEFAULT 0 COMMENT '总值',
total_coin_value BIGINT NOT NULL DEFAULT 0 COMMENT '总金币值',
total_diamond_value BIGINT NOT NULL DEFAULT 0 COMMENT '总钻石值',
total_gift_point BIGINT NOT NULL DEFAULT 0 COMMENT '总礼物积分',
total_heat_value BIGINT NOT NULL DEFAULT 0 COMMENT '总热度值',
charge_asset_type VARCHAR(32) NOT NULL DEFAULT 'COIN' COMMENT '扣费资产类型',
last_price_version VARCHAR(64) NOT NULL DEFAULT '' COMMENT '最后价格版本',
first_received_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '首次收到时间UTC epoch ms',
last_received_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '最后收到时间UTC epoch ms',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, user_id, gift_id),
KEY idx_user_gift_wall_user_sort (app_code, user_id, sort_order, total_value, last_received_at_ms),
KEY idx_user_gift_wall_gift (app_code, gift_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户礼物墙表';
CREATE TABLE IF NOT EXISTS wallet_projection_events (
projection_name VARCHAR(64) NOT NULL COMMENT '投影名称',
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
event_id VARCHAR(128) NOT NULL COMMENT '事件幂等 ID',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
retry_count INT NOT NULL DEFAULT 0 COMMENT '重试次数',
locked_by VARCHAR(96) NOT NULL DEFAULT '' COMMENT '当前锁定 worker',
locked_until_ms BIGINT NOT NULL DEFAULT 0 COMMENT '锁定截止时间UTC epoch ms',
last_error TEXT NULL COMMENT '最后一次失败原因',
processed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '处理时间UTC epoch ms',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (projection_name, app_code, event_id),
KEY idx_wallet_projection_claim (projection_name, app_code, status, locked_until_ms, updated_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包投影事件表';
CREATE TABLE IF NOT EXISTS resource_grants (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
grant_id VARCHAR(96) NOT NULL COMMENT '发放 ID',
command_id VARCHAR(128) NOT NULL COMMENT '业务命令幂等 ID',
target_user_id BIGINT NOT NULL COMMENT '目标用户 ID',
grant_source VARCHAR(32) NOT NULL COMMENT '发放来源',
grant_subject_type VARCHAR(32) NOT NULL COMMENT '发放主体类型',
grant_subject_id VARCHAR(96) NOT NULL COMMENT '发放主体 ID',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
request_hash VARCHAR(128) NOT NULL COMMENT '请求哈希值',
group_snapshot_json JSON NULL COMMENT '资源分组快照 JSON',
reason VARCHAR(256) NOT NULL COMMENT '原因',
operator_user_id BIGINT NOT NULL COMMENT '操作人用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, grant_id),
UNIQUE KEY uk_resource_grants_command (app_code, command_id),
KEY idx_resource_grants_target_time (app_code, target_user_id, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源发放表';
CREATE TABLE IF NOT EXISTS resource_grant_items (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
grant_item_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '发放明细 ID',
grant_id VARCHAR(96) NOT NULL COMMENT '发放 ID',
resource_id BIGINT NOT NULL COMMENT '资源 ID',
resource_snapshot_json JSON NOT NULL COMMENT '资源快照 JSON',
quantity BIGINT NOT NULL DEFAULT 1 COMMENT '数量',
duration_ms BIGINT NOT NULL DEFAULT 0 COMMENT '持续时长,毫秒',
result_type VARCHAR(32) NOT NULL COMMENT '结果类型',
wallet_transaction_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '钱包交易 ID',
entitlement_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '权益 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
KEY idx_resource_grant_items_grant (app_code, grant_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='资源发放明细表';
CREATE TABLE IF NOT EXISTS user_resource_entitlements (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
entitlement_id VARCHAR(96) NOT NULL COMMENT '权益 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
resource_id BIGINT NOT NULL COMMENT '资源 ID',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
quantity BIGINT NOT NULL DEFAULT 1 COMMENT '数量',
remaining_quantity BIGINT NOT NULL DEFAULT 1 COMMENT '剩余数量',
effective_at_ms BIGINT NOT NULL COMMENT '生效时间UTC epoch ms',
expires_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '过期时间UTC epoch ms',
source_grant_id VARCHAR(96) NOT NULL COMMENT '来源发放 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, entitlement_id),
KEY idx_user_resource_active (app_code, user_id, resource_id, status, expires_at_ms),
KEY idx_user_resource_user_type (app_code, user_id, status, updated_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户资源权益表';
CREATE TABLE IF NOT EXISTS user_resource_equipment (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
user_id BIGINT NOT NULL COMMENT '用户 ID',
resource_type VARCHAR(32) NOT NULL COMMENT '资源类型',
entitlement_id VARCHAR(96) NOT NULL COMMENT '权益 ID',
resource_id BIGINT NOT NULL COMMENT '资源 ID',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, user_id, resource_type),
KEY idx_user_resource_equipment_user (app_code, user_id, updated_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户资源装备表';
CREATE TABLE IF NOT EXISTS wallet_diamond_exchange_rules (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
rule_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '规则 ID',
exchange_type VARCHAR(32) NOT NULL COMMENT '兑换类型',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
from_asset_type VARCHAR(32) NOT NULL DEFAULT 'DIAMOND' COMMENT '源资产类型',
to_asset_type VARCHAR(32) NOT NULL COMMENT '目标资产类型',
from_amount BIGINT NOT NULL COMMENT '源数量',
to_amount BIGINT NOT NULL COMMENT '目标数量',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_diamond_exchange_rule (app_code, exchange_type, from_amount, to_asset_type),
KEY idx_diamond_exchange_active (app_code, status, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包钻石兑换规则表';
CREATE TABLE IF NOT EXISTS red_packet_configs (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
enabled BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否启用红包',
delayed_open_seconds INT NOT NULL DEFAULT 0 COMMENT '延迟红包打开秒数',
expire_seconds INT NOT NULL DEFAULT 300 COMMENT '红包过期秒数',
daily_send_limit INT NOT NULL DEFAULT 0 COMMENT '每用户 UTC 日发送上限0 表示禁止发送',
updated_by_admin_id BIGINT NOT NULL DEFAULT 0 COMMENT '最后更新后台用户 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包配置主表';
CREATE TABLE IF NOT EXISTS red_packet_count_tiers (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
tier_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '数量档位 ID',
packet_count INT NOT NULL COMMENT '红包数量',
status VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '业务状态',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_red_packet_count_tier (app_code, packet_count),
KEY idx_red_packet_count_tier_status (app_code, status, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包数量档位表';
CREATE TABLE IF NOT EXISTS red_packet_amount_tiers (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
tier_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '金额档位 ID',
total_amount BIGINT NOT NULL COMMENT '红包总金币金额',
status VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '业务状态',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
UNIQUE KEY uk_red_packet_amount_tier (app_code, total_amount),
KEY idx_red_packet_amount_tier_status (app_code, status, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包金额档位表';
CREATE TABLE IF NOT EXISTS red_packets (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
packet_id VARCHAR(96) NOT NULL COMMENT '红包 ID',
command_id VARCHAR(128) NOT NULL COMMENT '发红包命令幂等 ID',
sender_user_id BIGINT NOT NULL COMMENT '发送者用户 ID',
room_id VARCHAR(96) NOT NULL COMMENT '房间 ID',
region_id BIGINT NOT NULL COMMENT '房间区域 ID',
packet_type VARCHAR(32) NOT NULL COMMENT '红包类型normal/delayed',
total_amount BIGINT NOT NULL COMMENT '红包总金币金额',
packet_count INT NOT NULL COMMENT '红包份数',
remaining_amount BIGINT NOT NULL COMMENT '剩余未领取金币金额',
remaining_count INT NOT NULL COMMENT '剩余未领取份数',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
open_at_ms BIGINT NOT NULL COMMENT '可领取时间UTC epoch ms',
expires_at_ms BIGINT NOT NULL COMMENT '过期时间UTC epoch ms',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, packet_id),
UNIQUE KEY uk_red_packets_command (app_code, command_id),
KEY idx_red_packets_room_time (app_code, room_id, created_at_ms),
KEY idx_red_packets_sender_time (app_code, sender_user_id, created_at_ms),
KEY idx_red_packets_expire (app_code, status, expires_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包主表';
CREATE TABLE IF NOT EXISTS red_packet_allocations (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
packet_id VARCHAR(96) NOT NULL COMMENT '红包 ID',
allocation_no INT NOT NULL COMMENT '份额序号',
amount BIGINT NOT NULL COMMENT '份额金币金额',
status VARCHAR(32) NOT NULL COMMENT '份额状态',
claimed_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '领取用户 ID',
claim_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '领取记录 ID',
claimed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '领取时间UTC epoch ms',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, packet_id, allocation_no),
KEY idx_red_packet_alloc_claimable (app_code, packet_id, status, allocation_no),
KEY idx_red_packet_alloc_user (app_code, claimed_by_user_id, claimed_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包随机份额表';
CREATE TABLE IF NOT EXISTS red_packet_claims (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
claim_id VARCHAR(96) NOT NULL COMMENT '领取记录 ID',
command_id VARCHAR(128) NOT NULL COMMENT '抢红包命令幂等 ID',
packet_id VARCHAR(96) NOT NULL COMMENT '红包 ID',
user_id BIGINT NOT NULL COMMENT '领取用户 ID',
amount BIGINT NOT NULL COMMENT '领取金币金额',
wallet_transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
failure_reason VARCHAR(64) NOT NULL DEFAULT '' COMMENT '失败原因',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, claim_id),
UNIQUE KEY uk_red_packet_claim_command (app_code, command_id),
UNIQUE KEY uk_red_packet_claim_user (app_code, packet_id, user_id),
KEY idx_red_packet_claim_packet (app_code, packet_id, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包领取记录表';
CREATE TABLE IF NOT EXISTS red_packet_refunds (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
refund_id VARCHAR(96) NOT NULL COMMENT '退款记录 ID',
command_id VARCHAR(128) NOT NULL COMMENT '退款命令幂等 ID',
packet_id VARCHAR(96) NOT NULL COMMENT '红包 ID',
sender_user_id BIGINT NOT NULL COMMENT '发送者用户 ID',
refund_amount BIGINT NOT NULL COMMENT '退款金币金额',
wallet_transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, refund_id),
UNIQUE KEY uk_red_packet_refund_command (app_code, command_id),
UNIQUE KEY uk_red_packet_refund_packet (app_code, packet_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包过期退款记录表';
CREATE TABLE IF NOT EXISTS red_packet_user_daily_counters (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
user_id BIGINT NOT NULL COMMENT '用户 ID',
send_day CHAR(10) NOT NULL COMMENT 'UTC 日期YYYY-MM-DD',
sent_count INT NOT NULL COMMENT '当日已发送次数',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, user_id, send_day)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='红包用户每日发送计数表';
CREATE TABLE IF NOT EXISTS wallet_withdrawal_requests (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
withdrawal_id VARCHAR(96) NOT NULL COMMENT '提现 ID',
command_id VARCHAR(128) NOT NULL COMMENT '业务命令幂等 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
asset_type VARCHAR(32) NOT NULL COMMENT '钱包资产类型',
amount BIGINT NOT NULL COMMENT '金额或数量',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
payout_account VARCHAR(256) NOT NULL COMMENT '出款账户',
reason VARCHAR(512) NOT NULL DEFAULT '' COMMENT '原因',
wallet_transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
reviewed_by_user_id BIGINT NULL COMMENT '审核用户 ID',
review_reason VARCHAR(512) NOT NULL DEFAULT '' COMMENT '审核原因',
reviewed_at_ms BIGINT NULL COMMENT '审核时间UTC epoch ms',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, withdrawal_id),
UNIQUE KEY uk_withdrawal_command (app_code, command_id),
KEY idx_withdrawal_user_time (app_code, user_id, created_at_ms),
KEY idx_withdrawal_status_time (app_code, status, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='钱包提现申请表';
CREATE TABLE IF NOT EXISTS vip_levels (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
level INT NOT NULL COMMENT '等级',
name VARCHAR(64) NOT NULL COMMENT '名称',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
price_coin BIGINT NOT NULL COMMENT 'VIP 价格金币数',
duration_ms BIGINT NOT NULL COMMENT '持续时长,毫秒',
reward_resource_group_id BIGINT NOT NULL DEFAULT 0 COMMENT '奖励资源分组 ID',
required_recharge_coin_amount BIGINT NOT NULL DEFAULT 0 COMMENT '购买所需累计充值金币1-5 级固定为 06-10 级必须配置',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序权重,数值越小越靠前',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, level),
KEY idx_vip_levels_status_sort (app_code, status, sort_order)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='VIP 等级表';
SET @ddl := IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'vip_levels' AND COLUMN_NAME = 'required_recharge_coin_amount') = 0,
'ALTER TABLE vip_levels ADD COLUMN required_recharge_coin_amount BIGINT NOT NULL DEFAULT 0 COMMENT ''购买所需累计充值金币1-5 级固定为 06-10 级必须配置'' AFTER reward_resource_group_id',
'SELECT 1'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
CREATE TABLE IF NOT EXISTS user_vip_memberships (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
user_id BIGINT NOT NULL COMMENT '用户 ID',
level INT NOT NULL COMMENT '等级',
name VARCHAR(64) NOT NULL DEFAULT '' COMMENT '名称',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
started_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '开始时间UTC epoch ms',
expires_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '过期时间UTC epoch ms',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, user_id),
KEY idx_user_vip_expiry (app_code, status, expires_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户 VIP 成员关系表';
CREATE TABLE IF NOT EXISTS vip_purchase_orders (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
order_id VARCHAR(96) NOT NULL COMMENT '订单 ID',
command_id VARCHAR(128) NOT NULL COMMENT '业务命令幂等 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
target_level INT NOT NULL COMMENT '目标等级',
previous_level INT NOT NULL COMMENT '原等级',
price_coin BIGINT NOT NULL COMMENT 'VIP 价格金币数',
status VARCHAR(32) NOT NULL COMMENT '业务状态',
wallet_transaction_id VARCHAR(96) NOT NULL COMMENT '钱包交易 ID',
resource_grant_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '资源发放 ID',
request_hash VARCHAR(128) NOT NULL COMMENT '请求哈希值',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
updated_at_ms BIGINT NOT NULL COMMENT '更新时间UTC epoch ms',
PRIMARY KEY (app_code, order_id),
UNIQUE KEY uk_vip_purchase_command (app_code, command_id),
KEY idx_vip_purchase_user_time (app_code, user_id, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='VIP 购买订单表';
CREATE TABLE IF NOT EXISTS user_vip_history (
app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离',
history_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '历史 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
action VARCHAR(32) NOT NULL COMMENT '操作',
previous_level INT NOT NULL COMMENT '原等级',
new_level INT NOT NULL COMMENT '新等级',
order_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '订单 ID',
created_at_ms BIGINT NOT NULL COMMENT '创建时间UTC epoch ms',
KEY idx_user_vip_history_user_time (app_code, user_id, created_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户 VIP 历史表';
INSERT IGNORE INTO wallet_gift_prices (
app_code, gift_id, price_version, status, charge_asset_type, coin_price, gift_point_amount, heat_value,
effective_at_ms, created_at_ms, updated_at_ms
) VALUES
('lalu', 'rose', 'v1', 'active', 'COIN', 10, 10, 10, 0, 0, 0),
('lalu', 'rocket', 'v1', 'active', 'COIN', 100, 100, 100, 0, 0, 0);
INSERT IGNORE INTO resources (
app_code, resource_code, resource_type, name, status, grantable, grant_strategy,
wallet_asset_type, wallet_asset_amount, price_type, coin_price, gift_point_amount, usage_scope_json, asset_url, preview_url,
animation_url, metadata_json, sort_order, created_by_user_id, updated_by_user_id,
created_at_ms, updated_at_ms
) VALUES
('lalu', 'gift_rose', 'gift', 'Rose', 'active', TRUE, 'increase_quantity', '', 0, 'coin', 10, 10, JSON_ARRAY('gift'), '', '', '', JSON_OBJECT(), 10, 0, 0, 0, 0),
('lalu', 'gift_rocket', 'gift', 'Rocket', 'active', TRUE, 'increase_quantity', '', 0, 'coin', 100, 100, JSON_ARRAY('gift'), '', '', '', JSON_OBJECT(), 20, 0, 0, 0, 0);
INSERT IGNORE INTO resources (
app_code, resource_code, resource_type, name, status, grantable, grant_strategy,
wallet_asset_type, wallet_asset_amount, price_type, coin_price, gift_point_amount, usage_scope_json, asset_url, preview_url,
animation_url, metadata_json, sort_order, created_by_user_id, updated_by_user_id,
created_at_ms, updated_at_ms
) VALUES
('lalu', 'vip1_avatar_frame', 'avatar_frame', 'VIP1 Avatar Frame', 'active', TRUE, 'set_active_flag', '', 0, 'free', 0, 0, JSON_ARRAY('profile', 'room'), '', '', '', JSON_OBJECT(), 101, 0, 0, 0, 0),
('lalu', 'vip2_avatar_frame', 'avatar_frame', 'VIP2 Avatar Frame', 'active', TRUE, 'set_active_flag', '', 0, 'free', 0, 0, JSON_ARRAY('profile', 'room'), '', '', '', JSON_OBJECT(), 102, 0, 0, 0, 0),
('lalu', 'vip3_vehicle', 'vehicle', 'VIP3 Vehicle', 'active', TRUE, 'set_active_flag', '', 0, 'free', 0, 0, JSON_ARRAY('room_entry'), '', '', '', JSON_OBJECT(), 103, 0, 0, 0, 0);
INSERT IGNORE INTO resource_groups (
app_code, group_code, name, status, description, sort_order,
created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms
) VALUES
('lalu', 'vip1_rewards', 'VIP1 Rewards', 'active', 'VIP1 purchase rewards', 101, 0, 0, 0, 0),
('lalu', 'vip2_rewards', 'VIP2 Rewards', 'active', 'VIP2 purchase rewards', 102, 0, 0, 0, 0),
('lalu', 'vip3_rewards', 'VIP3 Rewards', 'active', 'VIP3 purchase rewards', 103, 0, 0, 0, 0);
INSERT IGNORE INTO resource_group_items (
app_code, group_id, item_type, resource_id, wallet_asset_type, wallet_asset_amount,
quantity, duration_ms, sort_order, created_at_ms, updated_at_ms
)
SELECT 'lalu', g.group_id, 'resource', r.resource_id, '', 0, 1, 604800000, 10, 0, 0
FROM resource_groups g
JOIN resources r ON r.app_code = g.app_code AND r.resource_code = 'vip1_avatar_frame'
WHERE g.app_code = 'lalu' AND g.group_code = 'vip1_rewards';
INSERT IGNORE INTO resource_group_items (
app_code, group_id, item_type, resource_id, wallet_asset_type, wallet_asset_amount,
quantity, duration_ms, sort_order, created_at_ms, updated_at_ms
)
SELECT 'lalu', g.group_id, 'resource', r.resource_id, '', 0, 1, 604800000, 10, 0, 0
FROM resource_groups g
JOIN resources r ON r.app_code = g.app_code AND r.resource_code = 'vip2_avatar_frame'
WHERE g.app_code = 'lalu' AND g.group_code = 'vip2_rewards';
INSERT IGNORE INTO resource_group_items (
app_code, group_id, item_type, resource_id, wallet_asset_type, wallet_asset_amount,
quantity, duration_ms, sort_order, created_at_ms, updated_at_ms
)
SELECT 'lalu', g.group_id, 'resource', r.resource_id, '', 0, 1, 604800000, 10, 0, 0
FROM resource_groups g
JOIN resources r ON r.app_code = g.app_code AND r.resource_code = 'vip3_vehicle'
WHERE g.app_code = 'lalu' AND g.group_code = 'vip3_rewards';
INSERT IGNORE INTO vip_levels (
app_code, level, name, status, price_coin, duration_ms, reward_resource_group_id, required_recharge_coin_amount,
sort_order, created_at_ms, updated_at_ms
)
SELECT 'lalu', 1, 'VIP1', 'active', 1000, 604800000, group_id, 0, 10, 0, 0
FROM resource_groups
WHERE app_code = 'lalu' AND group_code = 'vip1_rewards';
INSERT IGNORE INTO vip_levels (
app_code, level, name, status, price_coin, duration_ms, reward_resource_group_id, required_recharge_coin_amount,
sort_order, created_at_ms, updated_at_ms
)
SELECT 'lalu', 2, 'VIP2', 'active', 3000, 604800000, group_id, 0, 20, 0, 0
FROM resource_groups
WHERE app_code = 'lalu' AND group_code = 'vip2_rewards';
INSERT IGNORE INTO vip_levels (
app_code, level, name, status, price_coin, duration_ms, reward_resource_group_id, required_recharge_coin_amount,
sort_order, created_at_ms, updated_at_ms
)
SELECT 'lalu', 3, 'VIP3', 'active', 8000, 604800000, group_id, 0, 30, 0, 0
FROM resource_groups
WHERE app_code = 'lalu' AND group_code = 'vip3_rewards';
INSERT IGNORE INTO vip_levels (
app_code, level, name, status, price_coin, duration_ms, reward_resource_group_id, required_recharge_coin_amount,
sort_order, created_at_ms, updated_at_ms
) VALUES
('lalu', 4, 'VIP4', 'disabled', 0, 604800000, 0, 0, 40, 0, 0),
('lalu', 5, 'VIP5', 'disabled', 0, 604800000, 0, 0, 50, 0, 0),
('lalu', 6, 'VIP6', 'disabled', 0, 604800000, 0, 0, 60, 0, 0),
('lalu', 7, 'VIP7', 'disabled', 0, 604800000, 0, 0, 70, 0, 0),
('lalu', 8, 'VIP8', 'disabled', 0, 604800000, 0, 0, 80, 0, 0),
('lalu', 9, 'VIP9', 'disabled', 0, 604800000, 0, 0, 90, 0, 0),
('lalu', 10, 'VIP10', 'disabled', 0, 604800000, 0, 0, 100, 0, 0);
INSERT IGNORE INTO wallet_diamond_exchange_rules (
app_code, exchange_type, status, from_asset_type, to_asset_type,
from_amount, to_amount, sort_order, created_at_ms, updated_at_ms
) VALUES
('lalu', 'diamond_to_coin', 'active', 'DIAMOND', 'COIN', 100, 100, 10, 0, 0),
('lalu', 'diamond_to_usd_balance', 'active', 'DIAMOND', 'USD_BALANCE', 1000, 100, 20, 0, 0);
INSERT IGNORE INTO gift_type_configs (
app_code, type_code, name, tab_key, status, sort_order,
created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms
) VALUES
('lalu', 'normal', '普通礼物', 'Gift', 'active', 10, 0, 0, 0, 0),
('lalu', 'cp', 'CP礼物', 'CP', 'active', 20, 0, 0, 0, 0),
('lalu', 'lucky', '幸运礼物', 'Lucky', 'active', 30, 0, 0, 0, 0),
('lalu', 'super_lucky', '超级幸运礼物', 'Super Lucky', 'active', 40, 0, 0, 0, 0),
('lalu', 'exclusive', '专属礼物', 'Exclusive', 'active', 50, 0, 0, 0, 0),
('lalu', 'noble', '贵族礼物', 'Noble', 'active', 60, 0, 0, 0, 0),
('lalu', 'flag', '国旗礼物', 'Flag', 'active', 70, 0, 0, 0, 0),
('lalu', 'activity', '活动礼物', 'Activity', 'active', 80, 0, 0, 0, 0),
('lalu', 'magic', '魔法礼物', 'Magic', 'active', 90, 0, 0, 0, 0),
('lalu', 'custom', '定制礼物', 'Custom', 'active', 100, 0, 0, 0, 0);
INSERT IGNORE INTO gift_configs (
app_code, gift_id, resource_id, status, name, sort_order, presentation_json,
gift_type_code, effective_from_ms, effective_to_ms, effect_types_json,
created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms
)
SELECT 'lalu', 'rose', resource_id, 'active', 'Rose', 10, JSON_OBJECT(),
'normal', 0, 0, JSON_ARRAY(),
0, 0, 0, 0
FROM resources
WHERE app_code = 'lalu' AND resource_code = 'gift_rose'
LIMIT 1;
INSERT IGNORE INTO gift_configs (
app_code, gift_id, resource_id, status, name, sort_order, presentation_json,
gift_type_code, effective_from_ms, effective_to_ms, effect_types_json,
created_by_user_id, updated_by_user_id, created_at_ms, updated_at_ms
)
SELECT 'lalu', 'rocket', resource_id, 'active', 'Rocket', 20, JSON_OBJECT(),
'normal', 0, 0, JSON_ARRAY('animation', 'global_broadcast'),
0, 0, 0, 0
FROM resources
WHERE app_code = 'lalu' AND resource_code = 'gift_rocket'
LIMIT 1;
INSERT IGNORE INTO gift_config_regions (
app_code, gift_id, region_id, created_at_ms, updated_at_ms
)
SELECT gc.app_code, gc.gift_id, 0, 0, 0
FROM gift_configs gc
LEFT JOIN gift_config_regions existing
ON existing.app_code = gc.app_code AND existing.gift_id = gc.gift_id
WHERE existing.gift_id IS NULL
AND gc.app_code = 'lalu'
AND gc.gift_id IN ('rose', 'rocket');