Files
xzmaster/docs/SPRINT_01_ISSUES_BOARD.md
2026-03-20 12:50:41 +08:00

436 lines
10 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.
# XueZhanMaster Sprint 1 Issue 看板
本文档把当前最优先的 `Week 1``Week 2` 工作直接拆成真实可执行任务。
当前状态快照日期:`2026-03-20`
Sprint 目标:
- 把动作系统从“只支持定缺和出牌”扩展为“可以承接麻将主干动作”
- 为后续响应优先级裁决建立候选动作模型
- 为 H5 正式对局页拆分准备稳定的数据结构和页面结构
---
## 1. 使用说明
### 1.1 本文档解决什么问题
- 当前这一轮开发先做哪几件事
- 哪些任务已经开始,哪些还没开始
- 每个任务的前后依赖关系是什么
- 每个任务做完之后如何验收
### 1.2 看板状态定义
- `待做`:已进入本次 Sprint但尚未开始
- `进行中`:当前优先推进中的任务
- `已完成`:本次 Sprint 内已完成并可供后续任务依赖
### 1.3 执行顺序建议
1. 先完成后端动作模型扩展
2. 再完成动作校验与事件扩展
3. 再定义响应候选和私有动作消息体
4. 最后输出 H5 页面拆分和动作面板结构
这样安排遵守:
- `KISS`:先稳住后端动作语义,再扩前端页面
- `YAGNI`:本轮不直接冲结算和持久化
- `SOLID`:规则、动作、消息、前端结构按职责拆开推进
- `DRY`:统一动作入口和统一消息模型,不走分叉
---
## 2. 待做
### S1-05 [功能] 扩展私有动作消息体,支持响应候选下发
## 背景
后续 `HU / GANG / PENG / PASS` 不是任何时刻都可点,必须先有“当前玩家可执行哪些动作”的私有候选列表。现在虽有私有动作主题,但消息体还不足以表达响应窗口和候选动作。
## 目标
把私有动作消息体扩展成可支持:
- 当前可行动作列表
- 候选动作来源
- 响应截止上下文
- 与当前回合/弃牌事件的关联关系
## 范围
- 定义候选动作 DTO
- 定义是否为响应窗口动作
- 定义关联事件 ID 或动作上下文
- 补充前端消费字段说明
## 非范围
- 不在本任务里完成最终 UI 交互
- 不在本任务里实现多人竞争裁决
## 依赖
- `S1-01`
- `S1-02`
- `S1-04`
## 产出物
- 后端私有动作消息模型
- 消息发布说明
- 前端订阅字段适配说明
## 验收标准
- 服务端能向指定用户发送结构化候选动作
- 消息能区分“主动出牌动作”和“被动响应动作”
- 前端收到后无需猜测字段语义
## 验证方式
- 后端:`mvn test`
- 前端:`npm run build`
- 手工:模拟一次弃牌后,检查候选动作消息结构是否完整
### S1-06 [研究] 响应优先级裁决规则澄清
## 背景
在真正实现多人响应之前,必须先统一项目内部的动作优先级和冲突处理规则,否则后端、前端、教学系统会各自假设,后续很容易返工。
## 目标
形成一份明确的规则澄清结果,至少回答:
- `HU / GANG / PENG / PASS` 的优先级顺序
- 多人同时可响应时的裁决方式
- 响应窗口何时打开、何时关闭
- AI 与真人竞争时是否采用同一裁决规则
## 范围
- 梳理当前产品约束
- 梳理实现层需要的最小规则集
- 输出推荐裁决策略
## 非范围
- 不在本任务里直接落代码
## 依赖
- `S1-04`
## 产出物
- 规则澄清文档
- 后续开发任务拆分建议
## 验收标准
- 可以直接指导 `S1-07`
- 后续实现不再需要对优先级做二次猜测
## 验证方式
- 文档评审
- 与主计划、阶段看板、周计划保持一致
### S1-08 [H5] 对局页信息架构与页面拆分方案
## 背景
当前 `App.vue` 是原型操作台,已经能跑主流程,但信息和状态都堆在单页里。后续如果不先定义页面结构,动作系统一扩展,前端会迅速失控。
## 目标
输出 H5 正式对局页拆分方案,明确:
- 房间页、对局页、复盘页的职责
- 对局页内的信息分区
- 私有教学面板和动作面板层级
- 公共事件区与私有区边界
## 范围
- 页面职责定义
- 组件拆分建议
- 状态归属建议
- 移动端布局区块说明
## 非范围
- 不在本任务里实现完整 UI
- 不在本任务里处理所有视觉细节
## 依赖
- `S1-05`
## 产出物
- 页面拆分文档
- 信息架构草图说明
- 下一轮前端任务拆分建议
## 验收标准
- 下一轮前端改造可以按本文档直接开始
- 公共区、私有区、动作区职责清楚
## 验证方式
- 文档评审
- 与当前 H5 要求、周计划和阶段看板一致
---
## 3. 进行中
### S1-00 [Epic] 动作系统与 H5 页面拆分准备
## 背景
当前项目已经完成房间流、开局、定缺、出牌、AI 自动推进和实时消息骨架,但动作系统仍停留在最小主干。要继续推进 `PENG / GANG / HU / PASS` 和正式 H5 对局页,必须先完成本轮 Sprint。
## 阶段目标
- 动作系统具备扩展主干
- 私有候选动作模型可表达响应窗口
- H5 下一轮页面拆分有明确执行输入
## 关键交付
- 动作枚举与请求体扩展
- 动作校验与事件扩展
- 私有动作消息体扩展
- 响应裁决规则澄清
- H5 页面拆分方案
## 不做范围
- 不做完整胡牌结算
- 不做数据库持久化
- 不做完整 H5 视觉还原
## 退出标准
- 后端已能承接新增动作类型
- 前端已知道如何接响应候选
- 下一轮 H5 正式页面改造可以直接开始
### S1-04 [功能] 响应候选模型初版
## 背景
要支持 `PENG / GANG / HU / PASS`,系统不能只知道“执行了什么”,还必须知道“现在允许谁做什么”。这个模型是后续优先级裁决、前端动作面板、教学提示的共同基础。
## 目标
定义响应候选模型,能表达:
- 当前响应来源于哪次弃牌或事件
- 哪些玩家可以响应
- 每个玩家可响应哪些动作
- 响应窗口的生命周期
## 范围
- 设计候选动作数据结构
- 设计响应窗口上下文
- 设计与座位、玩家 ID、事件 ID 的关联
## 非范围
- 不在本任务里完成最终竞争裁决实现
## 依赖
- `S1-02`
- `S1-03`
## 产出物
- 后端候选动作模型
- 前后端字段语义说明
## 验收标准
- 候选结构可表达“谁现在能做什么”
- 后续可直接承接 `PASS`
- 前端动作面板无需再自行推导
## 验证方式
- 模型评审
- 后端:`mvn test`
### S1-07 [功能] H5 动作面板字段对齐与占位接入
## 背景
后端一旦开始发送响应候选,前端至少要能消费这些字段并用最小方式展示,否则会形成后端已支持、前端完全不可见的断层。
## 目标
让 H5 原型页先具备读取并展示响应候选字段的占位能力,为后续正式动作面板铺路。
## 范围
- 订阅并解析新的私有动作消息字段
- 在原型页中增加最小占位展示
- 区分“主动动作按钮”和“响应动作按钮”
## 非范围
- 不在本任务里完成正式视觉设计
- 不在本任务里完成多状态动画
## 依赖
- `S1-05`
## 产出物
- 前端字段适配
- H5 原型占位展示
## 验收标准
- 当前原型页能看到候选动作
- 不会影响现有定缺和出牌功能
## 验证方式
- 前端:`npm run build`
- H5 手工:检查候选动作占位区是否出现
---
## 4. 已完成
### S1-BASE-01 [基础] 当前最小链路已打通
## 已完成内容
- 房间创建、加入、准备、开局
- 未满 4 人自动补 AI
- 定缺
- 真人出牌
- AI 自动推进回合
- 统一动作入口初版
- 公共事件与私有消息骨架
- H5 原型操作台
## 对 Sprint 1 的意义
这是本次 Sprint 的基础底座,后续所有任务都建立在这条最小链路上。
### S1-01 [功能] 统一动作入口支持 `PENG / GANG / HU / PASS` 基础请求模型
## 已完成内容
- `GameSessionService.performAction` 不再只在服务层硬编码放行 `SELECT_LACK_SUIT / DISCARD`
- 兼容接口 `lack / discard` 已复用统一动作入口
- `GameActionRequest` 已补轻量上下文字段 `sourceSeatNo`
- `PENG / GANG / HU / PASS` 已可进入统一动作处理链
- 当前未实现动作会由处理器统一返回 `GAME_ACTION_UNSUPPORTED`
- 补充了“新动作走统一入口”和“未知动作被拒绝”的测试
## 验收结果
- 新动作不再被服务层提前拦死
- 现有定缺和出牌链路未回归
- `mvn test` 已通过
### S1-02 [功能] 动作校验器与处理链扩展
## 已完成内容
- `PENG / GANG / HU / PASS` 已有独立处理分支入口
- 新增动作已补统一的阶段校验
- 新增动作已补统一的来源座位校验
- 需要目标牌的动作已补必填参数校验
- 当前可明确区分三类结果:
- 参数非法
- 时机非法
- 进入分支但动作尚未实现
- 已补充对应单元测试
## 验收结果
- 非法时机请求会返回 `GAME_PHASE_INVALID`
- 缺少来源座位或目标牌会返回 `GAME_ACTION_PARAM_INVALID`
- 合法进入分支的新增动作当前返回 `GAME_ACTION_UNSUPPORTED`
- `mvn test` 已通过
### S1-03 [功能] 事件模型扩展,覆盖新增动作语义
## 已完成内容
- `GameEventType` 已补齐:
- `RESPONSE_WINDOW_OPENED`
- `RESPONSE_WINDOW_CLOSED`
- `PENG_DECLARED`
- `GANG_DECLARED`
- `HU_DECLARED`
- `PASS_DECLARED`
- `GameEvent` 已新增统一事件工厂方法,覆盖:
- 开局
- 定缺
- 阶段切换
- 摸牌
- 弃牌
- 切换回合
- 未来响应窗口事件
- 未来响应动作事件
- 现有公共事件已改为复用统一工厂方法,不再在多处手工拼接载荷
- 已补充事件工厂测试,验证新增动作事件载荷格式
## 验收结果
- 事件模型已能表达新增动作语义
- 现有事件载荷格式更加统一
- 后续 `S1-04 / S1-05` 可以直接复用事件约定
- `mvn test` 已通过
---
## 5. 依赖关系图
### 5.1 后端主线
`S1-01 -> S1-02 -> S1-03 -> S1-04 -> S1-05`
### 5.2 规则澄清主线
`S1-04 -> S1-06`
### 5.3 前端准备主线
`S1-05 -> S1-07 -> S1-08`
---
## 6. 推荐领取顺序
如果下一轮马上要开始做代码,建议按下面顺序领取:
1. `S1-01`
2. `S1-02`
3. `S1-03`
4. `S1-04`
5. `S1-05`
6. `S1-07`
7. `S1-06`
8. `S1-08`
原因:
- 先把后端动作主干做稳
- 再让前端能最小消费字段
- 最后输出裁决规则和页面结构文档,指导下一轮实现