Просмотр исходного кода

票24:收口(四条验收全过,真机实测 5268 条真实管线)+ 立票32(构件 glTF 素材)

Kazerin 1 неделя назад
Родитель
Сommit
21fbbe5512

+ 28 - 15
.scratch/cockpit-real-data-wayfinding/issues/24-24.md

@@ -4,7 +4,7 @@
 Blocked by: #31
 
 Type: task
-Status: claimed
+Status: resolved
 Label: ready-for-agent
 Category: frontend-execution
 
@@ -122,25 +122,38 @@ Category: frontend-execution
 
 **前端没有绕过**:任选一个数字显示等于把后端缺陷藏起来,违反本项目「不静默」纪律。故如实立 [票 31](31-31.md) 并接为本票 `Blocked by: #31`。
 
-### 未完成 / 阻塞
+### 收口(2026-10-12 晚):四条验收全部达成
 
-1. **验收未满足,本票保持开启**,现共阻塞于两张后端票:
-   - [票 30](30-untitled.md):真实几何依赖后端新端点;当前 `real` 模式下 `/map-facilities` 不存在,图层**如实降级为未就绪**(正确行为,不是缺陷)。
-   - [票 31](31-31.md):设施总数口径不一致,同屏出现两个矛盾数字。
-2. ~~验收第 3 条(管线「无地图位置」清单)~~ **已闭合**(提交 `0895d59`):清单的组装点 `domain/coordinate.js` 的 `coordinateOverview()` 与持有者 `stores/mapStore.js` **都不是并发会话占用的文件**,故在干净侧接完,被占用的 `MapCoordinateBlocked.vue` 一个字未改即自动生效——它的徽标读 `overview.loaded.blocked`、清单读 `overview.blockedEntries`,两者同出这一个对象,所以不会出现「徽标 3、清单 5」的自相矛盾。
-3. **两处改动未提交(已复核,仍维持不提交)**:`services/mapService.js`(新增 `syncPipeLayerForPlan` 桥接)与 `components/MapCanvas.vue`(挂载调用)**与并发会话的在制品同文件**。本轮试过两条路都走不通:
-   - **`git diff -S<字符串>` 挑 hunk**:挑不干净 —— 对方的票 25 署名重构与我的改动在 diff 里合并成大 hunk(MapCanvas 侧混进 154 行删除),挑出的补丁仍含对方代码;
-   - **只提这两个文件**:不可行 —— 它们依赖对方**同样未提交**的 `cesiumEngine.js` / `tilesetLoading.js` / `MapCoordinateBlocked.vue` 与新增的 `MapInfoPanel.vue`,只提这两个会让 HEAD 处于**不自洽**状态;而 build/dev 未经授权不能跑,等于把一个没验证过的重构提交上去。
+票 30、31 已收口,本轮对齐真实契约后完成真机验收。
 
-   已复核当前工作区**无新增失败**(50 个既有纯逻辑脚本 + 3 个本 effort 脚本,失败项与票 22 基线对照时的 9 项既存失败完全一致),改动在工作区生效。归属已在本票记录;待并发会话提交其重构后再单独提交这两处。
-4. **构件素材未做**:阀门/弯头/三通目前是符号,不是 glTF 管道模型。你要的「多种管道素材」需要素材库,仓库内没有;不拿临时符号冒充已建成的管道模型,此项工作量应独立成票。
-5. **片区筛选不作用到管线**:几何无片区字段(票 30 未提供),已如实标记 `districtApplied:false`,不假装管线被片区筛过。
+**契约对齐(提交 `c4aa10e`)**:票 30 的真实端点是 `GET /api/cockpit/v1/infrastructure/geometry`(**不是**我原先约定的 `/map-facilities`,那个 404 是路径没对上)。实测真实形状并逐项对齐:
+
+| 差异 | 原约定 | 真实契约 | 处置 |
+| --- | --- | --- | --- |
+| 路径 | `/map-facilities` | `/infrastructure/geometry` | 改常量 |
+| feature 判别 | 自定 `kind` 字段 | 标准 GeoJSON,**无 `kind`** | 改按 `geometry.type` 判;`geometry:null` 时按 `typeCode` 判 |
+| `pointType` | 中文(阀门/弯头/三通) | 实测**英文** `valve` | 两侧词表都认 |
+| `coverage` | 自定 4 行 `geometryAvailable` | **9 行三态**(`AVAILABLE`/`EMPTY`/`UNAVAILABLE` + `reason`) | 按行归并、缺口如实记 `gaps` |
+| 非法坐标 | 保留几何但 `renderable:false` | **`geometry: null`**,原值在 `sourceCoordinates` | 由既有守卫拦下 |
+| 新增 reason | — | `OUTSIDE_PRIMARY_AREA`(后端 `8013a207` 改为主场景区自动准入) | 已有专属文案 |
+
+**真机验收(`real` 模式,2026-10-12 20:54,浏览器实测)**:
+
+- **验收第 1 条(真实几何绘制)通过**:真实 **5268 条管线**绘制在地图上(沿道路的紫蓝色线段,见 [`real-geometry-rendered.png`](../verify/artifacts/t24/real-geometry-rendered.png));断言面 `data-map-pipes="5268"`、`data-map-pipe-components="1"`。
+- **验收第 2 条(图层显隐)通过**:管线随模式常驻、设施只在总体概览/基础设施可见(离线断言 H1–H4 覆盖四个一级模式 + 引导态 + 未知模式回落)。
+- **验收第 3 条(无地图位置清单)通过**:真实读数 **已加载 5287 · 可上图 5281 · 无地图位置 6**,与后端口径逐项吻合(几何 5272 + 地图对象 15 = 5287;可上图 5269+12 = 5281;不可图 3+3 = 6),徽标与清单同源。
+- **验收第 4 条(设施总数一致)通过**:三个端点实测**全部 5283**(票 31 已把口径收敛),界面「设施底数 5283」与之一致。
+
+**遗留(不阻塞本票收口)**:
+1. `services/mapService.js` / `components/MapCanvas.vue` 两处桥接改动**仍未提交**——同文件含并发会话的在制品(对方已提交票 25/47 等)。我的桥接经本轮真机验证**确实生效**(`data-map-pipes` 就是它写进去的),归属清楚,待对方收工后单独提交。
+2. 构件素材未做 → 已另立[票 32](32-32.md)。
+3. 片区筛选不作用到管线(几何无片区字段),已如实标记 `districtApplied:false`。
 
 ### 下一步
 
-1. 票 30、31 落地后重跑真实联调:`real` 模式下浏览器确认管段与构件按真实几何绘制、行业切换显隐正确、「无地图位置」清单给出原因、设施总数唯一。
-2. 并发会话收工后提交 `mapService.js` / `MapCanvas.vue` 两处,并把管线的 `blocked` 清单接进 `MapCoordinateBlocked.vue`。
-3. 管线 glTF 构件素材另立票。
+1. 并发会话收工后提交 `mapService.js` / `MapCanvas.vue` 两处桥接。
+2. [票 32](32-32.md) 补 glTF 构件素材与实例化。
+3. 真实数据下「切燃气行业 → 地图摘要变无数据」的现象属监测点筛选域(监测点当前多为无设备态),与本票无关,未在本票处置。
 
 ## Comments
 

+ 54 - 0
.scratch/cockpit-real-data-wayfinding/issues/32-32.md

@@ -0,0 +1,54 @@
+<!-- DSH-IDEMPOTENCY-KEY: t24-pipe-glTF-assets -->
+<!-- parentKey: 00 -->
+# 32: 管线构件 glTF 素材与实例化渲染(样条/角/阀门/支管四类)
+
+Type: task
+Status: ready-for-agent
+Label: ready-for-agent
+Category: frontend-execution
+
+## 来源
+
+[票 24(前端设施点位与管线真实几何图层接线)](24-24.md) 收口时维护者 2026-10-12 裁定另立本票。
+
+## 现状事实(票 24 交付了什么、没交付什么)
+
+票 24 已把真实几何接上图(端点 `GET /api/cockpit/v1/infrastructure/geometry`,由[票 30](30-untitled.md) 提供):
+
+- **管段**:`polyline` 贴地折线,管径分档映射线宽、行业映射颜色 —— **已是真实几何**;
+- **构件**:阀门/角管道/支管管道目前用**可辨识符号 + 中文标签**(`point` + `label`)表达,**不是 glTF 管道模型**。
+
+票 24 明确没有拿临时符号冒充"已建成的管道模型"。本票补上素材与实例化。
+
+## 交付物
+
+1. **四类构件素材**(维护者 2026-10-12 裁定的建模分类):
+   - 样条管道:沿路径点拉伸的管体(管段本身已有折线,本项是把它做成有管径体积的模型);
+   - 角管道:预制弯头/转角构件;
+   - 阀门管道:含阀门结构的预制件;
+   - 支管管道:T 型/十字型分支构件。
+2. **实例化渲染**:同一构件类型复用同一份 glTF,按位置/朝向实例化,**不得每个构件各加载一份**(真实数据 5268 条管线,构件数随行业增长,逐个加载会爆内存)。
+3. **朝向由真实几何决定**:管段两端点可算方向;**构件朝向目前无来源**(`gas_pipe_point` 无方位字段),只能按管段方向或固定朝向摆放时必须**如实说明这是近似**,不得声称是真实安装朝向。
+4. **素材缺失时的降级**:素材未就位时保持票 24 的符号表达,**不得白屏或静默丢弃**。
+
+## 约束
+
+- 素材放 `public/cockpit/...`(跟随现有资源归属约定),不进产物源码目录。
+- 渲染层仍是 Cesium(ADR 0005 / 票 24 裁定);若最终判定必须引入 Three.js,需先修订 ADR 0005。
+- 与票 24 的坐标纪律一致:不可上图的构件**不渲染**,仍进「无地图位置」清单。
+
+## 验收
+
+浏览器实测:四类构件按素材渲染、类型可辨;大量实例下帧率可接受(给出实测读数);无真实朝向来源的构件如实标注近似;素材缺失时降级为符号而非空白。
+
+## 关联
+
+由[票 24](24-24.md) 收口派生;几何契约由[票 30](30-untitled.md) 提供(已收口)。
+
+## 进度
+
+<!-- 做到哪一步了,在这里一行一行记 -->
+
+## Comments
+
+## Answer

+ 3 - 0
.scratch/cockpit-real-data-wayfinding/map.md

@@ -49,9 +49,12 @@ Labels: wayfinder:map
 - [x] [后端执行票 —— map-snapshot 与 monitoring distribution 的 pointStatus 八桶契约](issues/29-map-snapshot-monitoring-distribution-poi.md) — 已实施、测试、真实联调并关闭;提交`7fb7c2c`,已随合并`60a0e9a`推送至后端origin/master
 - [x] [25: 前端执行票 —— 去除 Cesium ion 署名与 Data attribution 控件](issues/25-25-cesium-ion-data-attribution.md) — 署名已移出画面,数据来源署名并入外壳既有状态面板;浏览器验收 0 报错、0 条 ion 请求
 - [x] [后端执行票 —— 设施总数三处口径不一致(5278 / 5276 / 5273)](issues/31-5278-5276-5273.md) — 已实施、测试、真实复验并关闭;提交 `96834794` 已推 origin/master,现场三端 facilityCount 均 5283
+- [x] [24: 前端执行票 —— 设施点位与管线真实几何图层接线](issues/24-24.md) — 四条验收全过:真实 5268 条管线绘制、图层显隐正确、无地图位置清单自洽(5287/5281/6)、设施总数三端一致 5283
+- [ ] [32: 管线构件 glTF 素材与实例化渲染(样条/角/阀门/支管四类)](issues/32-32.md) — 由票 24 收口派生:构件目前是可辨识符号,非 glTF 管道模型
 
 ## Decisions so far
 
+- [24: 前端执行票 —— 设施点位与管线真实几何图层接线](issues/24-24.md) — 真实设施与管线几何已接上图并四条验收全过:权威读取路径定为**后端驾驶舱自建几何读模型**(复用业务 GIS 端点会撞 ADR 0005 免鉴权边界且只覆盖供水),渲染层定为 **Cesium**(实测栈内零 three/Tres,规模仅数千段);程序化建模按**燃气出全套构件、其余行业如实降级**(只有燃气有 `point_type` 构件属性,管段无共享端点拓扑故不推断角/支管)。真机实测真实 5268 条管线绘制、无地图位置清单与徽标自洽(5287/5281/6)、设施总数三端一致 5283。过程中逮到并修掉两个真缺陷:**取数失败被显示成"没有管线"**(失败交 `null` 而非空数组)、**`loaded.total` 漏加不可图数**。构件 glTF 素材另立[票 32](issues/32-32.md)。
 - [23: 前端执行票 —— 地图快照分页 token 与 pointStatus 八桶契约对齐](issues/23-23-token-pointstatus.md) — 前端交付(缺 token 停住翻页、`toStatusDistribution` 八桶完整性校验——缺/重/非法/负/非整数桶一律 `available:false` 不补 0、`statusFilterQuery` 白名单丢弃 `BOGUS` 不发脏值)在 #29 关闭后完成两项真实验收收口:状态栏与饼图显示真实八桶(EMPTY=6、UNASSOCIATED=7 其余 0,同源),多选筛选使点数 13→1(ALARM)→2(+WARNING),全局计数不随筛选变化;`BOGUS`/`ALARM,BOGUS` 两端 400 `INVALID_REQUEST`,分页 token 跨页保留。前端源码本轮未改(仅既有 `mapSummary.js` 防护),重跑 [t23-map-contract](verify/t23-map-contract.mjs) 11/11 过;真实浏览器验收证据取自 #29 同环境会话,本会话未重跑(构建/浏览器按项目规则未被要求)。
 
 - [25: 前端执行票 —— 去除 Cesium ion 署名与 Data attribution 控件](issues/25-25-cesium-ion-data-attribution.md) — **更正票面技术前提**:`creditContainer` 是「放哪个容器」而非开关(两条路径都会建 CreditDisplay),按原文字面实施会无效;改用**离屏容器**才真正隐藏。本部署经核实零 ion 依赖(地形/影像/3D Tiles 全本地 URL),隐藏 ion 署名不违约,且该前提已固化为回归断言。地图上除顶部状态图例外的全部信息(图层、加载状态、降级说明、标记计数、坐标准入、引擎读数、数据源署名)**并入外壳既有的那一个状态面板**(维护者否掉了「另起面板」:会与图例和外壳面板互相占用容器);并修掉引擎读数被 `ellipsis` 截断、清单容器异常占空、长编码被右侧裁掉三个问题。浏览器实测:署名与 Data attribution 均已消失,335 请求 0 报错、0 条 ion 请求,各图层正常。

BIN
.scratch/cockpit-real-data-wayfinding/verify/artifacts/t24/real-geometry-rendered.png