# 双色球奖金规则更新说明 ## 更新概述 根据新的双色球开奖规则,系统已完成以下更新: ## 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` 主要功能: - 根据新规则计算中奖等级和奖金 - 判断是否应该执行特别规定(福运奖期间) 关键方法: ```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脚本: ```bash # 添加特别规定期间标识字段 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导入逻辑更新 ✅ 代码编译通过 **所有代码已完成并通过编译检查,可以部署使用。**