--- name: C端 packages 响应精简 overview: 在 slot_console 的 Free Credits 定格状态接口(`/api/free-credits/status` 与 `claim` 共用 `buildStatus`)中,精简 `packages[]` 每项字段,并将档位 status 4/5 映射为 3,使 C 端仅见 0–3。后台 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`,并注明 C 端 status 取值 0–3。 ### 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`、`0–3` 不变; - 或在 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,除非你希望一并补齐。