# Plan — VR 演唱会票务小程序 Round 3 执行 > 版本:v3.0 | 日期:2026-05-26 | Agent:council/BackendArchitect > 任务:Round 3 评估更新 — 现场代码核查,修正 P0 优先级,投票 A --- ## 评估范围 - Phase 4 Tree API 设计文档完整性 + 可行性 - SeatMapService + `/seatmap` API 完整性 - seatSpecMap 注入商品详情 API 的实现方案(Round 3 修正) - CartSave extension_data 多座位存储链路(Round 3 修正) - 后端下一步优先级建议 --- ## 现状快照(Round 3 现场核查) ### Phase 4 Tree API - 设计文档:✅ `docs/PHASE_4_API.md` + `PLAN_TREE_API_IMPLEMENTATION.md`(父仓库 commit `40a9b0ad1`) - `SeatSkuService.php`(实际名):✅ 存在,含 `GetGoodsViewData()` + `buildSeatSpecMap()` - `SeatMapService.php`(设计名):❌ 不存在(命名混淆) - `api/` 目录(Worktree):❌ 未纳入 Git 追踪(父仓库有 `Goods.php`) - 状态:**设计完整,代码仅部分复用逻辑,命名混淆 + api 目录未追踪** ### SeatMapService + seatmap API(Round 3 修正) - `index/Index.php::soldSeats` — ✅ 存在,路由正常 - `SeatSkuService::getSoldSeats()` — ❌ **方法完全缺失(致命)** - **关键修正**:`Index.php:43` 调用不存在的方法,**所有直接调用 soldSeats API 的客户端都会触发 PHP Fatal Error** - H5 绕过正确(不走 API),但 UniApp/第三方 调用会崩溃 - `api/Goods.php::seatmap()`(父仓库):⚠️ 引用不存在的 `SeatMapService::GetSeatMap()` - 命名混淆:设计文档说 `SeatMapService`,实际类名是 `SeatSkuService` ### seatSpecMap 注入商品详情(Round 3 一致) - Goods.php 硬编码调用 — ✅ **H5 已工作**(直接调用 `GetGoodsViewData()`) - Hook `plugins_service_goods_data` — ❌ **未在 Hook.php 中注册** - UniApp 调用 `api/goods/detail` API — ❌ **Gap 1 仍成立** - 结论:Gap 1 **致命且成立** ### CartSave extension_data(Round 3 修正) - H5 链路 `ticket_detail.html:762` — ✅ 已实现(`extension_data` 嵌套在 `order_base`) - `TicketService::onOrderPaid()` — ✅ 逐行生成票(多座位已支持) - 结论:**Gap 2 已消除**,UniApp 只需复刻 H5 的 JSON 格式,后端无需额外改动 --- ## BackendArchitect 评估任务 | Task | 内容 | 状态 | |------|------|------| | B1 | Phase 4 Tree API 设计文档评估 | [Done: council/BackendArchitect] | | B2 | SeatMapService + seatmap API 完整性检查 | [Done: council/BackendArchitect] — P0 崩溃发现 | | B3 | seatSpecMap 注入方案设计 | [Done: council/BackendArchitect] — Hook 注册即可 | | B4 | CartSave extension_data 多座位链路分析 | [Done: council/BackendArchitect] — Gap 2 已消除 | | B5 | 输出 Round 3 评估报告 + 投票 | [Done: council/BackendArchitect] | --- ## 待执行任务(Round 3 更新 — P0 → P1 → P2 排序) ### P0 — 立即修复(2h 内完成) | Task | 内容 | 依赖 | 状态 | |------|------|------|------| | P0-1 | 实现 `SeatSkuService::getSoldSeats()` | 无 | [To Claim: council/BackendArchitect] | | P0-2 | 注册 `plugins_service_goods_data` Hook + `InjectGoodsDetailData()` | 无 | [To Claim: council/BackendArchitect] | ### P1 — 短期完善 | Task | 内容 | 依赖 | 状态 | |------|------|------|------| | P1-1 | `api/` 目录纳入 Git 追踪 + 修复 `SeatMapService` 命名混淆 | P0-2 | [To Claim] | | P1-2 | 统一 `SeatMapService` / `SeatSkuService` 命名 | P1-1 | [To Claim] | | P1-3 | 完善 Phase 4 Tree API 文档(API 契约) | 无 | [To Claim] | ### P2 — 可延后 | Task | 内容 | 依赖 | 状态 | |------|------|------|------| | P2-1 | Phase 4 Tree API 实现(`buildTree()`) | P1-1 | [To Claim] | | P2-2 | 实时座位锁定机制(SKIP LOCKED) | P0-1 | [To Claim] | --- ## 投票结果 **投票:A — 后端优先** 理由: 1. `getSoldSeats()` 实现(30 行)修复运行时崩溃,解锁 UniApp soldSeats API 2. Hook 注册(10 行)解锁 UniApp 商品详情 API(Gap 1) 3. Gap 2(CartSave)已消除,后端无额外改动需求 4. Phase 4 不应前置,应在 P0/P1 稳定后作为独立任务启动 --- ## 输出 - 评估报告(更新版):`docs/council-eval-backendarchitect.md` - 投票:`docs/council-eval-backendarchitect.md#五投票`