# 双色球奖金规则更新说明

## 更新概述
根据新的双色球开奖规则，系统已完成以下更新：

## 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导入逻辑更新
✅ 代码编译通过

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