# Plan — VR 演唱会票务小程序 Round 4 执行 > 版本:v4.0 | 日期:2026-05-26 | Agent:council/BackendArchitect > 任务:Round 4 现场核查 — 修正误判,投票 A --- ## 评估范围 - Phase 4 Tree API 设计文档完整性 + 可行性 - SeatMapService + `/seatmap` API 完整性 - seatSpecMap 注入商品详情 API 的实现方案 - CartSave extension_data 多座位存储链路 - 后端下一步优先级建议 --- ## Round 4 现场核查结论 ### Phase 4 Tree API - 设计文档:✅ `docs/PHASE_4_API.md` + `PLAN_TREE_API_IMPLEMENTATION.md` - `SeatMapService.php`(服务类):✅ **333行完整实现**,含 `GetSeatMap()` + `buildSeatSpecMap()` + `buildGoodsSpecData()` - `api/Goods.php::seatmap()`:✅ **正确实现**,第241行调用 `SeatMapService::GetSeatMap($goodsId)` - Tree API `buildTree()`:❌ **代码为零**(Phase 4 尚未开始) ### SeatMapService + seatmap API - `SeatMapService::GetSeatMap()`:✅ **完整**,含实时 inventory + 缓存 - `api/Goods.php::seatmap()`:✅ **正确**,UniApp 调用无崩溃 - `index/Index.php::soldSeats`:❌ **Index.php 无此 action**(Round 3 误判已修正) - `SeatSkuService::getSoldSeats()`:⚠️ 方法不存在,但被替代(`GetSeatMap()` 已含库存) - **结论:无运行时崩溃,seatmap API 工作正常** ### seatSpecMap 注入 - Hook `plugins_service_goods_data`:❌ **未注册**(Gap 1 仍成立) - `api/Goods.php::detail()`:❌ 不包含 VR 数据 - H5 `ticket_detail.html`:✅ **工作正常**(直接调用 `GetGoodsViewData()`) - UniApp detail API:❌ **Gap 1 成立**,但 `/seatmap` API 可变通绕过 - **结论:Gap 1 成立,UniApp 可先调用 `/seatmap` 绕过** ### CartSave extension_data - `ticket_detail.html:762`:✅ 已实现,`extension_data` 嵌套在 `order_base` - `TicketService::onOrderPaid()`:✅ 已实现,多座位支持 - **结论:Gap 2 已消除,后端无需改动** --- ## BackendArchitect 评估任务 | Task | 内容 | 状态 | |------|------|------| | B1 | Phase 4 Tree API 设计文档评估 | [Done: council/BackendArchitect] — 设计完整,代码为零 | | B2 | SeatMapService + seatmap API 完整性检查 | [Done: council/BackendArchitect] — Round 3 误判已修正,API 完整 | | B3 | seatSpecMap 注入方案设计 | [Done: council/BackendArchitect] — Hook 注册方案已明确 | | B4 | CartSave extension_data 多座位链路分析 | [Done: council/BackendArchitect] — Gap 2 已消除 | | B5 | 输出 Round 4 评估报告 + 投票 | [Done: council/BackendArchitect] | --- ## P0 修正(Round 4) | 原问题 | Round 3 状态 | Round 4 修正 | |--------|-------------|-------------| | P0-1 `getSoldSeats()` 方法缺失 | 致命 | ❌ **已消除** — `GetSeatMap()` 已含库存,无崩溃 | | P0-2 Hook `plugins_service_goods_data` 未注册 | 致命 | ⚠️ **降级 P1** — UniApp 可用 `/seatmap` 变通绕过 | | P0-3 `Index.php:soldSeats` 触发 Fatal Error | 致命 | ❌ **已消除** — Index.php 无 soldSeats action | --- ## 最终优先级 | 优先级 | 任务 | 预计工时 | 收益 | |--------|------|---------|------| | **P1-A** | Hook 注册 + `InjectGoodsDetailData()` | 30min | 解锁 UniApp 完整票务链路 | | **P1-B** | `api/Goods.php::detail()` 注入 VR 数据 | 20min | 与 Hook 注册二选一 | | **P2** | Phase 4 Tree API `buildTree()` | 待定 | Tree VR 体验 | | **P3** | Phase 4 完整 Tree 体验 | 待定 | VR 差异化功能 | --- ## 投票结果 **投票:A — 后端优先** 理由: 1. Hook 注册约 30 行代码,解决 Gap 1,解锁 UniApp 完整票务链路 2. Round 4 确认:seatmap API 已完整,无运行时崩溃 3. Gap 2 已消除,后端链路完整 4. UniApp 可用方案 B(先 /seatmap 后 /detail)立即变通绕过 Gap 1 5. Phase 4 是体验增强,不应作为主攻方向 --- ## 输出 - 评估报告(Round 4 更新版):`docs/council-eval-backendarchitect.md` - 投票:`docs/council-eval-backendarchitect.md#五投票