update: 提交所有修改和新增功能代码
This commit is contained in:
195
双色球奖金规则更新说明.md
Normal file
195
双色球奖金规则更新说明.md
Normal file
@@ -0,0 +1,195 @@
|
||||
# 双色球奖金规则更新说明
|
||||
|
||||
## 更新概述
|
||||
根据新的双色球开奖规则,系统已完成以下更新:
|
||||
|
||||
## 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导入逻辑更新
|
||||
✅ 代码编译通过
|
||||
|
||||
**所有代码已完成并通过编译检查,可以部署使用。**
|
||||
Reference in New Issue
Block a user