vr-shopxo-plugin/docs/AGENT_PROMPT.md

161 lines
5.4 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.

# Agent 执行 Prompt — VR 演唱会票务小程序 Phase 2
## 前提条件(必读)
你正在帮助开发一个 **ShopXO 票务插件vr_ticket**
- 仓库:`http://xmhome.ow-my.com:3000/sileya-ai/vr-shopxo-plugin`
- 本地路径:`/Users/bigemon/WorkSpace/vr-shopxo-plugin`
- ShopXO 容器localhost:10000Web/ localhost:10001MySQL/ localhost:9000PHP-FPM
- DB 用户root / shopxo_root_2024表前缀`vrt_`
**完整文档路径**`/Users/bigemon/WorkSpace/vr-shopxo-plugin/docs/FULL_PLAN.md`
> ⚠️ 在做任何事情之前,**必须先读 `FULL_PLAN.md`**,理解完整上下文后再开始。
---
## 项目背景(一句话)
VR 演唱会票务微信小程序插件。用户选座 → 填观演人 → 微信支付 → 电子票二维码 → 现场扫码核销。
---
## 当前优先级
### P0阻塞一切
**Issue 1 修复**:购买提交流程完全失效,有三层叠加问题。
**顺序**
1. **后端**:修改 `SeatSkuService::GetGoodsViewData()`,新增 `seatSpecMap` 生成逻辑
- 查询 `GoodsSpecBase` + `GoodsSpecValue` + `GoodsSpecBase.extends.seat_key`
- 输出 `seatSpecMap[seatKey] = {spec_base_id, price, inventory, spec: [...]}`
- 完整逻辑见 `FULL_PLAN.md` 第 4.3 节
2. **后端**:修改 `Goods.php`,在 `MyViewAssign` 中加入 `seatSpecMap`
3. **前端**:修改 `ticket_detail.html`,用 `seatSpecMap` 替代当前错误的 `specBaseIdMap`
4. **前端**:修复 `submit()` 函数
- 改 GET → POST 隐藏表单(**不是** `location.href`
- spec 必须是**完整的 4 维数组**`[{type:'$vr-场馆',value:'...'},{type:'$vr-分区',value:'...'},{type:'$vr-座位号',value:'...'},{type:'$vr-场次',value:'...'}]`
- **不是** `{type:'$vr-座位号', value: seatKey}` — 这是错的
- spec 从 `seatSpecMap[seatKey].spec` 读取,**不要自己构造**
- `extension_data` 必须嵌套在 `order_base` 内,**不是平铺在第一层**
- 直接 `JSON.stringify`**不需要 base64**
### P1
5. **前端**`ticket_detail.html` 新增场次/场馆/分区选择器 UI + `filterSeatMap()` 联动过滤
6. **前端**缩放时舞台跟随zoom wrapper 方案)
7. **后端**:新增 `sold_seats` API 端点 + 前端 `loadSoldSeats()` 调用
### P2
8. 商品详情图片展示(确认需求)
9. `GetGoodsViewData()` 多场次返回数组而非 `validConfigs[0]`
10. `onOrderPaid` spec 匹配审计(未来关注,不阻塞)
---
## 绝对禁止事项
-**不要**用 `location.href` 传递购买参数ShopXO 只在 POST 时存储数据)
-**不要**把 spec 格式写成 `{type:'$vr-座位号', value: 'room_001_A_3'}` — 这是错的
-**不要**把 `extension_data` 平铺在 `goods_data` 第一层 — 必须嵌套在 `order_base`
-**不要**在 submit() 里对 `goods_data` 做 base64 — 直接 `JSON.stringify` 即可
-**不要**修改 `BuyService.php` 的核心逻辑 — 所有修复都在前端和插件后端做
-**不要**新建数据库表来存观演人信息 — 用 ShopXO 原生的 `order.extension_data`
---
## 常见错误警告
### spec 数组格式(最高频错误)
```
错误:
spec: [{type:'$vr-座位号', value: 'room_001_A_3'}]
正确完整4维
spec: [
{type:'$vr-场馆', value: 'VR 演唱会馆'},
{type:'$vr-分区', value: 'VR 演唱会馆-1号演播厅-VIP区'},
{type:'$vr-座位号', value: 'VR 演唱会馆-1号演播厅-VIP区-A-1排3座'},
{type:'$vr-场次', value: '15:00-16:59'}
]
```
### order_base 嵌套(第二高频错误)
```
错误:
{
goods_id: 118,
spec: [...],
extension_data: {...} ← 平铺!错!
}
正确:
{
goods_id: 118,
spec: [...],
order_base: { ← 必须嵌套在 order_base 内!
extension_data: {...}
}
}
```
### goods_data 编码(第三高频错误)
```
错误:
input.value = btoa(JSON.stringify(goodsDataList)) ← 不需要 base64
正确:
input.value = JSON.stringify(goodsDataList) ← 直接 JSON 字符串
```
ShopXO `BuyService::BuyGoods` 第60行判断 `!is_array($_POST['goods_data'])` 才会 decode直接 POST JSON 字符串即可。
---
## 快速参考
| 我需要知道 | 去哪里找 |
|-----------|---------|
| 完整上下文 + 修复方案 | `FULL_PLAN.md` |
| 原始 goods.vr_goods_config 数据 | `FULL_PLAN.md` 第二章 |
| seatSpecMap 正确结构 | `FULL_PLAN.md` 4.3 节 |
| submit() 正确实现 | `FULL_PLAN.md` 第六章 |
| Buy 链路数据流 | `FULL_PLAN.md` 6.3 节 |
| 关键代码行号索引 | `FULL_PLAN.md` 第八章 |
| spec 选择器设计 | `FULL_PLAN.md` 第五章 |
| 座位图渲染方法 | `FULL_PLAN.md` 5.3 节 |
---
## 工作流程
1. **读** `FULL_PLAN.md` 全文(必读)
2. **确认**你理解了 4 维 spec 结构 + seatSpecMap 映射关系
3. **按优先级顺序**处理 P0 → P1 → P2
4. **每完成一个模块**,在本地测试验证后再继续
5. **commit 前**`git status` 检查暂存区,不提交 binary图片/压缩包),不在本仓库 push 到远程
---
## commit 规范
```
feat(Phase2): [模块名] [简短描述]
示例:
feat(Phase2): SeatSkuService GetGoodsViewData 新增 seatSpecMap 生成
feat(Phase2): ticket_detail.html 修复 submit() POST + 4维spec数组
```
**注意**:本仓库是 fork不直接 push 到 upstream。只 commit 到本地,汇报给大头后由他处理上游合并。