--- name: 精简 Spin 响应 overview: 调整 `POST /api/lucky-reward/spin` 的 `SpinResultEntity`:去掉 spinId/prizeType/prizeAmountQf/myAmountDisplay,新增 poolItemId;myAmountQf 改为大单位 float(3 位小数向下取整)。 todos: - id: amount-format-3dp content: LuckyRewardAmountService 新增 formatAmountDisplay3 + 单测 status: completed - id: spin-result-entity content: 精简 SpinResultEntity 字段(poolItemId + myAmountQf float) status: completed - id: logic-return content: executeManualSpin 返回新结构 status: completed - id: docs-yapi content: 更新 lucky_reward_api.md §3 与 YApi spin 接口 status: completed isProject: false --- # 手动 Spin 响应精简方案 ## 现状 - 路径:`POST /api/lucky-reward/spin`,**无请求 Body**(JWT 鉴权) - 返回 [`SpinResultEntity`](slot_console/app/entity/luckyReward/SpinResultEntity.php) 由 [`LuckyRewardLogic::executeManualSpin()`](slot_console/app/api/logic/LuckyRewardLogic.php) 组装 - 抽奖结果 [`DrawResultEntity`](slot_console/app/entity/luckyReward/DrawResultEntity.php) 已含 `poolItemId`(与活动详情 `poolItems[].id` 同源,即 `reward_pool_item.id`) ## 目标响应 `data` | 字段 | 类型 | 说明 | |------|------|------| | poolItemId | int | 命中的奖池项 ID(客户端对照 `poolItems` 定位格子/本地图) | | myAmountQf | float | 抽奖后 My Amount,**大单位、3 位小数、向下取整**(字段名沿用,语义变更) | | spinAvailable | int | 剩余 Spin 次数 | | playerStatus | int | 玩家状态 | | isDuplicate | bool | 幂等重复(当前手动 Spin 仍固定 `false`) | **删除:** `spinId`、`prizeType`、`prizeAmountQf`、`myAmountDisplay` 示例: ```json { "poolItemId": 3, "myAmountQf": 9.570, "spinAvailable": 0, "playerStatus": 1, "isDuplicate": false } ``` ## 实现步骤 ### 1. 金额格式化(3 位小数) 在 [`LuckyRewardAmountService`](slot_console/app/service/luckyReward/LuckyRewardAmountService.php) 新增专用方法,例如 `formatAmountDisplay3(int $amountQf): float`: - 规则:`floor($amountQf) / 1000`,再 `number_format(..., 3, '.', '')` 转 float - 与现有 2 位 `formatAmountDisplay()` 并存,避免影响 status/open-box/records 等接口 在 [`LuckyRewardAmountServiceTest`](slot_console/tests/Unit/LuckyRewardAmountServiceTest.php) 补充用例(如 `9570 → 9.570`、`9576 → 9.576`)。 ### 2. 更新 Entity 修改 [`SpinResultEntity`](slot_console/app/entity/luckyReward/SpinResultEntity.php): - 删除:`spinId`、`prizeType`、`prizeAmountQf`、`myAmountDisplay` - 新增:`poolItemId`(int) - 修改:`myAmountQf` 类型 `int → float`,PHPDoc 注明「大单位 3 位小数展示值」 ### 3. 更新 Logic 组装 [`LuckyRewardLogic::executeManualSpin()`](slot_console/app/api/logic/LuckyRewardLogic.php) 返回处改为: ```php return new SpinResultEntity([ 'poolItemId' => $drawResult->poolItemId, 'myAmountQf' => LuckyRewardAmountService::formatAmountDisplay3((int) $activityPlayer->my_amount_qf), 'spinAvailable' => (int) $activityPlayer->spin_available, 'playerStatus' => (int) $activityPlayer->status, 'isDuplicate' => false, ]); ``` - 服务端仍生成 `manualSpinId` 写库/日志,**仅不再返回给客户端** - `prize_type`、`prize_amount_qf` 仍写入 `lucky_reward_spin_record`,Record Tab 不受影响 ### 4. 文档与 YApi - 更新 [`slot_console/doc/lucky_reward_api.md`](slot_console/doc/lucky_reward_api.md) §3 字段表与示例 - 同步 YApi 手动 Spin 接口(project 14,cat_115 内 spin 对应 ID,与 #553–561 同组) ### 5. 自检 - 跑 `verify-slot-backend.sh` + docker `php -l` - 跑 `LuckyRewardAmountServiceTest`、现有 `LuckyRewardDrawServiceTest`(确认 `poolItemId` 链路未断) ## 数据流(变更后) ```mermaid sequenceDiagram participant Client participant SpinAPI as POST_spin participant Logic as LuckyRewardLogic participant Draw as DrawService participant DB as spin_record Client->>SpinAPI: JWT, no body SpinAPI->>Logic: executeManualSpin Logic->>Draw: draw(poolItems) Draw-->>Logic: poolItemId, prizeType Logic->>DB: spin_id, prize_type, prize_amount_qf Logic-->>Client: poolItemId, myAmountQf(3dp), spinAvailable, playerStatus ``` ## 影响范围 - **Breaking change**:依赖旧 Spin 响应字段的前端需改为用 `poolItemId` 对照 `poolItems` 展示命中格;My Amount 读 `myAmountQf`(float 3 位) - **无改动**:请求体仍为空;Controller/Validator 无需改;后台奖池项 CRUD 不变