Type: implementation Status: resolved Blocked by: 42 Labels: ready-for-agent
按规格 18 建立唯一的模式图层计划纯函数(建议 domain/modeLayerPlan.js),统一输出当前模式的 markers、blocked、legend、locateTargets、degradedNotes。引导态和四个一级模式使用已裁决矩阵;地图引擎和组件只消费计划,不做第二次过滤。一级模式切换保持 Viewer、选择身份和快照;总览与分项切换暂停/恢复选择,分项之间清空。
ALARM/WARNING 和管线。实际设施/管线源未就绪时只验计划与诚实降级,不宣称这些图层已落地。已完成并关闭。 领域断言 29/29、变异 8/8 全部打红、真机走查 10/10(连跑两次稳定)、
回归走查 5/5(人工走查暴露的缺陷修复后固化),全量零依赖回归绿(t04/t28 两处既有红与本票无关)。
人工走查后补修一处真缺陷(2026-09-30):票 45 人工走查用默认样例(现网边界)时,
点监测点点位摘要里的设备卡片 → 摘要面板直接消失。根因在 modeLayerPlan.selectionVisible()
的设备级判定要求 row.placement === 'drawn',而默认样例设备统一 UNVERIFIED_COORDINATE/no-location
⇒ 设备级选择被判「不可见」⇒ 外壳 <aside v-if="… selectionVisibleInMode"> 卸载。设备级详情
(档案/指标/预警等分区)与该设备能否上图无关,一台无地图位置的设备仍要看它的详情分区。
修法:设备级选择只要在 associatedDevices 里找到该设备行,就按模式可见性判(预警处置只显示
报警/预警),不再要求 placement === 'drawn'。已补 F6-no-location-device-detail-visible(纯逻辑)
与 verify/t46-no-location-detail-walkthrough.mjs(5/5,真实鼠标点设备卡片路径)钉住。
domain/modeLayerPlan.js(新):「一张图什么时候显示什么」的唯一领域接缝(规格 18)。
planModeLayers() 输入 { mode, objects, abnormalDevices, facilities, pipelines, associatedDevices, selection, entered },
输出 { markers, blocked, legend, byStatus, locateTargets, degradedNotes, facilities, pipelines,
associatedDevices, layerStates, selection };另有 planModeSelectionTransition()(总览↔分项保留 /
分项↔分项清空)与 isAssociatedDeviceVisible()(关联设备模式判据的唯一住址)。services/mapService.js:syncPointMarkersForSummary(objects) 改为 syncPointMarkersForPlan(plan)
—— 服务层只消费计划,不再自己调 planPointMarkers 重判(规格:引擎和组件不做第二次过滤)。components/MapCanvas.vue:接收外壳算好的 plan prop;图例/降级说明直接渲染计划输出;
引导态门控图例(v-if="entered")与计数浮标;新增 data-map-degraded-note 走查断言面。domain/deviceLayer.js:isVisibleInMode() 改为别名转发到 modeLayerPlan.isAssociatedDeviceVisible
(判据唯一住址;t42 既有断言入口不变)。stores/deviceLayerStore.js:syncForSelection({ entered }) —— 引导态关联设备图层整体撤下(数据仍可预取)。CockpitShell.vue:外壳是唯一计算计划的地方(握有 mapStore/设备行/异常设备/选择态全部输入);
modeLayerPlan computed 一次计算,MapCanvas/详情浮层只消费;模式 watcher 执行
planModeSelectionTransition 的结论(分项↔分项 closeDetail(),唯一的关闭入口);
modeAbnormalDevices 来自 /monitoring/situation(运行概况分区的 abnormalEquipment[]),
未取到时传 null(计划输出降级说明,不猜异常点);introVisible watcher 联动设备层重算。verify/t46-mode-layer-plan.mjs(新,29/29,含回归 F6-no-location-device-detail-visible)+ 变异 8/8 全打红;
verify/t46-mode-layer-walkthrough.mjs(新,10/10);
verify/t46-no-location-detail-walkthrough.mjs(新,5/5,默认样例点设备卡片面板不消失)。plan prop。服务层入参从 objects 改为 { markers, byStatus },模式裁决无第二条路径。classifyDevice 先判
pending/inconsistent/no-location/unavailable/terrain-pending,计划层只对已 drawn 的行做模式过滤。WARNING/ALARM 之外的 WORK_ORDER/OFFLINE/UNKNOWN 不构成异常点
(A6 钉住);异常设备数据未就绪时预警处置不画任何点并给 abnormal-devices-unready 降级说明
(A7:不猜、不借用点位聚合状态)。null → degraded + 降级说明;
契约就绪(哪怕空数组)→ ready;模式不显示 → hidden。管线未就绪在四模式都是 degraded
而非 hidden(A8b:常驻 ≠ 数据就绪才常驻,不把缺数据伪装成"该模式没有对象")。pointCode 供"返回点位"用,判据若先查 pointCode
会把"设备被本模式隐藏"误判成"点位可见 ⇒ 显示"(本票自查抓到,见下)。selection.visible=false 时浮层隐藏(v-if 摘除),
selection 状态一个字节不动;切回目标模式可见时自动恢复——恢复就是"计划重新判定为可见",
不需要额外状态机。selectionVisible() 先查 pointCode 再查 deviceCode
—— 设备级选择带着 pointCode(返回点位要用),于是"选中的 NORMAL 设备在预警处置应暂停"
被判成"其点位可见 ⇒ 显示"(F4 逮到)。修法:设备级优先看设备,点位级才看点位标记。blockedRows.length === 0 ? true : … 恒真却显示 PASS。修法:另跑一趟
默认样例(现网边界 renderable=false),要求降级行确实存在。驱动:verify/cdp-driver.mjs(票 44 交付的零依赖 CDP 驱动;本机 puppeteer-core 仍缺失),
document.hidden === false(Cesium 真实渲染)。
introVisible →
计划 entered=false 的门控链路真实生效;device-layer 受控样例的两个监测点);pipelines-unready 降级说明(该样例 operationOverview 未取数 ⇒
异常设备数据未就绪 ⇒ 不猜异常点,如实降级);ready(不换快照、不重建 Viewer);deviceStatus.js 的 deviceLegend() 去留(票 44 移交)。facilities/pipelines 入参 + degraded 说明),
数据到位后只需把真实集合传进 planModeLayers,无需再动矩阵。零依赖闸门 35 道全绿(含本票新增 t46;t10 的 F5/F7 守卫按票 46 结构更新 ——
意图不变:planPointMarkers 唯一调用点在计划层、MapCanvas 只喂计划、浮层仍是 main 兄弟节点)。
两处红与本票无关:① t28-fill-container.mjs 需 puppeteer(模块已不在本机);
② t04-config.mjs 的「不该硬编码后端地址」指向 services/cockpitApi.js(并发会话正在改)。
按 AGENTS.md:本会话未跑 build;yarn dev 未由我启动(8000 端口已有服务在跑)。
浏览器仅用于本次走查(维护者授权的提权通道,同票 44)。