# VR票务插件修复 — 任务简报

> 整理：西莉雅
> 时间：2026-04-16 CST
> 仓库：http://xmhome.ow-my.com:3000/sileya-ai/vr-shopxo-plugin

---

## 一、任务目标

将 vr_ticket 插件从 `.backup_plugins/vr_ticket/` 迁移到 `shopxo/app/plugins/vr_ticket/`，使其能正常工作（参考已验证的 `my_test_plugin` 样本）。

---

## 二、当前环境（2026-04-16）

| 项目 | 值 |
|------|---|
| ShopXO 版本 | v6.8.0（官方最新） |
| 数据库名 | `vrticket` |
| 表前缀 | `vrt_` |
| 后台入口 | `adminufgeyw.php` |
| is_develop | true |
| 自定义菜单 | `shopxo/config/vrt_custom_menu.php`（直接注入 sidebar，不走插件系统） |
| PHP 容器 | `shopxo-php`（已重启生效） |

---

## 三、参考样本：my_test_plugin（已验证工作正常）

**文件结构：**
```
shopxo/app/plugins/my_test_plugin/
├── Event.php              ← 事件回调（注意：不是 EventListener.php）
├── Hook.php               ← CSS/JS 钩子入口
├── config.json            ← 插件元数据（菜单通过 sidebar config 手动注入）
├── install.sql            ← 建表 SQL
├── uninstall.sql          ← 清理 SQL
├── admin/Admin.php        ← 所有后台控制器方法（单文件模式）
└── view/admin/admin/      ← 视图文件（3个 HTML）
    ├── index.html
    ├── form.html
    ├── layout.html
    └── buttons.html
```

**关键配置（config.json）：**
```json
{
    "base": {
        "plugins": "my_test_plugin",
        "name": "我的测试插件",
        "version": "1.0.0"
    },
    "hook": {
        "plugins_css": ["app\\plugins\\my_test_plugin\\Hook"],
        "plugins_js":  ["app\\plugins\\my_test_plugin\\Hook"]
    }
}
```

**路由机制（已验证）：**
- URL: `/adminufgeyw.php?s=plugins/index/pluginsname/my_test_plugin/pluginscontrol/admin/pluginsaction/index`
- ShopXO 解析：`pluginsname=my_test_plugin`, `pluginscontrol=admin`, `pluginsaction=index`
- ThinkPHP PSR-4：`\app\plugins\my_test_plugin\admin\Admin::Index()`
- 映射文件：`app/plugins/my_test_plugin/admin/Admin.php` ✓

**视图路径（已验证）：**
- ThinkPHP 解析：`return view('/plugins/view/my_test_plugin/admin/view/admin/index');`
- 映射文件：`app/plugins/my_test_plugin/view/admin/admin/index.html` ✓

---

## 四、vr_ticket 插件现状（.backup_plugins/vr_ticket/）

### 4.1 文件结构

```
.backup_plugins/vr_ticket/
├── EventListener.php          ← ❌ 错误：ShopXO 规范文件名是 Event.php
├── plugin.json                ← 插件元数据
├── app.php                    ← 插件主入口
├── README.md
├── database/migrations/
│   ├── 001_vr_tables.sql      ← 建表 SQL（注意表名前缀）
│   └── fix_garbled_name.sql
├── service/
│   ├── BaseService.php
│   ├── TicketService.php
│   ├── SeatSkuService.php
│   └── AuditService.php
├── admin/
│   ├── Admin.php               ← 旧版单文件模式（已废弃）
│   ├── controller/
│   │   ├── Base.php
│   │   ├── Plugins.php
│   │   ├── SeatTemplate.php
│   │   ├── Ticket.php
│   │   ├── Venue.php
│   │   ├── Verification.php
│   │   └── Verifier.php
│   ├── seat_template/         ← ❌ 错误目录结构
│   ├── ticket/
│   ├── venue/
│   ├── verification/
│   ├── verifier/
│   └── view/                   ← ❌ 旧视图路径（view/admin/view/...）
│       ├── seat_template/list.html
│       ├── seat_template/save.html
│       ├── ticket/detail.html
│       ├── ticket/list.html
│       ├── venue/list.html
│       ├── venue/save.html
│       ├── verification/list.html
│       ├── verifier/list.html
│       └── verifier/save.html
└── view/goods/
    └── ticket_detail.html      ← 前端票务详情页（正确）
```

### 4.2 已知问题清单

| # | 问题 | 严重性 | 修复方向 |
|---|------|--------|---------|
| 1 | `EventListener.php` → 应改为 `Event.php` | 🔴 致命 | 重命名文件 |
| 2 | 表名 `plugins_vr_xxx` → 应为 `vrt_vr_xxx`（实际前缀是 `vrt_`，不是 `plugins_`） | 🔴 致命 | 全局替换所有 Db::name() 和 SQL |
| 3 | `admin/view/xxx/yyy.html` → 应为 `view/admin/admin/xxx.html` | 🔴 致命 | 重组视图目录结构 |
| 4 | 视图中的 `return view('/plugins/view/vr_ticket/admin/view/...')` 路径需重新核对 | 🔴 致命 | 对照 my_test_plugin 修正路径 |
| 5 | `plugin.json` 的 menus 配置在当前环境不生效（sidebar 加载问题） | 🟡 中等 | 暂不使用 menus，用 vrt_custom_menu.php 注入 |
| 6 | `admin/controller/` 目录下有多个独立控制器文件（旧结构） | 🟡 中等 | 统一为单文件 `Admin.php` 模式 |
| 7 | `Venue.php` 控制器有重复实现（Admin.php 里也有 VenueList/VenueSave） | 🟡 中等 | 清理冗余，统一到 Admin.php |
| 8 | `Base.php` 控制器基类存在但鉴权链已修复（继承 Common） | 🟢 轻微 | 确认 Base.php 正确继承 Common |

---

## 五、数据库表结构（来自 001_vr_tables.sql）

表前缀：`vrt_`（不是 `plugins_vr_`）

- `vrt_vr_seat_templates` — 座位模板（seat_map JSON）
- `vrt_vr_tickets` — 电子票（ticket_code / qr_data / seat_info）
- `vrt_vr_verifiers` — 核销员（user_id 关联 ShopXO 用户）
- `vrt_vr_verifications` — 核销记录（ticket_id / verifier_id）
- `vrt_vr_audit_log` — 审计日志（action/operator/target）

**注意：ShopXO Db::name() 的表名映射规则是：去掉前缀部分后拼接。即 `Db::name('plugins_vr_seat_templates')` → 实际查 `vrt_plugins_vr_seat_templates`（表不存在）。正确写法：`Db::name('vr_seat_templates')` → `vrt_vr_seat_templates`。**

---

## 六、修复任务清单

### P0 — 必须修复（插件能跑起来）

- [ ] 重命名 `EventListener.php` → `Event.php`
- [ ] 统一为 `admin/Admin.php` 单文件控制器模式（参考 my_test_plugin）
- [ ] 重组视图目录：`view/admin/admin/{功能}/{action}.html`
- [ ] 修正所有 `Db::name('plugins_vr_xxx')` → `Db::name('vr_xxx')`
- [ ] 修正 SQL 文件中的表名（`vrt_plugins_vr_` → `vrt_vr_`）
- [ ] 在 `vrt_custom_menu.php` 添加 vr_ticket 菜单入口
- [ ] 复制修复后的插件到 `shopxo/app/plugins/vr_ticket/`

### P1 — 功能验证

- [ ] 座位模板 CRUD（后台）
- [ ] 电子票列表 + 票详情 + QR 显示
- [ ] 核销员管理
- [ ] 核销记录列表

### P2 — 清理

- [ ] 删除 `admin/controller/` 旧文件
- [ ] 删除 `admin/seat_template/` 等错误目录
- [ ] 更新 plugin.json（去除 menus，走 sidebar config）
- [ ] 确认 plugin.json 的 plugins 名称字段与目录名一致

---

## 七、工作要求

1. **工作留痕**：所有修改记录保存到 `shopxo/.edit-log/{date}/`
2. **分步提交**：每完成一个 P0 子项 commit 一次，commit message 明确描述改动
3. **二次审查**：完成后提交给 Anthropic/Google 模型做二次 review
4. **不走 Council 提交自动 merge**：所有 commit 留在本地 worktree，由西莉娅手动审核后 push

---

## 八、关键文件索引

| 文件 | 说明 |
|------|------|
| `shopxo/app/plugins/my_test_plugin/` | 已验证的工作样本 |
| `.backup_plugins/vr_ticket/` | 需要修复的旧代码 |
| `shopxo/config/vrt_custom_menu.php` | 侧边栏菜单配置（参考格式） |
| `shopxo/app/service/AdminPowerService.php` | 侧边栏注入代码位置（第 598 行） |
| `shopxo/public/static/common/iconfont/iconfont.css` | 可用图标列表（534个） |
| `docs/插件手册.md` | ShopXO 官方插件开发手册 |
