Files
henan-backend/olympus-py/schema.sql
T
2026-09-21 19:21:35 +08:00

241 lines
15 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.
-- ============================================================
-- Olympus 电子游戏模块 全量建表 DDL
-- 表前缀: game_olympus_ 游戏类型: OLYMPUS
-- 设计对齐 sweet 体系,差异点:
-- 1. 饰品桶最高 1000x(单局封顶 1000 倍基础下注)
-- 2. step 表自带 accumulator_before/after(跨回合炸弹累计)与 win_capped
-- 3. record 表自带结算/补发字段(settled 等),无需后期 ALTER
-- 4. 模式仅三种: normal / ante / buy_fs(互斥,无 super 模式)
-- ============================================================
-- 1. 箱子配置(模式 × 下注档位)
CREATE TABLE IF NOT EXISTS game_olympus_box (
box_id BIGINT NOT NULL COMMENT 'PK',
game_type VARCHAR(16) NOT NULL DEFAULT 'OLYMPUS',
box_type VARCHAR(32) NOT NULL COMMENT 'normal|ante|buy_fs',
bet DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '基础下注',
name VARCHAR(50) DEFAULT NULL,
price DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '实际扣费 = bet × CM (normal=1/ante=2/buy_fs=20)',
total_ornaments INT NOT NULL DEFAULT '0' COMMENT '总回合数',
rtp DECIMAL(5,4) NOT NULL DEFAULT '0.8000' COMMENT '目标返奖率',
rtp_converge_ratio DECIMAL(4,3) NULL COMMENT '一轮收敛回合占比,空=默认0.15',
sort INT DEFAULT '0',
status VARCHAR(1) DEFAULT '1' COMMENT '1启用 0禁用',
del_flag VARCHAR(1) DEFAULT '0',
remark VARCHAR(200) DEFAULT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (box_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus箱子配置';
-- 2. 饰品桶定义(0x ~ 1000x,共17档)
CREATE TABLE IF NOT EXISTS game_olympus_ornament (
id BIGINT NOT NULL COMMENT 'PK 1-17',
game_type VARCHAR(16) NOT NULL DEFAULT 'OLYMPUS',
expect_mul DECIMAL(8,2) NOT NULL COMMENT '期望倍率(最高1000)',
name VARCHAR(50) DEFAULT NULL,
range_low DECIMAL(8,2) DEFAULT NULL COMMENT '落桶区间下限(含)',
range_high DECIMAL(8,2) DEFAULT NULL COMMENT '落桶区间上限(含)',
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus饰品桶定义';
-- 3. 箱子-饰品桶分布(库存配额,剩余 = count - used)
-- audience 多身份爆率:每种身份(common/anchor/robot)一套独立分布,回合库存池共享
CREATE TABLE IF NOT EXISTS game_olympus_box_ornament (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
box_id BIGINT NOT NULL,
ornament_id INT NOT NULL,
audience VARCHAR(16) NOT NULL DEFAULT 'common' COMMENT '身份维度 common普通/anchor主播/robot机器人',
count INT NOT NULL DEFAULT '0' COMMENT '分配回合数',
used INT NOT NULL DEFAULT '0' COMMENT '已消耗回合数,剩余=count-used',
PRIMARY KEY (id),
UNIQUE KEY uk_box_ornament_aud (box_id, ornament_id, audience)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus箱子饰品分布(多身份)';
-- 4. 预生成回合
CREATE TABLE IF NOT EXISTS game_olympus_round (
round_id BIGINT NOT NULL COMMENT 'PK',
box_id BIGINT NOT NULL,
ornament_id INT NOT NULL COMMENT '落入的饰品桶 1-17',
actual_mul DECIMAL(10,4) NOT NULL DEFAULT '0.0000' COMMENT '实际总倍率(≤1000)',
free_spin_count INT NOT NULL DEFAULT '0' COMMENT '免费旋转总次数(15+重触发×5)',
total_cascades INT NOT NULL DEFAULT '0' COMMENT '总步数',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (round_id),
INDEX idx_box_ornament (box_id, ornament_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus预生成回合';
-- 5. 回合步骤(级联/翻滚明细)
CREATE TABLE IF NOT EXISTS game_olympus_step (
id BIGINT NOT NULL COMMENT 'PK',
round_id BIGINT NOT NULL,
free_spin_id INT NOT NULL DEFAULT '0' COMMENT '0=基础旋转, >0=第N次免费旋转',
cascade_seq INT NOT NULL DEFAULT '0' COMMENT '本旋转内第几次翻滚',
grid_state JSON DEFAULT NULL COMMENT '6×5网格最终状态',
multiplier_detail JSON DEFAULT NULL COMMENT '炸弹符号 [{"pos":int,"val":int},...]',
symbol_links JSON DEFAULT NULL COMMENT '中奖明细 [{"symbol","count","loc",...}]',
accumulated_symbols JSON DEFAULT NULL COMMENT '本旋转累计消除符号 {"CROWN":9,...}',
spin_winners JSON DEFAULT NULL COMMENT '获胜者面板:本旋逐波追加 [{"symbol","count","win"},...] 新旋清空',
removed_positions JSON DEFAULT NULL COMMENT '消除位置 [pos,...]',
drop_data JSON DEFAULT NULL COMMENT '下落数据 [{"from":int,"to":int,"symbol":"A"},...]',
fill_data JSON DEFAULT NULL COMMENT '填充数据 [{"pos":int,"symbol":"A"},...]',
scatter_trigger JSON DEFAULT NULL COMMENT '基础盘触发免费旋转 {scatterCount,freeSpins(15),scatterWin}',
retrigger_info JSON DEFAULT NULL COMMENT '免费旋转重触发 {scatterCount,extraSpins(5),scatterWin}',
base_score DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '本步基础分(未乘炸弹)',
win_amount DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '本步赢额(回合末帧含炸弹结算)',
accumulator_before DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '本步前累计炸弹倍数',
accumulator_after DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '本步后累计炸弹倍数(跨回合传递)',
spin_win DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '整局累计赢额',
win_capped TINYINT NOT NULL DEFAULT '0' COMMENT '本步赢额被1000x封顶截断 0否1是',
bigwin_level VARCHAR(16) DEFAULT NULL COMMENT '爆奖档位(小/中/大,只在免费旋转里判档,按单旋赢额盖在该旋末帧,同档可多次): small/middle/big',
is_final TINYINT DEFAULT '0' COMMENT '本旋转末帧',
PRIMARY KEY (id),
INDEX idx_round (round_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus回合步骤';
-- 6. 游戏记录(含结算/补发字段,建表即带全)
CREATE TABLE IF NOT EXISTS game_olympus_record (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
user_id BIGINT NOT NULL,
box_id BIGINT NOT NULL,
round_id BIGINT NOT NULL,
cost DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '扣费 = bet × CM',
total_win DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '总赢额(结算时填,≤bet×1000)',
settled TINYINT NOT NULL DEFAULT '0' COMMENT '是否已结算 0未1已(幂等守卫)',
mode_type VARCHAR(20) DEFAULT NULL COMMENT '游戏模式 normal/ante/buy_fs',
auto_dismantle TINYINT DEFAULT 0 COMMENT '开局自动分解快照 0关1开',
reward_type VARCHAR(10) DEFAULT NULL COMMENT '发放类型 gold/ornament',
settled_win DECIMAL(10,2) DEFAULT 0.00 COMMENT '本局价值(金币金额=饰品价格)',
prize_id BIGINT DEFAULT NULL COMMENT '饰品ID game_olympus_prize_ornament.id',
prize_name VARCHAR(100) DEFAULT NULL COMMENT '饰品名称',
prize_image_url VARCHAR(500) DEFAULT NULL COMMENT '饰品图片URL',
prize_level_img VARCHAR(500) DEFAULT NULL COMMENT '品质图片URL',
settle_source VARCHAR(20) DEFAULT NULL COMMENT '结算来源 start=开局已结算(动画还在播) / finish=末帧播完(已结束,进战绩列表)',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
INDEX idx_user_time (user_id, create_time),
INDEX idx_box_time (box_id, create_time),
INDEX idx_settled_time (settled, create_time)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='Olympus游戏记录';
-- 7. 用户统计
CREATE TABLE IF NOT EXISTS game_olympus_user (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
user_id BIGINT NOT NULL,
total_spins BIGINT NOT NULL DEFAULT '0',
total_cost DECIMAL(12,2) NOT NULL DEFAULT '0.00',
total_win DECIMAL(12,2) NOT NULL DEFAULT '0.00',
total_free_spins INT NOT NULL DEFAULT '0',
max_win_mul DECIMAL(10,4) NOT NULL DEFAULT '0.0000' COMMENT '历史最高倍率(≤1000)',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_user (user_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='Olympus用户统计';
-- 8. 每日盈亏
CREATE TABLE IF NOT EXISTS game_olympus_win (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
date DATE NOT NULL,
total_spins BIGINT NOT NULL DEFAULT '0',
total_cost DECIMAL(14,2) NOT NULL DEFAULT '0.00',
total_win DECIMAL(14,2) NOT NULL DEFAULT '0.00',
net_profit DECIMAL(14,2) NOT NULL DEFAULT '0.00',
player_count INT NOT NULL DEFAULT '0',
PRIMARY KEY (id),
UNIQUE KEY uk_date (date)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='Olympus每日盈亏';
-- 9. 返奖饰品定义(展示用饰品,按赢额区间匹配)
CREATE TABLE IF NOT EXISTS game_olympus_prize_ornament (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
game_type VARCHAR(16) NOT NULL DEFAULT 'OLYMPUS',
name VARCHAR(100) DEFAULT NULL COMMENT '饰品名称',
image_url VARCHAR(500) DEFAULT NULL COMMENT '饰品图片URL',
grade INT DEFAULT NULL COMMENT '品质等级 1-5',
exterior_name VARCHAR(100) DEFAULT NULL COMMENT '品质名称 崭新出厂/略有磨损/久经沙场/破损不堪/战痕累累',
sort INT DEFAULT '0',
status VARCHAR(1) DEFAULT '1',
is_fallback TINYINT DEFAULT '0' COMMENT '兜底饰品 1是(仅展示不覆盖金额) 0否',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='Olympus返奖饰品';
-- 10. 返奖饰品区间(与 prize_ornament 一一对应,区间连续覆盖)
CREATE TABLE IF NOT EXISTS game_olympus_prize_range (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
prize_id BIGINT NOT NULL COMMENT 'game_olympus_prize_ornament.id',
win_low DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '返奖区间下限(含)',
win_high DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '返奖区间上限(含)',
PRIMARY KEY (id),
UNIQUE KEY uk_prize (prize_id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='Olympus返奖区间';
-- 11. 箱子饰品分布模板(抽干补桶依据,按身份区分)
CREATE TABLE IF NOT EXISTS game_olympus_box_template (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
box_id BIGINT NOT NULL COMMENT '所属箱子ID',
audience VARCHAR(16) NOT NULL DEFAULT 'common' COMMENT '身份维度 common/anchor/robot',
name VARCHAR(100) NOT NULL COMMENT '模板名称(同一箱子+身份内唯一)',
total_rounds INT NOT NULL DEFAULT 0 COMMENT '总回合数 = items 各 count 之和',
items_json TEXT NOT NULL COMMENT '饰品分布JSON: [{"ornamentId":1,"count":100},...]',
is_active TINYINT NOT NULL DEFAULT 0 COMMENT '是否生效模板(抽干补桶依据) 1是 0否',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uk_box_aud_name (box_id, audience, name),
KEY idx_box_aud_active (box_id, audience, is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus箱子饰品分布模板(多身份)';
-- 12. 奖池水位调整日志(注水/抽水/重置审计)
CREATE TABLE IF NOT EXISTS game_olympus_reward_log (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'PK',
box_id BIGINT DEFAULT NULL COMMENT '箱子ID(批量/重置为汇总,可空)',
box_name VARCHAR(100) DEFAULT NULL COMMENT '箱子名/汇总描述',
audience VARCHAR(16) NOT NULL DEFAULT 'common' COMMENT '身份 common/anchor/robot/white',
type TINYINT NOT NULL COMMENT '1注水 2抽水 3重置',
amount DECIMAL(14,2) NOT NULL DEFAULT '0.00' COMMENT '调整金额(绝对值)',
balance_before DECIMAL(14,2) DEFAULT NULL COMMENT '调整前水位',
balance_after DECIMAL(14,2) DEFAULT NULL COMMENT '调整后水位',
pool_balance DECIMAL(14,2) DEFAULT NULL COMMENT '操作后总池余额',
operator VARCHAR(64) DEFAULT NULL COMMENT '操作人',
remark VARCHAR(200) DEFAULT NULL COMMENT '备注',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY idx_create (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Olympus奖池水位调整日志';
-- ============================================================
-- 种子数据:饰品桶 1-17(0x ~ 1000x)
-- ============================================================
INSERT INTO game_olympus_ornament (id, game_type, expect_mul, name, range_low, range_high) VALUES
(1, 'OLYMPUS', 0.00, '0x', 0.00, 0.00),
(2, 'OLYMPUS', 0.50, '0.5x', 0.01, 1.00),
(3, 'OLYMPUS', 1.50, '1.5x', 1.00, 2.00),
(4, 'OLYMPUS', 2.50, '2.5x', 2.00, 3.00),
(5, 'OLYMPUS', 4.00, '4x', 3.00, 5.00),
(6, 'OLYMPUS', 6.50, '6.5x', 5.00, 8.00),
(7, 'OLYMPUS', 10.00, '10x', 8.00, 12.00),
(8, 'OLYMPUS', 16.00, '16x', 12.00, 20.00),
(9, 'OLYMPUS', 25.00, '25x', 20.00, 30.00),
(10, 'OLYMPUS', 40.00, '40x', 30.00, 50.00),
(11, 'OLYMPUS', 60.00, '60x', 50.00, 70.00),
(12, 'OLYMPUS', 100.00, '100x', 70.00, 130.00),
(13, 'OLYMPUS', 150.00, '150x', 130.00, 170.00),
(14, 'OLYMPUS', 200.00, '200x', 170.00, 230.00),
(15, 'OLYMPUS', 300.00, '300x', 230.00, 370.00),
(16, 'OLYMPUS', 500.00, '500x', 370.00, 630.00),
(17, 'OLYMPUS', 1000.00, '1000x', 630.00, 1370.00)
ON DUPLICATE KEY UPDATE expect_mul=VALUES(expect_mul), name=VALUES(name),
range_low=VALUES(range_low), range_high=VALUES(range_high);
-- ============================================================
-- 附:Java 服务上线时执行(先不执行,接入后台时再放开)
-- ============================================================
-- 维护开关
-- INSERT INTO sys_config (config_name, config_key, config_value, config_type, create_by, create_time, remark)
-- VALUES ('Olympus维护', 'olympusMaintenance', '0', 'Y', 'admin', NOW(), 'Olympus维护开关 0正常 1维护');
-- 未结算兜底补发定时任务(系统监控>定时任务)
-- INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark)
-- VALUES ('Olympus未结算补发', 'OLYMPUS', 'olympusSettleTask.scheduledSettle()', '0 */10 * * * ?', '1', '0', '0', 'admin', NOW(), '每10分钟扫描超35分钟未结算记录并补发金币/饰品');