## ADDED Requirements

### Requirement: 提现申请列表查询
系统 SHALL 提供提现申请列表查询接口，用于审批管理。

**接口**：`GET /api/admin/commission/withdrawal-requests`

**请求参数**：
- `page`、`page_size`：分页
- `status`：状态筛选（1=待审批, 2=已通过, 3=已拒绝）
- `withdrawal_no`：提现单号（精确查询）
- `shop_name`：店铺名称（模糊查询）
- `start_time`、`end_time`：申请时间范围

**响应字段**：
- 提现申请详情（id, withdrawal_no, amount, fee_rate, fee, actual_amount）
- 店铺信息（shop_id, shop_name, shop_hierarchy）
- 申请人信息（applicant_id, applicant_name）
- 状态信息（status, status_name）
- 收款信息（withdrawal_method, account_name, account_number）
- 处理信息（processor_id, processor_name, processed_at, remark）

#### Scenario: 查询待审批的提现申请
- **WHEN** 请求 `status=1` 的提现申请
- **THEN** 返回所有待审批的申请
- **AND** 按申请时间倒序排列

#### Scenario: 平台用户查看所有申请
- **WHEN** 平台用户请求提现申请列表
- **THEN** 返回所有店铺的提现申请

#### Scenario: 代理商用户查看下级申请
- **WHEN** 代理商用户请求提现申请列表
- **THEN** 只返回自己店铺及下级店铺的申请

---

### Requirement: 审批通过提现申请
系统 SHALL 提供审批通过提现申请的接口。

**接口**：`POST /api/admin/commission/withdrawal-requests/:id/approve`

**请求参数**：
- `id`：提现申请ID（路径参数）
- `payment_type`：放款类型（必填，目前只支持 manual）
- `amount`：修正后的提现金额（可选）
- `withdrawal_method`：修正后的收款类型（可选）
- `account_name`：修正后的收款人姓名（可选）
- `account_number`：修正后的收款账号（可选）
- `remark`：备注（可选）

**响应字段**：
- `id`、`withdrawal_no`、`status`、`status_name`、`processed_at`

#### Scenario: 审批通过待审批的申请
- **WHEN** 管理员审批通过一个待审批的提现申请
- **THEN** 申请状态变为已通过（status=2）
- **AND** 记录处理人ID和处理时间
- **AND** 从店铺佣金钱包扣除提现金额（从冻结余额扣除）
- **AND** 创建钱包交易流水记录

#### Scenario: 修正提现金额后审批
- **WHEN** 管理员修正提现金额后审批通过
- **THEN** 重新计算手续费和实际到账金额
- **AND** 按修正后的金额扣款
- **AND** 如果修正金额小于原金额，退回差额到可用余额

#### Scenario: 审批非待审批状态的申请
- **WHEN** 尝试审批非待审批状态的申请
- **THEN** 返回错误：申请状态不允许此操作

#### Scenario: 钱包余额不足
- **WHEN** 店铺佣金钱包冻结余额不足
- **THEN** 返回错误：钱包余额不足

---

### Requirement: 拒绝提现申请
系统 SHALL 提供拒绝提现申请的接口。

**接口**：`POST /api/admin/commission/withdrawal-requests/:id/reject`

**请求参数**：
- `id`：提现申请ID（路径参数）
- `remark`：拒绝原因（必填）

**响应字段**：
- `id`、`withdrawal_no`、`status`、`status_name`、`processed_at`

#### Scenario: 拒绝待审批的申请
- **WHEN** 管理员拒绝一个待审批的提现申请
- **THEN** 申请状态变为已拒绝（status=3）
- **AND** 记录处理人ID、处理时间和拒绝原因
- **AND** 解冻店铺佣金钱包中的冻结金额
- **AND** 创建钱包交易流水记录（解冻类型）

#### Scenario: 拒绝时必须填写原因
- **WHEN** 拒绝申请时未填写 remark
- **THEN** 返回错误：拒绝原因不能为空

#### Scenario: 拒绝非待审批状态的申请
- **WHEN** 尝试拒绝非待审批状态的申请
- **THEN** 返回错误：申请状态不允许此操作

---

### Requirement: 审批事务一致性
系统 SHALL 确保审批操作的事务一致性。

#### Scenario: 审批通过事务
- **WHEN** 审批通过提现申请
- **THEN** 状态更新、钱包扣款、流水记录在同一事务中完成
- **AND** 任一步骤失败则全部回滚

#### Scenario: 拒绝事务
- **WHEN** 拒绝提现申请
- **THEN** 状态更新、解冻余额、流水记录在同一事务中完成
- **AND** 任一步骤失败则全部回滚

#### Scenario: 并发审批防护
- **WHEN** 多个管理员同时审批同一申请
- **THEN** 只有一个操作成功
- **AND** 其他操作返回状态冲突错误
