Files
cursor/plans/c端_packages_响应精简_b2ac407a.plan.md
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

123 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: C端 packages 响应精简
overview: 在 slot_console 的 Free Credits 定格状态接口(`/api/free-credits/status``claim` 共用 `buildStatus`)中,精简 `packages[]` 每项字段,并将档位 status 4/5 映射为 3使 C 端仅见 03。后台 innerapi 与库表语义不变。
todos:
- id: model-list-for-client
content: 在 FreeCreditsPackageModel 实现 mapStatusForClient并精简 listForClient 返回字段
status: in_progress
- id: update-phpdoc
content: 更新 FreeCreditsLogic、FreeCreditsController 的 packages/status PHPDoc
status: pending
- id: update-unit-tests
content: 调整 FreeCreditsClientStatusTest / Harness并补充 status 4/5→3 用例
status: pending
- id: run-phpunit
content: 在 php82 容器内跑 FreeCreditsClientStatusTest 验证
status: pending
isProject: false
---
# C 端定格状态 packages 响应调整
## 背景与范围
目标接口在 [slot_console/app/api/controller/FreeCreditsController.php](slot_console/app/api/controller/FreeCreditsController.php)
- `POST /api/free-credits/status``FreeCreditsLogic::status()``buildStatus()`
- `POST /api/free-credits/claim` 成功后的 `data` 结构相同
`packages[]` 当前由 [slot_console/app/model/common/FreeCreditsPackageModel.php](slot_console/app/model/common/FreeCreditsPackageModel.php) 的 `listForClient()` 组装,经 `FreeCreditsLogic::clientPackagesForPlayer()` 注入响应:
```72:86:slot_console/app/model/common/FreeCreditsPackageModel.php
public static function listForClient(int $playerId, callable $formatAmount): array
{
// ...
$packages[] = [
'id' => intval($row->id),
'package_no' => intval($row->package_no),
'package_type' => intval($row->package_type),
'amount' => $formatAmount(intval($row->amount_qf)),
'status' => intval($row->status),
];
```
库表档位 status[install.sql](slot_console/db/install.sql)`0` 锁定、`1` 可操作、`2` 处理中、`3` 已完成、`4` 失败、`5` 风控拒绝。
**不在本次范围**`innerapi/free-credits/*`(后台仍用 `package_no` / `package_type` 聚合)、库表与 Logic 内按 `package_no` / `package_type` 的业务判断。
## 目标契约
`packages[]` 每项仅保留:
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | int | 档位主键claim / 第一档提现仍传 `package_id` |
| `amount` | float | 展示大单位,逻辑不变 |
| `status` | int | **仅可能为 0、1、2、3**DB 为 4 或 5 时对外返回 3 |
列表仍按 `package_no` 升序(查询不变,仅响应不暴露 `package_no`。C 端可用数组下标区分第一档(`[0]`)与后续档。
Status 映射(仅 C 端展示层):
```mermaid
flowchart LR
db0[DB 0 locked] --> c0[C 0]
db1[DB 1 ready] --> c1[C 1]
db2[DB 2 processing] --> c2[C 2]
db3[DB 3 completed] --> c3[C 3]
db4[DB 4 failed] --> c3
db5[DB 5 rejected] --> c3
```
## 实现步骤
### 1. 修改 `FreeCreditsPackageModel::listForClient()`
文件:[FreeCreditsPackageModel.php](slot_console/app/model/common/FreeCreditsPackageModel.php)
- 新增私有/公有静态方法(建议 `mapStatusForClient(int $status): int`),将 `STATUS_FAILED(4)`、`STATUS_REJECTED(5)` 转为 `STATUS_COMPLETED(3)`,其余原样返回。
- `listForClient()` 返回项改为 `{ id, amount, status }``status` 走映射方法。
- 更新 `@return` PHPDoc`list<array{id:int,amount:float,status:int}>`,并注明 C 端 status 取值 03。
### 2. 同步 Logic / Controller 文档
- [FreeCreditsLogic.php](slot_console/app/api/logic/FreeCreditsLogic.php)`clientPackagesForPlayer()` 的 `@return` 与注释。
- [FreeCreditsController.php](slot_console/app/api/controller/FreeCreditsController.php)`status()` / `claim()` 中 `packages` 字段说明——去掉 `package_no`、`package_type``status` 改为 `0 locked ~ 3 completed失败/拒绝对外亦为 3`。
### 3. 单测
- [FreeCreditsClientStatusTest.php](slot_console/tests/Unit/FreeCreditsClientStatusTest.php)`PACKAGE_KEYS` 改为 `['id','amount','status']`;注入样例去掉 `package_no` / `package_type`。
- 新增用例(二选一或都做):
- 对 `mapStatusForClient`:断言 `4→3`、`5→3`、`03` 不变;
- 或在 harness 注入 `status=4/5` 的 package断言 `buildStatus` 输出为 `3`。
- [FreeCreditsLogicHarness.php](slot_console/tests/Support/FreeCreditsLogicHarness.php):更新 `injectClientPackages` 相关 PHPDoc 类型。
运行Docker
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit tests/Unit/FreeCreditsClientStatusTest.php
```
## 数据流(变更后)
```mermaid
sequenceDiagram
participant C as C端
participant API as FreeCreditsController
participant Logic as FreeCreditsLogic
participant Model as FreeCreditsPackageModel
C->>API: status / claim
API->>Logic: buildStatus
Logic->>Model: listForClient
Model->>Model: mapStatusForClient
Model-->>Logic: id, amount, status
Logic-->>C: packages[]
```
## 风险与说明
- **C 端若已依赖 `package_no` / `package_type` 或区分 4/5**:需同步改 UI服务端 claim 仍用 `package_id`,顺序校验仍在 Logic/DB不依赖响应里的 `package_no`。
- **失败/拒绝与成功完成在 UI 上同为 status=3**:符合当前需求;若以后要区分展示,需另加字段或改映射规则。
- 单测 [FreeCreditsClientStatusTest](slot_console/tests/Unit/FreeCreditsClientStatusTest.php) 期望顶层含 `first_cash_amount`,但 [buildStatus](slot_console/app/api/logic/FreeCreditsLogic.php) 当前未返回该字段——与本次改动无关,不纳入本 PR除非你希望一并补齐。