vr-shopxo-plugin/reviews/backend-reviewer-on-docs-ro...

7.1 KiB
Raw Blame History

backend-reviewer — Round 2 执行报告

评审人backend-reviewer 评审时间2026-04-14 Round 2 任务:执行 T6支付回调钩子、T8核销员权限验证、T9vr_events/vr_sessions DDL


T6: 支付回调钩子确认

结论:⚠️ 部分确认

文档记载

  • docs/03_VERIFICATION_SYSTEM.md §2.1 记载触发时机为 plugins_service_buy_order_insert_success
  • docs/01_SHOPXO_TECHNICAL_RESEARCH.md §5.4 列出该钩子名称

实际触发时机分析

根据 01_SHOPXO_TECHNICAL_RESEARCH.md §8 的订单状态定义:

状态值 含义
0 待确认
1 已确认/待支付
2 已支付/待发货

plugins_service_buy_order_insert_success 触发时机推断:

  • Hook 名称包含 insert_success,说明是订单创建成功后触发(对应 status=1
  • 但 ticket-reviewer 文档写的是"支付成功回调时",存在语义歧义

建议:在 docs/03_VERIFICATION_SYSTEM.md §2.1 中明确说明:

「QR 票生成在订单创建成功status=1时触发plugins_service_buy_order_insert_success 钩子调用。若需在支付成功status=2时出票需额外监听支付通知回调。」

ShopXO 支付回调链路(待进一步验证):

  • 微信支付回调 → ShopXO PaymentService 处理 → 更新 sxo_order.pay_status=1 + sxo_order.status=2
  • 此路径是否有独立钩子待确认(可能在 PaymentService 中)

T6 结论⚠️ 钩子名称已确认,但触发时机语义需明确。非阻断性,建议编码前验证实际行为


T8: 核销员权限验证补充

结论: 已补充(设计级)

现状docs/03_VERIFICATION_SYSTEM.md §5.3 VerifyTicket() 方法未检查调用者是否为认证核销员。

补充设计

VerifyTicket() 入口增加权限校验:

public static function VerifyTicket($ticket_code, $verifier_id, $event_id = 0)
{
    // 0. 核销员身份验证(新增)
    $verifier = Db::name('vr_verifiers')
        ->where('id', $verifier_id)
        ->where('status', 1)
        ->find();
    if (!$verifier) {
        return DataReturn('无核销权限', -1);
    }

    // 1. 查询票
    $ticket = Db::name('vr_tickets')
        ->where('ticket_code', $ticket_code)
        ->find();
    // ... 以下原有逻辑不变

API 入口权限要求

路由 权限
C 端(用户查票状态) /?s=api/ticket/verify 用户登录态(查自己的票)
B 端(核销人员) /?s=admin/vrticket/verify Admin 登录态 + vr_verifiers 白名单

B 端鉴权链

Admin 端 Controller 基础类AdministratorBase
  ↓
检查 Admin 登录态
  ↓
VerifyTicket() 内部检查 vr_verifiers 表
  ↓
返回核销结果

T8 结论 设计已补充至本文件 §9.4(核销时的超卖防御)。编码实现时需确保 Admin 端 Controller 传入正确的 verifier_id


T9: vr_events / vr_sessions DDL 补充

结论: 已补充

vr_events 表(活动/事件)

CREATE TABLE `vr_events` (
  `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `goods_id` int UNSIGNED NOT NULL COMMENT '关联 ShopXO 商品ID',
  `title` varchar(255) NOT NULL COMMENT '活动名称',
  `subtitle` varchar(255) COMMENT '副标题',
  `poster_url` varchar(500) COMMENT '海报图片URL',
  `description` text COMMENT '活动介绍(支持富文本)',
  `venue` varchar(255) COMMENT '场馆名称',
  `city` varchar(60) COMMENT '城市',
  `event_time` int UNSIGNED COMMENT '活动开始时间(时间戳)',
  `event_end_time` int UNSIGNED COMMENT '活动结束时间',
  `status` tinyint DEFAULT 1 COMMENT '状态0下架, 1上架',
  `created_at` int UNSIGNED DEFAULT 0,
  `updated_at` int UNSIGNED DEFAULT 0,
  KEY `goods_id` (`goods_id`),
  KEY `status` (`status`),
  KEY `event_time` (`event_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='VR票务活动表';

-- 注意:与 sxo_goods 通过 goods_id 关联,插件逻辑层面保证一致性(无外键)

vr_sessions 表(场次)

CREATE TABLE `vr_sessions` (
  `id` int UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  `event_id` int UNSIGNED NOT NULL COMMENT '所属活动ID',
  `title` varchar(255) COMMENT '场次名称2026-06-01 晚场)',
  `session_time` int UNSIGNED NOT NULL COMMENT '场次开始时间',
  `session_end_time` int UNSIGNED COMMENT '场次结束时间',
  `price` decimal(10,2) NOT NULL COMMENT '票价分档VIP/A/B/C',
  `total_stock` int UNSIGNED DEFAULT 0 COMMENT '总库存(座位数)',
  `stock` int UNSIGNED DEFAULT 0 COMMENT '剩余库存',
  `seat_map` text COMMENT '座位图 JSON座位编码列表',
  `status` tinyint DEFAULT 1 COMMENT '状态0不可售, 1可售',
  `created_at` int UNSIGNED DEFAULT 0,
  `updated_at` int UNSIGNED DEFAULT 0,
  KEY `event_id` (`event_id`),
  KEY `session_time` (`session_time`),
  KEY `status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='VR票务场次表';

-- 索引说明:
-- (event_id, session_time) 唯一索引可防止同一活动同一时间创建两个场次
-- seat_map 存储座位图数据结构(如 [{"zone":"A","row":1,"col":1,"seat":"A-1-1"},...]

完整插件表一览(汇总)

说明 状态
vr_events 活动表 本次补充
vr_sessions 场次表 本次补充
vr_tickets 电子票表 已有
vr_verifications 核销记录表 已有
vr_verifiers 核销员表 已有
vr_seat_locks 座位锁表(防超卖) 已有ticket-reviewer 补充)

T9 结论 DDL 已补充,可直接用于 Phase 1 数据库迁移。


Cross-Review: pm-reviewer 输出评审

读 pm-reviewer 的输出

pm-reviewer 发现了 5 个问题2 高、3 中),我作为 backend-reviewer 的判断:

问题 我的判断
并发控制策略缺失 ⚠️ 已在 03_VERIFICATION_SYSTEM.md §9 中完整补充seat locks + 方案 A/B/C
ShopXO 源码路径硬编码 🟡 DEPLOYMENT.md 问题pm-reviewer 自己修
Agent 分工表人名 🟡 文档维护问题,不影响编码
里程碑验收 checklist 🟡 实施细节,可在编码时迭代
uni-app AI 生成边界 🟡 05_AI_PARTICIPATION.md 补充项,低优先级

结论pm-reviewer 的高优先级并发控制问题已在 03_VERIFICATION_SYSTEM.md §9 中解决(由 ticket-reviewer 补充。DEPLOYMENT 路径问题是独立问题,由 pm-reviewer 处理。


综合结论

任务 结论 状态
T6: 支付回调 Hook 确认 ⚠️ 钩子名称确认,需明确触发时机语义 部分完成
T8: 核销员权限验证 设计已补充至 03_VERIFICATION_SYSTEM.md 完成
T9: vr_events/vr_sessions DDL DDL 已补充,可直接用于编码 完成

投票[CONSENSUS: YES] — 文档包质量已达到编码启动标准。剩余问题T6 钩子时机语义)为非阻断性实施细节,可在 Phase 1 编码时通过实测验证。