## ADDED Requirements

### Requirement: 订单支付处理

系统 SHALL 根据支付方式正确处理订单支付，包括钱包扣款、在线支付、混合支付等。

**钱包支付流程**：
1. 检查钱包可用余额是否充足
2. 冻结钱包余额（`frozen_balance` 增加）
3. 创建订单，状态为"待支付"
4. 订单完成后，扣减钱包余额（`balance` 减少，`frozen_balance` 减少），创建钱包明细记录
5. 订单取消时，解冻钱包余额（`frozen_balance` 减少）

**在线支付流程**：
1. 创建订单，状态为"待支付"
2. 调用第三方支付接口
3. 用户完成支付后，订单状态变更为"已支付"
4. 订单完成后，订单状态变更为"已完成"

**混合支付流程**：
1. 检查钱包可用余额是否充足（钱包支付部分）
2. 冻结钱包余额
3. 创建订单，状态为"待支付"
4. 调用第三方支付接口（在线支付部分）
5. 用户完成在线支付后，扣减钱包余额，订单状态变更为"已支付"
6. 订单完成后，订单状态变更为"已完成"

#### Scenario: 钱包支付订单完成

- **WHEN** 用户使用钱包支付购买套餐，订单金额为 3000 分
- **THEN** 系统：
  1. 创建订单，状态为"待支付"，冻结钱包余额 3000 分
  2. 订单处理完成后，扣减钱包余额 3000 分，解冻 3000 分，创建钱包明细记录（类型为"扣款"），订单状态变更为"已完成"

#### Scenario: 混合支付订单完成

- **WHEN** 用户使用混合支付购买套餐，钱包支付 2000 分 + 在线支付 3000 分
- **THEN** 系统：
  1. 创建订单，状态为"待支付"，冻结钱包余额 2000 分
  2. 用户完成在线支付 3000 分后，扣减钱包余额 2000 分，解冻 2000 分，创建钱包明细记录，订单状态变更为"已支付"
  3. 订单处理完成后，订单状态变更为"已完成"

#### Scenario: 订单取消，解冻钱包余额

- **WHEN** 用户使用钱包支付创建订单，订单金额为 3000 分，然后取消订单
- **THEN** 系统解冻钱包余额 3000 分（`frozen_balance` 减少 3000），订单状态变更为"已取消"

---

## MODIFIED Requirements

### Requirement: 订单实体定义

系统 SHALL 定义订单(Order)实体，统一管理两种订单类型：套餐订单、号卡订单，并支持混合支付方式（钱包 + 在线支付）。

**修改说明**：
- 增加 `wallet_payment_amount` 字段：钱包支付金额
- 增加 `online_payment_amount` 字段：在线支付金额
- 支持用户在购买套餐时选择支付方式（全部钱包支付、全部在线支付、混合支付）

**实体字段**（只列出新增字段）：
- `wallet_payment_amount`：钱包支付金额（BIGINT，单位：分，默认 0）**【新增】**
- `online_payment_amount`：在线支付金额（BIGINT，单位：分，默认 0）**【新增】**

**支付规则**：
- `wallet_payment_amount` + `online_payment_amount` = `amount`（订单总金额）
- 当 `payment_method` 为 "wallet" 时，`wallet_payment_amount` = `amount`，`online_payment_amount` = 0
- 当 `payment_method` 为 "online" 时，`online_payment_amount` = `amount`，`wallet_payment_amount` = 0
- 混合支付时，`payment_method` 为 "mixed"，两个字段都 > 0

#### Scenario: 全额钱包支付

- **WHEN** 用户购买套餐，订单金额为 30 00 分（30 元），选择钱包支付，钱包余额为 10000 分
- **THEN** 系统创建订单，`amount` 为 3000，`payment_method` 为 "wallet"，`wallet_payment_amount` 为 3000，`online_payment_amount` 为 0

#### Scenario: 全额在线支付

- **WHEN** 用户购买套餐，订单金额为 3000 分（30 元），选择在线支付
- **THEN** 系统创建订单，`amount` 为 3000，`payment_method` 为 "online"，`wallet_payment_amount` 为 0，`online_payment_amount` 为 3000

#### Scenario: 混合支付

- **WHEN** 用户购买套餐，订单金额为 5000 分（50 元），钱包余额为 3000 分，用户选择钱包支付 3000 分 + 在线支付 2000 分
- **THEN** 系统创建订单，`amount` 为 5000，`payment_method` 为 "mixed"，`wallet_payment_amount` 为 3000，`online_payment_amount` 为 2000

#### Scenario: 钱包余额不足，部分钱包支付

- **WHEN** 用户购买套餐，订单金额为 5000 分（50 元），钱包余额为 2000 分，用户选择钱包支付 2000 分 + 在线支付 3000 分
- **THEN** 系统先冻结钱包余额 2000 分，创建订单，`wallet_payment_amount` 为 2000，`online_payment_amount` 为 3000，等待用户完成在线支付

#### Scenario: 钱包余额不足，无法全额钱包支付

- **WHEN** 用户购买套餐，订单金额为 5000 分（50 元），钱包余额为 3000 分，用户选择钱包支付
- **THEN** 系统拒绝创建订单，返回错误信息"钱包余额不足"，建议用户选择混合支付或在线支付

---

### Requirement: 订单数据校验

系统 SHALL 对订单数据进行校验，确保数据完整性和一致性，特别是支付金额的一致性。

**新增校验规则**：
- `wallet_payment_amount`：必填，≥ 0，最多精确到分
- `online_payment_amount`：必填，≥ 0，最多精确到分
- `wallet_payment_amount` + `online_payment_amount` = `amount`（订单总金额）
- 当 `payment_method` 为 "wallet" 时，`wallet_payment_amount` 必须 = `amount`
- 当 `payment_method` 为 "online" 时，`online_payment_amount` 必须 = `amount`
- 当 `payment_method` 为 "mixed" 时，两个字段都必须 > 0

#### Scenario: 支付金额不一致

- **WHEN** 创建订单，`amount` 为 5000，`wallet_payment_amount` 为 2000，`online_payment_amount` 为 2000
- **THEN** 系统拒绝创建，返回错误信息"支付金额总和与订单金额不一致"

#### Scenario: 钱包支付时在线支付金额不为 0

- **WHEN** 创建订单，`payment_method` 为 "wallet"，`wallet_payment_amount` 为 3000，`online_payment_amount` 为 0（正确），但用户错误地设置 `online_payment_amount` 为 100
- **THEN** 系统拒绝创建，返回错误信息"钱包支付时在线支付金额必须为 0"

#### Scenario: 混合支付时钱包支付金额为 0

- **WHEN** 创建订单，`payment_method` 为 "mixed"，`wallet_payment_amount` 为 0，`online_payment_amount` 为 5000
- **THEN** 系统拒绝创建，返回错误信息"混合支付时钱包支付金额和在线支付金额都必须大于 0"
