council(draft): BackendArchitect - plan for editor research Q2
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>refactor/vr-ticket-20260416
parent
d411073885
commit
4e5fda72a2
147
plan.md
147
plan.md
|
|
@ -1,41 +1,32 @@
|
||||||
# vr-shopxo-plugin P0 修复执行计划 — plan.md
|
# vr-shopxo-plugin 编辑器方案调研 — plan.md
|
||||||
|
|
||||||
> 版本:v5.0 | 日期:2026-04-15 | Agent:BackendArchitect + FrontendDev
|
> 版本:v1.0 | 日期:2026-04-15 | Agent:BackendArchitect (Q2) + FrontendDev (Q1)
|
||||||
> 关联:Issue #9 | 状态:**Finalize 阶段 — 待 FrontendDev 共识投票**
|
|
||||||
|
|
||||||
## 评审结果 (BackendArchitect Review)
|
|
||||||
|
|
||||||
**文件**: `reviews/BackendArchitect-on-FrontendDev-P1.md`
|
|
||||||
|
|
||||||
| 检查项 | 结论 |
|
|
||||||
|--------|------|
|
|
||||||
| specBaseIdMap 接口格式对齐 | ✅ PASS |
|
|
||||||
| goods_params seat-level 结构 | ✅ PASS |
|
|
||||||
| Fallback 回退策略 | ✅ PASS |
|
|
||||||
| Seat label ↔ Backend regex 对齐 | ✅ PASS |
|
|
||||||
| Price 来源对齐 | ✅ PASS |
|
|
||||||
|
|
||||||
**Verdict**: `[APPROVE]`
|
|
||||||
|
|
||||||
## Bug Fixes (Round 3 Review)
|
|
||||||
|
|
||||||
- [x] **Fix-1**: `SeatSkuService.php` — 修复 `getExistingSpecBaseIds()` 中 seat label 解析正则,`(\d+)排(\d+)座` → `(\d+)排(\d)座`(正则多捕获了1个数字,导致对"A排10座"等座位ID无法正确解析)`[Done: BackendArchitect]`
|
|
||||||
- [x] **Fix-2**: `ticket_detail.html` — 修复 `submit()` 中 `specBaseIdMap[seatKey]` 访问方式,`(obj||{}).spec_base_id` → 直接取数值(PHP 返回的是整数而非对象)`[Done: BackendArchitect]`
|
|
||||||
- [x] **Fix-3**: `SeatSkuService.php` + `ticket_detail.html` — 两个 bug 已合并到 main(commit `96337bc84`)`[Done: BackendArchitect]`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 任务背景
|
## 任务背景
|
||||||
|
|
||||||
方案 A 已全票通过(见 `council-output/ARCHITECTURE_DECISION.md`)。现在进入**执行阶段**,按优先级实施三个任务。
|
vr-shopxo-plugin 后台编辑器设计方案调研,分两个子问题:
|
||||||
|
- **Q1(FrontendDev)**:JSON 编辑器复杂度评估
|
||||||
|
- **Q2(BackendArchitect)**:商品发布页替换方案可行性
|
||||||
|
|
||||||
|
目标:`council-output/EDITOR_RESEARCH.md` 输出最终推荐
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 任务清单
|
## 任务清单
|
||||||
|
|
||||||
- [x] **P0-A**: `BaseService::initGoodsSpecs()` — 商品 112 最小修复集 `[Done: BackendArchitect]`
|
### Q1 — JSON 编辑器复杂度评估(FrontendDev)
|
||||||
- [x] **P0-B**: `SeatSkuService::BatchGenerate()` — 批量生成座位级 SKU `[Done: BackendArchitect]`
|
- [ ] **Q1-A**: 调研 ShopXO 后台是否有现成 JSON 编辑器组件
|
||||||
- [x] **P1**: `ticket_detail.html` submit() 重构 — seat-level 逐座提交 `[Done: FrontendDev]`
|
- [ ] **Q1-B**: 评估 Vue3 + JSON Schema form 实现 4 层嵌套编辑器的代码量/工时
|
||||||
|
- [ ] **Q1-C**: 与拆表方案对比 JSON 编辑器的开发和维护成本
|
||||||
|
|
||||||
|
### Q2 — 商品发布页替换方案可行性(BackendArchitect)
|
||||||
|
- [ ] **Q2-A**: 确认 `plugins_view_admin_goods_save` 钩子在 `SaveInfo()` 中的调用位置和上下文
|
||||||
|
- [ ] **Q2-B**: 分析 `plugins_view_admin_goods_save` 能否完全替换商品发布页面内容
|
||||||
|
- [ ] **Q2-C**: 分析 `Save()` 方法的数据接收方式(标准 $_POST vs 特殊格式)
|
||||||
|
- [ ] **Q2-D**: 确认插件视图文件路径可行性和数据流闭环
|
||||||
|
|
||||||
|
### 交叉任务
|
||||||
|
- [ ] **Output**: 汇总 Q1+Q2 结论,写入 `council-output/EDITOR_RESEARCH.md`,给出最终推荐
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -43,76 +34,26 @@
|
||||||
|
|
||||||
| 阶段 | 内容 | 负责 |
|
| 阶段 | 内容 | 负责 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| Draft | 各成员编写执行代码 | BackendArchitect (P0-A/P0-B), FrontendDev (P1) |
|
| Round 1 | 规划,各自调研 | BackendArchitect (Q2), FrontendDev (Q1) |
|
||||||
| Review | 代码互审,验证 SQL 正确性 | BackendArchitect 审 P1, FrontendDev 审 P0-A/P0-B |
|
| Round 2+ | 执行调研,代码级确认 | BackendArchitect (Q2-A~D), FrontendDev (Q1-A~C) |
|
||||||
| Finalize | 合并到 main,实测验证 | 所有成员 |
|
| Finalize | 汇总报告,推荐方案 | 所有成员 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## P0-A 详细设计
|
## Q2 详细调研任务(BackendArchitect)
|
||||||
|
|
||||||
**文件**: `plugins/vr_ticket/service/BaseService.php`
|
需要实际查看以下代码文件:
|
||||||
|
|
||||||
**方法**: `public static function initGoodsSpecs(int $goodsId): array`
|
1. `shopxo/app/admin/controller/Goods.php` 的 `SaveInfo()` 方法 — 找到 `plugins_view_admin_goods_save` 钩子调用位置
|
||||||
|
2. `shopxo/app/admin/controller/Goods.php` 的 `Save()` 方法 — 确认数据接收方式
|
||||||
**逻辑**:
|
3. `shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php` — 如果存在,分析现有实现
|
||||||
1. UPDATE `is_exist_many_spec=1` WHERE `id=$goodsId`(幂等)
|
|
||||||
2. 检查 `$vr-场馆`/`$vr-分区`/`$vr-时段`/`$vr-座位号` 是否存在(按 name 查 `goods_spec_type`),不存在则 INSERT
|
|
||||||
3. 使用 `Db::name('GoodsSpecType')->insert()` 防止重复(先查后插)
|
|
||||||
|
|
||||||
**验证**: 执行后 `SELECT * FROM sxo_goods_spec_type WHERE goods_id=112` 确认 4 条 spec_type 记录。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## P0-B 详细设计
|
|
||||||
|
|
||||||
**文件**: `plugins/vr_ticket/service/SeatSkuService.php`(新建)
|
|
||||||
|
|
||||||
**方法**: `public static function BatchGenerate(int $goodsId, int $seatTemplateId): array`
|
|
||||||
|
|
||||||
**返回值**:
|
|
||||||
```php
|
|
||||||
[
|
|
||||||
'code' => 0,
|
|
||||||
'msg' => '...',
|
|
||||||
'data' => [
|
|
||||||
'total' => 100, // 座位总数
|
|
||||||
'generated' => 50, // 本次生成数
|
|
||||||
'batch' => 1, // 批次数
|
|
||||||
'spec_base_id_map' => ['0_0' => 2001, '0_1' => 2002, ...] // seatId => spec_base_id
|
|
||||||
]
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
**核心逻辑**:
|
|
||||||
1. 从 `vr_seat_templates` 读取 seat_map(map → rows → seats)
|
|
||||||
2. 从 zone 配置获取 price(seat_info.price 或 section.price)
|
|
||||||
3. 遍历每个座位,生成 `goods_spec_base` 行(inventory=1,price 从 zone.price 获取)
|
|
||||||
4. 同时写入 `goods_spec_value`(4 维度 × N 座位 = 4N 行)
|
|
||||||
5. **旁路 `GoodsSpecificationsInsert()`** — 直接 SQL INSERT
|
|
||||||
6. 分批:500 条/批,10000 座位约 20 批
|
|
||||||
|
|
||||||
**幂等**: 已存在的座位(通过 $vr-座位号 spec_value 的 extends.seat_id 判断)不重复生成。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## P1 详细设计(FrontendDev)
|
|
||||||
|
|
||||||
**文件**: `plugins/vr_ticket/view/goods/ticket_detail.html`
|
|
||||||
|
|
||||||
**逻辑**:
|
|
||||||
1. `submit()` 改为遍历 `this.selectedSeats`
|
|
||||||
2. 每个座位从 `app.specBaseIdMap[seatKey]` 获取 `spec_base_id`(seatKey = `row_col`)
|
|
||||||
3. 构造 `goods_params` 数组,每个座位一行
|
|
||||||
4. 降级策略:`spec_base_id` 不存在时走原逻辑
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 依赖关系
|
## 依赖关系
|
||||||
|
|
||||||
- P0-A 和 P0-B 可并行开发
|
- Q1 和 Q2 完全独立,可并行调研
|
||||||
- P1 依赖 P0-B 完成后注入 `specBaseIdMap` 数据
|
- Output 依赖 Q1 和 Q2 全部完成
|
||||||
- P0-A 完成后需在 ShopXO 容器实测验证
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -120,28 +61,14 @@
|
||||||
|
|
||||||
| 任务 | Claim 状态 |
|
| 任务 | Claim 状态 |
|
||||||
|------|-----------|
|
|------|-----------|
|
||||||
| P0-A | [Done: BackendArchitect] |
|
| Q1-A, Q1-B, Q1-C | [Claimed: FrontendDev] |
|
||||||
| P0-B | [Done: BackendArchitect] |
|
| Q2-A, Q2-B, Q2-C, Q2-D | [Claimed: BackendArchitect] |
|
||||||
| P1 | [Done: FrontendDev] |
|
| Output 报告 | [Unclaimed] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 执行顺序
|
## 关键文件路径
|
||||||
|
|
||||||
1. [Done] BackendArchitect: P0-A 代码 + SQL 验证
|
- `shopxo/app/admin/controller/Goods.php` — 核心调研对象
|
||||||
2. [Done] BackendArchitect: P0-B SeatSkuService::BatchGenerate()
|
- `shopxo/app/plugins/vr_ticket/hook/AdminGoodsSave.php` — 钩子实现参考
|
||||||
3. [Done] FrontendDev: P1 submit() 重构
|
- `council-output/EDITOR_RESEARCH.md` — 输出报告
|
||||||
4. [Done] BackendArchitect: 合并到 main(commit `96337bc84`)
|
|
||||||
5. [Pending] 容器实测:商品 112 `initGoodsSpecs(112)` → 验证 is_exist_many_spec=1 + 4条spec_type
|
|
||||||
6. [Pending] 容器实测:`BatchGenerate(112, $templateId)` → 验证座位级 SKU 生成
|
|
||||||
7. [Pending] FrontendDev: 验证前端 seat-level goods_params 构造正确
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 已交付文件
|
|
||||||
|
|
||||||
| 文件 | 状态 |
|
|
||||||
|------|------|
|
|
||||||
| `shopxo/app/plugins/vr_ticket/service/BaseService.php` | ✅ 含 `initGoodsSpecs()` |
|
|
||||||
| `shopxo/app/plugins/vr_ticket/service/SeatSkuService.php` | ✅ 新建,含 `BatchGenerate()` + `UpdateSessionSku()` |
|
|
||||||
| `shopxo/app/plugins/vr_ticket/view/goods/ticket_detail.html` | ✅ submit() 已重构(FrontendDev) |
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue