38-infrastructure-panel-adjustments.md 13 KB

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" 的状态详情区,默认收起 → 失败提示永远看不见。改为 <main> 底部居中可见浮层(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 57/57(A 删规模/留里程/同行、B 三种失败各有互不相同的文案、C 两维度聚合正确+清单保留+退役字段零消费、D 真实 null-scale 形状、E 静态守卫(浮层不被折叠门控/相机走完整路径/无 key 特判/省略单份)、F store 行为含异步 false);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(长文本省略方法)。
  • 相关:决策 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 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 全通过(两个 .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(第一轮记录见上)。