## 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** 其他操作返回状态冲突错误