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

196 lines
6.9 KiB
Markdown
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.

# 双色球奖金规则更新说明
## 更新概述
根据新的双色球开奖规则,系统已完成以下更新:
## 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.0013.33** 新增
D1工作表大乐透开奖数据列结构
- A列开奖期号
- B列开奖日期
- C-G列前区球1-5
- H-I列后区球1-2
- **J列奖池金额单位亿元 8.5010.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导入逻辑更新
代码编译通过
**所有代码已完成并通过编译检查,可以部署使用。**