技术实现方案

这一章写给要动手的人:渲染管线怎么搭、算法网关怎么定契约、指标规则怎么表达、资产包怎么保证不可篡改。每个关键点都给出接口、数据结构或伪代码。

3DGS 渲染SOG / SSOG任务网关 Schema规则 DSL偏差热力图Manifest + WORMAPI / DDL

4.1三维渲染管线

目标:在一个场景里同时稳定加载 3DGS、点云、3D Tiles、GIM 线框,并支持拾取、量测、截图。难点不在"加载",在深度合成、坐标一致、性能预算。

4.1.1 渲染内核分层

SCENE API load / pick / measure / shot 业务层唯一入口 Cesium Viewer 相机 · 地形 · 3D Tiles 坐标转换 · 场景图 深度缓冲 · 裁剪 WebGL2 / 可选 WebGPU Three.js Layer 3DGS · 点云 · GIM 线框 自定义 Shader · 实例化 相机矩阵同步 独立 RenderTarget + 深度合成 数据源 .splat / .ply potree octree / pnts 3D Tiles / glTF / GIM 交互层 GPU Picking · 空间索引 Snap / 锚点 / 测量工具 撤销栈 · 标注重绘 计算层 平面 / 圆柱 / 悬链线拟合 最短距离 · 角度 · 垂直度 精度评估 · 不确定度 输出层 量测结果 · 证据截图 偏差热力图 · 报告素材 审计事件 图 4-1 渲染内核分层:Cesium 负责地理空间与瓦片,Three.js 负责高斯/点云自定义渲染,两者通过共享相机矩阵与深度纹理合成。

4.1.2 3DGS 渲染的关键实现

数据格式

// .splat 每个高斯点 32 bytes
position : float32 × 3   // 世界坐标 (ECEF / ENU)
scale    : float32 × 3   // 三轴尺度(对数域)
color    : uint8   × 4   // RGBA
rotation : uint8   × 4   // 四元数(量化)

// .ply 需解析 SH 系数(degree 0–3)
f_dc_0..2 / f_rest_0..44
opacity / scale_0..2 / rot_0..3

导入时统一转为 GPU 纹理(RGBA32F)或 SSBO;位置做 float64 → float32 的局部坐标平移,避免大坐标抖动。

发布格式建议:PLY 仅作源文件/归档;Web 端优先加载 SOG / Streamed SOG。SOG 用 WebP 图像平面存量化属性,体积约为 PLY 的 1/15–1/20,并天然支持空间树 LOD。MipMap3D 的公开产品即采用该路线,详见 第 08 章。

渲染顺序

1. 视锥裁剪 + 距离裁剪

按 chunk 包围盒剔除;远处 chunk 降 LOD。

2. 深度键计算 + GPU 排序

16-bit 深度键,radix sort;每帧或相机变化超阈值时排序。

3. 实例化绘制

每点一个 quad,顶点着色器展开 2D 协方差;片元做高斯衰减。

4. 深度合成

写入独立 FBO,与 Cesium 深度纹理比较,避免被地形/模型遮挡错误。

4.1.3 三方深度合成(最容易翻车的地方)

问题:Cesium 的 3D Tiles 和 Three.js 的 3DGS 各自维护深度缓冲,直接叠加会出现"高斯穿透墙体"或"点云漂浮在模型前面"。
方案:把 3DGS / 点云渲染到独立 RenderTarget,读取 Cesium 的深度纹理做逐像素深度测试;或者将 Three.js 场景作为 Cesium CustomPrimitive 注入,共用同一深度缓冲。推荐后者,代价是需要处理 Cesium 的渲染管线生命周期。
验收标准:在构架柱前后各放一个高斯点,旋转相机 360°,遮挡关系必须始终正确。

4.1.4 LOD 与内存策略

数据LOD 策略内存上限卸载策略
3DGS空间分块 + 按屏幕空间误差选层;单块 ≤ 200 万高斯1.2 GBLRU,离开视锥 30 s 卸载
点云Octree 八叉树;屏幕空间误差 < 1.5 px1.0 GB按节点引用计数
3D Tiles标准 geometricError;最大 SSE 16512 MBCesium 内置
GIM构件级;按包围盒合并批次256 MB整工程常驻
格式决策(参考 MipMap3D):原方案"直接加载 .splat/.ply + 自研分块"会多花 4–6 人周,且首屏与显存不可控。建议改为:训练输出 PLY(归档)→ 发布转换 SOG/SSOG(Web)→ Loader 统一抽象 SplatSource。SOG 属有损量化,不能作为量测唯一依据,量测仍应回到 PLY/点云。

4.2三通道效果(技术验证图)

下面三张图由本方案自带的 Canvas 渲染器生成,用于说明三种数据在同一视角下的视觉差异与叠加关系。真实项目中使用 Cesium + Three.js 实现同等效果。

3DGS 实景

高斯泼溅
连续表面、真实纹理、适合查看外观与遮挡

LiDAR 点云

点云
精确几何、可量测、适合拟合与偏差分析

GIM 线框叠加

设计模型
构件语义、设备编码、设计值来源
技术效果判读:3DGS 负责"看得懂",点云负责"量得准",GIM 负责"说得清"。三者不是替代关系,而是同一验收结论的三种证据。工作台必须支持任意两两叠加与透明度调节。

4.3量测算法

量测不是"点两个点算距离"。工程验收需要拟合几何基元,再从基元提取轴线、平面、间距。所有算法必须是纯函数、可单测、带不确定度。

量测项算法输入输出精度目标
两点距离欧氏距离(ENU)2 个锚点距离 + 置信区间± 3 mm
对地高度地面分类 + 最近点搜索导线点 + 地面点集最小垂直距离± 10 mm
弧垂悬链线拟合 y=a·cosh((x-x₀)/a)+b导线点序列弧垂值 + 拟合残差± 15 mm
杆塔倾斜轴线拟合(PCA)+ 基础面拟合塔身点云 + 基础面倾斜率 %± 0.02%
相间距离圆柱面拟合 + 轴线最短距离两相导线点云净距 mm± 5 mm
交叉跨越净空两线段最短距离 + 垂直投影导线轴线 + 被跨越物净空 mm± 10 mm
绝缘子偏角轴线向量与铅垂线夹角绝缘子点云 / 影像角度 °± 0.2°
构架垂直度柱轴线拟合 + 铅垂线柱点云垂直度 ‰± 0.1‰
平面度SVD 平面拟合 + 残差 P95平面点云平面度 mm± 1 mm
构件偏差ICP 精配准 + 法向有符号距离GIM 三角网 + 实景点云逐点偏差 + 统计± 5 mm

圆柱拟合(导线)伪代码

def fit_cylinder(points):
    # 1. RANSAC 找初始轴线
    best = None
    for _ in range(500):
        p1, p2 = sample_two(points)
        axis = normalize(p2 - p1)
        r, inliers = estimate_radius(points, axis, p1)
        if score(inliers, r) > best.score:
            best = (axis, p1, r, inliers)
    # 2. 最小二乘精化
    axis, center, r = refine(best.inliers)
    # 3. 不确定度(Bootstrap)
    ci = bootstrap_ci(points, fit_cylinder, n=200)
    return Cylinder(axis, center, r, ci)

关键:先剔除离散噪点(导线间隔棒、金具),再做拟合,否则半径会被拉大。

量测结果的数据结构

{
  "measureId": "M-20261106-0042",
  "tool": "cylinder_min_distance",
  "crs": "EPSG:4547",
  "points": [[x,y,z], [x,y,z]],
  "value": 4388.0,
  "unit": "mm",
  "uncertainty": 4.2,
  "confidence": 0.95,
  "fitResidual": 3.8,
  "algoVersion": "geo-1.4.2",
  "evidence": ["shot-8842.png"]
}
辅助测量级不是"随便量":精度等级(户内 ≤10 mm / 室外 ≤20 mm / 角度 ≤0.2°)必须写进每次量测结果,并在报告中披露。超过精度等级的结论只能作为"辅助判断",不能替代法定检测。

4.4算法任务网关

网关是平台与算法团队之间的"合同执行者"。它的价值不在转发,而在校验、幂等、重试、拒收、审计。

4.4.0 三种接入形态:先定形态,再谈接口

HTTP / REST

在线同步

平台主动下发任务、查询状态。适合算法服务常驻、网络稳定的场景;必须带幂等键。

MQ / Webhook

异步解耦

任务排队、进度回调、失败重试。适合高并发与长任务;需 eventId 去重与死信队列。

文件 + CLI

离线 / 私有化

只读输入、可写输出、退出码 + JSON 摘要。算法团队不暴露网络服务时首选;平台只认产物目录与质量元数据。

推荐组合:任务下发走 HTTP,状态回调用 MQ/Webhook,成果走对象存储 + 文件约定。三种形态共用同一份任务单与质量元数据 Schema,业务代码不因接入形态分叉。

4.4.1 任务单 Schema(冻结版 v1.0)

{
  "schemaVersion": "1.0",
  "taskId": "T-2026-1106-08",
  "idempotencyKey": "sha256(projectId+inputHash+algo+params)",
  "type": "reconstruction.3dgs",          // reconstruction | registration | segmentation | tiling | gim.parse
  "projectId": "PRJ-2026-0117",
  "priority": "normal",
  "algoVersion": "3dgs-2.3.1",             // 不允许 latest
  "parameters": { "quality": "high", "maxGaussians": 8000000 },
  "crs": { "epsg": 4547, "centralMeridian": 105, "unit": "m" },
  "inputs": [
    { "role": "image", "url": "s3://.../raw/v3/images.zip",
      "size": 15240000000, "sha256": "..." },
    { "role": "controlPoint", "url": "s3://.../control.gpkg",
      "size": 20480, "sha256": "..." }
  ],
  "output": {
    "bucket": "verif-prod",
    "prefix": "projects/PRJ-2026-0117/recon/T-2026-1106-08/",
    "required": ["model.ply", "tiles/", "manifest.json"]
  },
  "callback": {
    "url": "https://verif.internal/api/algo/callback",
    "signatureAlgo": "HMAC-SHA256",
    "events": ["progress", "done", "failed"]
  },
  "deadline": "2026-11-06T18:00:00+08:00"
}

4.4.2 质量元数据 Schema(缺一项即拒收)

{
  "taskId": "T-2026-1106-08",
  "algo": { "name": "3dgs", "version": "2.3.1", "imageDigest": "sha256:..." },
  "quality": {
    "registrationResidualMm": 3.2,
    "pointDensityPtsPerM2": 1240,
    "coverageRatio": 0.986,
    "holeRatio": 0.014,
    "iou": 0.94
  },
  "extent": { "min": [x,y,z], "max": [x,y,z] },
  "crs": { "epsg": 4547, "unit": "m" },
  "artifacts": [
    { "name": "model.ply", "bytes": 4200000000,
      "sha256": "...", "format": "ply" }
  ],
  "finishedAt": "2026-11-06T16:10:00+08:00"
}
字段校验规则失败动作
registrationResidualMm必须 ≤ 阈值(粗 50 / 精 10)拒收 + 告警
coverageRatio≥ 0.98拒收,要求补采
crs.epsg必须存在且为已知投影拒收
artifacts[].sha256与对象存储实际哈希一致拒收 + 隔离
algo.imageDigest必须是已登记版本拒收
extent必须覆盖工程范围告警 + 人工确认
原则:元数据不全 = 成果不存在。不要"先入库后补元数据",那等于放弃可追溯性。

4.4.3 网关 API

方法路径说明幂等
POST/api/algo/tasks创建任务,返回 taskId + 上传凭证是(idempotencyKey)
GET/api/algo/tasks/{id}查询状态、进度、质量摘要是
GET/api/algo/tasks/{id}/eventsSSE 订阅进度是
POST/api/algo/tasks/{id}/cancel取消(仅排队/已下发)是
POST/api/algo/callback算法侧回调 progress/done/failed是(eventId)
POST/api/algo/tasks/{id}/replay同输入重放(复现/对比)是
GET/api/algo/capabilities算法能力、版本、参数模板是
建议:网关同时提供 Mock Server,按 schema 返回假任务和假成果。前端与业务后端可以在算法团队未就绪时先跑通全流程,这是压缩工期的关键手段。

4.5GIM 解析适配

GIM 不是"一个模型文件",而是一套工程模型包。适配器的职责是把它的构件树、属性、编码、几何转成平台可用的标准结构。

调用方式

# 容器化 CLI,无网络、只读输入、可写输出
docker run --rm \
  -v /data/gim:/work/in:ro \
  -v /data/out:/work/out:rw \
  gim-parser:2.1 \
  --in /work/in/project.gim \
  --out /work/out \
  --crs EPSG:4547 \
  --with-props \
  --log-json

# 退出码
0  成功
2  输入数据错误(可修复)
3  内部错误(需工具方介入)

平台侧只读 stdout 的 JSON 摘要与输出目录,不解析 GIM 二进制格式。工具升级不影响平台代码。

输出标准结构

gim-bundle/
├── manifest.json          // 版本、坐标系、构件数
├── tree.json              // 工程→单位工程→构件树
├── components.geojson     // 包围盒 + 中心点
├── properties.parquet     // 设备编码 + 属性
├── geometry/
│   ├── model.glb          // 合并几何
│   └── {componentId}.glb  // 按需拆分
└── mapping.csv            // GIM 编码 ↔ PMS 资产编码
必须冻结:设备编码规则、属性字段名、单位(mm/m)、坐标系、构件层级。任何一项变更都要版本号 + 重新解析。

GIM 线框与实景的 mm 级配准展示

解析后的 GIM 几何先转到工程本地 ENU 坐标,再与实景点云做粗配准(控制点/地理坐标)与精配准(ICP point-to-plane)。展示时 GIM 线框以半透明青色叠加,偏差用颜色映射:绿色 ≤ 10 mm、黄色 10–30 mm、红色 > 30 mm。用户可切换"仅线框 / 实体 / 偏差云图"三种模式。

4.6指标核验引擎

408 项指标不能硬编码 408 个 if。必须用"规则 DSL + 计算插件"的方式,让规范工程师也能维护。

4.6.1 规则 DSL

{
  "code": "XL-DX-001",
  "name": "导线相间距离",
  "category": "line-clearance",
  "standard": "GB 50545-2010 表 13.0.2-1",
  "method": "cylinder_min_distance",        // 计算插件名
  "designExpr": "gim.conductors[phase].spacing",
  "limit": {
    "type": "all_of",
    "rules": [
      { "op": "<=", "left": "abs(deviation)", "right": "design * 0.05" },
      { "op": "<=", "left": "abs(deviation)", "right": "50 mm" }
    ],
    "aggregate": "min"                     // 取严
  },
  "verdict": {
    "pass": "abs(deviation) <= limit",
    "watch": "abs(deviation) > limit/2 and abs(deviation) <= limit",
    "fail": "abs(deviation) > limit",
    "pending": "missing(model) or missing(sample)"
  },
  "requires": ["segmentation.conductors", "gim.conductors"],
  "evidence": ["pointcloudId", "screenshot", "algoVersion"],
  "manualAllowed": false
}

4.6.2 执行流程

1
加载规则集
按标准版本
2
检查依赖
分割/模型/抽检
3
取设计值
GIM 属性
4
取模型值
量测插件
5
三级判定
取严 + 兜底

408 项的数据组织

层级数量示例
大类10变电 5 类 / 线路 5 类
子类42主变、GIS、构架、接地…
指标项408BD-DQ-014 套管中心线偏移
规则版本1:N每条指标可绑定多个标准版本
证据1:N点云、截图、量测点、算法版本

批量核定与性能

  • 单指标计算 P95 ≤ 300 ms(不含点云加载)。
  • 408 项批量核定 ≤ 2 min(并发 8,GPU 只用于分割)。
  • 依赖缺失的指标直接置 pending,不阻塞其他项。
  • 批量结果先写草稿区,人工确认后再落正式版本。
  • 规则变更触发"影响分析",只复算受影响指标。

4.7图实比对

图实比对不是"左右两张图"。它要回答:哪个构件、偏了多少、往哪个方向偏、是否影响其他指标。

算法链

1. 粗对齐

地理坐标 / 控制点 / 特征匹配,残差 ≤ 50 mm。

2. 精配准

ICP point-to-plane;按构件分区,避免整体最优掩盖局部偏差。

3. 逐点偏差

沿 GIM 法向计算有符号距离;剔除遮挡与噪点。

4. 统计与着色

均值、P95、最大值;色带映射;生成差异清单。

5. 影响分析

偏差构件是否触发相邻指标(净距、间距、倾斜)。

偏差色带

-50 mm-150+15+50 mm 有符号偏差(法向)
常见陷阱:整体 ICP 会把系统性偏移"平均掉",看起来处处吻合,实际整体平移了 20 mm。必须做分区配准 + 残差分布检查,并保留配准前后的对比截图。

4.8缺陷闭环与报告引擎

缺陷编号与关联

编号规则:D-{工程短码}-{序号},如 D-0117-006。缺陷必须关联:指标项、量测结果、证据截图、构件编码、责任班组、整改期限。

状态可执行动作触发通知
待确认确认 / 作废验收工程师
待整改接单 / 转派班组长
整改中上传照片 / 提交复验监理
待复验受理 / 驳回验收工程师
复验中通过 / 驳回项目经理
已闭环查看 / 归档—

报告生成链路

数据快照

锁定报告生成时刻的指标结果、缺陷、模型版本,保证可复现。

模板渲染

HTML 模板 + 数据绑定;章节可配置;支持企业标准模板。

模型截图

固定相机位、固定分辨率、带比例尺与指北针;截图哈希入库。

PDF 输出

Playwright → PDF/A-2b;字体嵌入;页码与签章位。

签署归档

监理 / 业主电子签章;签章后只读。

报告要点:三维验收报告不是"把表格打印出来"。它必须包含:封面、结论摘要、指标统计、超限清单、缺陷闭环情况、模型截图、配准残差、算法版本、签署页。任何结论都能回链到工作台。

4.9资产包与存证

竣工资产包是项目的最终交付物,也是法律效力的载体。设计原则:自描述、可校验、不可变、可长期读取。

Manifest 结构

{
  "schemaVersion": "1.0",
  "packageId": "PKG-2026-0117-V3",
  "project": { "id": "PRJ-2026-0117", "name": "500kV 云岭变" },
  "createdAt": "2026-11-06T18:00:00+08:00",
  "files": [
    { "path": "model/scene.splat", "format": "splat",
      "bytes": 8420000000, "sha256": "..." }
  ],
  "counts": { "splat": 1, "las": 6, "3dtiles": 1,
    "pcd": 3, "gim": 2, "ifc": 1,
    "pdf": 3, "csv": 1, "e57": 2 },
  "rootHash": "sha256(canonical(manifest.files))",
  "signatures": [
    { "role": "supervisor", "name": "...",
      "algorithm": "SM2", "value": "...", "tsa": "..." }
  ]
}

9 类成果与校验

格式用途校验点
splat3DGS 实景可加载、点数、CRS、LOD
las原始/配准点云LAS 版本、点格式、CRS
3dtilesWeb 发布tileset.json、LOD、包围盒
pcd中间成果字段、精度、坐标系
gim设计模型版本、构件数、编码
ifc通用交换IFC 版本、几何、属性
pdf验收报告PDF/A、签署、页码
csv指标台账编码、UTF-8、行数
e57点云交换头信息、字节数、校验
任一格式校验失败 → 整包不可提交。允许缺项,但必须在 manifest 中显式声明 "absent": true 并说明原因。

存证四步链

1
单文件哈希
SHA-256
2
包根哈希
规范化 JSON
3
可信时间戳
RFC 3161 / 内网 TSA
4
电子签章
SM2 / PAdES
可离线验证:资产包内附 verify.html(纯前端、无依赖),双击即可重新计算哈希并校验签名,不依赖平台。这是长期可读性的最低保障。

4.9.2下游仿真包:OpenUSD / SimReady

竣工资产要同时满足两套世界:电力侧认 GIM,机器人与具身智能侧认 OpenUSD + SimReady。做法不是二选一,而是“主包 GIM + 配套 USD 仿真包 + 映射表”的双包交付。

核心判断:GIM(NB/T 11199)是变电站原生标准资产,带电气语义、设备台账、层级结构,是合规真值;OpenUSD(.usd/.usda/.usdc)+ SimReady 是 Isaac Sim / Omniverse / 物理 AI 的事实标准,带碰撞、质量、摩擦、关节、传感器与语义。二者通过 GIM GUID ↔ USD Prim 路径映射,既满足归档,也能直接训练。

格式定位对照

格式电力归档合规机器人动力学仿真视觉 / 激光合成数据电气语义本项目定位
GIM✅ 国网标准❌ 原生不支持物理❌完整主包 · 电力真值 / 验收基准
OpenUSD + SimReady电力不认✅ 首选✅可由 GIM 映射仿真训练主资产
SDFormat❌✅ ROS/Gazebo一般弱ROS 团队可选配套
glTF / GLB❌❌ 无物理✅弱轻量渲染 / 合成图像
3D Tiles❌❌✅ 实景纹理 / 点云弱实景素材 / 辅助
IFC土建可❌❌弱土建结构交换

推荐交付包目录

pkg-{projectId}/
├── gim/                       # 主包:电力合规真值(NB/T 11199)
├── usd/
│   ├── substation.usda        # SimReady Stage
│   ├── robots/h20.usda
│   └── materials/
├── simready/
│   ├── physics.usda           # 碰撞 / 质量 / 摩擦 / 关节
│   └── semantics.usda         # 设备类型 / 电压等级 / GUID
├── maps/
│   └── gim-usd-mapping.json   # GUID ↔ Prim 一一对应
├── pointcloud/                # LAS / 3D Tiles / E57
├── gltf/                      # 轻量渲染 / 合成图像
├── sdf/                       # ROS 2 / Gazebo 可选
└── manifest.json              # 版本 / 哈希 / 签署 / 映射校验

GIM → OpenUSD 转换流水线

1
解析 GIM
cbm/dev/fam/mod/ifc/icd
2
语义映射
GUID → Prim 路径
3
几何转 USD
Mesh / Xform / 材质
4
物理化
碰撞 / 质量 / 摩擦 / 关节
5
SimReady 校验
7 项规范逐项检查

映射表 Schema(关键)

{
  "schemaVersion": "1.0",
  "source": { "format": "gim", "packageId": "PKG-2026-0117-V3", "hash": "4f19aa30..." },
  "target": { "format": "openusd", "stage": "usd/substation.usda", "simready": "1.0" },
  "units": { "metersPerUnit": 1, "upAxis": "Y", "crs": "EPSG:4547" },
  "items": [
    {
      "gimGuid": "BD-GZ-006",
      "deviceType": "构架柱",
      "usdPrim": "/World/Substation/Gantry/Column_A",
      "semanticTags": ["steel-structure", "500kV"],
      "physics": { "massKg": 3200, "friction": 0.6, "collision": "convexHull" }
    }
  ]
}

SimReady 七项硬校验

① 单位与坐标

metersPerUnit=1、upAxis=Y、ENU、与 EPSG:4547 对齐。

② 碰撞体

每个可碰撞构件必须有简化碰撞(Box / ConvexHull / Capsule),禁止用渲染 Mesh 直接做碰撞。

③ 质量与惯性

按设备台账赋值;主变 82 t、构架柱 3.2 t 等,惯性张量自动计算。

④ 摩擦 / 恢复

钢 0.6 / 混凝土 0.8 / 橡胶 1.0;地面与设备分别配置。

⑤ 关节与铰接

H20 20 关节、A6 6 轴、M2 轮系;关节类型 / 限位 / 阻尼 / 驱动。

⑥ 语义标签

设备类型、电压等级、GIM GUID、PMS 资产编码,供策略与评测使用。

⑦ 材质与传感器

PBR 光学参数、LiDAR 反射率、深度/语义相机可渲染。

校验失败即阻断

任一项失败不得进入训练集;修复后重新生成映射与 Stage。

边界:OpenUSD 不作为电力归档格式,不替代 GIM;GIM 也不直接进 Isaac Sim。二者必须同时存在、通过映射表对齐,任何一方更新都要触发另一方重新生成。
概念区分:MCP 是 Agent 调用工具、读取资产的协议,不是资产格式;GIM / OpenUSD 才是资产文件标准。二期可通过 MCP Server 把"查询 GIM 构件、读取 USD Prim、执行量测"暴露给验收 Agent。

4.10数据模型与 API

4.10.1 核心表 DDL(节选)

CREATE TABLE ind_result (
  id              bigserial PRIMARY KEY,
  project_id      varchar(32) NOT NULL,
  indicator_code  varchar(32) NOT NULL,
  rule_version    int NOT NULL,
  design_value    numeric(16,4),
  model_value     numeric(16,4),
  sample_value    numeric(16,4),
  deviation       numeric(16,4),
  unit            varchar(8),
  verdict         varchar(12) NOT NULL,  -- pass/watch/fail/pending
  reason_code     varchar(64),
  evidence_ids    jsonb,
  algo_version    varchar(32),
  verified_by     varchar(32),
  verified_at     timestamptz NOT NULL DEFAULT now(),
  is_current      boolean NOT NULL DEFAULT true
);
CREATE INDEX idx_ind_board ON ind_result(project_id, verdict, is_current);
CREATE UNIQUE INDEX uq_ind_ver ON ind_result(project_id, indicator_code, rule_version, verified_at);

CREATE TABLE tsk_task (
  id              varchar(32) PRIMARY KEY,
  project_id      varchar(32) NOT NULL,
  type            varchar(48) NOT NULL,
  status          varchar(16) NOT NULL,
  idempotency_key varchar(128) UNIQUE,
  input_manifest  jsonb NOT NULL,
  output_manifest jsonb,
  quality_meta    jsonb,
  algo_version    varchar(32),
  retry_count     int DEFAULT 0,
  created_at      timestamptz DEFAULT now(),
  finished_at     timestamptz
);

4.10.2 API 设计原则

  • REST + JSON;资源命名复数;版本在路径 /api/v1。
  • 统一响应:{ code, message, data, traceId }。
  • 分页:page / size / sort;大列表用游标。
  • 错误码:业务码 5 位,HTTP 状态语义化。
  • 幂等:写操作支持 Idempotency-Key。
  • 长任务:202 + Location + SSE 订阅。
  • 导出:异步任务 + 下载凭证。
  • 所有时间 ISO 8601,带时区。

核心接口清单

GET/projects/{id}/overview
POST/projects/{id}/datasets
POST/projects/{id}/tasks
GET/projects/{id}/indicators
POST/indicators/{code}/verify
POST/indicators/batch-verify
GET/projects/{id}/diff
POST/defects
POST/defects/{id}/transition
POST/archives/{id}/verify
GET/reports/{id}/pdf

4.10.3 权限模型

// 一个角色 = 一组权限点;数据范围用 ABAC 表达式
{
  "role": "verifier",
  "permissions": ["indicator:read", "indicator:verify", "defect:create"],
  "dataScope": "project.members contains user.id AND unit.clearance <= user.clearance",
  "fieldMask": { "rawCoordinate": "mask", "cost": "deny" }
}

4.11性能、测试与开发规范

性能测试场景

场景数据量目标
工作台首屏1 亿点 + 800 万高斯≤ 8 s
图层叠加3 层 + 20 万构件≥ 30 FPS
批量核验408 项≤ 2 min
任务并发10 个重建任务队列可控
资产打包60 GB / 9 类≤ 15 min
报告生成120 页 + 30 图≤ 60 s

测试金字塔

单元测试 · 60%

几何算法、规则判定、金额/单位换算必须有测试;覆盖率 ≥ 70%。

集成测试 · 30%

Testcontainers 起 PG/MinIO/RabbitMQ;重点测事务与状态机。

端到端 · 10%

Playwright 覆盖 8 条主流程;截图对比防止 UI 回归。

验收口径必须有"金标准数据":一套已知答案的点云 + GIM,任何算法/规则改动都跑回归,偏差超过 1 mm 即失败。

开发规范(红线)

主题规则检查方式
坐标禁止在业务代码里手写坐标转换;统一走 crs/ 工具包Code Review + ESLint 自定义规则
三维业务层禁止 import Cesium/Three;只能通过 SceneAPI依赖边界检查(dependency-cruiser)
双形态业务代码禁止出现 isDesktop 分支CI grep + Review
判定禁止在前端计算合格/不合格;以后端结果为准接口契约 + Review
审计所有写操作必须落审计;禁止物理删除框架拦截器 + 单测
存证哈希、时间戳、签署代码不得由 AI 生成;变更需评审CODEOWNERS + 评审记录
依赖新增依赖必须过许可证扫描;禁止 GPL/AGPL 进入交付件FOSSA / ScanCode CI
密钥禁止硬编码;使用 K8s Secret / Vault;定期轮换gitleaks 扫描
交付前必须回答的 6 个问题:① 坐标系是否全部可追溯?② 每个结论是否有证据?③ 失败任务是否可重放?④ 归档包是否能离线校验?⑤ C/S 是否真的不依赖外网?⑥ 许可证是否干净?

4.12前沿增强与演进路线

一期先把"判定正确、证据可追溯、资产可归档"做扎实;以下能力作为增强项,按成熟度分批引入,不进入一期关键路径。

近期 · 0–6 个月

可落地的 AI 辅助

  • 铭牌 / 设备编码 OCR,减少手工映射
  • 缺陷描述草稿生成,人工确认后入库
  • 规则 DSL 补全与一致性检查
  • 相似历史缺陷检索(pgvector)
中期 · 6–12 个月

三维语义与变化检测

  • 开放词汇分割,自动识别设备类型
  • 多期实景变化检测,追踪施工进度
  • 3DGS 语义场 + GIM 属性融合
  • AR 现场复核与远程见证
远期 · 12 个月+

数字孪生与具身智能

  • 竣工数字孪生:运维期状态映射
  • 具身智能训练场:巡检机器人/无人机
  • 跨工程验收知识库与联邦分析
  • 验收 Agent:自动编排 + 人工签认

技术成熟度与建议

技术成熟度项目价值一期建议风险
视觉大模型辅助识别较高减少设备编码手工映射、辅助缺陷分类试点,结果必须人工确认误识别、可解释性不足
LLM 报告/缺陷文案较高提升编写效率,统一术语只生成草稿,不自动签发幻觉、合规表述风险
3DGS 开放词汇分割中自动构件归类、语义检索二期预研精度与稳定性
多期变化检测中施工进度、违建/堆土识别二期配准误差敏感
数字孪生发布中运维期资产可视化先保证资产包可导出数据更新机制复杂
具身智能训练场早期自动巡检、数据飞轮二期之后投入大、场景不确定
AI 使用边界(红线):① 合格/超限的最终判定必须由规则引擎 + 人工签认,不由大模型决定;② 存证、哈希、签署代码不得由 AI 生成;③ AI 生成的缺陷描述、报告段落必须标注"AI 草稿"并人工复核;④ 涉敏数据不得送入外部大模型,必须私有化部署或脱敏。