对齐讲解业务单元静态数据口径

- 刷新讲解静态数据包并保留完整 outline 树
- 按后台顶层业务单元口径归并讲解点统计
- 更新讲解静态数据刷新操作文档

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
lyf
2026-07-03 02:05:02 +08:00
parent 0cd8d43684
commit c146beba9e
14 changed files with 12266 additions and 8796 deletions

View File

@@ -0,0 +1,352 @@
# 讲解业务静态数据包更新操作文档
本文固化 `frontend-miniapp` 项目中“讲解”业务静态数据包的检查与更新流程。操作范围覆盖讲解展厅、后台讲解树业务单元、讲解点、讲解内容、音频内容元数据以及讲解到位置预览的关联数据不扩展到馆内导览模型、路线图、Tencent 地图或小程序专项构建。
## 适用范围
- 项目目录:`E:\MyWork\深圳国际艺术馆\museum-guide\museum-guide-v4.0\frontend-miniapp`
- 静态包目录:`static/guide-data`
- 导出脚本:`scripts/export-guide-static-data.py`
- 达梦数据库服务器:`1.92.206.90`
- 后端数据库配置来源:`E:\MyWork\深圳国际艺术馆\智慧导览\smart-navigation-system\yudao-server\src\main\resources\application-local.yaml`
- 当前 nav-assets 包:`static/nav-assets/codex_nav_20260621_175310_museum_default_centerline_finalxy`
不要在文档、提交信息或终端输出中记录数据库密码。脚本从后端本地配置读取连接信息,操作文档只记录配置文件路径。
## 讲解业务数据源结论
讲解内容数据源由 `VITE_GUIDE_CONTENT_SOURCE_MODE` 控制,共 3 个模式:
- `static`:默认模式,读取 `static/guide-data` 静态包。
- `remote`:后端接口模式,`BackendExplainContentProvider` 加载后端搜索、详情、展厅和讲解点接口,并保留静态兜底。
- `mock`:开发环境显式 mock仅在 `import.meta.env.DEV` 下启用。
代码入口:
- `src/config/dataSource.ts`
- `src/data/providers/staticMuseumContentProvider.ts`
- `src/data/providers/staticGuideDataProvider.ts`
- `src/data/providers/backendExplainContentProvider.ts`
- `src/data/adapters/guideDataAdapter.ts`
- `src/repositories/ExplainRepository.ts`
- `src/repositories/MediaRepository.ts`
音频播放解析还有独立后端 API
- `src/repositories/AudioPlayInfoRepository.ts`
- `src/repositories/PublishedExhibitAudioRepository.ts`
该音频 API 用于播放地址、讲解词正文和目标解析,不等同于讲解列表/内容静态包数据源。
## 业务单元口径
后台管理端 `http://1.92.206.90:3001/guide/exhibits` 的讲解树使用后端接口:
```text
GET /guide/exhibits/tree
GET /guide/exhibits/tree/{nodeId}/children
```
后端实现位于:
```text
E:\MyWork\深圳国际艺术馆\智慧导览\smart-navigation-system\yudao-module-gis\src\main\java\cn\iocoder\yudao\module\gis\controller\admin\guide\V2ExhibitTreeController.java
```
该接口的业务单元来源是 `NATURE_SGS.SGS_EXHIBIT_OUTLINE`,不是 `SGS_EXHIBITION_UNIT`。后台树的关键口径:
- 展厅节点来自 `SGS_EXHIBITION_HALL`
- 业务单元来自展厅下的顶层 `SGS_EXHIBIT_OUTLINE`,即 `outline.parentId == hall.id`
- 统计讲解点时,讲解点可归并到所属顶层业务单元;如果顶层业务单元下没有有效讲解点,也仍然显示为业务单元。
- 因此 `outlines.json` 必须保留完整 `SGS_EXHIBIT_OUTLINE` 树,不能再过滤为“有讲解点引用的 outline 子集”。
前端静态 adapter 的对应口径:
- `businessUnitCount`:展厅下顶层、未删除的 outline 数量。
- `guideStopCount`:这些顶层 outline 及其后代下未删除讲解点数量。
- 空业务单元保留展示,`guideStopCount = 0`
当前用于回归的人类厅示例:
```text
人类厅5 个业务单元 · 38 个讲解点
```
其中:
- 第一单元什么是灵长类27 个讲解点
- 第二单元猿与猴5 个讲解点
- 第三单元丛林远足6 个讲解点
- 第四单元与巨兽同行0 个讲解点
- 第五单元从燧石到硅基0 个讲解点
## 静态包文件边界
讲解首页、讲解展厅、业务单元、讲解点、详情、位置预览和媒体可用状态由以下文件共同生成:
- `manifest.json`
- `halls.json`
- `outlines.json`
- `guide-stops.json`
- `guide-contents.json`
- `poi-bridge.json`
同一目录下的 `exhibits.json``pois.json``indexes.json` 也应随导出一并保持一致。虽然它们不都是讲解主列表的直接输入但会参与详情兜底、内容关联、POI 桥接和索引一致性。不要只覆盖单个 JSON避免 manifest、索引和桥接统计不一致。
注意:
- `outlines.json` 是完整后台讲解树,不是用户端“可播放讲解点”的子集。
- `indexes.outlinesByHallId` 包含展厅下所有后代 outline用于索引和详情关联用户端业务单元数量不要直接用该数组长度应由 adapter 取顶层 outline 计算。
## 操作前检查
确认依赖可用:
```powershell
python -c "import importlib.util; print('pyodbc', bool(importlib.util.find_spec('pyodbc'))); print('yaml', bool(importlib.util.find_spec('yaml')))"
Get-OdbcDriver | Where-Object { $_.Name -like '*DM*' -or $_.Name -like '*Dameng*' } | Select-Object Name,Platform | Format-List
```
预期:
- `pyodbc True`
- `yaml True`
- 存在 `DM8 ODBC DRIVER`
确认 nav-assets 包存在:
```powershell
Test-Path 'static\nav-assets\codex_nav_20260621_175310_museum_default_centerline_finalxy\app_nav_manifest.json'
Test-Path 'static\nav-assets\codex_nav_20260621_175310_museum_default_centerline_finalxy\data\poi_all.json'
```
预期均为 `True`
## 导出静态包
优先直接使用后端原配置导出。脚本会读取配置中的达梦连接信息,不需要把含密码配置复制到项目目录:
```powershell
$repo = 'E:\MyWork\深圳国际艺术馆\museum-guide\museum-guide-v4.0\frontend-miniapp'
$sourceConfig = 'E:\MyWork\深圳国际艺术馆\智慧导览\smart-navigation-system\yudao-server\src\main\resources\application-local.yaml'
$navAssets = Join-Path $repo 'static\nav-assets\codex_nav_20260621_175310_museum_default_centerline_finalxy'
Set-Location $repo
python 'scripts\export-guide-static-data.py' `
--config $sourceConfig `
--output 'static\guide-data' `
--nav-assets $navAssets
```
成功输出示例:
```text
Exported sgs-guide-static/v1 to ...\static\guide-data
Counts: {"exhibits": 4700, "guide-contents": 717, "guide-stops": 391, "halls": 8, "outlines": 250, "pois": 2244}
Bridge: {"hallBridgeCount": 8, "navPoiCount": 298, "sgsPoiBridgeCount": 876, "sgsPoiCandidateCount": 13}
```
异常时不要手动编辑单个 JSON先排查数据库连接、ODBC 驱动、schema 或 nav-assets 路径。
## SSH 隧道兜底方案
如果当前网络不能直连 `1.92.206.90:5237`,再使用 SSH 隧道。SSH 密钥路径:
```text
E:\MyWork\深圳自然馆\服务器信息\KeyPair-c006.pem
```
确认 SSH 能登录服务器:
```powershell
ssh -i 'E:\MyWork\深圳自然馆\服务器信息\KeyPair-c006.pem' -o BatchMode=yes -o StrictHostKeyChecking=accept-new -o ConnectTimeout=10 root@1.92.206.90 hostname
```
确认本地转发端口空闲:
```powershell
Get-NetTCPConnection -LocalPort 15237 -ErrorAction SilentlyContinue | Select-Object LocalAddress,LocalPort,State,OwningProcess
```
启动本地端口转发:
```powershell
$sshArgs = @(
'-i', 'E:\MyWork\深圳自然馆\服务器信息\KeyPair-c006.pem',
'-o', 'BatchMode=yes',
'-o', 'ExitOnForwardFailure=yes',
'-o', 'StrictHostKeyChecking=accept-new',
'-N',
'-L', '127.0.0.1:15237:127.0.0.1:5237',
'root@1.92.206.90'
)
$tunnel = Start-Process -FilePath 'ssh' -ArgumentList $sshArgs -WindowStyle Hidden -PassThru
Start-Sleep -Seconds 3
$tunnel.Id
```
确认隧道可用:
```powershell
Test-NetConnection 127.0.0.1 -Port 15237 | Select-Object ComputerName,RemotePort,TcpTestSucceeded | Format-List
```
创建临时配置。临时配置只把 JDBC 地址从服务器地址替换为本地隧道地址,不修改原后端配置文件,也不要写入项目目录:
```powershell
$repo = 'E:\MyWork\深圳国际艺术馆\museum-guide\museum-guide-v4.0\frontend-miniapp'
$sourceConfig = 'E:\MyWork\深圳国际艺术馆\智慧导览\smart-navigation-system\yudao-server\src\main\resources\application-local.yaml'
$tmpRoot = Join-Path $env:TEMP ('sgs-explain-export-' + (Get-Date -Format 'yyyyMMddHHmmss'))
New-Item -ItemType Directory -Path $tmpRoot | Out-Null
$tmpConfig = Join-Path $tmpRoot 'application-local-tunnel.yaml'
(Get-Content -Raw -LiteralPath $sourceConfig).Replace('jdbc:dm://1.92.206.90:5237','jdbc:dm://127.0.0.1:15237') | Set-Content -LiteralPath $tmpConfig -Encoding UTF8
```
导出到项目静态包:
```powershell
Set-Location $repo
python 'scripts\export-guide-static-data.py' `
--config $tmpConfig `
--output 'static\guide-data' `
--nav-assets 'static\nav-assets\codex_nav_20260621_175310_museum_default_centerline_finalxy'
```
导出通过本地隧道完成时,脚本会在 `manifest.json` 记录 `127.0.0.1:15237` 和临时配置路径。提交前应改回真实来源:
```json
"source": {
"type": "dameng",
"host": "1.92.206.90",
"port": "5237",
"schema": "NATURE_SGS",
"configPath": "E:\\MyWork\\深圳国际艺术馆\\智慧导览\\smart-navigation-system\\yudao-server\\src\\main\\resources\\application-local.yaml"
}
```
## 校验
JSON 与 `rowCount` 校验:
```powershell
node -e "const fs=require('fs'); const dir='static/guide-data'; const m=JSON.parse(fs.readFileSync(dir+'/manifest.json','utf8')); for (const f of Object.values(m.files)) { const j=JSON.parse(fs.readFileSync(dir+'/'+f,'utf8')); if (j.rows && typeof j.rowCount==='number' && j.rows.length!==j.rowCount) throw new Error(f+' rowCount mismatch'); } console.log(JSON.stringify({generatedAt:m.generatedAt,counts:m.counts,bridgeStats:m.bridgeStats,source:m.source},null,2));"
```
讲解内容和音频 URL 数量检查:
```powershell
node -e "const fs=require('fs'); const m=JSON.parse(fs.readFileSync('static/guide-data/manifest.json','utf8')); const g=JSON.parse(fs.readFileSync('static/guide-data/guide-contents.json','utf8')); const playable=g.rows.filter(r=>r.standardAudioUrl||r.extendedAudioUrl||r.audioUrl||r.standardAudioUrlEn||r.extendedAudioUrlEn).length; console.log(JSON.stringify({generatedAt:m.generatedAt,counts:m.counts,bridgeStats:m.bridgeStats,guideContentsRowCount:g.rowCount,guideContentsWithAudioUrl:playable},null,2));"
```
业务单元口径回归校验。人类厅应为 5 个业务单元、38 个有效讲解点:
```powershell
$script = @'
const fs = require('fs')
const dir = 'static/guide-data'
const halls = JSON.parse(fs.readFileSync(dir + '/halls.json', 'utf8')).rows
const outlines = JSON.parse(fs.readFileSync(dir + '/outlines.json', 'utf8')).rows
const stops = JSON.parse(fs.readFileSync(dir + '/guide-stops.json', 'utf8')).rows
const human = halls.find((h) => h.name === '人类厅')
const hallIds = new Set(halls.filter((h) => !(h.deleted === 1 || h.deleted === true || h.deleted === '1')).map((h) => String(h.id)))
const outlineById = new Map(outlines.filter((o) => !(o.deleted === 1 || o.deleted === true || o.deleted === '1')).map((o) => [String(o.id), o]))
const topOutlines = outlines.filter((o) => String(o.parentId) === String(human.id) && !(o.deleted === 1 || o.deleted === true || o.deleted === '1'))
const topForStop = (stop) => {
let current = outlineById.get(String(stop.outlineId))
for (let guard = 0; current && guard < 16; guard++) {
const parentId = String(current.parentId)
if (hallIds.has(parentId)) return current
current = outlineById.get(parentId)
}
}
const visibleStops = stops.filter((s) => !(s.deleted === 1 || s.deleted === true || s.deleted === '1'))
const units = topOutlines.map((u) => ({ id: String(u.id), name: u.name, guideStopCount: visibleStops.filter((s) => String(topForStop(s)?.id) === String(u.id)).length }))
if (units.length !== 5) throw new Error('人类厅业务单元数量不为 5: ' + units.length)
const guideStopCount = units.reduce((sum, u) => sum + u.guideStopCount, 0)
if (guideStopCount !== 38) throw new Error('人类厅讲解点数量不为 38: ' + guideStopCount)
console.log(JSON.stringify({ hall: '人类厅', businessUnitCount: units.length, guideStopCount, units }, null, 2))
'@
$script | node
```
最小代码边界校验:
```powershell
pnpm type-check
```
如果本次仅更新静态 JSON一般不需要运行 `pnpm build:h5`,因为它会写入 `dist`。若同时改了读取逻辑、adapter、repository 或 UI再补充
```powershell
pnpm lint
pnpm build:h5
```
## 关闭隧道
仅在使用 SSH 隧道兜底时需要执行。用启动隧道时返回的进程 ID 关闭:
```powershell
Stop-Process -Id <tunnel-process-id> -ErrorAction SilentlyContinue
Start-Sleep -Seconds 1
Get-NetTCPConnection -LocalPort 15237 -ErrorAction SilentlyContinue | Select-Object LocalAddress,LocalPort,State,OwningProcess
```
预期:没有残留监听。
## 2026-07-02 最新更新记录
本次使用后端原始配置连接 `1.92.206.90` 达梦数据库,导出并更新 `static/guide-data`
更新后关键统计:
- `halls`: `8`
- `outlines`: `250`
- `guide-stops`: `391`
- `exhibits`: `4700`
- `guide-contents`: `717`
- `pois`: `2244`
- `sgsPoiBridgeCount`: `876`
- `sgsPoiCandidateCount`: `13`
- 有音频 URL 的讲解内容:`382`
业务单元口径修正:
- `outlines.json` 恢复完整 `SGS_EXHIBIT_OUTLINE` 树,不再裁剪到 28 条。
- 前端 adapter 改为按展厅下顶层 outline 生成业务单元,空业务单元也保留。
- 人类厅回归结果:`5 个业务单元 · 38 个讲解点`
更新文件:
- `scripts/export-guide-static-data.py`
- `src/data/adapters/guideDataAdapter.ts`
- `static/guide-data/README.md`
- `static/guide-data/exhibits.json`
- `static/guide-data/guide-contents.json`
- `static/guide-data/guide-stops.json`
- `static/guide-data/halls.json`
- `static/guide-data/indexes.json`
- `static/guide-data/manifest.json`
- `static/guide-data/outlines.json`
- `static/guide-data/poi-bridge.json`
- `static/guide-data/pois.json`
已完成校验:
- JSON 全量解析通过。
- `rowCount``rows.length` 一致。
- 人类厅业务单元回归校验通过。
- `pnpm type-check` 通过。
- `pnpm lint` 通过。
- `pnpm build:h5` 通过。
## 常见风险
- 不要直接读取或改写 `src/assets/data`,该目录是历史 demo 数据。
- 不要把 `remote``mock` 模式误判为当前默认生产数据源;默认是 `static`
- 不要只更新 `guide-contents.json`,否则 `manifest``indexes``poi-bridge` 可能与内容数据不一致。
- 不要把本地隧道地址提交到 `manifest.json`
- 不要把 `outlines.json` 过滤成只有讲解点引用的子集;后台业务单元需要完整 outline 树和顶层 outline 口径。
- 不要用 `indexes.outlinesByHallId.length` 当作用户端业务单元数量,该索引包含所有后代 outline。
- 不要因为 `poi-bridge.json` 增加了位置关联就宣称已支持正式路线规划;当前用户侧仍应按位置预览能力表述。
- 不要在文档、日志或提交中复制数据库密码、MinIO 密钥、微信密钥等敏感配置。

View File

@@ -496,8 +496,10 @@ def export_package(config_path: Path, output_dir: Path, nav_assets_dir: Path) ->
output_dir.mkdir(parents=True, exist_ok=True)
data: dict[str, list[dict[str, Any]]] = {}
for table, file_stem in TABLES.items():
rows = fetch_table(connection, schema, table)
data[file_stem] = rows
data[file_stem] = fetch_table(connection, schema, table)
for table, file_stem in TABLES.items():
rows = data[file_stem]
write_json(
output_dir / f"{file_stem}.json",
{

View File

@@ -1,4 +1,6 @@
import type {
ExplainBusinessUnit,
ExplainGuideStop,
ExplainTrack,
GuideLocationResolution,
GuideLocationResolutionStatus,
@@ -17,6 +19,7 @@ import type {
GuideStaticContentPayload,
GuideStaticDataset,
GuideStaticExplainDataset,
GuideStaticExplainNavigationDataset,
GuideStaticExhibitPayload,
GuideStaticHallPayload,
GuideStaticOutlinePayload,
@@ -32,11 +35,20 @@ export interface GuideContentDataAdapterResult {
mediaAssets: MediaAsset[]
}
export interface GuideExplainNavigationAdapterResult {
halls: MuseumHall[]
guideStops: ExplainGuideStop[]
businessUnitsByHallId: Record<string, ExplainBusinessUnit[]>
}
export interface GuideExplainDataAdapterResult {
halls: MuseumHall[]
exhibits: MuseumExhibit[]
tracks: ExplainTrack[]
mediaAssets: MediaAsset[]
guideStops: ExplainGuideStop[]
businessUnitsByHallId: Record<string, ExplainBusinessUnit[]>
exhibitByStopId: Record<string, MuseumExhibit>
}
const stringifyId = (value: string | number | null | undefined) => (
@@ -239,6 +251,176 @@ const toHallModels = (
}
})
const toExplainBusinessUnitsByHallId = (
stops: ExplainGuideStop[],
topOutlines: Array<{ id: string; name: string; hallId: string; sort?: number }> = []
) => {
const unitsByHallId: Record<string, ExplainBusinessUnit[]> = {}
const stopGroupsByHall = new Map<string, Map<string, ExplainGuideStop[]>>()
const unitNameByKey = new Map<string, string>()
const unitOrderByKey = new Map<string, number>()
topOutlines.forEach((outline) => {
const hallGroups = stopGroupsByHall.get(outline.hallId) || new Map<string, ExplainGuideStop[]>()
if (!hallGroups.has(outline.id)) {
hallGroups.set(outline.id, [])
}
stopGroupsByHall.set(outline.hallId, hallGroups)
unitNameByKey.set(`${outline.hallId}:${outline.id}`, outline.name)
unitOrderByKey.set(`${outline.hallId}:${outline.id}`, outline.sort ?? 0)
})
stops
.slice()
.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0))
.forEach((stop) => {
const hallId = stop.hallId || ''
if (!hallId) return
const unitId = stop.outlineId || `ungrouped-${hallId}`
const unitName = stop.outlineName || '其他讲解'
const hallGroups = stopGroupsByHall.get(hallId) || new Map<string, ExplainGuideStop[]>()
const groupStops = hallGroups.get(unitId) || []
groupStops.push(stop)
hallGroups.set(unitId, groupStops)
stopGroupsByHall.set(hallId, hallGroups)
if (!unitNameByKey.has(`${hallId}:${unitId}`)) {
unitNameByKey.set(`${hallId}:${unitId}`, unitName)
}
if (!unitOrderByKey.has(`${hallId}:${unitId}`)) {
unitOrderByKey.set(`${hallId}:${unitId}`, stop.sort ?? 0)
}
})
stopGroupsByHall.forEach((groupMap, hallId) => {
unitsByHallId[hallId] = Array.from(groupMap.entries())
.map(([unitId, groupStops]) => ({
id: unitId,
name: unitNameByKey.get(`${hallId}:${unitId}`) || '其他讲解',
hallId,
guideStopCount: groupStops.length,
stops: groupStops
}))
.sort((a, b) => (
(unitOrderByKey.get(`${hallId}:${a.id}`) ?? 0) - (unitOrderByKey.get(`${hallId}:${b.id}`) ?? 0)
))
})
return unitsByHallId
}
const createExplainNavigationAdapter = (
dataset: GuideStaticExplainNavigationDataset,
hallGuideCounts = new Map<string, number>(),
poiBridge: {
hallToNavPoiId?: Record<string, GuideStaticPoiBridgeEntryPayload>
sgsPoiToNavPoiId?: Record<string, GuideStaticPoiBridgeEntryPayload>
} = {}
): GuideExplainNavigationAdapterResult => {
const visibleHalls = visibleHallsFrom(dataset.halls)
const visibleOutlines = visibleOutlinesFrom(dataset.outlines)
const visibleStops = visibleStopsFrom(dataset.guideStops)
const hallById = new Map(visibleHalls.map((hall) => [stringifyId(hall.id), hall]))
const outlineById = new Map(visibleOutlines.map((outline) => [stringifyId(outline.id), outline]))
const hallBridgeById = poiBridge.hallToNavPoiId || {}
const sgsPoiBridgeById = poiBridge.sgsPoiToNavPoiId || {}
const findHallForOutline = (outline: GuideStaticOutlinePayload | undefined) => {
let current = outline
let guard = 0
while (current && guard < 16) {
const parentId = stringifyId(current.parentId)
if (parentId && hallById.has(parentId)) {
return hallById.get(parentId)
}
current = parentId ? outlineById.get(parentId) : undefined
guard += 1
}
return undefined
}
const findHallForStop = (stop: GuideStaticStopPayload | undefined) => (
findHallForOutline(outlineById.get(stringifyId(stop?.outlineId)))
)
const findTopOutlineForStop = (stop: GuideStaticStopPayload | undefined) => {
let current = outlineById.get(stringifyId(stop?.outlineId))
let guard = 0
while (current && guard < 16) {
const parentId = stringifyId(current.parentId)
if (parentId && hallById.has(parentId)) {
return current
}
current = parentId ? outlineById.get(parentId) : undefined
guard += 1
}
return outlineById.get(stringifyId(stop?.outlineId))
}
const topOutlines = visibleOutlines.flatMap((outline) => {
const id = stringifyId(outline.id)
const parentId = stringifyId(outline.parentId)
if (!id || !parentId || !hallById.has(parentId)) return []
return [{
id,
name: outline.name || `业务单元 ${id}`,
hallId: parentId,
sort: typeof outline.sort === 'number' ? outline.sort : undefined
}]
})
const resolveHallLocation = (hall: GuideStaticHallPayload | undefined) => {
const hallId = stringifyId(hall?.id)
const sourcePoiId = stringifyId(hall?.poiId)
const bridgedHall = hallId ? toLocationResolution(hallBridgeById[hallId], 'exact', sourcePoiId) : undefined
if (bridgedHall) return bridgedHall
return sourcePoiId ? toLocationResolution(sgsPoiBridgeById[sourcePoiId], 'exact', sourcePoiId) : undefined
}
const halls = toHallModels(visibleHalls, hallGuideCounts, hallBridgeById, sgsPoiBridgeById)
const guideStops: ExplainGuideStop[] = visibleStops.map((stop) => {
const topOutline = findTopOutlineForStop(stop)
const hall = findHallForStop(stop)
const location = resolveHallLocation(hall)
const floorId = location?.floorId || formatFloorId(hall, undefined) || stop.floorCode || stringifyId(stop.floorId)
return {
id: stringifyId(stop.id) || '',
name: firstText(stop.name) || `讲解点 ${stringifyId(stop.id) || ''}`,
hallId: stringifyId(hall?.id),
hallName: hall?.name || undefined,
floorId,
targetType: 'STOP',
targetId: stringifyId(stop.id) || '',
coverImageUrl: resolveImage(stop.coverImageUrl, hall?.coverImageUrl, hall?.galleryUrls),
description: firstText(stop.name),
hasAudio: Boolean(stop.audioUrl),
poiId: location?.poiId,
outlineId: stringifyId(topOutline?.id),
outlineName: topOutline?.name || undefined,
sort: typeof stop.sort === 'number' ? stop.sort : undefined
}
})
return {
halls,
guideStops,
businessUnitsByHallId: toExplainBusinessUnitsByHallId(guideStops, topOutlines)
}
}
export const createGuideExplainNavigationAdapter = (
dataset: GuideStaticExplainNavigationDataset
): GuideExplainNavigationAdapterResult => createExplainNavigationAdapter(dataset)
export const createGuideExplainDataAdapter = (dataset: GuideStaticExplainDataset): GuideExplainDataAdapterResult => {
const visibleHalls = visibleHallsFrom(dataset.halls)
const visibleOutlines = visibleOutlinesFrom(dataset.outlines)
@@ -272,6 +454,36 @@ export const createGuideExplainDataAdapter = (dataset: GuideStaticExplainDataset
findHallForOutline(outlineById.get(stringifyId(stop?.outlineId)))
)
const findTopOutlineForStop = (stop: GuideStaticStopPayload | undefined) => {
let current = outlineById.get(stringifyId(stop?.outlineId))
let guard = 0
while (current && guard < 16) {
const parentId = stringifyId(current.parentId)
if (parentId && hallById.has(parentId)) {
return current
}
current = parentId ? outlineById.get(parentId) : undefined
guard += 1
}
return outlineById.get(stringifyId(stop?.outlineId))
}
const topOutlines = visibleOutlines.flatMap((outline) => {
const id = stringifyId(outline.id)
const parentId = stringifyId(outline.parentId)
if (!id || !parentId || !hallById.has(parentId)) return []
return [{
id,
name: outline.name || `业务单元 ${id}`,
hallId: parentId,
sort: typeof outline.sort === 'number' ? outline.sort : undefined
}]
})
const resolveHallLocation = (
hall: GuideStaticHallPayload | undefined,
status: Exclude<GuideLocationResolutionStatus, 'unavailable'>
@@ -313,6 +525,36 @@ export const createGuideExplainDataAdapter = (dataset: GuideStaticExplainDataset
const halls = toHallModels(visibleHalls, hallGuideCounts, hallBridgeById, sgsPoiBridgeById)
const guideStops: ExplainGuideStop[] = visibleStops.map((stop) => {
const topOutline = findTopOutlineForStop(stop)
const hall = findHallForStop(stop)
const preciseLocation = resolveSgsPoiLocation([stop.poiId], 'exact')
const location = preciseLocation || resolveHallLocation(hall, 'hallFallback')
const floorId = location?.floorId || formatFloorId(hall, undefined) || stop.floorCode || stringifyId(stop.floorId)
const stopGuide = visibleGuides.find((guide) => (
guide.targetType?.toUpperCase() === 'STOP'
&& stringifyId(guide.targetId) === stringifyId(stop.id)
))
return {
id: stringifyId(stop.id) || '',
name: firstText(stop.name, stopGuide?.title) || `讲解点 ${stringifyId(stop.id) || ''}`,
hallId: stringifyId(hall?.id),
hallName: hall?.name || undefined,
floorId,
targetType: 'STOP',
targetId: stringifyId(stop.id) || '',
coverImageUrl: resolveImage(stop.coverImageUrl, stopGuide?.mediaGallery, hall?.coverImageUrl, hall?.galleryUrls),
description: firstText(stopGuide?.standardText, stopGuide?.extendedText, stop.name),
hasAudio: stopGuide ? Boolean(primaryAudioUrl(stopGuide)) : Boolean(stop.audioUrl),
poiId: location?.poiId,
outlineId: stringifyId(topOutline?.id),
outlineName: topOutline?.name || undefined,
sort: typeof stop.sort === 'number' ? stop.sort : undefined
}
})
const businessUnitsByHallId = toExplainBusinessUnitsByHallId(guideStops, topOutlines)
const mediaAssets: MediaAsset[] = visibleGuides.map((guide) => {
const id = `media-${stringifyId(guide.id) || 'unknown'}`
const url = primaryAudioUrl(guide)
@@ -374,6 +616,13 @@ export const createGuideExplainDataAdapter = (dataset: GuideStaticExplainDataset
}
})
const exhibitByStopId = exhibits.reduce<Record<string, MuseumExhibit>>((result, exhibit) => {
if (exhibit.playTargetType === 'STOP' && exhibit.playTargetId) {
result[exhibit.playTargetId] = exhibit
}
return result
}, {})
const tracks: ExplainTrack[] = visibleGuides.map((guide) => {
const id = stringifyId(guide.id) || ''
const exhibitId = stringifyId(guide.exhibitId) || `guide-${id}`
@@ -409,7 +658,10 @@ export const createGuideExplainDataAdapter = (dataset: GuideStaticExplainDataset
halls,
exhibits,
tracks,
mediaAssets
mediaAssets,
guideStops,
businessUnitsByHallId,
exhibitByStopId
}
}

View File

@@ -225,6 +225,13 @@ export interface GuideStaticDataset {
poiBridge: GuideStaticPoiBridgePayload
}
export interface GuideStaticExplainNavigationDataset {
manifest: GuideStaticManifestPayload
halls: GuideStaticHallPayload[]
outlines: GuideStaticOutlinePayload[]
guideStops: GuideStaticStopPayload[]
}
export interface GuideStaticExplainDataset {
manifest: GuideStaticManifestPayload
halls: GuideStaticHallPayload[]
@@ -297,6 +304,7 @@ export interface StaticGuideDataProvider {
assetUrl(relativePath: string): string
loadManifest(): Promise<GuideStaticManifestPayload>
loadIndexes(): Promise<GuideStaticIndexesPayload>
loadExplainNavigationDataset(): Promise<GuideStaticExplainNavigationDataset>
loadExplainDataset(): Promise<GuideStaticExplainDataset>
loadDataset(): Promise<GuideStaticDataset>
}
@@ -309,6 +317,8 @@ export const createStaticGuideDataProvider = (
let manifestRequest: Promise<GuideStaticManifestPayload> | null = null
let indexesCache: GuideStaticIndexesPayload | null = null
let indexesRequest: Promise<GuideStaticIndexesPayload> | null = null
let explainNavigationDatasetCache: GuideStaticExplainNavigationDataset | null = null
let explainNavigationDatasetRequest: Promise<GuideStaticExplainNavigationDataset> | null = null
let explainDatasetCache: GuideStaticExplainDataset | null = null
let explainDatasetRequest: Promise<GuideStaticExplainDataset> | null = null
let datasetCache: GuideStaticDataset | null = null
@@ -349,6 +359,46 @@ export const createStaticGuideDataProvider = (
return indexesRequest
},
async loadExplainNavigationDataset() {
if (explainNavigationDatasetCache) return explainNavigationDatasetCache
if (datasetCache) {
explainNavigationDatasetCache = {
manifest: datasetCache.manifest,
halls: datasetCache.halls,
outlines: datasetCache.outlines,
guideStops: datasetCache.guideStops
}
return explainNavigationDatasetCache
}
if (explainNavigationDatasetRequest) return explainNavigationDatasetRequest
explainNavigationDatasetRequest = provider.loadManifest()
.then(async (manifest) => {
const [
halls,
outlines,
guideStops
] = await Promise.all([
requestJson<GuideStaticPackagePayload<GuideStaticHallPayload>>(provider.assetUrl(manifest.files.halls)),
requestJson<GuideStaticPackagePayload<GuideStaticOutlinePayload>>(provider.assetUrl(manifest.files.outlines)),
requestJson<GuideStaticPackagePayload<GuideStaticStopPayload>>(provider.assetUrl(manifest.files.guideStops))
])
explainNavigationDatasetCache = {
manifest,
halls: halls.rows,
outlines: outlines.rows,
guideStops: guideStops.rows
}
return explainNavigationDatasetCache
})
.finally(() => {
explainNavigationDatasetRequest = null
})
return explainNavigationDatasetRequest
},
async loadExplainDataset() {
if (explainDatasetCache) return explainDatasetCache
if (datasetCache) {
@@ -364,29 +414,20 @@ export const createStaticGuideDataProvider = (
}
if (explainDatasetRequest) return explainDatasetRequest
explainDatasetRequest = provider.loadManifest()
.then(async (manifest) => {
explainDatasetRequest = provider.loadExplainNavigationDataset()
.then(async (navigationDataset) => {
const [
halls,
outlines,
guideStops,
guideContents,
poiBridge
] = await Promise.all([
requestJson<GuideStaticPackagePayload<GuideStaticHallPayload>>(provider.assetUrl(manifest.files.halls)),
requestJson<GuideStaticPackagePayload<GuideStaticOutlinePayload>>(provider.assetUrl(manifest.files.outlines)),
requestJson<GuideStaticPackagePayload<GuideStaticStopPayload>>(provider.assetUrl(manifest.files.guideStops)),
requestJson<GuideStaticPackagePayload<GuideStaticContentPayload>>(provider.assetUrl(manifest.files.guideContents)),
manifest.files.poiBridge
? requestJson<GuideStaticPoiBridgePayload>(provider.assetUrl(manifest.files.poiBridge))
requestJson<GuideStaticPackagePayload<GuideStaticContentPayload>>(provider.assetUrl(navigationDataset.manifest.files.guideContents)),
navigationDataset.manifest.files.poiBridge
? requestJson<GuideStaticPoiBridgePayload>(provider.assetUrl(navigationDataset.manifest.files.poiBridge))
: Promise.resolve(emptyPoiBridge)
])
explainDatasetCache = {
manifest,
halls: halls.rows,
outlines: outlines.rows,
guideStops: guideStops.rows,
...navigationDataset,
guideContents: guideContents.rows,
poiBridge
}

View File

@@ -14,9 +14,11 @@ import {
} from '@/config/dataSource'
import {
createGuideExplainDataAdapter,
createGuideExplainNavigationAdapter,
createGuideContentDataAdapter,
type GuideContentDataAdapterResult,
type GuideExplainDataAdapterResult
type GuideExplainDataAdapterResult,
type GuideExplainNavigationAdapterResult
} from '@/data/adapters/guideDataAdapter'
import {
staticGuideDataProvider,
@@ -112,12 +114,20 @@ const unavailableMockAudio = (id: string): MediaAsset => ({
export class StaticGuideContentProvider implements ExplainContentProvider {
private adapterCache: GuideContentDataAdapterResult | null = null
private explainAdapterCache: GuideExplainDataAdapterResult | null = null
private explainNavigationAdapterCache: GuideExplainNavigationAdapterResult | null = null
constructor(private readonly provider: StaticGuideDataProvider = staticGuideDataProvider) {}
private async loadExplainNavigationAdapter() {
if (this.explainNavigationAdapterCache) return this.explainNavigationAdapterCache
const dataset = await this.provider.loadExplainNavigationDataset()
this.explainNavigationAdapterCache = createGuideExplainNavigationAdapter(dataset)
return this.explainNavigationAdapterCache
}
private async loadExplainAdapter() {
if (this.explainAdapterCache) return this.explainAdapterCache
if (this.adapterCache) return this.adapterCache
const dataset = await this.provider.loadExplainDataset()
this.explainAdapterCache = createGuideExplainDataAdapter(dataset)
@@ -137,13 +147,30 @@ export class StaticGuideContentProvider implements ExplainContentProvider {
return adapter.exhibits
}
async getExhibitById(id: string) {
const adapter = await this.loadExplainAdapter()
return adapter.exhibits.find((exhibit) => exhibit.id === id)
|| adapter.exhibitByStopId[id]
|| null
}
async listGuideStopsByHall(hallId: string) {
const adapter = await this.loadExplainNavigationAdapter()
return adapter.guideStops.filter((stop) => stop.hallId === hallId)
}
async listTemporaryBusinessUnitsByHall(hallId: string) {
const adapter = await this.loadExplainNavigationAdapter()
return adapter.businessUnitsByHallId[hallId] || []
}
async listExhibits() {
const adapter = await this.loadAdapter()
return adapter.exhibits
}
async listHalls() {
const adapter = await this.loadExplainAdapter()
const adapter = await this.loadExplainNavigationAdapter()
return adapter.halls
}

View File

@@ -21,6 +21,10 @@ Re-export:
python scripts/export-guide-static-data.py
```
Operational runbook for SSH tunnel export and explain-business refresh:
- `docs/Data/explain-static-data-refresh-runbook.md`
Optional arguments:
```bash

View File

@@ -79,7 +79,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1780909532310"
},
{
"id": "1780909532241",
@@ -118,7 +118,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1780909532368"
},
{
"id": "1780578602690728",
@@ -83557,7 +83557,7 @@
"description": null,
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": "http://1.92.206.90:9000/museum-assets/exhibit_images/20260606/universe/861c1ffa31d447a195120a72d349fa2c.png",
"coverImageUrl": "http://1.92.206.90:9000/museum-assets/20260629/image16.png",
"galleryUrls": "[\"http://1.92.206.90:9000/museum-assets/exhibit_images/20260606/legacy/75ecedd88dc24e519488d828512537c9.png\"]",
"audioUrl": null,
"audioDuration": 0,
@@ -83578,7 +83578,7 @@
"tenantId": "0",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": "1823450596859000"
"stopId": "1823450596863811"
},
{
"id": "1780620049205588",
@@ -83635,7 +83635,7 @@
"description": null,
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "http://1.92.206.90:9000/museum-assets/20260629/image16.png",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": 0,
@@ -83656,7 +83656,7 @@
"tenantId": "0",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": "1823450596859000"
"stopId": "1823450596863811"
},
{
"id": "1780620049205590",
@@ -83812,7 +83812,7 @@
"tenantId": "0",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": "1823450596859000"
"stopId": "1823450596869980"
},
{
"id": "1780620049205594",
@@ -92314,7 +92314,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "核心展品",
"stopId": null
"stopId": "178090181119217"
},
{
"id": "7151780752527597",
@@ -92353,7 +92353,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "核心展品",
"stopId": null
"stopId": "178090181119528"
},
{
"id": "7151780752527630",
@@ -92392,7 +92392,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181119899"
},
{
"id": "7151780753844465",
@@ -105358,7 +105358,7 @@
"description": "生态标本,皮张完整,体色和状态自然。游泳姿态。\r\n尺寸: 37*38*10 cm",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "http://1.92.206.90:9000/museum-assets/20260629/image2.jpeg",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": 0,
@@ -105379,7 +105379,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1780908246192"
},
{
"id": "715795000000000192",
@@ -105808,7 +105808,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1780907025592"
},
{
"id": "715795000000000203",
@@ -106801,7 +106801,7 @@
"description": "",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "http://1.92.206.90:9000/museum-assets/20260629/image8.jpeg",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": 0,
@@ -106822,7 +106822,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1823450596499784"
},
{
"id": "715795000000000229",
@@ -110332,7 +110332,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1780907025090"
},
{
"id": "715795000000000319",
@@ -113782,7 +113782,7 @@
"description": "1、仿真模型虎纹蛙\r\n2、尺寸12cm\r\n3、编号G6-4.3-12\r\n4、做法工艺3D建模打印加固上色\r\n5、含制作、运输、安装、保险、模型支撑支架等\r\n6、满足招标文件、设计图纸、方案图册及相关规范等全部要求",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "http://1.92.206.90:9000/museum-assets/20260629/image9.jpeg",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": 0,
@@ -113803,7 +113803,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1823450596525991"
},
{
"id": "715795000000000408",
@@ -124177,7 +124177,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1823450595664409"
},
{
"id": "715795000000000674",
@@ -135682,7 +135682,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1780907692487"
},
{
"id": "715796000000000004",
@@ -149644,7 +149644,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181115241"
},
{
"id": "715797000000000039",
@@ -166336,7 +166336,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "1823450595935856"
},
{
"id": "715803000000000019",
@@ -166765,7 +166765,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "1823450595956295"
},
{
"id": "715803000000000030",
@@ -166804,7 +166804,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "1823450595961957"
},
{
"id": "715803000000000031",
@@ -170704,7 +170704,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "1823450595709143"
},
{
"id": "715814000000000012",
@@ -174916,7 +174916,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181115752"
},
{
"id": "715816000000000107",
@@ -174955,7 +174955,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181116150"
},
{
"id": "715816000000000108",
@@ -175072,7 +175072,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181116427"
},
{
"id": "715816000000000111",
@@ -175111,7 +175111,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": null,
"stopId": null
"stopId": "178090181117787"
},
{
"id": "715816000000000112",
@@ -175540,7 +175540,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181116688"
},
{
"id": "715816000000000123",
@@ -175774,7 +175774,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181116952"
},
{
"id": "715816000000000129",
@@ -177022,7 +177022,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181118029"
},
{
"id": "715816000000000161",
@@ -177061,7 +177061,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181118237"
},
{
"id": "715816000000000162",
@@ -177334,7 +177334,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "核心展品",
"stopId": null
"stopId": "178090181118531"
},
{
"id": "715816000000000169",
@@ -177529,7 +177529,7 @@
"tenantId": "1",
"spatialNodeId": null,
"exhibitLevel": "重点展品",
"stopId": null
"stopId": "178090181118826"
},
{
"id": "715816000000000174",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -6,16 +6,16 @@
{
"id": "715792102100832256",
"mapId": null,
"floorId": null,
"floorId": "2065808921272119298",
"poiId": null,
"hallCode": "E5",
"name": "人类厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "我们是谁?从哪里来?到哪里去?这不仅仅是哲学命题也是研究人类进化最渴望了解的真相。100多年来科学家通过对大量化石的研究发现人类起源于灵长类人与猿具有共同的祖先经过数百万年的演化走到今天。但是这个演化过程并不是一帆风顺充满了曲折与偶然它的每个进步在生物史上都是一次飞跃。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E4%BA%BA%E7%B1%BB%E5%8E%85__coverImageUrl__cf4b63c7e9_1782805919765.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -28,25 +28,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T17:15:43.802058",
"deleted": 0,
"floorCode": "L1",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E4%BA%BA%E7%B1%BB%E5%8E%85__coverImageUrl__cf4b63c7e9_1782805919765.webp"
},
{
"id": "715792102100832257",
"mapId": null,
"floorId": null,
"floorId": "2065808920714276866",
"poiId": null,
"hallCode": "E2",
"name": "地球厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "欢迎来到“地球厅”展区!在这里,我们将从宏观到微观,从过去到现在,全面了解这颗我们赖以生存的蓝色星球,带您踏上一场探索地球奥秘的奇妙之旅,地球厅的探索旅程将分为四个单元,每个单元都聚焦于地球的不同方面,带您领略地球的神奇与壮丽。在“宜居地球”单元,我们将带您从宇宙的视角审视地球的独特性.了解地球的蔚蓝色外观、其独特的生命孕育环境,以及太阳与地球内部能量如何共同作用,维持着地球的生机与活力.通过互动展示和多媒体演示,直观感受到地球的圈层结构如何相互依存,共同创造了这个生命的摇篮。\n“地史探源\"单元将带您穿越时空回到地球诞生之初见证其45亿年的演化历程您将了解地球的绝对年龄是如何测定的探索地层的相对年龄以及地球从熔融状态逐。渐冷却、演化出水圈和大气圈的复杂过程。通过化石、岩石和模拟模型见证生命的起\n源、演化与灭绝事件感受地球历史的波澜壮阔。\n“华夏格局”单元聚焦于中国地质的特色与多样性。这里您将了解内力如何塑造了\n中国的大地格局外力如何雕刻出秀美的河山.从青藏高原的隆升到珠江的蜿蜒流淌,从黄土高原的沟壑纵横到南海的波涛汹涌,您将领略华夏大地的壮丽景观和地质变迁,\n感受这片土地的沧桑巨变。\n在最后的“地球的馈赠”单元我们将一同探索矿物资源如何成为人类文明发展的基石.从古代的石器、青铜器、铁器,到现代的新能源材料和高科技元件,看到矿物资源在各个历史时期的重要应用。通过展示硅、铝、钛等新材料的特性和应用,您将了解材料科学如何推动技术革命,引领人类走向更高效、可持续的未来。\n现在让我们一同开启这场跨越时空、深人地球内部的奇妙之旅探索地球的奥秘与人类文明的紧密联系。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E5%9C%B0%E7%90%83%E5%8E%85__coverImageUrl__01b7636aa9_1782805894116.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -59,25 +59,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T18:19:27.817944",
"deleted": 0,
"floorCode": "L-2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E5%9C%B0%E7%90%83%E5%8E%85__coverImageUrl__01b7636aa9_1782805894116.webp"
},
{
"id": "715792102100832258",
"mapId": null,
"floorId": null,
"floorId": "2065808920714276866",
"poiId": null,
"hallCode": "E1",
"name": "宇宙厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "宇宙是浩瀚、神秘、包罗万象的,人类对宇宙的想象和探索是漫长的、多元的、永无止境的。\n 首先,展览以地球为主视角,从天文学史的角度切入,内容涉及宇宙观、方法论、人类对于自然乃至整个宇宙的基本态度,强调思想、艺术、技术的结合。\n 然后,从地球延伸至宇宙,讲述等级宇宙结构,诠释整个世界的尺度结构。围绕天体类型,将行星系统、恒星系统、星系系统等较为前沿的天文发现和热点融入其中。\n 最后,再次由遥远宇宙回到我们身边,讲述行星科学和深空探测。通过陨石、行星采样的微观视角切入,将外星球的样本呈现在我们眼前,以小见大地探索这个神奇的宇宙。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260702/%E5%9C%B0%E7%90%83%E9%A6%86_1782983255673.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -90,25 +90,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T17:07:41.804589",
"deleted": 0,
"floorCode": "L-2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/exhibition-hall/20260702/%E5%9C%B0%E7%90%83%E9%A6%86_1782983215322.webp"
},
{
"id": "715792102100832259",
"mapId": null,
"floorId": null,
"floorId": "2065808920714276866",
"poiId": null,
"hallCode": "E3",
"name": "演化厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "在漫长的38亿年生命演化史中探寻生命进化的内因与外因规律并在化石记录中寻找演化的事实证据。在展示演化史脉络同时融入了学科史介绍一些重要的基础理论观点;结合遗传学介绍演化的物质基础;结合特殊的生物学现象介绍演化的驱动。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E6%BC%94%E5%8C%96%E5%8E%85__coverImageUrl__544444b670_1782805902349.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -121,25 +121,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T17:14:23.460037",
"deleted": 0,
"floorCode": "L-2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E6%BC%94%E5%8C%96%E5%8E%85__coverImageUrl__544444b670_1782805902349.webp"
},
{
"id": "715792102100832260",
"mapId": null,
"floorId": null,
"floorId": "2065808920714276866",
"poiId": null,
"hallCode": "E4",
"name": "恐龙厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "该展厅前承地球生命的演化之路,后续哺乳动物与人类生命的进化篇章,展示了地球曾经最为兴盛的物种之一一一恐龙。展览首先从发现恐龙化石开始,讲述了早期科学家们从各类化石中判定了恐龙的存在;通过科学的研究与分析,进而了解了恐龙这种生物的物种及其演化信息;中间以专题形式,展开讲述了粤赣恐龙故乡的发现与研究成果;接着通过进一步的研究,科学家们以有力的证据论证了恐龙生活的时代及其生活的习性特征;最终,以恐龙灭绝谜题的假想与探究,继续揭秘着恐龙的研究故事,拼凑起世界的恐龙地图。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260702/%E6%81%90%E9%BE%99%E9%A6%86_1782983676437.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -152,25 +152,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T17:14:54.791898",
"deleted": 0,
"floorCode": "L-2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/exhibition-hall/20260702/%E6%81%90%E9%BE%99%E9%A6%86_1782983683613.webp"
},
{
"id": "715792102100832261",
"mapId": null,
"floorId": null,
"floorId": "2065808921578303490",
"poiId": null,
"hallCode": "E6",
"name": "生物厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "生物多样性是生物与环境形成的生态复合体以及与此相关的各种生态过程的总和。缤纷多彩的生物世界一方面值得我们去惊叹、去赞美,另一方面也向我们提出了问题--究竟是什么造就了地球上的生命形态如此纷繁复杂?是环境的选择还是生命自身的内在需求,抑或其它。\n地球因生命而精彩。这些丰富多彩的生物是人类生存和发展\n的基础也是需要珍惜和保护重要资源。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260702/%E7%94%9F%E6%80%81%E8%A7%82_1782983756830.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -183,25 +183,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T17:16:11.025493",
"deleted": 0,
"floorCode": "L2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/exhibition-hall/20260702/%E7%94%9F%E6%80%81%E8%A7%82_1782983762387.webp"
},
{
"id": "715792102100832262",
"mapId": null,
"floorId": null,
"floorId": "2065808921578303490",
"poiId": null,
"hallCode": "E7",
"name": "生态厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "展示全球主要生态系统及生态景观,包括海洋、森林、湿地、荒漠、草原、山、极地、淡水等,突出淡水中生物与环境的生态关系;基于动物地理学理念,呈现世界生物地理区系及其形成因素。讲述生物的捕食防御、求偶繁殖等生存智慧;并从环境因素、人为因素角度反映物种濒危问题,唤醒观众对生物生态的关怀。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E7%94%9F%E6%80%81%E5%8E%85__coverImageUrl__0d91adb197_1782805948214.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -214,25 +214,25 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T18:20:10.553529",
"deleted": 0,
"floorCode": "L2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E7%94%9F%E6%80%81%E5%8E%85__coverImageUrl__0d91adb197_1782805948214.webp"
},
{
"id": "715792102100832263",
"mapId": null,
"floorId": null,
"floorId": "2065808921578303490",
"poiId": null,
"hallCode": "E8",
"name": "家园厅",
"nameEn": null,
"subtitle": null,
"description": null,
"description": "展馆空间设计策略以“家园”为核心概念,用“河流”和“山地岛屿”的形态方式作为空间灵感,巧妙的运用二者之间的“流动”和“穿插”,沟通起展厅的四个单元内容。其中,第一单元“万物共生”也是整个展厅的体验重点,围绕原本环形的空间结构,随着曲折蜿蛾的动线进行层层展演,呈现深圳十二时辰“自然、城市、共生”的家园景观。",
"descriptionEn": null,
"narrationText": null,
"coverImageUrl": null,
"coverImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E5%AE%B6%E5%9B%AD%E5%8E%85__coverImageUrl__89581a4213_1782805958654.webp",
"galleryUrls": null,
"audioUrl": null,
"audioDuration": null,
@@ -245,11 +245,11 @@
"tenantId": "1",
"creator": "",
"createTime": "2026-06-08T00:32:35",
"updater": "",
"updateTime": "2026-06-08T00:32:35",
"updater": "142",
"updateTime": "2026-07-02T17:17:11.579353",
"deleted": 0,
"floorCode": "L2",
"schematicImageUrl": null
"schematicImageUrl": "/minio/museum-assets/temp-exhibition/20260630/%E5%B1%95%E5%8E%85%E7%A9%BA%E9%97%B4__%E5%AE%B6%E5%9B%AD%E5%8E%85__coverImageUrl__89581a4213_1782805958654.webp"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"schemaVersion": "sgs-guide-static/v1",
"generatedAt": "2026-06-22T01:54:11.876097+00:00",
"generatedAt": "2026-07-02T17:36:16.697936+00:00",
"source": {
"type": "dameng",
"host": "1.92.206.90",
@@ -23,13 +23,13 @@
"outlines": 250,
"guide-stops": 391,
"exhibits": 4700,
"guide-contents": 706,
"pois": 2238
"guide-contents": 717,
"pois": 2244
},
"bridgeStats": {
"hallBridgeCount": 8,
"sgsPoiBridgeCount": 869,
"sgsPoiCandidateCount": 12,
"sgsPoiBridgeCount": 876,
"sgsPoiCandidateCount": 13,
"navPoiCount": 298
}
}

View File

@@ -1,6 +1,6 @@
{
"schemaVersion": "sgs-guide-poi-bridge/v1",
"generatedAt": "2026-06-22T01:54:11.869004+00:00",
"generatedAt": "2026-07-02T17:36:16.690423+00:00",
"source": {
"guideStaticSchemaVersion": "sgs-guide-static/v1",
"navAssetRunId": "codex_nav_20260621_175310_museum_default_centerline_finalxy",
@@ -8,8 +8,8 @@
},
"stats": {
"hallBridgeCount": 8,
"sgsPoiBridgeCount": 869,
"sgsPoiCandidateCount": 12,
"sgsPoiBridgeCount": 876,
"sgsPoiCandidateCount": 13,
"navPoiCount": 298
},
"sgsFloorIdToNavFloorId": {
@@ -7759,6 +7759,46 @@
"sourcePoiId": "5523",
"sourcePoiName": "女卫生间04"
},
"5524": {
"navPoiId": "connector_0043_L_2_停车场_楼梯01",
"navPoiName": "停车场_楼梯01",
"navFloorId": "L-2",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 1.144218,
"sourcePoiId": "5524",
"sourcePoiName": "停车场楼梯01"
},
"5525": {
"navPoiId": "connector_0044_L_2_停车场_楼梯02",
"navPoiName": "停车场_楼梯02",
"navFloorId": "L-2",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 1.125434,
"sourcePoiId": "5525",
"sourcePoiName": "停车场楼梯02"
},
"5526": {
"navPoiId": "connector_0045_L_2_停车场_楼梯03",
"navPoiName": "停车场_楼梯03",
"navFloorId": "L-2",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 1.198595,
"sourcePoiId": "5526",
"sourcePoiName": "停车场楼梯03"
},
"5527": {
"navPoiId": "connector_0046_L_2_停车场_楼梯27",
"navPoiName": "停车场_楼梯27",
"navFloorId": "L-2",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 1.248401,
"sourcePoiId": "5527",
"sourcePoiName": "停车场楼梯27"
},
"5529": {
"navPoiId": "connector_0021_L_2_A_扶梯",
"navPoiName": "A_扶梯",
@@ -7769,6 +7809,46 @@
"sourcePoiId": "5529",
"sourcePoiName": "L-2_A扶梯"
},
"5550": {
"navPoiId": "connector_0088_L_1_停车场_楼梯01",
"navPoiName": "停车场_楼梯01",
"navFloorId": "L-1",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 0.841848,
"sourcePoiId": "5550",
"sourcePoiName": "停车场楼梯01"
},
"5551": {
"navPoiId": "connector_0089_L_1_停车场_楼梯02",
"navPoiName": "停车场_楼梯02",
"navFloorId": "L-1",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 1.130357,
"sourcePoiId": "5551",
"sourcePoiName": "停车场楼梯02"
},
"5552": {
"navPoiId": "connector_0090_L_1_停车场_楼梯03",
"navPoiName": "停车场_楼梯03",
"navFloorId": "L-1",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 0.530654,
"sourcePoiId": "5552",
"sourcePoiName": "停车场楼梯03"
},
"5553": {
"navPoiId": "connector_0091_L_1_停车场_楼梯04",
"navPoiName": "停车场_楼梯04",
"navFloorId": "L-1",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 0.796205,
"sourcePoiId": "5553",
"sourcePoiName": "停车场楼梯04"
},
"5556": {
"navPoiId": "connector_0067_L_1_A_扶梯",
"navPoiName": "A_扶梯",
@@ -7979,16 +8059,6 @@
"sourcePoiId": "5628",
"sourcePoiName": "女卫生间002"
},
"5629": {
"navPoiId": "poi_0041_L2_卫生间",
"navPoiName": "卫生间",
"navFloorId": "L2",
"method": "name_floor_coordinate",
"confidence": "high",
"distanceMeters": 4.483514,
"sourcePoiId": "5629",
"sourcePoiName": "卫生间"
},
"5630": {
"navPoiId": "poi_0047_L2_无障碍卫生间001",
"navPoiName": "无障碍卫生间001",
@@ -8231,6 +8301,16 @@
"sourcePoiId": "5522",
"sourcePoiName": "女卫生间03"
},
"5554": {
"navPoiId": "connector_0092_L_1_停车场_楼梯27",
"navPoiName": "停车场_楼梯27",
"navFloorId": "L-1",
"method": "name_floor_coordinate_candidate",
"confidence": "low",
"distanceMeters": 16.274469,
"sourcePoiId": "5554",
"sourcePoiName": "停车场楼梯27"
},
"5595": {
"navPoiId": "poi_0024_L1_无障碍卫生间",
"navPoiName": "无障碍卫生间",

View File

@@ -1,7 +1,7 @@
{
"schemaVersion": "sgs-guide-static/v1",
"sourceTable": "SGS_POI",
"rowCount": 2238,
"rowCount": 2244,
"rows": [
{
"id": "596",
@@ -62543,7 +62543,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781621747364\",\"code\":\"RPOI_L1_088\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":7,\"sourceNodeNames\":[\"L1_C_楼梯10\",\"L1_C_楼梯11\",\"L1_C_楼梯11.001\",\"L1_C_楼梯12\",\"L1_C_楼梯13\",\"L1_C_楼梯14\",\"L1_C_楼梯15\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_137\",\"POI_L1_STAIRS_138\",\"POI_L1_STAIRS_139\",\"POI_L1_STAIRS_140\",\"POI_L1_STAIRS_141\",\"POI_L1_STAIRS_142\",\"POI_L1_STAIRS_143\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781621747364\",\"code\":\"RPOI_L1_088\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":8,\"sourceNodeNames\":[\"L1_C_楼梯10\",\"L1_C_楼梯11\",\"L1_C_楼梯11.001\",\"L1_C_楼梯12\",\"L1_C_楼梯13\",\"L1_C_楼梯14\",\"L1_C_楼梯15\",\"L1_C_楼梯033\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_137\",\"POI_L1_STAIRS_138\",\"POI_L1_STAIRS_139\",\"POI_L1_STAIRS_140\",\"POI_L1_STAIRS_141\",\"POI_L1_STAIRS_142\",\"POI_L1_STAIRS_143\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\",\"modelUpdateFix\":\"2026-06-24-L1-C033\"}",
"phone": null,
"businessHours": null,
"sortOrder": 87,
@@ -62553,8 +62553,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-16T22:55:59.132440",
"updater": "1",
"updateTime": "2026-06-16T23:06:12.102849",
"updater": "codex-data-fix",
"updateTime": "2026-06-24T19:49:03.797973",
"deleted": true,
"tenantId": "1",
"externalUrl": null,
@@ -68983,7 +68983,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781622457665\",\"code\":\"RPOI_L1_088\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":7,\"sourceNodeNames\":[\"L1_C_楼梯10\",\"L1_C_楼梯11\",\"L1_C_楼梯11.001\",\"L1_C_楼梯12\",\"L1_C_楼梯13\",\"L1_C_楼梯14\",\"L1_C_楼梯15\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_137\",\"POI_L1_STAIRS_138\",\"POI_L1_STAIRS_139\",\"POI_L1_STAIRS_140\",\"POI_L1_STAIRS_141\",\"POI_L1_STAIRS_142\",\"POI_L1_STAIRS_143\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781622457665\",\"code\":\"RPOI_L1_088\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":8,\"sourceNodeNames\":[\"L1_C_楼梯10\",\"L1_C_楼梯11\",\"L1_C_楼梯11.001\",\"L1_C_楼梯12\",\"L1_C_楼梯13\",\"L1_C_楼梯14\",\"L1_C_楼梯15\",\"L1_C_楼梯033\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_137\",\"POI_L1_STAIRS_138\",\"POI_L1_STAIRS_139\",\"POI_L1_STAIRS_140\",\"POI_L1_STAIRS_141\",\"POI_L1_STAIRS_142\",\"POI_L1_STAIRS_143\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\",\"modelUpdateFix\":\"2026-06-24-L1-C033\"}",
"phone": null,
"businessHours": null,
"sortOrder": 87,
@@ -68993,8 +68993,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-16T23:07:48.946917",
"updater": "1",
"updateTime": "2026-06-16T23:19:13.923371",
"updater": "codex-data-fix",
"updateTime": "2026-06-24T19:49:03.919981",
"deleted": true,
"tenantId": "1",
"externalUrl": null,
@@ -83449,7 +83449,7 @@
"floorId": "2065808920714276866",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-2_停车场楼梯",
"name": "停车场楼梯01",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -83463,7 +83463,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_010\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯01\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_010\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_010\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯01\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯01\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_010\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 9,
@@ -83473,8 +83473,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:25:59.600693",
"updater": "1",
"updateTime": "2026-06-17T01:25:59.600693",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.126795",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -83489,7 +83489,7 @@
"floorId": "2065808920714276866",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-2_停车场楼梯",
"name": "停车场楼梯02",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -83503,7 +83503,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_011\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯02\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_011\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_011\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯02\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯02\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_011\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 10,
@@ -83513,8 +83513,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:25:59.662044",
"updater": "1",
"updateTime": "2026-06-17T01:25:59.662044",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.235047",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -83529,7 +83529,7 @@
"floorId": "2065808920714276866",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-2_停车场楼梯",
"name": "停车场楼梯03",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -83543,7 +83543,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_012\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯03\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_012\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_012\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯03\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯03\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_012\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 11,
@@ -83553,8 +83553,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:25:59.727990",
"updater": "1",
"updateTime": "2026-06-17T01:25:59.727990",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.301538",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -83569,7 +83569,7 @@
"floorId": "2065808920714276866",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-2_停车场楼梯",
"name": "停车场楼梯27",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -83583,7 +83583,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_013\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯27\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_013\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB2_013\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯27\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_停车场_楼梯27\"],\"sourcePoiCodes\":[\"POI_LB2_STAIRS_013\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 12,
@@ -83593,8 +83593,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:25:59.792337",
"updater": "1",
"updateTime": "2026-06-17T01:25:59.792337",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.359528",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -84489,7 +84489,7 @@
"floorId": "2065808920466812930",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-1_停车场楼梯",
"name": "停车场楼梯01",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -84503,7 +84503,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_036\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯01\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_056\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_036\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯01\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯01\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_056\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 35,
@@ -84513,8 +84513,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:01.236787",
"updater": "1",
"updateTime": "2026-06-17T01:26:01.236787",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.423036",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -84529,7 +84529,7 @@
"floorId": "2065808920466812930",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-1_停车场楼梯",
"name": "停车场楼梯02",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -84543,7 +84543,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_037\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯02\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_057\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_037\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯02\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯02\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_057\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 36,
@@ -84553,8 +84553,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:01.298944",
"updater": "1",
"updateTime": "2026-06-17T01:26:01.298944",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.491084",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -84569,7 +84569,7 @@
"floorId": "2065808920466812930",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-1_停车场楼梯",
"name": "停车场楼梯03",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -84583,7 +84583,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_038\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯03\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_058\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_038\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯03\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯03\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_058\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 37,
@@ -84593,8 +84593,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:01.357618",
"updater": "1",
"updateTime": "2026-06-17T01:26:01.357618",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.558048",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -84609,7 +84609,7 @@
"floorId": "2065808920466812930",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-1_停车场楼梯",
"name": "停车场楼梯04",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -84623,7 +84623,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_039\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯04\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_059\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_039\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯04\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯04\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_059\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 38,
@@ -84633,8 +84633,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:01.416453",
"updater": "1",
"updateTime": "2026-06-17T01:26:01.416453",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.619055",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -84649,7 +84649,7 @@
"floorId": "2065808920466812930",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-1_停车场楼梯",
"name": "停车场楼梯27",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -84663,7 +84663,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_040\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯27\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_060\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_LB1_040\",\"floorCode\":\"L-1\",\"sourceFloorCode\":\"L-1\",\"modelGroup\":\"L-1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯27\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-1_停车场_楼梯27\"],\"sourcePoiCodes\":[\"POI_LB1_STAIRS_060\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 39,
@@ -84673,8 +84673,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:01.476972",
"updater": "1",
"updateTime": "2026-06-17T01:26:01.476972",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.683030",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -85929,7 +85929,7 @@
"floorId": "2065808919904776194",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "EXTERIOR_室外楼梯",
"name": "停车场楼梯01",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -85943,7 +85943,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_072\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"室外\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯01\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_113\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_072\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯01\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯01\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_113\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 71,
@@ -85953,8 +85953,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:03.540058",
"updater": "1",
"updateTime": "2026-06-17T01:26:03.540058",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.741026",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -85969,7 +85969,7 @@
"floorId": "2065808919904776194",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "EXTERIOR_室外楼梯",
"name": "停车场楼梯02",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -85983,7 +85983,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_073\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"室外\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯02\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_114\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_073\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯02\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯02\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_114\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 72,
@@ -85993,8 +85993,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:03.603255",
"updater": "1",
"updateTime": "2026-06-17T01:26:03.603255",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.804041",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -86009,7 +86009,7 @@
"floorId": "2065808919904776194",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "EXTERIOR_室外楼梯",
"name": "停车场楼梯03",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -86023,7 +86023,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_074\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"室外\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯03\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_115\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_074\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯03\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯03\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_115\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 73,
@@ -86033,8 +86033,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:03.663405",
"updater": "1",
"updateTime": "2026-06-17T01:26:03.663405",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.895472",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -86049,7 +86049,7 @@
"floorId": "2065808919904776194",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "EXTERIOR_室外楼梯",
"name": "停车场楼梯04",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -86063,7 +86063,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_075\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"室外\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯04\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_116\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_075\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯04\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯04\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_116\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 74,
@@ -86073,8 +86073,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:03.723734",
"updater": "1",
"updateTime": "2026-06-17T01:26:03.723734",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:01.966045",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -86089,7 +86089,7 @@
"floorId": "2065808919904776194",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "EXTERIOR_室外楼梯",
"name": "停车场楼梯27",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
@@ -86103,7 +86103,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_076\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"室外\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯27\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_117\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_EXTERIOR_076\",\"floorCode\":\"EXTERIOR\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"EXTERIOR\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"停车场楼梯27\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_室外_楼梯27\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_117\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 75,
@@ -86113,8 +86113,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:03.789369",
"updater": "1",
"updateTime": "2026-06-17T01:26:03.789369",
"updater": "codex-parking-stair-rename",
"updateTime": "2026-06-28T14:03:02.031516",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -86150,11 +86150,11 @@
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"status": 2,
"creator": "1",
"createTime": "2026-06-17T01:26:03.852621",
"updater": "1",
"updateTime": "2026-06-17T01:26:03.852621",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:02.750652",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -86583,7 +86583,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L1_088\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":7,\"sourceNodeNames\":[\"L1_C_楼梯10\",\"L1_C_楼梯11\",\"L1_C_楼梯11.001\",\"L1_C_楼梯12\",\"L1_C_楼梯13\",\"L1_C_楼梯14\",\"L1_C_楼梯15\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_137\",\"POI_L1_STAIRS_138\",\"POI_L1_STAIRS_139\",\"POI_L1_STAIRS_140\",\"POI_L1_STAIRS_141\",\"POI_L1_STAIRS_142\",\"POI_L1_STAIRS_143\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L1_088\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":8,\"sourceNodeNames\":[\"L1_C_楼梯10\",\"L1_C_楼梯11\",\"L1_C_楼梯11.001\",\"L1_C_楼梯12\",\"L1_C_楼梯13\",\"L1_C_楼梯14\",\"L1_C_楼梯15\",\"L1_C_楼梯033\"],\"sourcePoiCodes\":[\"POI_L1_STAIRS_137\",\"POI_L1_STAIRS_138\",\"POI_L1_STAIRS_139\",\"POI_L1_STAIRS_140\",\"POI_L1_STAIRS_141\",\"POI_L1_STAIRS_142\",\"POI_L1_STAIRS_143\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\",\"modelUpdateFix\":\"2026-06-24-L1-C033\"}",
"phone": null,
"businessHours": null,
"sortOrder": 87,
@@ -86593,8 +86593,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:04.531702",
"updater": "1",
"updateTime": "2026-06-17T01:26:04.531702",
"updater": "codex-data-fix",
"updateTime": "2026-06-24T19:49:04.029956",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -87463,7 +87463,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L1P5_110\",\"floorCode\":\"L1.5\",\"sourceFloorCode\":\"L1.5\",\"modelGroup\":\"L1.5\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":5,\"sourceNodeNames\":[\"L1.5_C_楼梯12\",\"L1.5_C_楼梯13\",\"L1.5_C_楼梯14\",\"L1.5_C_楼梯31\",\"L1.5_C_楼梯32\"],\"sourcePoiCodes\":[\"POI_L1P5_STAIRS_184\",\"POI_L1P5_STAIRS_185\",\"POI_L1P5_STAIRS_186\",\"POI_L1P5_STAIRS_187\",\"POI_L1P5_STAIRS_188\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L1P5_110\",\"floorCode\":\"L1.5\",\"sourceFloorCode\":\"L1.5\",\"modelGroup\":\"L1.5\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":6,\"sourceNodeNames\":[\"L1.5_C_楼梯12\",\"L1.5_C_楼梯13\",\"L1.5_C_楼梯14\",\"L1.5_C_楼梯31\",\"L1.5_C_楼梯32\",\"L1.5_C_楼梯11\"],\"sourcePoiCodes\":[\"POI_L1P5_STAIRS_184\",\"POI_L1P5_STAIRS_185\",\"POI_L1P5_STAIRS_186\",\"POI_L1P5_STAIRS_187\",\"POI_L1P5_STAIRS_188\",\"POI_L1P5_STAIRS_189\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"phone": null,
"businessHours": null,
"sortOrder": 109,
@@ -87473,8 +87473,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:05.959649",
"updater": "1",
"updateTime": "2026-06-17T01:26:05.959649",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:06.100350",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -87649,7 +87649,7 @@
"floorId": "2065808921578303490",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "卫生间",
"name": "卫生间01",
"nameEn": null,
"type": "toilet",
"exhibitCode": null,
@@ -87663,7 +87663,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L2_115\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"卫生间\",\"poiCategory\":\"sanitation\",\"poiCategoryLabel\":\"卫生设施\",\"connectorGroup\":\"卫生间\",\"aggregationPolicy\":\"single\",\"sourceCount\":1,\"sourceNodeNames\":[\"L2_卫生间\"],\"sourcePoiCodes\":[\"POI_L2_TOILET_193\"],\"routeCandidate\":false,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"model_update_review\",\"batchCode\":\"V20260627093736_e73e3\",\"code\":\"POI_L2_卫生间\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"卫生间\",\"poiCategory\":\"sanitation\",\"poiCategoryLabel\":\"卫生设施\",\"connectorGroup\":\"卫生间01\",\"aggregationPolicy\":\"single\",\"sourceCount\":1,\"sourceNodeNames\":[\"L2_卫生间\"],\"sourcePoiCodes\":[\"POI_L2_卫生间\"],\"routeCandidate\":false,\"reviewRequired\":true,\"reviewReason\":\"sprint_12g_user_confirmed\"}",
"phone": null,
"businessHours": null,
"sortOrder": 114,
@@ -87673,8 +87673,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:06.275289",
"updater": "1",
"updateTime": "2026-06-17T01:26:06.275289",
"updater": "codex-s12g-rename",
"updateTime": "2026-06-27T14:47:09.801927",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -87903,7 +87903,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L2_121\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"B\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L2_B_楼梯09\"],\"sourcePoiCodes\":[\"POI_L2_STAIRS_207\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L2_121\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"B\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":2,\"sourceNodeNames\":[\"L2_B_楼梯09\",\"L2_B_楼梯10\"],\"sourcePoiCodes\":[\"POI_L2_STAIRS_207\",\"POI_L2_STAIRS_B10\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 120,
@@ -87913,8 +87913,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:06.645688",
"updater": "1",
"updateTime": "2026-06-17T01:26:06.645688",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:06.854098",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -87943,7 +87943,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L2_122\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":5,\"sourceNodeNames\":[\"L2_C_楼梯10\",\"L2_C_楼梯11\",\"L2_C_楼梯12\",\"L2_C_楼梯13\",\"L2_C_楼梯33\"],\"sourcePoiCodes\":[\"POI_L2_STAIRS_208\",\"POI_L2_STAIRS_209\",\"POI_L2_STAIRS_210\",\"POI_L2_STAIRS_211\",\"POI_L2_STAIRS_212\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L2_122\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":4,\"sourceNodeNames\":[\"L2_C_楼梯11\",\"L2_C_楼梯12\",\"L2_C_楼梯13\",\"L2_C_楼梯33\"],\"sourcePoiCodes\":[\"POI_L2_STAIRS_209\",\"POI_L2_STAIRS_210\",\"POI_L2_STAIRS_211\",\"POI_L2_STAIRS_212\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"phone": null,
"businessHours": null,
"sortOrder": 121,
@@ -87953,8 +87953,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:06.715412",
"updater": "1",
"updateTime": "2026-06-17T01:26:06.715412",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:06.967086",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -89103,7 +89103,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L4_151\",\"floorCode\":\"L4\",\"sourceFloorCode\":\"L4\",\"modelGroup\":\"L4\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"B\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L4_B_楼梯09\"],\"sourcePoiCodes\":[\"POI_L4_STAIRS_261\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L4_151\",\"floorCode\":\"L4\",\"sourceFloorCode\":\"L4\",\"modelGroup\":\"L4\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"B\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":2,\"sourceNodeNames\":[\"L4_B_楼梯09\",\"L4_B_楼梯10\"],\"sourcePoiCodes\":[\"POI_L4_STAIRS_261\",\"POI_L4_STAIRS_B10\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"single_model_node_candidate\"}",
"phone": null,
"businessHours": null,
"sortOrder": 150,
@@ -89113,8 +89113,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:08.619166",
"updater": "1",
"updateTime": "2026-06-17T01:26:08.619166",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:07.903095",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -89143,7 +89143,7 @@
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L4_152\",\"floorCode\":\"L4\",\"sourceFloorCode\":\"L4\",\"modelGroup\":\"L4\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":4,\"sourceNodeNames\":[\"L4_C_楼梯10\",\"L4_C_楼梯12\",\"L4_C_楼梯13\",\"L4_C_楼梯33\"],\"sourcePoiCodes\":[\"POI_L4_STAIRS_262\",\"POI_L4_STAIRS_263\",\"POI_L4_STAIRS_264\",\"POI_L4_STAIRS_265\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"extParams": "{\"source\":\"acceptance_review_poi\",\"batchCode\":\"BATCH_1781630718479\",\"code\":\"RPOI_L4_152\",\"floorCode\":\"L4\",\"sourceFloorCode\":\"L4\",\"modelGroup\":\"L4\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"C\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":3,\"sourceNodeNames\":[\"L4_C_楼梯12\",\"L4_C_楼梯13\",\"L4_C_楼梯33\"],\"sourcePoiCodes\":[\"POI_L4_STAIRS_263\",\"POI_L4_STAIRS_264\",\"POI_L4_STAIRS_265\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"aggregated_from_multiple_model_nodes\"}",
"phone": null,
"businessHours": null,
"sortOrder": 151,
@@ -89153,8 +89153,8 @@
"status": 1,
"creator": "1",
"createTime": "2026-06-17T01:26:08.682540",
"updater": "1",
"updateTime": "2026-06-17T01:26:08.682540",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:08.012087",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
@@ -89522,6 +89522,246 @@
"z": 27.164301,
"spatialAreaId": null,
"spatialAreaName": null
},
{
"id": "5676",
"mapId": "1",
"floorId": "2065808921272119298",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L1_J楼梯",
"nameEn": null,
"type": "stairs",
"exhibitCode": null,
"x": -10.880158,
"y": 0.510898,
"longitude": null,
"latitude": null,
"boundaryGeojson": null,
"address": null,
"iconUrl": null,
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"model_update_manual_fix\",\"batchCode\":\"MODEL_FIX_20260624\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"楼梯\",\"poiCategory\":\"vertical_transport\",\"poiCategoryLabel\":\"垂直交通\",\"connectorGroup\":\"J\",\"aggregationPolicy\":\"by_floor_type_shaft_zone\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_J_楼梯029\"],\"routeCandidate\":true,\"reviewRequired\":false,\"reviewReason\":\"confirmed_new_vertical_connector\"}",
"phone": null,
"businessHours": null,
"sortOrder": 0,
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"creator": "codex-data-fix",
"createTime": "2026-06-24T19:49:04.296000",
"updater": "codex-data-fix",
"updateTime": "2026-06-24T19:49:04.296000",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
"images": null,
"z": 0.064167,
"spatialAreaId": null,
"spatialAreaName": null
},
{
"id": "5677",
"mapId": "1",
"floorId": "2065808921272119298",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "售票处",
"nameEn": null,
"type": "ticket_office",
"exhibitCode": null,
"x": 23.253601,
"y": 23.566392,
"longitude": null,
"latitude": null,
"boundaryGeojson": null,
"address": null,
"iconUrl": null,
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"model_update_review\",\"batchCode\":\"V20260627093736_e73e3\",\"code\":\"POI_L1_售票处\",\"floorCode\":\"L1\",\"sourceFloorCode\":\"L1\",\"modelGroup\":\"L1\",\"poiTypeLabel\":\"售票处\",\"poiCategory\":\"visitor_service\",\"poiCategoryLabel\":\"观众服务\",\"connectorGroup\":\"售票处\",\"aggregationPolicy\":\"single\",\"sourceCount\":1,\"sourceNodeNames\":[\"L1_售票处\"],\"sourcePoiCodes\":[\"POI_L1_售票处\"],\"routeCandidate\":false,\"reviewRequired\":true,\"reviewReason\":\"sprint_12g_user_confirmed\"}",
"phone": null,
"businessHours": null,
"sortOrder": 112,
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"creator": "codex-s12g",
"createTime": "2026-06-27T14:42:03.431967",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:03.431969",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
"images": null,
"z": 0.241455,
"spatialAreaId": null,
"spatialAreaName": null
},
{
"id": "5678",
"mapId": "1",
"floorId": "2065808921578303490",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L2_闸机",
"nameEn": null,
"type": "entrance_exit",
"exhibitCode": null,
"x": -79.206632,
"y": -38.1329,
"longitude": null,
"latitude": null,
"boundaryGeojson": null,
"address": null,
"iconUrl": null,
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"model_update_review\",\"batchCode\":\"V20260627093736_e73e3\",\"code\":\"POI_L2_闸机\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"出入口\",\"poiCategory\":\"access\",\"poiCategoryLabel\":\"出入口\",\"connectorGroup\":\"闸机\",\"aggregationPolicy\":\"single\",\"sourceCount\":1,\"sourceNodeNames\":[\"L2_闸机\"],\"sourcePoiCodes\":[\"POI_L2_闸机\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"sprint_12g_user_confirmed\"}",
"phone": null,
"businessHours": null,
"sortOrder": 142,
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"creator": "codex-s12g",
"createTime": "2026-06-27T14:42:04.234471",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:04.234474",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
"images": null,
"z": 10.583146,
"spatialAreaId": null,
"spatialAreaName": null
},
{
"id": "5679",
"mapId": "1",
"floorId": "2065808920714276866",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "L-2_闸机",
"nameEn": null,
"type": "entrance_exit",
"exhibitCode": null,
"x": 18.389145,
"y": 10.345641,
"longitude": null,
"latitude": null,
"boundaryGeojson": null,
"address": null,
"iconUrl": null,
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"model_update_review\",\"batchCode\":\"V20260627093736_e73e3\",\"code\":\"POI_LB2_闸机\",\"floorCode\":\"L-2\",\"sourceFloorCode\":\"L-2\",\"modelGroup\":\"L-2\",\"poiTypeLabel\":\"出入口\",\"poiCategory\":\"access\",\"poiCategoryLabel\":\"出入口\",\"connectorGroup\":\"闸机\",\"aggregationPolicy\":\"single\",\"sourceCount\":1,\"sourceNodeNames\":[\"L-2_闸机\"],\"sourcePoiCodes\":[\"POI_LB2_闸机\"],\"routeCandidate\":true,\"reviewRequired\":true,\"reviewReason\":\"sprint_12g_user_confirmed\"}",
"phone": null,
"businessHours": null,
"sortOrder": 44,
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"creator": "codex-s12g",
"createTime": "2026-06-27T14:42:04.927965",
"updater": "codex-s12g",
"updateTime": "2026-06-27T14:42:04.927968",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
"images": null,
"z": -13.751693,
"spatialAreaId": null,
"spatialAreaName": null
},
{
"id": "5680",
"mapId": "1",
"floorId": "2065808921578303490",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "卫生间02",
"nameEn": null,
"type": "toilet",
"exhibitCode": null,
"x": 105.095766,
"y": 39.954363,
"longitude": null,
"latitude": null,
"boundaryGeojson": null,
"address": null,
"iconUrl": null,
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": "{\"source\":\"model_update_review\",\"batchCode\":\"V20260627093736_e73e3\",\"code\":\"POI_L2_卫生间02\",\"floorCode\":\"L2\",\"sourceFloorCode\":\"L2\",\"modelGroup\":\"L2\",\"poiTypeLabel\":\"卫生间\",\"poiCategory\":\"sanitation\",\"poiCategoryLabel\":\"卫生设施\",\"connectorGroup\":\"卫生间02\",\"aggregationPolicy\":\"single\",\"sourceCount\":1,\"sourceNodeNames\":[\"L2_卫生间02\"],\"sourcePoiCodes\":[\"POI_L2_卫生间02\"],\"routeCandidate\":false,\"reviewRequired\":true,\"reviewReason\":\"sprint_12g_user_confirmed\"}",
"phone": null,
"businessHours": null,
"sortOrder": 152,
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"creator": "codex-s12g",
"createTime": "2026-06-27T14:42:05.760570",
"updater": "codex-s12g-rename",
"updateTime": "2026-06-27T14:47:10.063634",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
"images": null,
"z": 10.273865,
"spatialAreaId": null,
"spatialAreaName": null
},
{
"id": "5681",
"mapId": "1",
"floorId": "2065808921272119298",
"clsExhibitionId": null,
"clsAssetIds": null,
"name": "测试",
"nameEn": null,
"type": "shop",
"exhibitCode": null,
"x": -57.026,
"y": 10.446,
"longitude": null,
"latitude": null,
"boundaryGeojson": null,
"address": null,
"iconUrl": null,
"coverImageUrl": null,
"description": null,
"descriptionEn": null,
"extParams": null,
"phone": null,
"businessHours": null,
"sortOrder": 0,
"isGuidePoint": false,
"viewCount": 0,
"guidePlayCount": 0,
"status": 1,
"creator": "1",
"createTime": "2026-06-30T18:12:42.903760",
"updater": "1",
"updateTime": "2026-06-30T18:12:42.903760",
"deleted": false,
"tenantId": "1",
"externalUrl": null,
"images": null,
"z": 3.263,
"spatialAreaId": null,
"spatialAreaName": null
}
]
}