Files
cursor/plans/精简_spin_响应_210342c6.plan.md
ray zhou 2dd9f17da9 ok
2026-06-29 14:51:55 +08:00

120 lines
4.6 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: 精简 Spin 响应
overview: 调整 `POST /api/lucky-reward/spin``SpinResultEntity`:去掉 spinId/prizeType/prizeAmountQf/myAmountDisplay新增 poolItemIdmyAmountQf 改为大单位 float3 位小数向下取整)。
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 14cat_115 内 spin 对应 ID#553561 同组)
### 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 不变