vr-shopxo-plugin/plan.md

92 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Plan — 调研「场馆删除后编辑商品出现规格重复错误」问题
> 版本v1.3 | 日期2026-04-20 | Agentcouncil/FrontendDev + council/SecurityEngineer + council/BackendArchitect
---
## 任务概述
当票务商品关联的场馆模板被硬删除后,编辑商品时出现「规格不允许重复」错误。
**根因调查分工**
- FrontendDev前端规格项构建与 fallback 行为
- BackendArchitect后端规格去重逻辑、`spec_base_id_map` 解析
- SecurityEngineer安全风险评估P1 vs P2
---
## FrontendDev 任务清单
- [x] [Done: council/FrontendDev] **Task 1**: 读取 `ticket_detail.html`,分析前端构建规格项的过程
- [x] [Done: council/FrontendDev] **Task 2**: 当模板不存在时,前端如何处理 `template_snapshot``spec_base_id_map`
- [x] [Done: council/FrontendDev] **Task 3**: `loadSoldSeats()` 函数实际实现了吗soldSeats 数据如何填充?
- [x] [Done: council/FrontendDev] **Task 4**: 编辑模式下(已有 vr_goods_config前端是否正确处理已删除场馆的旧规格
- [x] [Done: council/FrontendDev] **Task 5**: 给出前端根因分析(含具体文件路径和行号)
- [x] [Done: council/FrontendDev] **Task 6**: 给出修复方案
- [x] [Done: council/FrontendDev] **Task 7**: 将调研报告写入 `reviews/council-ghost-spec-FrontendDev.md`
---
## SecurityEngineer 任务清单
- [x] [Done: council/SecurityEngineer] **Task S1**: 读取 AdminGoodsSaveHandle.php — 安全审计:保存时是否拒绝脏数据
- [x] [Done: council/SecurityEngineer] **Task S2**: 读取 SeatSkuService.php — 幽灵 spec 注入路径分析
- [x] [Done: council/SecurityEngineer] **Task S3**: 读取 AdminGoodsSave.php — ShopXO 入口安全检查
- [x] [Done: council/SecurityEngineer] **Task S4**: 输出安全审计报告 → `reviews/SecurityEngineer-GHOST_SPEC_SECURITY.md`
- [x] [Done: council/SecurityEngineer] **Task S5**: 更新 `reviews/council-ghost-spec-summary.md`
---
## BackendArchitect 任务清单
- [x] [Done: council/BackendArchitect] **Task B1**: 读取 AdminGoodsSaveHandle.php找出 `vr_goods_config` 的读取和解析逻辑
- [x] [Done: council/BackendArchitect] **Task B2**: 找出 `spec_base_id_map` 如何被转换成规格项
- [x] [Done: council/BackendArchitect] **Task B3**: 当 `template_id` 指向不存在的场馆时SeatSkuService.php 的 GetGoodsViewData 如何 fallback
- [x] [Done: council/BackendArchitect] **Task B4**: 幽灵 spec 是在哪个环节产生的?是否在保存时过滤?
- [x] [Done: council/BackendArchitect] **Task B5**: 商品保存时规格去重逻辑在哪里?`vr_goods_config` 中若有多个规格项的 `spec_base_id` 相同会怎样?
- [x] [Done: council/BackendArchitect] **Task B6**: 给出根因分析(含具体行号)和修复方案
- [x] [Done: council/BackendArchitect] **Task B7**: 将调研报告写入 `reviews/council-ghost-spec-BackendArchitect.md`
---
## 阶段划分
| 阶段 | 状态 |
|------|------|
| **Draft** | ✅ 完成(所有 Agent 完成文件读取和分析)|
| **Review** | ✅ 完成(各 Agent 已提交调研报告)|
| **Finalize** | ✅ 完成summary.md 写入,含 BackendArchitect 最终报告)|
---
## 关键文件(必须全部检查)
| 文件 | 关注点 |
|------|--------|
| `shopxo/app/plugins/vr_ticket/view/goods/ticket_detail.html` | 前端规格项构建、template_snapshot fallback |
| `shopxo/app/plugins/vr_ticket/service/SeatSkuService.php` | GetGoodsViewData模板不存在时的 fallback |
| `shopxo/app/plugins/vr_ticket/hook/AdminGoodsSaveHandle.php` | 商品保存钩子vr_goods_config 处理 |
| `shopxo/app/plugins/vr_ticket/admin/Admin.php` | VenueDelete 硬删除逻辑 |
| `shopxo/app/admin/hook/AdminGoodsSave.php` | ShopXO 商品保存钩子入口 |
---
## 输出文件
| 文件 | Agent | 状态 |
|------|-------|------|
| `reviews/council-ghost-spec-FrontendDev.md` | FrontendDev | ✅ |
| `reviews/SecurityEngineer-GHOST_SPEC_SECURITY.md` | SecurityEngineer | ✅ |
| `reviews/council-ghost-spec-BackendArchitect.md` | BackendArchitect | ✅ |
| `reviews/council-ghost-spec-summary.md` | SecurityEngineer | ✅ (v2.1 — 含 BackendArchitect 报告) |
---
## 根因结论BackendArchitect 验证)
| 优先级 | 根因 | 文件:行号 |
|--------|------|-----------|
| **P1** | 无效 config 块未从数组移除,`continue` 后脏数据写回 DB | AdminGoodsSaveHandle.php:88-89 + 148-150 |
| **P2** | GetGoodsViewData 单模板模式,多模板时覆盖有效块 | SeatSkuService.php:368 + 386-388 |
| **P3** | BatchGenerate 对无效 template_id 返回 code=-2阻断保存 | AdminGoodsSaveHandle.php:164-170 |