# V11 团课预约取消测试数据文档

## 文档说明

本文档描述了用于测试团课预约取消功能的测试数据，包含三种会员卡类型的取消预约场景。

## 测试场景概览

| 序号 | 场景描述 | 用户 | 会员卡类型 |
| :--- | :--- | :--- | :--- |
| 1 | 使用时长卡预约后取消 | 张三 | 时长卡（30天） |
| 2 | 使用次数卡预约后取消 | 李四 | 次数卡（10次） |
| 3 | 使用储值卡预约后取消 | 王五 | 储值卡（500元） |

## 测试用户数据

### 1. 张三（时长卡用户）

| 字段 | 值 |
| :--- | :--- |
| 会员编号 | `MEM_TEST_ZHANG` |
| 昵称 | 张三_时长卡用户 |
| 手机号 | 13800002001 |
| 性别 | 男（1） |

#### 会员卡信息

| 字段 | 值 |
| :--- | :--- |
| 卡类型 | 时长卡（TIME_CARD） |
| 卡名称 | 30天时长卡 |
| 状态 | ACTIVE（有效） |
| 到期时间 | 2026-07-02 23:59:59 |
| 购买时间 | 2026-06-02 10:00:00 |

---

### 2. 李四（次数卡用户）

| 字段 | 值 |
| :--- | :--- |
| 会员编号 | `MEM_TEST_LI` |
| 昵称 | 李四_次数卡用户 |
| 手机号 | 13800002002 |
| 性别 | 男（1） |

#### 会员卡信息

| 字段 | 值 |
| :--- | :--- |
| 卡类型 | 次数卡（COUNT_CARD） |
| 卡名称 | 10次卡 |
| 状态 | ACTIVE（有效） |
| 剩余次数 | 5次 |
| 到期时间 | 2026-12-31 23:59:59 |

---

### 3. 王五（储值卡用户）

| 字段 | 值 |
| :--- | :--- |
| 会员编号 | `MEM_TEST_WANG` |
| 昵称 | 王五_储值卡用户 |
| 手机号 | 13800002003 |
| 性别 | 女（2） |

#### 会员卡信息

| 字段 | 值 |
| :--- | :--- |
| 卡类型 | 储值卡（STORED_VALUE_CARD） |
| 卡名称 | 储值卡500 |
| 状态 | ACTIVE（有效） |
| 剩余金额 | 200.00元 |
| 到期时间 | 2027-06-02 23:59:59 |

---

## 测试课程数据

### 晚间瑜伽_取消测试

| 字段 | 值 |
| :--- | :--- |
| 课程名称 | 晚间瑜伽_取消测试 |
| 教练ID | 101 |
| 课程类型 | 1 |
| 开始时间 | 2026-06-15 19:00:00 |
| 结束时间 | 2026-06-15 20:00:00 |
| 上课地点 | 瑜伽教室 |
| 最大人数 | 20人 |
| 当前人数 | 3人（三位测试用户） |
| 状态 | 0（正常） |
| 次数消耗 | 1次 |
| 储值消耗 | 30.00元 |

---

## 预约记录数据

### 预约状态说明

| 状态码 | 含义 |
| :--- | :--- |
| `0` | 已预约（等待取消） |
| `1` | 已取消 |
| `2` | 已出席 |
| `3` | 缺席 |

### 预约记录详情

| 用户 | 预约时间 | 状态 | 课程名称 |
| :--- | :--- | :--- | :--- |
| 张三 | 2026-06-02 11:00:00 | 0（已预约） | 晚间瑜伽_取消测试 |
| 李四 | 2026-06-02 11:30:00 | 0（已预约） | 晚间瑜伽_取消测试 |
| 王五 | 2026-06-02 12:00:00 | 0（已预约） | 晚间瑜伽_取消测试 |

---

## 测试用例设计

### 场景1：时长卡用户取消预约

**前置条件：**
- 张三持有有效时长卡
- 张三已成功预约课程
- 当前时间 < 课程开始时间

**测试步骤：**
1. 调用取消预约接口，传入张三的预约记录ID
2. 验证预约状态变为 `1`（已取消）
3. 验证课程当前人数减1
4. 验证时长卡状态保持不变（时长卡取消预约不影响卡状态）

**预期结果：**
- 预约记录状态更新为已取消
- 课程剩余名额增加1
- 时长卡有效期不受影响

---

### 场景2：次数卡用户取消预约

**前置条件：**
- 李四持有次数卡，剩余5次
- 李四已成功预约课程（已扣除1次）
- 当前时间 < 课程开始时间

**测试步骤：**
1. 调用取消预约接口，传入李四的预约记录ID
2. 验证预约状态变为 `1`（已取消）
3. 验证课程当前人数减1
4. 验证次数卡剩余次数恢复为5次（返还1次）

**预期结果：**
- 预约记录状态更新为已取消
- 课程剩余名额增加1
- 次数卡返还1次，剩余次数恢复为5次

---

### 场景3：储值卡用户取消预约

**前置条件：**
- 王五持有储值卡，余额200元
- 王五已成功预约课程（已扣除30元）
- 当前时间 < 课程开始时间

**测试步骤：**
1. 调用取消预约接口，传入王五的预约记录ID
2. 验证预约状态变为 `1`（已取消）
3. 验证课程当前人数减1
4. 验证储值卡余额恢复为200元（返还30元）

**预期结果：**
- 预约记录状态更新为已取消
- 课程剩余名额增加1
- 储值卡返还30元，余额恢复为200元

---

## 数据文件位置

```
manage-db/src/main/resources/db/migration/V11__Insert_Cancel_Booking_Test_Data.sql
```

## 数据依赖

| 依赖文件 | 说明 |
| :--- | :--- |
| `V6__Create_GroupCourse_table.sql` | 团课相关表结构 |
| `V8__Create_Member_And_MemberCard.sql` | 会员和会员卡表结构 |
| `V9__Add_GroupCourse_Booking_Snapshot_Fields.sql` | 预约快照字段 |

---

## 注意事项

1. 测试数据中使用的日期均为未来日期，确保测试时课程尚未开始
2. 会员卡状态均为 ACTIVE，确保可以正常预约
3. 取消预约功能应在课程开始前24小时内允许操作（具体时间限制由业务逻辑决定）
4. 取消预约后应记录操作日志和交易流水
