diff --git a/docs/api/vr-ticket-city-filter-api.md b/docs/api/vr-ticket-city-filter-api.md
new file mode 100644
index 00000000..a0b17c22
--- /dev/null
+++ b/docs/api/vr-ticket-city-filter-api.md
@@ -0,0 +1,256 @@
+# VR 票务商品城市筛选 API 文档
+
+> 文档版本:v1.0.0
+> 创建日期:2026-06-05
+> 作者:sileya-ai
+> 适用:vr_ticket 插件 v1.0.0+
+
+---
+
+## 一、功能概述
+
+本 API 为 VR 票务商品提供基于用户地理位置的城市筛选功能。用户打开 UniApp 时,系统会获取用户的 GPS 坐标,并自动筛选出距离用户最近的已配置城市的票务商品。
+
+### 1.1 核心特性
+
+- **坐标反推**:根据用户经纬度自动匹配最近的城市
+- **向下兼容**:无坐标、无城市数据时返回全部商品,不影响正常浏览
+- **插件内封装**:所有逻辑封装在 `vr_ticket` 插件内,启用/停用完全符合插件规范
+
+---
+
+## 二、请求参数
+
+### 2.1 新增参数
+
+| 参数名 | 类型 | 必填 | 说明 | 示例 |
+|--------|------|------|------|------|
+| `user_lng` | float | 否 | 用户经度(高德地图坐标系) | `118.110652` |
+| `user_lat` | float | 否 | 用户纬度(高德地图坐标系) | `24.585292` |
+| `city_id` | int | 否 | 显式城市 ID(优先级高于坐标) | `350205` |
+| `cityid` | int | 否 | 城市 ID 别名(兼容旧版) | `350205` |
+
+### 2.2 参数优先级
+
+```
+1. city_id / cityid(显式传入,直接使用)
+2. user_lng + user_lat(坐标反推最近城市)
+3. 无参数 → 不筛选,返回全部商品
+```
+
+### 2.3 已有参数
+
+使用本功能时,请确保以下基础参数已正确传递:
+
+| 参数名 | 说明 | 示例 |
+|--------|------|------|
+| `s` | 接口路由 | `index/index`, `search/data_list` |
+| `application` | 应用标识 | `app` |
+| `application_client_type` | 客户端类型 | `h5` |
+| `token` | 用户 Token | `a10070444f0494d35001ceff2156e4fd` |
+| `ajax` | AJAX 标识 | `ajax` |
+
+---
+
+## 三、受影响的 API
+
+### 3.1 首页商品列表
+
+```
+GET /api.php?s=index/index
+```
+
+**说明**:首页楼层商品推荐(包括 vr_ticket 票务商品)会受城市筛选影响。
+
+**示例请求**:
+```bash
+curl 'http://localhost:10000/api.php?s=index/index&system_type=default&application=app&application_client_type=h5&token=xxx&uuid=xxx&user_lng=118.110652&user_lat=24.585292&lang=zh&theme=red&ajax=ajax'
+```
+
+**响应**:返回首页数据,其中票务商品楼层仅显示该城市/最近城市的商品。
+
+---
+
+### 3.2 商品搜索
+
+```
+GET /api.php?s=search/data_list
+```
+
+**说明**:商品搜索结果中的票务商品会受城市筛选影响。
+
+**示例请求**:
+```bash
+curl 'http://localhost:10000/api.php?s=search/data_list&application=app&application_client_type=h5&user_lng=118.110652&user_lat=24.585292&ajax=ajax'
+```
+
+**响应**:返回搜索结果,其中票务商品仅显示该城市/最近城市的商品。
+
+---
+
+## 四、筛选逻辑
+
+### 4.1 触发条件
+
+城市筛选功能在以下条件**同时满足**时生效:
+
+| # | 条件 | 说明 |
+|---|------|------|
+| 1 | 用户传入 `user_lng` + `user_lat` | 有效的 GPS 坐标 |
+| 2 | 数据库中存在对应城市的坐标数据 | `Region` 表的 `lng > 0 AND lat > 0` |
+
+### 4.2 筛选规则
+
+```
+用户坐标 (lng, lat)
+ ↓
+GeoCityService::FindNearestCityId(lng, lat)
+ ↓ 遍历 Region 表所有有坐标的条目
+ ↓ 使用 Haversine 公式计算球面距离
+ ↓ 返回距离最近的地区 ID
+ ↓
+WHERE g.produce_region = 最近城市ID
+```
+
+### 4.3 生效场景
+
+| 场景 | user_lng | user_lat | 数据库有坐标 | 行为 |
+|------|---------|---------|-------------|------|
+| 正常定位 | ✅ | ✅ | ✅ | 按最近城市筛选 ✅ |
+| 无坐标参数 | ❌ | ❌ | - | 不筛选,返回全部 ✅ |
+| 数据库无坐标 | ✅ | ✅ | ❌ | 不筛选,返回全部 ✅ |
+| 显式 city_id | - | - | - | 按指定城市筛选 ✅ |
+
+---
+
+## 五、数据要求
+
+### 5.1 地区坐标数据
+
+系统依赖 `Region` 表中的坐标数据:
+
+```sql
+SELECT id, name, level, lng, lat
+FROM __PREFIX__region
+WHERE lng > 0 AND lat > 0 AND is_enable = 1
+```
+
+**字段说明**:
+
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| `id` | int | 地区 ID,用于商品 `produce_region` 关联 |
+| `name` | varchar | 地区名称(如"思明区") |
+| `level` | tinyint | 地区级别(2=城市,3=区县) |
+| `pid` | int | 上级地区 ID(如厦门市的 pid=35) |
+| `lng` | decimal(10,6) | 经度 |
+| `lat` | decimal(10,6) | 纬度 |
+
+### 5.2 商品产地字段
+
+票务商品的 `produce_region` 字段需要与 `Region` 表的 `id` 对应:
+
+```sql
+UPDATE __PREFIX__goods
+SET produce_region = 350205 -- 思明区
+WHERE id = xxx AND plugins_params LIKE '%vr_ticket%'
+```
+
+---
+
+## 六、错误处理
+
+### 6.1 常见问题
+
+| 问题 | 原因 | 解决方案 |
+|------|------|---------|
+| 返回全部商品(未筛选) | 用户未传坐标或数据库无坐标数据 | 检查前端定位和地区坐标配置 |
+| 筛选结果为空 | 该城市暂无票务商品 | 正常现象,提示用户暂无该城市票务 |
+| 筛选了错误的距离城市 | 数据库只有远处城市有坐标 | 补充用户所在城市的坐标数据 |
+
+### 6.2 向下兼容
+
+系统设计为完全向下兼容:
+
+- **无坐标**:返回全部商品
+- **无城市坐标数据**:返回全部商品
+- **商品未填产地**:正常显示(不受筛选影响)
+
+---
+
+## 七、接口调试
+
+### 7.1 完整请求示例(首页)
+
+```bash
+curl -X POST 'http://localhost:10000/api.php' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "s": "index/index",
+ "system_type": "default",
+ "application": "app",
+ "application_client_type": "h5",
+ "application_client_brand": "",
+ "token": "a10070444f0494d35001ceff2156e4fd",
+ "uuid": "bb598005-572f-40ef-abc9-6e189bf210a8",
+ "user_lng": 118.110652,
+ "user_lat": 24.585292,
+ "lang": "zh",
+ "theme": "red",
+ "ajax": "ajax"
+ }'
+```
+
+### 7.2 完整请求示例(搜索)
+
+```bash
+curl -X POST 'http://localhost:10000/api.php' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "s": "search/data_list",
+ "application": "app",
+ "application_client_type": "h5",
+ "user_lng": 118.110652,
+ "user_lat": 24.585292,
+ "ajax": "ajax"
+ }'
+```
+
+### 7.3 使用 city_id 显式筛选
+
+```bash
+curl -X POST 'http://localhost:10000/api.php' \
+ -H 'Content-Type: application/json' \
+ -d '{
+ "s": "search/data_list",
+ "application": "app",
+ "application_client_type": "h5",
+ "city_id": 350205,
+ "ajax": "ajax"
+ }'
+```
+
+---
+
+## 八、相关文件
+
+| 文件路径 | 说明 |
+|---------|------|
+| `shopxo/app/plugins/vr_ticket/Hook.php` | 钩子监听,处理城市筛选逻辑 |
+| `shopxo/app/plugins/vr_ticket/service/GeoCityService.php` | 坐标转城市 ID 工具类 |
+| `shopxo/app/plugins/vr_ticket/config.json` | 插件钩子注册配置 |
+
+---
+
+## 九、版本历史
+
+| 版本 | 日期 | 说明 |
+|------|------|------|
+| v1.0.0 | 2026-06-05 | 初始版本,支持坐标城市筛选 |
+
+---
+
+## 十、联系方式
+
+- 作者:sileya-ai
+- 技术支持:vr_ticket 插件开发组
diff --git a/docs/showstart_ticketing_app.html b/docs/showstart_ticketing_app.html
new file mode 100644
index 00000000..894f1e76
--- /dev/null
+++ b/docs/showstart_ticketing_app.html
@@ -0,0 +1,1243 @@
+
+
+
+
+
+
+ VRTicket 潮流票夹 - 待核销票据
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
VRTicket 智能大脑
+
+
+
+ 本应用已完美还原图片细节(星标对齐、打孔卡、重磅时点字体),并深度接入 Gemini 2.5 Flash 实时生成与智能对话。
+
+
+
+
+ AI 快捷灵感操作
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
数据流转状态
+
+ 待核销票数(置顶):
+ {{ activeUnverifiedTickets.length }}
+
+
+ 已核销票数(下沉):
+ {{ verifiedTickets.length }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1. 星标与标题对齐方式 (星标紧贴标题)
+ 左上角星标采用 SVG 独立图层。影院标题使用 3 行固定列式布局,不产生横向和纵向挤压,彻底防止字体错位。
+
+
+ 2. 时点重磅粗体
+ 时间文字加粗为 font-black
+ 极致超粗体,并紧贴小字号日期,带来纯正的朋克排版体验。
+
+
+ 3. 已核销历史下沉
+ 已被扫码核销的卡片会自动应用半透明减噪蒙版,并下移排序到卡包的最下方,不占用首行黄金检票位。
+
+
+
+
+
+ 开发人员提示:可通过双击任何票卡,触发无感振动并一键快速模拟核销下沉。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VRTICKET 电子乘车检票凭证
+
+
+
+
+
+
+
+
{{ selectedTicket.cinema }}
+
+
{{ selectedTicket.movie }}
+
+
+
+
+
+
+ 放映时间
+ {{ selectedTicket.date }} {{ selectedTicket.time
+ }}
+
+
+ 位置信息
+ {{ selectedTicket.hall }} ({{ selectedTicket.seats.length }}张)
+
+
+
+
+
+
+
+
+
+ TIX - {{ selectedTicket.code }}
+
+
+
+
+
+
+
+
请对准影院或检票闸机扫码,由检票员销退
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/test.json b/docs/test.json
new file mode 100644
index 00000000..a70900ee
--- /dev/null
+++ b/docs/test.json
@@ -0,0 +1,897 @@
+{
+ "code": 0,
+ "msg": "success",
+ "data": {
+ "goods_id": 119,
+ "group_by": [
+ "venue",
+ "session",
+ "room",
+ "section"
+ ],
+ "tree": {
+ "venues": {
+ "测试场馆": {
+ "name": "测试场馆",
+ "sessions": {
+ "08:00-23:59": {
+ "name": "08:00-23:59",
+ "rooms": {
+ "老展厅 1": {
+ "name": "老展厅 1",
+ "sections": {
+ "A": {
+ "name": "A",
+ "seats": {
+ "1排1座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排1座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "1排1座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排2座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排2座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "1排2座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排3座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排3座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "1排3座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排4座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排4座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "1排4座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排5座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=1排5座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "1排5座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排1座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排1座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "2排1座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排2座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排2座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "2排2座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排6座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排6座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "2排6座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排7座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排7座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "2排7座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排6座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排6座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "A",
+ "seat": "3排6座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ }
+ },
+ "inventory": 10,
+ "has_available": true,
+ "min_price": 0,
+ "max_price": 0
+ },
+ "B": {
+ "name": "B",
+ "seats": {
+ "2排3座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=2排3座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "B",
+ "seat": "2排3座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排1座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排1座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "B",
+ "seat": "3排1座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排2座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排2座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "B",
+ "seat": "3排2座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排3座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排3座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "B",
+ "seat": "3排3座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排4座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排4座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "B",
+ "seat": "3排4座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排5座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=测试场馆|$vr-座位号=3排5座|$vr-演播室=老展厅 1",
+ "venue": "测试场馆",
+ "session": "08:00-23:59",
+ "room": "老展厅 1",
+ "section": "B",
+ "seat": "3排5座",
+ "price": 0,
+ "inventory": 1,
+ "original_price": 0
+ }
+ },
+ "inventory": 6,
+ "has_available": true,
+ "min_price": 0,
+ "max_price": 0
+ }
+ },
+ "inventory": 16,
+ "has_available": true,
+ "min_price": 0,
+ "max_price": 0
+ }
+ },
+ "inventory": 16,
+ "has_available": true,
+ "min_price": 0,
+ "max_price": 0
+ }
+ },
+ "inventory": 16,
+ "has_available": true,
+ "min_price": 0,
+ "max_price": 0
+ },
+ "万达国际电影城(朝阳国贸店)": {
+ "name": "万达国际电影城(朝阳国贸店)",
+ "sessions": {
+ "08:00-23:59": {
+ "name": "08:00-23:59",
+ "rooms": {
+ "主要展厅": {
+ "name": "主要展厅",
+ "sections": {
+ "A": {
+ "name": "A",
+ "seats": {
+ "1排1座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排1座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "1排1座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排2座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排2座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "1排2座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排4座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排4座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "1排4座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "1排5座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=1排5座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "1排5座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排1座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排1座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "2排1座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排2座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排2座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "2排2座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排4座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排4座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "2排4座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "2排5座": {
+ "spec_key": "$vr-分区=A|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排5座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "A",
+ "seat": "2排5座",
+ "price": 999,
+ "inventory": 1,
+ "original_price": 0
+ }
+ },
+ "inventory": 8,
+ "has_available": true,
+ "min_price": 999,
+ "max_price": 999
+ },
+ "B": {
+ "name": "B",
+ "seats": {
+ "2排3座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=2排3座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "B",
+ "seat": "2排3座",
+ "price": 299,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排1座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排1座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "B",
+ "seat": "3排1座",
+ "price": 299,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排2座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排2座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "B",
+ "seat": "3排2座",
+ "price": 299,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排3座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排3座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "B",
+ "seat": "3排3座",
+ "price": 299,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排4座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排4座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "B",
+ "seat": "3排4座",
+ "price": 299,
+ "inventory": 1,
+ "original_price": 0
+ },
+ "3排5座": {
+ "spec_key": "$vr-分区=B|$vr-场次=08:00-23:59|$vr-场馆=万达国际电影城(朝阳国贸店)|$vr-座位号=3排5座|$vr-演播室=主要展厅",
+ "venue": "万达国际电影城(朝阳国贸店)",
+ "session": "08:00-23:59",
+ "room": "主要展厅",
+ "section": "B",
+ "seat": "3排5座",
+ "price": 299,
+ "inventory": 1,
+ "original_price": 0
+ }
+ },
+ "inventory": 6,
+ "has_available": true,
+ "min_price": 299,
+ "max_price": 299
+ }
+ },
+ "inventory": 14,
+ "has_available": true,
+ "min_price": 299,
+ "max_price": 999
+ }
+ },
+ "inventory": 14,
+ "has_available": true,
+ "min_price": 299,
+ "max_price": 999
+ }
+ },
+ "inventory": 14,
+ "has_available": true,
+ "min_price": 299,
+ "max_price": 999
+ }
+ },
+ "sessions": [],
+ "rooms": [],
+ "sections": []
+ },
+ "seat_templates": {
+ "测试场馆_老展厅 1_A": {
+ "template_key": "测试场馆_老展厅 1_A",
+ "name": "测试场馆",
+ "room_name": "老展厅 1",
+ "section_name": "A",
+ "seat_map": {
+ "venue": {
+ "name": "一个测试场馆信息",
+ "address": "嘉庚体育馆",
+ "location": {
+ "lng": "",
+ "lat": ""
+ },
+ "images": [
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s",
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s"
+ ]
+ },
+ "rooms": [
+ {
+ "name": "老展厅 1",
+ "map": [
+ "AAAAA",
+ "AAB__AA",
+ "BBBBBA"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ },
+ "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad"
+ }
+ ]
+ },
+ "rooms": [
+ {
+ "name": "老展厅 1",
+ "map": [
+ "AAAAA",
+ "AAB__AA",
+ "BBBBBA"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ },
+ "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad"
+ }
+ ],
+ "layout_cols": 10,
+ "layout_rows": 10
+ },
+ "测试场馆_老展厅 1_B": {
+ "template_key": "测试场馆_老展厅 1_B",
+ "name": "测试场馆",
+ "room_name": "老展厅 1",
+ "section_name": "B",
+ "seat_map": {
+ "venue": {
+ "name": "一个测试场馆信息",
+ "address": "嘉庚体育馆",
+ "location": {
+ "lng": "",
+ "lat": ""
+ },
+ "images": [
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSYCSihMSLyWjofZ9zgb-CKfhZKckvioKSAeA&s",
+ "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQvditAZptaXNoJB9auyNWggC7_F_r19MAE8Q&s"
+ ]
+ },
+ "rooms": [
+ {
+ "name": "老展厅 1",
+ "map": [
+ "AAAAA",
+ "AAB__AA",
+ "BBBBBA"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ },
+ "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad"
+ }
+ ]
+ },
+ "rooms": [
+ {
+ "name": "老展厅 1",
+ "map": [
+ "AAAAA",
+ "AAB__AA",
+ "BBBBBA"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 0,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 0,
+ "color": "#1677ff"
+ }
+ },
+ "id": "69e5b802-c71e-4cc2-437f-2f1ef5f6afad"
+ }
+ ],
+ "layout_cols": 10,
+ "layout_rows": 10
+ },
+ "万达国际电影城(朝阳国贸店)_主要展厅_A": {
+ "template_key": "万达国际电影城(朝阳国贸店)_主要展厅_A",
+ "name": "万达国际电影城(朝阳国贸店)",
+ "room_name": "主要展厅",
+ "section_name": "A",
+ "seat_map": {
+ "venue": {
+ "name": "北京市朝阳区万达国际电影城",
+ "address": "中国北京市朝阳区国贸建国路93号",
+ "location": {
+ "lng": "116.471099",
+ "lat": "39.907398"
+ },
+ "images": [
+ "https://www.ruyifilm.com/image/20190101/W020160119569970428777.jpg",
+ "https://www.ruyifilm.com/image/20190101/W020160119569970447104.jpg"
+ ],
+ "notices": {
+ "buy": [],
+ "watch": [],
+ "service": [
+ {
+ "title": "近视镜",
+ "desc": "近视观众请自备近视眼镜",
+ "status": "warning"
+ }
+ ]
+ }
+ },
+ "rooms": [
+ {
+ "name": "主要展厅",
+ "map": [
+ "AA_AA",
+ "AABAA",
+ "BBBBB"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ },
+ "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47"
+ }
+ ]
+ },
+ "rooms": [
+ {
+ "name": "主要展厅",
+ "map": [
+ "AA_AA",
+ "AABAA",
+ "BBBBB"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ },
+ "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47"
+ }
+ ],
+ "layout_cols": 10,
+ "layout_rows": 10
+ },
+ "万达国际电影城(朝阳国贸店)_主要展厅_B": {
+ "template_key": "万达国际电影城(朝阳国贸店)_主要展厅_B",
+ "name": "万达国际电影城(朝阳国贸店)",
+ "room_name": "主要展厅",
+ "section_name": "B",
+ "seat_map": {
+ "venue": {
+ "name": "北京市朝阳区万达国际电影城",
+ "address": "中国北京市朝阳区国贸建国路93号",
+ "location": {
+ "lng": "116.471099",
+ "lat": "39.907398"
+ },
+ "images": [
+ "https://www.ruyifilm.com/image/20190101/W020160119569970428777.jpg",
+ "https://www.ruyifilm.com/image/20190101/W020160119569970447104.jpg"
+ ],
+ "notices": {
+ "buy": [],
+ "watch": [],
+ "service": [
+ {
+ "title": "近视镜",
+ "desc": "近视观众请自备近视眼镜",
+ "status": "warning"
+ }
+ ]
+ }
+ },
+ "rooms": [
+ {
+ "name": "主要展厅",
+ "map": [
+ "AA_AA",
+ "AABAA",
+ "BBBBB"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ },
+ "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47"
+ }
+ ]
+ },
+ "rooms": [
+ {
+ "name": "主要展厅",
+ "map": [
+ "AA_AA",
+ "AABAA",
+ "BBBBB"
+ ],
+ "sections": [
+ {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ ],
+ "seats": {
+ "A": {
+ "char": "A",
+ "name": "VIP区",
+ "price": 999,
+ "color": "#ff4d4f"
+ },
+ "B": {
+ "char": "B",
+ "name": "普通区",
+ "price": 299,
+ "color": "#1677ff"
+ }
+ },
+ "id": "6a03d61e-25bc-eb5c-467a-9077b5f26e47"
+ }
+ ],
+ "layout_cols": 10,
+ "layout_rows": 10
+ }
+ },
+ "session_meta": [
+ {
+ "session": "08:00-23:59",
+ "start": "08:00",
+ "end": "23:59",
+ "session_date": "2026-05-18",
+ "session_datetime": "2026-05-18 08:00:00",
+ "batch_expire_ts": 1779062100
+ }
+ ],
+ "peer_goods": [
+ {
+ "id": 116,
+ "title": "测试3",
+ "date": ""
+ },
+ {
+ "id": 117,
+ "title": "测试4",
+ "date": ""
+ },
+ {
+ "id": 118,
+ "title": "测试测试「XXXX」巡演",
+ "date": "2026-05-22"
+ }
+ ],
+ "meta": {
+ "seat_count": 30,
+ "template_count": 4,
+ "cache_hit": true,
+ "computed_at": 1779125108
+ }
+ }
+}
\ No newline at end of file