docs: 新增城市筛选API文档 + showstart票务参考 + 测试数据

- docs/api/vr-ticket-city-filter-api.md: 城市筛选完整API文档(参数说明/筛选逻辑/调试示例)
- docs/showstart_ticketing_app.html: showstart票务app界面参考
- docs/test.json: 测试数据
master
Council 2026-06-12 00:56:40 +08:00
parent 1b4e4a5db8
commit 8f2960576c
3 changed files with 2396 additions and 0 deletions

View File

@ -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 插件开发组

File diff suppressed because it is too large Load Diff

897
docs/test.json Normal file
View File

@ -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
}
}
}