Status: ready-for-human Labels: ready-for-human Category: enhancement Blocked by: None
不阻塞 23 张实现票的 mock 阶段;阻塞的是这些票接真实接口。
This was generated by AI during triage.
结论来自 24: 面板字段与后端契约覆盖调研(已 resolved)、2026-09-17 两轮对后端仓库的复核,以及主会话的逐条核实。缺口分两类:
E:\City-Lifeline-Cockpit-TvT,且后端仓库当时有并行会话的在途改动,不适合由本票直接改。可直接交付给后端项目经理的建票草案已单独产出:后端契约缺口交付包。
BT-5(Gogs #63)按人类裁定走「纵向样板」:完成 map-snapshot 一片的真实数据接线,余 21 片未动,票保持 open(约 5%)。
map-snapshot 纵向样板(不追求 22 片全接);井盖口径「以数据库为准」。BusinessCockpitMapSnapshotAdapter(@Primary),组合 monitor_point / equipment_point_rel / equipment_status / early_warning / work_order / equipment_type 六张既有表与服务,不新增表、不加投影,复用 BT-1…BT-4 已冻结的服务层(过滤/分页/mapFilter/坐标校验均不改)。192.168.110.30:54321/pipi_ner):接线后产出 7 个真实点位(2 个带设备)、3 条有效设备关联、34 台未关联设备、5 台报警、1 台离线 —— 非空且与库一致。BusinessCockpitMapSnapshotAdapterTest 4 例;全量 mvn -pl zksy-admin -am test 465 测试 0 失败。deviceCodes/WS monitoringPointCode 在真实数据下近乎全空(数据缺口,非代码缺陷);renderable=false(不上图),要上图需数据侧补标志或裁定「默认已校核」;monitor_point 无行业列,点位类型只能在关联设备类型唯一时推导;正常/预警 vs ACTIVE);manhole_base(3 条)/manhole_device_rel(6 条)与 manhole 类型根,前端筛选也有「井盖」项,但后端正式行业枚举只有 3 个;1212,1212)。wayfinder 记法:同前几轮——本票属后端 Gogs tracker,不挂在任何 wayfinder map 之下,故 gist 记在本票(其父台账)。
BT-4(Gogs #62)事件行补坐标校验与报警阈值完成并关闭:
events/current 的 EventItem 增加 coordinateValidation(state/reason/renderable/crs)与 thresholdMinValue/thresholdMaxValue(报警族在数据可得时有值,预警族 null);快照源补 coordinateVerified(报警族另补阈值)。校验复用 CockpitCoordinateValidator,与地图/分布/态势同一实现。coordinateVerified 时按未验证处理(UNVERIFIED + renderable=false),符合字典「未验证禁止渲染」;接线后按真实标志放行。events/history-analysis 的行是小时桶聚合、无逐事件行,不适用该字段(与 BT-1 的结论一致)。current-warnings-demo.html 增「上图」列(标记只画 renderable=true 的事件)。CockpitCurrentEventsControllerTest 14 例(含 INVALID/LONGITUDE_OUT_OF_RANGE、UNVERIFIED/UNVERIFIED_COORDINATE、报警阈值断言);全量 mvn -pl zksy-admin -am test 453 测试 0 失败。wayfinder 记法:同前几轮——本票属后端 Gogs tracker,不挂在任何 wayfinder map 之下,故 gist 记在本票(其父台账)。
BT-3(Gogs #61)趋势窗口可声明完成并关闭:
GET /overview/warning-settings 增加 range(LAST_24_HOURS/LAST_7_DAYS/LAST_30_DAYS,同 infrastructure/operating-information)与 startTime/endTime(显式 ISO 区间,成对且 startTime ≤ endTime);range{type,start,end} 回显生效区间(显式区间 type=CUSTOM,不声明时维持 CURRENT_BASELINE + null);trend[] 按窗口过滤(桶为业务时区日期,含端点,顺序沿用适配器)。range、单边区间、startTime > endTime、时间戳不可解析 → 400 INVALID_REQUEST,文案与兄弟切片一致。docs/cockpit/README.md 第 3 节端点参数 + 第 4 节新增「时间范围口径」。CockpitOverviewWarningSettingsControllerTest 9 例 + ServiceTest 3 例;全量 mvn -pl zksy-admin -am test 453 测试 0 失败。wayfinder 记法:同前两轮——本票属后端 Gogs tracker,不挂在任何 wayfinder map 之下,故 gist 记在本票(其父台账)。
BT-2(Gogs #60)路径裁定 + 落地完成并关闭:
map-snapshot 为准(不用 monitoring/distribution 供数),map-snapshot 承接全局筛选。理由:前端全局条件是「范围(scope) + 行业」两维,只加 industry 会让范围对地图无效;且票 08 的装载器已按 map-snapshot 的扁平分页形状验收关闭。map-snapshot 增加 industry/region/deviceType 三个入参;逐点补 region/industry/typeCode/typeName(未关联设备同样补);响应新增 mapFilter{industry,region,deviceType,pointCodes,deviceCodes} 回显生效范围;coordinateValidation 汇总改为「筛选范围内全量口径」;默认不筛时不排除任何对象(行业不可推导为 null)。docs/cockpit/README.md 第 3 节「地图筛选路径(冻结结论)」(票面验收第 1 条)。CockpitMapSnapshotControllerTest 14 例(含筛选、回显、非法行业 400、带筛选翻页快照锁);全量 mvn -pl zksy-admin -am test 450 测试 0 失败。overview/warning-settings 趋势窗口,Gogs #61),另有 BT-4(#62 事件坐标校验)与 BT-5(#63 真实数据接线)。wayfinder 记法:同第四轮——本票属后端 Gogs tracker,不挂在任何 wayfinder map 之下,故 gist 记在本票(其父台账)。
BT-1(Gogs #59)实施完成并关闭——设备→点位回联三件套全部落地:
CockpitMonitoringPointSummary 新增 deviceCodes(从 SourceMonitoringPoint.devices 投影,保序去重),map-snapshot 点位摘要现在能回联设备。monitoringPointCode;DeviceStatusRedisListener 按 equipment_base.equipment_code → equipment_point_rel → monitor_point.point_code 解析,未关联显式 null(帧序列化 WriteMapNullValue),查询异常降级不阻断推送。EventItem 新增 monitoringPointCode/monitoringPointName(快照源与 EventRow 同步补字段)。history-analysis 的 row 是小时桶聚合行,无逐事件行,不适用该字段。mvn -pl zksy-admin -am test(全量 zksy-admin 与 zksy-system)445 个测试 0 失败(含 REST 契约与 WS 增量两侧新增断言)。wayfinder 记法:本票属后端 Gogs tracker,不挂在任何 wayfinder map 之下(后端仓库无
map.md),故 gist 记在本票(其父台账)而非某张 map 的「Decisions so far」。
承接第二轮结论,重新只读复核后端(HEAD 仍 ed0ace5、远端仍 e2b4e45,G1/G2/G4/BT-3/BT-4 证据逐条复验成立),并把交付包草案在 Gogs 建成真实工单:
| BT | Gogs 票号 | 标题 | 标签 |
|---|---|---|---|
| BT-1 | #59 | BT-1 Cockpit device-to-point linkage(REST + WebSocket) | needs-triage |
| BT-2 | #60 | BT-2 全局行业筛选落图:路径裁定 + 落地 | needs-triage |
| BT-3 | #61 | BT-3 warning-settings 趋势窗口可声明 | needs-triage |
| BT-4 | #62 | BT-4 事件行补 coordinateValidation 与报警阈值 | needs-triage |
| BT-5 | #63 | BT-5 真实数据接线(程序级) | needs-triage |
handoff/backend-contract-gaps.md)。needs-triage:这些票都含待后端负责人裁定的点(BT-2 路径二选一、BT-1 ①②③、BT-5 排期),应由后端 PM 评估后转 ready-for-agent。monitoringState 过滤)按草案标注为可选,未建。filterStore 已在票 01 落地);② 适配器计数改为精确口径(23 接口 / 22 空实现 / 1 真实,不计 /foundation 自检则 22/21)。第一轮复核时后端 HEAD 为 #36、#37 未提交,当时判定「8 组补契约中 4 组已交付」。同日后端又落地 #37–#43,第二轮结论大幅前移:11 个契约判定项中 7 项已交付,1 项只剩一处,3 项未交付。
复核方式:只读阅读后端仓库 E:\pipe-ner-server 的控制器、响应类、适配器与 docs/cockpit/README.md;未改动后端任何文件,未跑构建或调试命令。
ed0ace5(test(cockpit): add contract integration environment and handoff (#43))。origin HEAD 仍是 e2b4e45(#42)——#43 未推送,联调前需确认部署来源提交。| 项 | 内容 | 状态 | 证据 |
|---|---|---|---|
| A | 跨设备事件读模型(当前 + 历史) | ✅ 已交付 | GET /events/current(mode 必填并校验,level/industry/status/分页)与 GET /events/history-analysis(eventFamily 必填并校验 + startTime/endTime);EventItem 含 eventNo/eventType/level/levelColor/status/eventTime/value/unit/deviceCode/deviceName/location/industry/longitude/latitude/workOrderSummary;历史侧回显 Range{type,startTime,endTime}。残留 monitoringPointCode 与 coordinateValidation(分别见 G4、BT-4) |
| B | 趋势时间范围可声明 | ✅ 已交付(2026-09-18,Gogs #61) | overview/warning-settings 增加 range 三档 + startTime/endTime,回显 range{type,start,end},趋势桶按窗口过滤;其余切片早已支持范围参数 |
| C | 响应/关闭时长聚合 | ✅ 已交付 | GET /events/handling-efficiency:averageDuration{value,unit,sampleCount,state,reason} + durationTrend[] + 工单 durationHours;口径冻结为 basis = CLOSED_WORK_ORDERS_OVER_TOTAL_EVENTS |
| D | 应急保障域三件套 | ✅ 已交付 | GET /infrastructure/emergency-support:Totals{emergencyResourceCount,hazardSourceCount,protectionTargetCount} + 三 section + eventSummary |
| E | 管理信息域 | ✅ 已交付 | GET /infrastructure/management-information:organizations + ownershipDistribution + unmaintained |
| F | 设施/行业运行信息 | ✅ 已交付 | GET /infrastructure/operating-information:metrics + capacityValue/loadRatio/loadState + trend + range/from/to |
| G1 | 全局行业筛选落到地图点位 | ✅ 已交付(2026-09-18,Gogs #60) | 裁定走路径①:map-snapshot 增加 industry/region/deviceType 入参,服务端过滤 + mapFilter 回显生效范围;分页与 snapshotAt 语义不变;结论冻结在 docs/cockpit/README.md 第 3 节 |
| G2 | 点位摘要补 industry、类型、徽标 |
✅ 已交付(2026-09-18,Gogs #60) | CockpitMonitoringPointSummary 补 region/industry/typeCode/typeName;徽标所需的设备数由 BT-1 的 deviceCodes 直接得出 |
| G3 | 未关联设备补 industry、设备类型 |
✅ 已交付 | CockpitMonitoringDistributionResponse.UnassociatedEquipmentMarker |
| G4 | 设备编码回联点位 | ✅ 已交付(2026-09-18,Gogs #59) | 点位摘要 deviceCodes + 四个 WS 增量 DTO 的 monitoringPointCode(真实库映射查询,未关联显式 null)+ 事件行 monitoringPointCode/monitoringPointName;REST 与 WS 契约测试两侧覆盖 |
| H | 跨设备设备状态清单 | ✅ 已交付 | GET /monitoring/situation:abnormalEquipment[]{deviceCode,deviceName,deviceType,industry,region,abnormalType,status,statusReasons,longitude,latitude,coordinateValidation} + 分页 + mapFilter.deviceCodes |
#43 交付了一份移交与联调手册:E:\pipe-ner-server\docs\cockpit\README.md(契约总则、字典冻结、端点清单、分页/快照/错误口径、WebSocket 增量、启动与联调检查表、容器化评估、已知未验证项)。票 25 里「字段名与语义」类问题已由它回答,不必再建票。Empty*Adapter(返回 ...Snapshot.empty(...)),唯一接入真实数据的是 BusinessCockpitWorkOrderReadAdapter(工单,@Primary 覆盖同名 Empty 实现)。前端切到真实接口会拿到全空快照(200 + freshness.state = EMPTY)。这是当前最大的交付差距,已作为 BT-5 写入交付包。(口径:若不计 /foundation 契约自检,则为 22 个读模型接口 / 21 个空实现。)CONTEXT.md 定义行业筛选是作用于整个驾驶舱的全局条件,但 map-snapshot 至今无法过滤地图点位:
GET /api/cockpit/v1/map-snapshot 无 industry 入参(CockpitMapSnapshotController)。CockpitMonitoringPointSummary 没有 industry 与点位类型,服务端与客户端都无从过滤。overview/monitoring、infrastructure/base-archives、monitoring/overview、monitoring/distribution 都已支持 industry 入参。需要后端定路径(二选一或都做):① map-snapshot 增加 industry 入参,CockpitMonitoringPointSummary 增加 industry 与点位类型字段;② 正式声明地图筛选以 /monitoring/distribution 为准——它已有 industry/deviceType/pointStatus/region 入参与逐点 industry/deviceType,但需在契约手册写明结论,前端实现票据此改取数路径。
deviceCodes + WS monitoringPointCode + 事件行点位 + 点位 industry/类型)CockpitMapSnapshot.SourceMonitoringPoint.devices 存在,但 CockpitMapSnapshotService.monitoringPoint()(145–160 行)只用它解析点位状态,没有把设备编码写进响应。cockpitDeviceStatusDelta 增量只带 deviceCode + 状态,前端拿到增量后无法知道它属于哪个监测点,点位状态无法联动。CockpitCurrentEventsResponse.EventItem 与 history-analysis 的行都缺 monitoringPointCode。GET /monitoring-points/{monitoringPointCode} 的 devices[].deviceCode 可反推 device→point,但需要逐点请求(N+1)。SourceMonitoringPoint.devices;applyDeviceStatusDelta 能按 deviceCode 解析到点位),改动集中在响应层。cockpitSubscribe 回帧只有 {scope, serverUpdatedAt},无初始状态数组(后端注释明确 REST 是初始快照、WS 只发增量——契约本身成立,前端按此实现);线上帧状态键是 data.status,而 DTO 字段名是 monitoringState,接入时注意别名。需要后端:二选一或全做——① CockpitMonitoringPointSummary 输出关联设备编码列表;② WS 增量帧带上 monitoringPointCode;③ 事件行补 monitoringPointCode。
11 个有缺口面板的完整字段表与分组补契约建议(含字段名、语义、是否需要新端点)见 research/panel-field-coverage.md 第 4 节,共 8 组;各组今日状态见上「第二轮逐项判定」:
currentEvents、historyAnalysis、eventAnalysis、operationOverview)— ✅ 已交付historyAnalysis、situationSummary)— ✅ 已交付(range 三档 + 显式区间)responseEfficiency)— ✅ 已交付emergency 整版)— ✅ 已交付monitoring/situation)实现票 17–20 的 mock 阶段可按已有的面板级聚合响应形状建模:/overview/infrastructure、/overview/monitoring、/overview/warning-settings、/infrastructure/base-archives、/infrastructure/operating-information、/infrastructure/management-information、/infrastructure/emergency-support、/monitoring/overview、/monitoring/distribution、/monitoring/situation、/events/current、/events/history-analysis、/events/handling-efficiency、/events/multidimensional-analysis。
三条仍未答复;下列为复核后掌握的现状与建议口径,供业务方确认或否决:
stale? 现状:点位六态 ALARM/WARNING/WORK_ORDER/NORMAL/OFFLINE/EMPTY;指标六态 NORMAL/WARNING/ALARM/EXPIRED/OFFLINE/UNKNOWN,且字典明确 EXPIRED 不与 OFFLINE 合并;situation.abnormalEquipment.abnormalType 是异常分类。建议:业务确认「故障」是否即这些集合的子集,还是要独立桶。handled/total(含已取消事件)? 现状:后端已冻结口径 basis = CLOSED_WORK_ORDERS_OVER_TOTAL_EVENTS(已结案工单数 ÷ 事件总数,见契约手册第 2 节),并显式给出 cancelledCount 等分量。建议:业务确认这就是所说的处置率,面板标注分子分母。maintainer(维护单位)是否同一概念? 现状:management-information 以 organizations + ownershipDistribution + unmaintained 建模,与 maintainer 分开,倾向「不是同一概念」。建议:业务确认「管理单位 = 管理机构/权属单位,maintainer = 维护单位」并回写术语表。| 票 | 影响 |
|---|---|
| 08 地图摘要 | ✅ G1/G2 已交付(Gogs #60):map-snapshot 承接 industry/region/deviceType 并回显 mapFilter;票 08 的分页/快照形状不变,装载器无需改动。另需注意真实数据未接线(BT-5) |
| 15 WebSocket | ✅ G4 已交付(Gogs #59):增量帧带 monitoringPointCode,未关联显式 null |
| 17 基础设施面板 | D/E/F 契约已交付,可对接;真实数据待接线 |
| 18 运行监测面板(含筛选联动地图) | ✅ G1/G2 已交付(Gogs #60):票 18 只需把 filterStore 的 scope/industry 传给 map-snapshot 的 region/industry 入参,并按 mapFilter 回显生效范围;filterStore 已在票 01 落地。F/G/H:monitoring/overview、monitoring/distribution、monitoring/situation 可对接 |
| 19 预警处置面板 | ✅ 契约已齐:A/C 已交付(events/current、history-analysis、handling-efficiency、multidimensional-analysis);monitoringPointCode 由 BT-1(#59)交付,coordinateValidation 与报警阈值由 BT-4(#62)交付。接真实接口前只剩真实数据未接线(BT-5) |
| 20 总体概览面板 | ✅ B 已交付(Gogs #61):overview/warning-settings 支持 range/startTime/endTime,可直接声明「近 7 日」并回显生效区间;真实数据待接线(BT-5) |
map-snapshot 支持 industry 入参并在点位摘要中返回 industry 与点位类型。已达成(2026-09-18,Gogs #60 已关闭):裁定走路径①,落地为 industry/region/deviceType 三入参 + 逐点 industry/typeCode/typeName + mapFilter 回显;结论写入契约手册第 3 节。deviceCodes、② WS 增量帧 monitoringPointCode、③ 事件行 monitoringPointCode 三者全部实现;REST 与 WS 契约测试两侧覆盖。据实更新(第一轮 30% → 第二轮 55% → 第四轮 61% → 第五轮 75%,第六轮因 #61 交付 B 上修):
map-snapshot 纵向样板(第 1 片已落地,见第八轮),余 21 片待续;并需裁定第八轮列出的口径(坐标校核默认值、工单状态值域、窨井行业枚举)。BT-1…BT-4(#59–#62)均已交付并关闭。map-snapshot 为准(industry/region/deviceType + mapFilter),见 docs/cockpit/README.md 第 3 节;/monitoring/distribution 不作为地图取数路径。map-snapshot 已接真实库(第 1/22 片),其余 21 片仍为空实现;这是接真实接口的最大差距,#63 未关闭。#43 未推送,远端仍是 #42;各切片 *-demo.html 是 fixtures,不是真实数据。