Files
cpzs-backend/双色球奖金规则更新说明.md

196 lines
6.9 KiB
Markdown
Raw Normal View 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`
主要功能:
- 根据新规则计算中奖等级和奖金
- 判断是否应该执行特别规定(福运奖期间)
关键方法:
```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导入逻辑更新
✅ 代码编译通过
**所有代码已完成并通过编译检查,可以部署使用。**