# 38: 前端执行票 —— 基础设施面板调整(基础档案同行 / 删除规模 / 运行信息定位修复 / 管理信息片区×行业图表) Type: task Status: resolved Label: ready-for-agent Blocked by: 37(已关闭,省略方法就位) Category: frontend-execution ## 来源 维护者 2026-10-13 反馈第 2、4、5、6 条。 ## 范围 1. **基础档案:设施总数与规模放到同一行**(第 4 条) 2. **删除「规模」读数**(第 2 条)——基础设施面板与总体概览「基础设施」面板;保留 `lengthKm` 3. **运行信息:定位能力修复**(第 5 条)——三种「点不动」必须分得开并给出可见文案 4. **管理信息:片区 × 行业图表化**(第 6 条)——分类柱状图可切「按片区/按行业」,下方保留紧凑清单 ## 实施记录(2026-10-15,本会话) **状态:四条范围全部实施、离线闸门 + 变异闸 + 真实浏览器走查(用户授权)完成,票关闭。改动未提交**(工作树混有票 43/45/46/47 等并行在制品,入库须单独裁剪,与票 33/36/37 同一条纪律)。 ### 交付 1+2:删规模 + 同行呈现 - `infrastructurePanels.js`:`toBaseArchives` 不再解析 `totals.scale`;`archivePanel` KPI 只剩设施总数 + 管线里程。 - `overviewPanels.js`:`toOverviewRegions` 不再带 `scale`;`infrastructureSummaryPanel` 删规模 KPI;`toOverviewInfrastructure` 的 `facilityTypes[].scale` 不再透传(真实值是 `"km"` 长度单位串,留字段只会诱导出第二次误用;长度归 `lengthKm`)。 - `PanelBlocks.vue`:删 `lengthKm` 的 `panel-kpi--wide` 整行特判与对应 CSS——「谁独占整行」由组件按 key 特判是第二份布局语义;KPI 网格 auto-fit 两项自然同行。 - `panelBlocks.js`:`KPI_ICONS` 删 `scale` 位;`CODE_TEXT` 的 large/medium/small 翻译**保留**(后端仍透传自由字符串,词表删了将来误上屏就是英文枚举——票 17 逮过的教训)。 - mock 同构:`contractMocks.js` 的 `totals.scale` 改真实形状 `null`、`facilityTypes[].scale` 改 `"km"`(mock 若继续给 `medium`,误留的消费点在真实下显示 `—`、mock 下显示「中型」,走查抓不到)。 ### 交付 3:定位「点了没反应」——两个真根因,都修了 1. **反馈藏在折叠面板里**(主根因):旧 chip 挂在 `v-show="statusPanelExpanded"` 的状态详情区,默认收起 → 失败提示永远看不见。改为 `
` 底部居中**可见浮层**(`data-locate-notice`,带 `编码 · 原因` 与关闭按钮,8 秒自动收起;定时器卸载必拆——票 15 的漏取消坑)。`data-locate-result` 断言面随迁。 2. **相机语义不对**:旧成功路径用 `setCameraFocus`(ADR 0008 只换中心、保持 heading/range,行星球尺度下几乎无感)。监测点改走 `locateMonitoringPoint`(完整视角定位,与点地图上同一个点位的 `pointSelection` 是同一条相机语义);非监测点保留中心换焦兜底;下发结果 `await` 核对,false 如实降级「地图尚未就绪」不假装成功。store 新增 `clearLocate`(反馈唯一持有者仍是 store)。 ### 交付 4:管理信息片区×行业图表化 - `panelBlocks.js` 新增 `dimensionBarsBlock`:**两个维度都由 domain 预聚合**(按片区/按行业各一份,降序 + 并列保序复用 `sortByCountDesc`),切换是纯展示动作、零后端往返、不进全局筛选(与 `panel-action` 接缝刻意分开,互不冒充)。 - `PanelBlocks.vue` 新增 `dimbars` 画法:`data-dim-tab`(真 button + aria-pressed)+ `data-dimbar-*`;行标签复用票 37 `EllipsisText` 接缝;设备计数进悬停说明不占柱。切换状态按「面板名+块标题」记在组件本地(按块对象记会被刷新顶掉)。 - 下方保留紧凑清单(逐 片区×行业 组合的设施/设备计数);`organizations`/`ownershipDistribution`/`unmaintained` 零消费(t15 既有守卫复验);「责任区域」不作为独立概念(决策 06)。 ### 验收对照 1. **逻辑闸门**:新增 [t38-infrastructure-panel-adjustments.mjs](../verify/t38-infrastructure-panel-adjustments.mjs) **57/57**(A 删规模/留里程/同行、B 三种失败各有互不相同的文案、C 两维度聚合正确+清单保留+退役字段零消费、D 真实 null-scale 形状、E 静态守卫(浮层不被折叠门控/相机走完整路径/无 key 特判/省略单份)、F store 行为含异步 false);[t38-mutations.mjs](../verify/t38-mutations.mjs) **10/10 全部打红**按字节还原。 2. **浏览器走查(real 后端,用户授权)**:① 基础档案「设施总数 5520 处 | 管线里程 55.60494 km」同行、无规模(截图);② 管理信息「按片区/按行业」切换生效(片区:未分区 5520;行业:排水 3166/供水 1652/燃气 699 降序行业色),明细清单保留(截图两张);③ 运行信息点定位 → 底部当场弹出「TCRQ202609080002 · 该点位不在已加载的一张图范围…」+ 关闭按钮(截图),到点自动收起实测生效。 3. **回归**:t44 107/107(dimbars 已进普查归类,两维度各自 RANK;B7 升级为「每一处 panel-bar__label 都走 EllipsisText」——dimbars 复用同写法后存在性断言失去牙,M6 变异当场暴露并修复)、t15 11/11、t50 30/30、t27/t16×2/t22/t42/t43/t46 全绿;t20 60/66 与 t05 282/283 的红名单与 HEAD 基线逐条一致(既有红:B4/C2/D2b/D3/E2/F3 与 D1-deviceStatistics,均非本票引入;B1b/C2d 已随本票契约更新转绿)。t17/t18 两脚本 import 旧导出在 HEAD 即崩(票 37 已归因),本票未新增破坏。 ### 走查暴露的新事实(移交,不属本票范围) **真实后端 `operating-information` 的 `pointCodes` 返回的是设施编码(TCRQ/CNRQ…),而 `map-snapshot` 对象序列只有监测点(GS001…)与未关联设备**——两个编码空间不重叠,所以运行信息面板的定位在真实数据下**永远 MISSING**。前端行为正确(如实报三种原因之一,验收条文「或如实报三种原因之一」按此后半成立),但数据语义可疑:`pointCodes` 本应引用可上图的监测点。已另立后端契约票承接排查(见地图子票)。 ### 遗留与入库裁剪清单 改动未提交;本票 hunks:`domain/panelBlocks.js`(dimensionBarsBlock + KPI_ICONS 删 scale + 注释)、`domain/infrastructurePanels.js`、`domain/overviewPanels.js`、`components/PanelBlocks.vue`(dimbars 画法 + 删 --wide + 本地切换状态)、`CockpitShell.vue`(浮层 + 自动收起 + 样式;**混有票 45/47 在制品 hunks**)、`stores/infrastructureStore.js`(locatePoint 完整视角 + clearLocate)、`mocks/contractMocks.js`(scale 真实形状 2 处)、`verify/t38-*.mjs` 两个新脚本、`.scratch/.../t44-distribution-ranking.mjs`(dimbars 归类 + B7 升级)、`t20-overview-panels.mjs`(B1b/C2d 随契约更新)。 ## 非目标 - 不改后端契约(`districtIndustry` 已交付)。 - 不改四模式面板目录与 panelId。 ## 关联 - 依赖:[37](37-shared-ellipsis-and-type-filter.md)(长文本省略方法)。 - 相关:决策 06(片区/行业唯一维度)、票 15(管理面板片区化)。 - 下游:走查暴露的 `pointCodes` 设施编码问题另立后端票(见上)。 ## Comments ## Answer ## 进度 第二轮(维护者 2026-10-15 复验反馈 2 条)已实施并走查闭环,票重新关闭。改动未提交。 ### 反馈 1:概览里程与基础档案对不上 + 概览那处可独占整行 **根因不是我以为的「两处各自取数不一致」**:`overviewStore.loadPanels` **确实**取了 `/infrastructure/base-archives`(管线里程的唯一来源),但合并进基础设施分区时**硬写 `regions: null`** —— 概览面板因此永远拿不到里程、显示占位符 `—`,而基础档案读同一个端点显示 62.60552。这正是 t20 里 `D3-regions-are-merged-into-infrastructure` 那条红;第一轮我把它归为「与本票无关的基线红」是失察,本轮连同同族真缺陷一并修。 - `overviewStore.js`:真的把 `regions` 并进分区(`regionsLoaded ? regions.data : null`,附 `regionsState`/`regionsReason`);里程两处**按构造同源**(同一个端点的同一字段),不再是「两次取数期望一致」。 - 整行排版:概览的 `lengthKm` 加 `wide: true`,渲染层只认通用 `item.wide`(`.panel-kpi--wide`),**不按 key 特判** —— 与第一轮删掉的那版的区别是「谁独占整行」的决定权在 domain,不在渲染层。第一轮的基础档案两项同行不受影响(都不声明 `wide`)。 ### 反馈 2:点设备 21119740 报「该点位不在已加载的一张图范围内」 **实测根因**:`21119740`(测试环境监测设备01)是**关联设备**,不以自身编码上图 —— 它是宿主监测点 `CBWS202610150001`(城北排水监测点01)的 `deviceCodes` 成员。`findMapObject` 只按对象自身编码匹配,故永远 MISSING;维护者判语「实际上该点位是已加载在图中的真实设备」准确。 - `domain/mapLocate.js`:新增 `findDeviceOwner`(按 `deviceCodes` 反查宿主监测点);`planLocate` 找不到对象时回联宿主,并带出 `deviceCode` 供上层区分。回联只在「找不到」时兜底:编码若真是对象自身编码仍直接命中;既非对象编码也非任何设备编码的,仍如实 MISSING(回联不吞真缺失)。 - `stores/infrastructureStore.js`:`locatePoint` 成功时开**回联到的对象自己的编码**(宿主点位)再进设备级 —— 与点地图上同一点位、再点它的设备卡片是同一条详情路径,「返回点位」回得去。反馈文案仍显示用户点的那个码(回联是内部动作,不改写用户看到的对象)。 - `monitoringStore.locateCode` 是死代码(外壳把所有 `@locate` 都接到 `infrastructureStore.locatePoint`),所以本修复落在**真实接线**的那条路径上。 ### 验收对照(第二轮) 1. **逻辑闸门**:t38 **67/67**(新增 B5/B5b/B5c/B5d/B5e 回联判定、F9/F9b 设备定位链路、A3c/A3d wide 归属、E13 regions 真并入);[t38-mutations](../verify/t38-mutations.mjs) **13/13 全部打红**(新增 M11 回联被撤 / M12 regions 又写 null / M13 wide 被撤),按字节还原。 2. **t20 从 60/66 升到 66/66 全绿** —— 第一轮标为「既有红」的 6 条,其中 4 条是真缺陷本轮修好:`regions: null`(里程根因)、`linkToIndustry` 拿到 filterStore 却不调用(点行业行静默无事发生,与「点了没反应」同类)、`situationData` 用 `{...spread}` 复制破坏「同源引用」证明、overviewStore 里的 `deviceStatistics` 死变量(裸后端字段名,触 t05 D1 面);另 2 条是过期夹具(B4/C2 仍按决策 06 之前的 `regionDistribution`/`区域分布`,已按真实后端形状 `districtDistribution`/片区分布 更新)。 3. **回归**:t44 107/107 + 变异 6/6、t15 11/11、t50 30/30、t43 23/23、t46、t42 契约、t27、t16×3、t22、t23、t05 适配层、t41 定位锚定 全绿。新增 [t38-r2-compile-check](../verify/t38-r2-compile-check.mjs) 全通过(两个 .vue 编译 + 四个 .js 真实 import + 回联确实挂在 planLocate 判定链上)。t17/t18 在 **HEAD 即崩溃**(票 15 删了 `MANAGEMENT_REGION_GAP`/`REGION_MAP_GAP` 导出而脚本仍 import,多票已归因),本轮零新增破坏。 4. **浏览器走查(real,用户已授权)**:① 总体概览-基础设施 管线里程 **62.60552 km**,与基础档案同读同值(修复前 `—`),且独占整行排版;② 运行监测-运行概况 点「定位 21119740」→ 相机飞到目标街景(城北排水监测点标记可见)+ 弹出**设备详情**弹窗(测试环境监测设备01/21119740/报警/设备档案·最新指标·预警5·报警66),无失败浮层(成功按设计不出文字)——正是「直接调用对应点位的点击事件,移动到目标位置并触发弹窗」。 ### 入库裁剪清单(第二轮 hunks) `stores/overviewStore.js`(regions 真并入 / linkToIndustry 真调用 / 同源引用 / 删死变量)、`domain/mapLocate.js`(findDeviceOwner + planLocate 回联 + deviceCode 带出)、`domain/overviewPanels.js`(lengthKm 的 wide)、`components/PanelBlocks.vue`(通用 `item.wide` 类绑定 + `.panel-kpi--wide` CSS;**该文件混有票 43/45/46/47 在制品,hunk 较大须逐段挑**)、`stores/infrastructureStore.js`(locatePoint 开宿主再进设备级)、`verify/t38-*.mjs` 三脚本 + `t38-r2-compile-check.mjs`、`t20-overview-panels.mjs`(B4/C2 夹具更新)。 第二轮完成时间:2026-10-15(第一轮记录见上)。