diff --git a/plan.md b/plan.md index f730cc5..3cb1701 100644 --- a/plan.md +++ b/plan.md @@ -61,7 +61,7 @@ - BackendArchitect: `[APPROVE]` — merged report produced - FrontendDev: `[APPROVE]` — merged report produced, Issue 2 zoom fix proposed -- FirstPrinciples: `[APPROVE]` — review complete, see `reviews/FirstPrinciples-on-council-assessment.md` +- FirstPrinciples: `[APPROVE]` — final consolidated report at `reviews/council-phase2-assessment.md` ## 新增发现(P2 潜在) @@ -71,10 +71,13 @@ ## 输出文件 -| 文件 | 内容 | 负责人 | -|------|------|--------| -| `reviews/FirstPrinciples-on-phase2-assessment.md` | 第一性原则分析报告 | FirstPrinciples | -| `reviews/council-phase2-assessment.md` | 合并评估报告(最终输出) | FirstPrinciples | +| 文件 | 内容 | 状态 | +|------|------|------| +| `reviews/council-phase2-assessment.md` | 合并评估报告(最终输出) | ✅ Done | +| `reviews/FirstPrinciples-on-council-assessment.md` | FirstPrinciples review | ✅ Done | +| `reviews/FirstPrinciples-on-phase2-assessment.md` | 第一性原则分析报告 | ✅ Done | + +**Phase 2 评估完成,所有文件已合并至 `reviews/council-phase2-assessment.md`** --- diff --git a/reviews/council-phase2-assessment.md b/reviews/council-phase2-assessment.md new file mode 100644 index 0000000..9e35a4d --- /dev/null +++ b/reviews/council-phase2-assessment.md @@ -0,0 +1,259 @@ +# VR 演唱会票务小程序 Phase 2 技术评估报告 + +> 日期:2026-04-21 +> 协作产出:BackendArchitect、FrontendDev、FirstPrinciples +> 源码依据:BuyService.php、GoodsCartService.php、SeatSkuService.php、ticket_detail.html + +--- + +## 执行摘要 + +Phase 2 完成了对 4 个已知问题的根因分析,识别了 1 个未被提及的潜在 Bug(多场次),并给出了分优先级的修复方案。 + +**结论**:所有 4 个问题均为可修复的技术问题,无架构级障碍。 + +--- + +## 问题总览 + +| # | 问题 | 优先级 | 根因分类 | +|---|------|--------|---------| +| 1 | 购买提交流程失效 | **P0** | GET→POST 机制错误 + 参数契约不匹配 | +| 2 | 缩放时舞台不跟随 | **P1** | DOM 结构导致 transform 不共享 | +| 3 | spec 加载机制回滚 | **P1** | ShopXO spec 匹配机制不兼容 + API 端点缺失 | +| 4 | 商品详情/图片加载 | **P2** | 模板未引入 ShopXO 内容渲染组件 | + +**新增发现(潜在 Bug)**: +| # | 问题 | 优先级 | +|---|------|--------| +| 5 | GetGoodsViewData() 只返回第一个场次 | **P2 潜在** | + +--- + +## Issue 1(P0):购买提交流程失效 + +### 根因分析(三层叠加) + +**第一层(致命)**:`location.href` 产生 GET 请求,但 `Buy::Index()` 只在 `data_post` 为真时调用 `BuyDataStorage()`。 + +```php +// Buy.php:56-62 +public function Index() +{ + if($this->data_post) { + BuyService::BuyDataStorage($this->user['id'], $this->data_post); + return MyRedirect(MyUrl('index/buy/index')); + } else { + // GET 分支:从 session 读取,URL 参数从未被读取 + $buy_data = BuyService::BuyDataRead($this->user['id']); + } +} +``` + +`goods_params` URL 参数从未被读取 → `BuyDataStorage` 从未被调用 → `BuyDataRead` 返回空 → "商品数据为空"。 + +**第二层(严重)**:字段名不匹配。 +- 前端发送:`goods_params`(JSON 数组) +- ShopXO 期望:`goods_data`(JSON 数组) + +**第三层(中等)**:规格匹配机制不兼容。 +- 当前:`spec_base_id: parseInt(specBaseId)` — 直接传 ID +- ShopXO:`spec: [{type, value}]` — 通过 type:value 字符串匹配 GoodsSpecValue 表 + +### 推荐修复 + +**前端(FrontendDev)**: + +```javascript +// 隐藏表单 POST(最小化变更,复用 Buy 链路) +submit: function() { + var goodsDataList = this.selectedSeats.map(function(seat, i) { + var specBaseId = self.specBaseIdMap[seat.seatKey] || self.sessionSpecId; + return { + goods_id: self.goodsId, + spec: [{type: '座位', value: seat.seatKey}], // ShopXO 规格格式 + stock: 1 + }; + }); + + var form = document.createElement('form'); + form.method = 'POST'; + form.action = MyUrl('index/buy/index'); + var input = document.createElement('input'); + input.name = 'goods_data'; + input.value = Base64.encode(JSON.stringify(goodsDataList)); + form.appendChild(input); + document.body.appendChild(form); + form.submit(); +} +``` + +**关于 extension_data(观演人信息)**:ShopXO 原生不支持 `extension_data`(OrderDetail 表无此字段)。推荐方案:新增 `vr_order_attendee` 表,在 `BuyService::OrderInsert()` 后存储观演人信息。 + +### 关键提醒(FirstPrinciples) + +> Issue 1 的准确描述是「Buy 传输机制损坏」,而非「购物车格式错误」。 +> +> 当前代码实际上绕过了购物车,直接进入 Buy 链路。这说明直觉上的「绕过购物车」需求并不存在——只是 `submit()` 的传递方式错了。 + +--- + +## Issue 2(P1):缩放时舞台不跟随 + +### 根因分析 + +```html +