Type: spec Status: ready-for-agent Label: ready-for-agent Blocked by: 02 Category: spec
本规格固化决策票 02的维护者确认结果,作为同一张 map的子规格单。它是「真实数据接线」阶段地图摘要筛选、未关联设备语义、全局状态筛选入口与自动渐进加载的实施输入;不覆盖 .scratch/cockpit-shell-panel-layout/spec.md。
规格文档已发布为 ready-for-agent 并挂到同一决策 map;100% 仅指规格交付,不表示筛选契约、自动加载或饼图已实现。后端契约改动(多值 pointStatus、命中设备子集、八桶全局计数、坐标汇总筛选后口径)需按地图约定在决策票收口后进入后端执行票;前端接线边界在本规格内。
值班人员需要在地图上按点位状态聚焦观察,但当前实现存在五处缺口与缺陷:
map-snapshot 不收 pointStatus(票 25 I1),状态条件只作用到监测分布面板与台账;值班人员选了状态,地图不跟随,界面却写着「全局筛选」。从值班人员视角:地图顶部的状态统计栏成为全局组合筛选入口(八桶多选 OR),筛选对监测点与未关联设备都生效,但各自使用各自的状态来源;监测分布面板改为饼图展示且不再自带筛选;地图摘要自动渐进加载,右上角保留一个小刷新图标(🔄)供手动换新快照。
关键语义(详见决策票 02 的 Answer):
industry/region/deviceType → 其所属监测点进入结果;未关联设备按自身这三个属性直接匹配。map-snapshot 与 /monitoring/distribution 两端同一语义。pointStatus(六态)匹配,不做设备级 OR 归并;未关联设备按设备状态词表(五态 + 状态未发布 UNKNOWN)匹配;EMPTY(无设备)只适用于监测点。pointStatus 契约=单参数多值(逗号分隔或重复参数,OR):pointStatus=ALARM,WARNING,UNKNOWN,UNASSOCIATED;UNKNOWN=点位上状态缺失或不在六态词典(未关联设备=设备状态未发布);认不出的值 400 INVALID_REQUEST;mapFilter 回显整套生效值;不传=全部。mapFilter 回显全部生效维度;结果为空走既有 EMPTY,前端不猜原因。map-snapshot 点位响应带命中设备子集(未筛=全部),前端无需 N+1。mapFilter 回显看到实际生效的筛选组合,以便排障时不靠猜。map-snapshot:
pointStatus(逗号分隔或重复参数),取值=六态 + UNKNOWN + UNASSOCIATED;认不出的值 400 INVALID_REQUEST;mapFilter 回显整套生效值。UNKNOWN=点位上 pointStatus 缺失或不在六态词典;UNASSOCIATED=结果包含未关联设备(类别筛选,不改变点位状态匹配)。/monitoring/distribution 同一语义。deviceCodes/设备明细按当前筛选裁剪;未筛=全部)。UNKNOWN + UNASSOCIATED),供状态栏与饼图共用;筛选时计数不变。/monitoring/distribution:
map-snapshot 语义);pointStatusDistribution 未筛时含八桶;筛选语义与 map-snapshot 一致。mapFilter 回显的约定统一。domain/modeLayerPlan.js 同构):输入筛选(行业/范围/类型/状态集合)与地图批次,输出地图对象集合 + 状态栏八桶计数 + 命中设备子集,一次算清;组件/store 只消费它,不做第二次过滤判断。stores/filterStore.js:pointStatus 由单值改为多值集合(空集=全部),增删/清空语义化;与行业/范围/类型同层级、切模式不重置。stores/mapStore.js + domain/mapSummary.js 装载器:接入多值 pointStatus 入参;新增自动分批加载(进入/筛选变化后连续 loadNext 至 settled,批次间留帧间隔,被新筛选打断按 token 纪律);刷新时机=筛选变化、freshness tick、WS 增量,统一走 refresh()。MapCanvas 图例区)从只读变为可多选的全局筛选入口(八桶 OR、全局计数、选中高亮);行常驻可点(含计数 0 的行)。mapStore.refresh();移除「加载下一页」「刷新快照」按钮(调试形态可保留)。statusFilter 块与自带筛选;状态统计改为饼图(消费全局未筛分布,高亮当前选中)。domain/pointStatus.js(六态 + UNKNOWN + UNASSOCIATED)与 domain/deviceStatus.js(设备五态);饼图与状态栏共用同一份全局未筛分布数据。mapSummary 装载器(注入取数 → 断言分页/快照/自动分批/刷新)。沿用仓库既有模式:.scratch/cockpit-shell-panel-layout/verify/tNN-*.mjs 零依赖逻辑闸门(先例 t08-map-summary.mjs、t09-point-status.mjs、t18-monitoring-panels.mjs、t46-mode-layer-plan.mjs)。-walkthrough.mjs + data-* 断言面):状态栏多选高亮与计数不变、🔄 手动刷新、饼图渲染、展开「另有 N 台」交互、死胡同修复(选中 0 计数状态后仍可改选)、自动分批加载完成态。pointStatus 白名单(六态 + UNKNOWN + UNASSOCIATED,认不出不传参的既有兜底在「非法值 400」契约下调整语义);EMPTY 桶不出现在未关联设备匹配中;点位不跨状态重复(按聚合状态匹配);组合筛选 AND 语义与 mapFilter 回显一致。domain/deviceStatus.js)的定义与视觉(关联设备图层既有契约);本规格只引用它作为未关联设备匹配取值。region + regionMap 配置」改为片区(district 0/1/2 → 城南/城北/太常,空值/乱码=未分区);本文中涉及 region/regionMap 的表述以该修订为准。CONTEXT.md:新增「未关联设备」「状态筛选」词条。