Files
cpzs-backend/双色球奖金规则更新说明.md
2026-02-14 12:15:01 +08:00

6.9 KiB
Raw Permalink Blame History

双色球奖金规则更新说明

更新概述

根据新的双色球开奖规则,系统已完成以下更新:

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_poolis_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接口

现有接口无需修改,系统会自动:

  1. 导入数据时计算特别规定状态
  2. 处理待开奖预测时使用新规则计算奖金
  3. 返回结果中包含福运奖等级(如果适用)

6. 注意事项

  1. 奖池金额单位变更

    • Excel中以"亿元"为单位如14.01表示14.01亿元)
    • 数据库中:以"亿元"为单位存储DECIMAL(10,2)类型)
    • 判断阈值15亿元启动3亿元停止
    • 重要:如果之前已经导入过数据(以元为单位),需要执行 sql/update_prize_pool_to_decimal.sql 来转换数据类型
  2. 历史数据处理

    • 如果需要重新计算历史预测记录,需要确保 lottery_draws 表中的 is_special_period 字段已正确设置
    • 可以通过重新导入Excel数据来自动计算历史期次的特别规定状态
  3. 特别规定状态的连续性

    • 系统会自动追踪特别规定状态的变化
    • 导入数据时必须按期号顺序导入,以确保状态计算正确
  4. 数据精度

    • 奖池金额使用 DECIMAL(10,2) 类型最多支持10位数字小数点后2位
    • 可以精确表示到0.01亿元即100万元

7. 测试建议

  1. 测试特别规定启动导入奖池≥15亿的数据验证 is_special_period 为1
  2. 测试特别规定停止:在特别规定期间导入奖池<3亿的数据验证 is_special_period 变为0
  3. 测试福运奖在特别规定期间预测3个红球匹配验证能获得福运奖5元
  4. 测试非特别规定期间验证3个红球匹配时不会获得福运奖

8. 文件清单

新增文件

  • src/main/java/com/xy/xyaicpzs/util/SsqPrizeCalculator.java
  • sql/add_special_rule_status.sql
  • sql/update_prize_pool_to_decimal.sql
  • 双色球奖金规则更新说明.md(本文件)

修改文件

  • src/main/java/com/xy/xyaicpzs/domain/entity/LotteryDraws.java
  • src/main/resources/generator/mapper/LotteryDrawsMapper.xml
  • src/main/java/com/xy/xyaicpzs/service/impl/DataAnalysisServiceImpl.java
  • src/main/java/com/xy/xyaicpzs/util/ExcelDataImporter.java

9. 完成状态

数据库字段添加 实体类更新 Mapper XML更新 奖金计算器实现 服务层更新 Excel导入逻辑更新 代码编译通过

所有代码已完成并通过编译检查,可以部署使用。