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 潮流票夹 - 待核销票据 + + + + + + + + + + + + +
+ + + + + +
+ + +
+ 15:40 +
+
+ + + + 5G +
+
+
+
+
+ + +
+ + +
+ + +
+ +
+
+
+
+ + + + + + + + + + + +
+
+
+
+
+
+
+
+
+
+ + +
+
+
+
+
+
+
+
+
+ + +
+ + + + + +
+ + +
+ live + + music + + in +
+
+ vrticket +
+ + +
+ + + + + VRTICKET • VRTICKET • VRTICKET • VRTICKET • + + + + + + + + + + +
+ VRTICKET +
+
+
+ + +
+ + +
+

待核销票据

+
+ + {{ + activeUnverifiedTickets.length }} + 张票 +
+
+ + +
+
+ +
+
+
+ + +
+
+
+ + +
+ + +
+
+ + + +
+ 大悦城电影院 +
+
+ + +
+ + +
+
+ + +
+ +
+

{{ ticket.movie + }}

+

{{ ticket.format }}

+ + +
{{ ticket.date }} +
+
{{ ticket.time }} +
+ + +
+ +
+ VIP +
+
+
{{ ticket.hall }}
+
+ {{ seat + }} +
+
+
+
+ + +
+ +
+
+ +
+ 2D +
+ +
+ {{ ticket.posterAbbr + || '水门桥' }} + {{ + ticket.posterEn || 'THE BATTLE AT LAKE' }} +
+
+ +
+ +
+
+
+ + +
+ 🎉 +

暂无待核销票据

+

所有票券均已完美核销,已下沉至底部

+
+ + +
+
+ 已核销票券历史 ({{ + verifiedTickets.length }}) + +
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+ {{ ticket.cinema }} +
+

{{ ticket.movie }}

+
{{ ticket.date }} | {{ ticket.time }}
+
+ + +
+ 已通过 PASSED +
+
+
+
+
+
+ + +
+
+
+ + +
+
+
+

VRTicket AI 秘僚

+

GEMINI 2.5 FLASH POWERED

+
+ +
+ + +
+ +
+

👋 你好!我是你的 VRTicket 潮流票务助手。

+

+ 你可以用任何自然语言向我提问,或者尝试让我“帮你订一张下周六去上海看周杰伦演唱会的票”,我会实时为你出票并导入到本机的钱包票夹中!

+
+ +
+
+
+ +
+ +
+
+
+ + +
+
+ + Gemini 正在精细计算中... +
+
+
+ + +
+ + + +
+ + +
+ + +
+
+ + +
+
+

潮流周边店

+

VRTICKET CREATIVE HUB

+
+ +
+
+
+ 💿
+
VRTicket 极简黑胶挂盘
+
+ ¥129 + +
+
+ +
+
+ 🎒
+
星宿多功能户外斜跨包
+
+ ¥199 + +
+
+
+
+ + +
+
+
🛹 +
+
+

极客探票员

+

ID: 8291038291

+
+
+ +
+
密钥设定 (如需使用个人 Gemini 密钥)
+
+ + +
+
+ +
+ VRTicket v2.6.5 Pro Mobile Edition
© 2026 VRTicket Lab. All rights reserved. +
+
+ +
+ + +
+ + + + + + + + + + + +
+ +
+ + + + + +
+
+
+

手动录入自定义票据

+ +
+ +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + VRTICKET 电子乘车检票凭证 +
+ +
+ + +
+
+
{{ selectedTicket.cinema }} +
+

{{ selectedTicket.movie }}

+
+ {{ selectedTicket.format }} +
+
+ + +
+
+ 放映时间 + {{ 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