vr-shopxo-plugin/plan.md

5.2 KiB
Raw Blame History

vr-shopxo-plugin P0 修复执行计划 — plan.md

版本v5.0 | 日期2026-04-15 | AgentBackendArchitect + FrontendDev 关联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)

  • Fix-1: SeatSkuService.php — 修复 getExistingSpecBaseIds() 中 seat label 解析正则,(\d+)排(\d+)座(\d+)排(\d)座正则多捕获了1个数字导致对"A排10座"等座位ID无法正确解析[Done: BackendArchitect]
  • Fix-2: ticket_detail.html — 修复 submit()specBaseIdMap[seatKey] 访问方式,(obj||{}).spec_base_id → 直接取数值PHP 返回的是整数而非对象)[Done: BackendArchitect]
  • Fix-3: SeatSkuService.php + ticket_detail.html — 两个 bug 已合并到 maincommit 96337bc84[Done: BackendArchitect]

任务背景

方案 A 已全票通过(见 council-output/ARCHITECTURE_DECISION.md)。现在进入执行阶段,按优先级实施三个任务。


任务清单

  • P0-A: BaseService::initGoodsSpecs() — 商品 112 最小修复集 [Done: BackendArchitect]
  • P0-B: SeatSkuService::BatchGenerate() — 批量生成座位级 SKU [Done: BackendArchitect]
  • P1: ticket_detail.html submit() 重构 — seat-level 逐座提交 [Done: FrontendDev]

阶段划分

阶段 内容 负责
Draft 各成员编写执行代码 BackendArchitect (P0-A/P0-B), FrontendDev (P1)
Review 代码互审,验证 SQL 正确性 BackendArchitect 审 P1, FrontendDev 审 P0-A/P0-B
Finalize 合并到 main实测验证 所有成员

P0-A 详细设计

文件: plugins/vr_ticket/service/BaseService.php

方法: public static function initGoodsSpecs(int $goodsId): array

逻辑:

  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

返回值:

[
    '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_mapmap → rows → seats
  2. 从 zone 配置获取 priceseat_info.price 或 section.price
  3. 遍历每个座位,生成 goods_spec_baseinventory=1price 从 zone.price 获取)
  4. 同时写入 goods_spec_value4 维度 × 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_idseatKey = row_col
  3. 构造 goods_params 数组,每个座位一行
  4. 降级策略:spec_base_id 不存在时走原逻辑

依赖关系

  • P0-A 和 P0-B 可并行开发
  • P1 依赖 P0-B 完成后注入 specBaseIdMap 数据
  • P0-A 完成后需在 ShopXO 容器实测验证

Claim 状态

任务 Claim 状态
P0-A [Done: BackendArchitect]
P0-B [Done: BackendArchitect]
P1 [Done: FrontendDev]

执行顺序

  1. [Done] BackendArchitect: P0-A 代码 + SQL 验证
  2. [Done] BackendArchitect: P0-B SeatSkuService::BatchGenerate()
  3. [Done] FrontendDev: P1 submit() 重构
  4. [Done] BackendArchitect: 合并到 maincommit 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