6.9 KiB
6.9 KiB
双色球奖金规则更新说明
更新概述
根据新的双色球开奖规则,系统已完成以下更新:
1. 数据库变更
新增字段
在 lottery_draws 表中新增字段:
is_special_period(TINYINT): 标识该期是否处于特别规定期间(0-否,1-是)prize_pool(BIGINT): 奖池金额(元),默认值为0
SQL脚本
sql/add_special_rule_status.sql: 添加特别规定期间标识字段sql/add_prize_pool_column.sql: 添加奖池字段
2. 新增工具类
SsqPrizeCalculator.java
位置:src/main/java/com/xy/xyaicpzs/util/SsqPrizeCalculator.java
主要功能:
- 根据新规则计算中奖等级和奖金
- 判断是否应该执行特别规定(福运奖期间)
关键方法:
// 计算中奖结果
public static PrizeResult calculatePrize(
Integer[] predictNumbers, // 预测号码 [红球1-6, 蓝球]
Integer[] drawNumbers, // 开奖号码 [红球1-6, 蓝球]
Long prizePool, // 奖池金额(元)
boolean isSpecialPeriod // 是否处于特别规定期间
)
// 判断是否应该执行特别规定
public static boolean shouldExecuteSpecialRule(
Double currentPrizePool, // 当前期奖池金额(单位:亿元)
boolean previousIsSpecialPeriod // 上一期是否处于特别规定期间
)
3. 新的中奖规则
奖项设置(7个等级)
| 奖项 | 中奖条件 | 奖金 |
|---|---|---|
| 一等奖 | 6红+1蓝 | 500万封顶(浮动) |
| 二等奖 | 6红 | 500万封顶(浮动) |
| 三等奖 | 5红+1蓝 | 3000元(固定) |
| 四等奖 | 5红 或 4红+1蓝 | 200元(固定) |
| 五等奖 | 4红 或 3红+1蓝 | 10元(固定) |
| 六等奖 | 1蓝 | 5元(固定) |
| 福运奖 | 3红(仅特别规定期间) | 5元(固定) |
特别规定(福运奖)执行规则
启动条件:
- 当奖池资金 ≥ 15亿元时开始执行特别规定
停止条件:
- 执行特别规定后,某期开奖后奖池资金 < 3亿元时停止执行
福运奖:
- 仅在特别规定期间有效
- 中奖条件:投注号码与开奖号码中的任意3个红球相同
- 奖金:5元
重要说明:
特别规定状态需要跨期追踪,不能仅根据当期奖池判断。系统会记录每期的 is_special_period 状态,并根据上一期状态和当期奖池金额来判断当期是否执行特别规定。
4. 代码更新
4.1 实体类更新
LotteryDraws.java
- 新增
prizePool字段(Double类型,单位:亿元) - 新增
isSpecialPeriod字段(Integer类型,0或1)
4.2 Mapper XML更新
LotteryDrawsMapper.xml
- 在
Base_Column_List中添加prize_pool和is_special_period字段 - 更新所有相关的 SQL 语句
4.3 服务层更新
DataAnalysisServiceImpl.java
- 使用
SsqPrizeCalculator替代旧的计算逻辑 - 在
processPendingPredictions()方法中:- 获取开奖记录的奖池金额和特别规定状态
- 调用
SsqPrizeCalculator.calculatePrize()计算中奖结果 - 更新预测记录的中奖状态、等级和奖金
- 删除旧的
calculatePredictResult()和calculateBonus()方法
4.4 Excel导入更新
ExcelDataImporter.java
importT10Data()方法:- 读取J列(索引9)的奖池金额
- 根据上一期状态计算当期的特别规定状态
- 设置
isSpecialPeriod字段
appendT10Data()方法:- 同样支持奖池和特别规定状态的计算
- 追加导入时会查询数据库中最新一期的状态
5. 使用说明
5.1 数据库迁移
执行以下SQL脚本:
# 添加特别规定期间标识字段
mysql -u用户名 -p数据库名 < sql/add_special_rule_status.sql
# 修改奖池字段类型(从BIGINT改为DECIMAL,单位从元改为亿元)
mysql -u用户名 -p数据库名 < sql/update_prize_pool_to_decimal.sql
5.2 Excel导入格式
T10工作表(双色球开奖数据)列结构:
- A列:开奖期号
- B列:开奖日期
- C-H列:红球1-6
- I列:蓝球
- J列:奖池金额(单位:亿元,如 12.00、13.33) ← 新增
D1工作表(大乐透开奖数据)列结构:
- A列:开奖期号
- B列:开奖日期
- C-G列:前区球1-5
- H-I列:后区球1-2
- J列:奖池金额(单位:亿元,如 8.50、10.25) ← 新增
重要说明:
- Excel中奖池以亿元为单位(如 12.00 表示12亿元)
- 系统导入时会自动转换为元(12.00亿 → 1200000000元)
- 判断规则时使用元为单位:
- 双色球:15亿 = 1500000000元,3亿 = 300000000元
- 大乐透:8亿 = 800000000元
5.3 API接口
现有接口无需修改,系统会自动:
- 导入数据时计算特别规定状态
- 处理待开奖预测时使用新规则计算奖金
- 返回结果中包含福运奖等级(如果适用)
6. 注意事项
-
奖池金额单位变更:
- Excel中:以"亿元"为单位(如14.01表示14.01亿元)
- 数据库中:以"亿元"为单位存储(DECIMAL(10,2)类型)
- 判断阈值:15亿元启动,3亿元停止
- 重要:如果之前已经导入过数据(以元为单位),需要执行
sql/update_prize_pool_to_decimal.sql来转换数据类型
-
历史数据处理:
- 如果需要重新计算历史预测记录,需要确保
lottery_draws表中的is_special_period字段已正确设置 - 可以通过重新导入Excel数据来自动计算历史期次的特别规定状态
- 如果需要重新计算历史预测记录,需要确保
-
特别规定状态的连续性:
- 系统会自动追踪特别规定状态的变化
- 导入数据时必须按期号顺序导入,以确保状态计算正确
-
数据精度:
- 奖池金额使用 DECIMAL(10,2) 类型,最多支持10位数字,小数点后2位
- 可以精确表示到0.01亿元(即100万元)
7. 测试建议
- 测试特别规定启动:导入奖池≥15亿的数据,验证
is_special_period为1 - 测试特别规定停止:在特别规定期间导入奖池<3亿的数据,验证
is_special_period变为0 - 测试福运奖:在特别规定期间,预测3个红球匹配,验证能获得福运奖(5元)
- 测试非特别规定期间:验证3个红球匹配时不会获得福运奖
8. 文件清单
新增文件
src/main/java/com/xy/xyaicpzs/util/SsqPrizeCalculator.javasql/add_special_rule_status.sqlsql/update_prize_pool_to_decimal.sql双色球奖金规则更新说明.md(本文件)
修改文件
src/main/java/com/xy/xyaicpzs/domain/entity/LotteryDraws.javasrc/main/resources/generator/mapper/LotteryDrawsMapper.xmlsrc/main/java/com/xy/xyaicpzs/service/impl/DataAnalysisServiceImpl.javasrc/main/java/com/xy/xyaicpzs/util/ExcelDataImporter.java
9. 完成状态
✅ 数据库字段添加 ✅ 实体类更新 ✅ Mapper XML更新 ✅ 奖金计算器实现 ✅ 服务层更新 ✅ Excel导入逻辑更新 ✅ 代码编译通过
所有代码已完成并通过编译检查,可以部署使用。