Files
cursor/plans/任务进度筛选对接_acbb7213.plan.md
2026-05-21 18:16:26 +08:00

229 lines
7.8 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: 任务进度筛选对接
overview: 新增独立分页接口 `player-task/task-list`(筛选 task_type + status + page/page_size供前端双下拉表格使用保留现有 `player-task/task-progress` 全量快照不变。同步 slot_sdk 与 API 文档。
todos:
- id: wallet-model-paginate
content: WalletFundLotModel 新增 paginatePlayerTaskLots按 lot_type/status 分页)
status: completed
- id: wallet-task-list-api
content: 新增 taskList 全链路Validator/DTO/Logic/Service/Controller
status: completed
- id: sdk-task-list
content: slot_sdk 新增 taskList 请求/响应实体与 WalletService 方法
status: completed
- id: api-doc-list
content: 新增 doc/player-task-list-api.md含前端双下拉 + 分页说明)
status: completed
- id: feature-tests-list
content: Feature 测试筛选、分页、参数校验task-progress 回归不变
status: completed
isProject: false
---
# 玩家任务进度:新增分页列表接口
## 背景与目标
- **现有** [`player-task/task-progress`](doc/player-task-progress-api.md):只读全量快照(`bonus_tasks` + `deposit_tasks` + `summary`**不改契约**,继续给大厅/SDK 轻量查询用。
- **新增** `player-task/task-list`:面向 **前端操作页**(双下拉 + 表格),支持 **类型筛选、状态筛选、分页**
前端操作区:
| 下拉框 | 选项 | 说明 |
|--------|------|------|
| 任务类型 | **Bonus** / **Deposit** | 必填,二选一 |
| 状态 | **全部** + Waiting / Active / PendingConversion / PlayedOut | `status=0` 或不传 = 全部可见态 |
```mermaid
flowchart TB
subgraph keep [保持不变]
TP["POST task-progress"]
TP --> Full["bonus_tasks + deposit_tasks 全量"]
end
subgraph newApi [新增]
TL["POST task-list"]
TL --> Filter["task_type + status"]
TL --> Page["page + page_size"]
Page --> List["list + 分页元数据"]
end
UI[前端表格页] --> TL
Lobby[大厅轻量展示] --> TP
```
---
## 1. 新接口契约
### 1.1 路由
| 项 | 值 |
|----|-----|
| Method | `POST` |
| Path | `player-task/task-list` |
| Controller | [`PlayerTaskController::taskList`](app/api/controller/PlayerTaskController.php)(新增方法) |
### 1.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `uid` | int | 是 | 用户 ID |
| `currency` | string | 是 | 币种,如 `TGO` |
| `task_type` | string | **是** | `bonus` \| `deposit` |
| `status` | int | 否 | `0` 或省略 = 全部玩家可见态;`1`/`2`/`3`/`5` = 单态 |
| `page` | int | 否 | 页码,默认 `1`,最小 `1` |
| `page_size` | int | 否 | 每页条数,默认 `20`,建议上限 `100` |
校验([`PlayerTaskValidator`](app/validator/PlayerTaskValidator.php) 新 scene `list`
- `uid``require|integer`
- `currency``require`
- `task_type``require|in:bonus,deposit`
- `status``integer|in:0,1,2,3,5`(可空,默认 0
- `page``integer|egt:1`(可空)
- `page_size``integer|between:1,100`(可空)
**前端映射**
| UI | 请求 |
|----|------|
| Bonus | `"task_type": "bonus"` |
| Deposit | `"task_type": "deposit"` |
| 全部 | 不传 `status``"status": 0` |
| Waiting / Active / … | `status` = `1` / `2` / `3` / `5` |
| 翻页 | 修改 `page`(切换筛选时重置 `page=1` |
### 1.3 成功响应 `data`
与仓库 [`SearchShardService`](app/service/search/shard/SearchShardService.php) 分页习惯对齐(`data``list`
```json
{
"task_type": "bonus",
"list": [ /* PlayerTaskItem task-progress 任务项字段相同 */ ],
"total": 15,
"page": 1,
"page_size": 20,
"last_page": 1
}
```
- `list[]` 元素结构 **复用** [`PlayerTaskItemEntity::toApiArray()`](app/entity/wallet/PlayerTaskItemEntity.php)(与 `task-progress` 单条一致)。
- 排序:`consume_priority_at ASC`, `lot_id ASC`(与现 [`listPlayerTaskLots`](app/model/multi/WalletFundLotModel.php) 一致)。
- 状态范围:默认仍为 PRD §26.1 四态 `[1,2,3,5]`**不含** Completed/Cancelled/Reversed`task-progress` 一致)。
### 1.4 与 `task-progress` 的分工
| 接口 | 场景 | 返回 |
|------|------|------|
| `task-progress` | 一次拿全量两类任务 + 计数汇总 | `summary` + `bonus_tasks` + `deposit_tasks` |
| `task-list` | 表格页:选定类型 + 状态 + 翻页 | 单维 `list` + 分页字段 |
---
## 2. wallet 实现要点
### 2.1 Model
在 [`WalletFundLotModel`](app/model/multi/WalletFundLotModel.php) 新增:
```php
/**
* 分页查询玩家任务 Lot。
* @return array{list: array, total: int, page: int, page_size: int, last_page: int}
*/
public function paginatePlayerTaskLots(
string $currency,
int $lotType,
array $statuses,
int $page,
int $pageSize
): array
```
- `statuses` 为空时直接返回空分页(与 `listPlayerTaskLots` 一致)。
- 使用 ThinkORM `paginate($pageSize, false, ['page' => $page])`,再将 `data` 重命名为 `list`
### 2.2 Service
在 [`PlayerTaskQueryService`](app/service/wallet/PlayerTaskQueryService.php) 新增 `queryTaskList(...)`
- `task_type` 字符串 → `LOT_TYPE_BONUS` / `LOT_TYPE_DEPOSIT`
- `status``PLAYER_VISIBLE_STATUSES` 或单元素数组
- 调用 Model 分页后,`buildTaskItems()` 组装 `list`
### 2.3 分层文件(新增/扩展)
| 层级 | 文件 |
|------|------|
| DTO | `app/api/dto/request/PlayerTaskListRequestDTO.php`(新建) |
| Validator | `PlayerTaskValidator` 增加 `SCENE_LIST` |
| Logic | `PlayerTaskLogic::taskList()` |
| Controller | `PlayerTaskController::taskList()` |
**不修改** `PlayerTaskProgressRequestDTO` / `taskProgress` 逻辑。
---
## 3. slot_sdk
新增(与 wallet 字段 snake_case 一致):
| 类型 | 文件 |
|------|------|
| 请求 | `PlayerTaskListRequestEntity.php` |
| 响应 | `PlayerTaskListResponseEntity.php`(含 `list``total``page``page_size``last_page``task_type` |
[`WalletService`](slot_sdk/src/service/wallet/WalletService.php) 新增:
```php
public function taskList(PlayerTaskListRequestEntity $entity): ?PlayerTaskListResponseEntity
// POST api/player-task/task-list
```
`taskProgress` / `PlayerTaskProgressRequestEntity` **保持不变**
发布slot_sdk commit → push → slot-wallet `composer update`
---
## 4. 文档
- **新建** [`doc/player-task-list-api.md`](doc/player-task-list-api.md):路由、入参、响应、前端双下拉 + 翻页交互、与 `task-progress` 对比、curl 示例。
- [`doc/player-task-progress-api.md`](doc/player-task-progress-api.md) 顶部增加「列表分页请用 task-list」交叉引用。
- [`doc/wallet.md`](doc/wallet.md) §26.1 补充 `task-list` 一行说明。
---
## 5. 测试
新建 `tests/Feature/PlayerTaskListTest.php`(造数参考 [`WalletRegisterBetWinTest`](tests/Feature/WalletRegisterBetWinTest.php)
| 用例 | 断言 |
|------|------|
| `task_type=bonus` + 默认分页 | `list` 非空项字段完整;`total >= len(list)` |
| `status=2` | `list``status` 均为 2 |
| `page=2` + `page_size=1` | 第二页与总数一致 |
| 缺 `task_type` | `40003` |
| `page_size=101` | `40003` |
| `task-progress` 仍返回双数组 | 回归,不受新接口影响 |
容器内执行:`docker compose exec -T php82` + 项目 PHPUnit 命令。
---
## 6. 不在本次范围
- 修改 `task-progress` 入参或响应
- 任务类型「全部」合并在一个列表
- 运营后台终态Completed 等)纳入筛选
- 前端页面实现(本仓库无前端)
---
## 7. 关键文件一览
| 仓库 | 变更 |
|------|------|
| slot-wallet | `PlayerTaskController``PlayerTaskLogic``PlayerTaskQueryService``WalletFundLotModel``PlayerTaskValidator`、新 DTO、`doc/player-task-list-api.md`、Feature 测试 |
| slot_sdk | 新 Entity ×2、`WalletService::taskList``readme.md` |