docs: 新增城市筛选API文档 + showstart票务参考 + 测试数据
- docs/api/vr-ticket-city-filter-api.md: 城市筛选完整API文档(参数说明/筛选逻辑/调试示例) - docs/showstart_ticketing_app.html: showstart票务app界面参考 - docs/test.json: 测试数据master
parent
1b4e4a5db8
commit
8f2960576c
|
|
@ -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
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue