来源:前端驾驶舱 tracker 票 25「后端契约缺口待办」交付包(handoff/backend-contract-gaps.md,2026-09-18 复核)。完整上下文见该交付包。
handoff/backend-contract-gaps.md
背景与证据:23 个 cockpit 适配器接口中 22 个只装配了 Empty*Adapter(@Service,直接返回 ...Snapshot.empty(...));唯一接入真实数据的是工单读模型 BusinessCockpitWorkOrderReadAdapter(@Primary)。各切片 docs/cockpit/*-demo.html 用的是内嵌 fixtures,不代表真实库数据。(计数口径:若不计 /foundation 契约自检,则为 22 个读模型接口 / 21 个空实现。)
Empty*Adapter
@Service
...Snapshot.empty(...)
BusinessCockpitWorkOrderReadAdapter
@Primary
docs/cockpit/*-demo.html
/foundation
要做什么:按切片补真实适配器(复用既有表与服务,遵循 cockpit-backend-read-contracts spec 的「先组合既有表与服务,测量后再加投影/索引」)。建议优先级:先地图与监测链路(map-snapshot、monitoring/distribution、monitoring/overview、monitoring/situation、monitoring-points/{code}),再基础设施三切片,最后预警处置四切片(其中工单链路已接)。
cockpit-backend-read-contracts
map-snapshot
monitoring/distribution
monitoring/overview
monitoring/situation
monitoring-points/{code}
验收标准:每个切片存在非空适配器并被 Spring 装配;用真实库跑通 docs/cockpit/README.md 第 6 节的联调检查表 1–7;snapshotAt 分页稳定、监测点不重复;空结果仍走 200 + freshness.state=EMPTY,不用 5xx 表达空。
docs/cockpit/README.md
snapshotAt
freshness.state=EMPTY
解除阻塞:所有前端票「接真实接口」的环节(mock 阶段不受阻)。
认领声明:Gogs 指派接口对本账号无效(同 #60–#62),以本评论声明认领。
阶段判定:未动工——无实施记录、无进度区、无评论,带 needs-triage → 先诊断(本评论)。
needs-triage
pipe-network-service-dev.yaml
jdbc:kingbase8://192.168.110.30:54321/pipi_ner?currentSchema=app_user
kingbase8-8.6.0
app_user
equipment_base
monitor_point
equipment_point_rel
equipment_status
equipment_type
early_warning
alarm_data
alarm_warning_rel
work_order
结论:本票技术前提具备(连得上、有数据、驱动在)。
deviceCodes
monitoringPointCode
equipment_type.parent_type_id
point_type
status
泄漏检测
GAS
正常
预警
ACTIVE
WATER_SUPPLY
DRAINAGE
manhole
0
pipe_network_base
del_flag=2
network_type
monitor_point.network_id
network_code
network_name
base-archives
operating-information
management-information
emergency-support
events/current
history-analysis
handling-efficiency
multidimensional-analysis
overview/*
type-metrics
freshness
foundation
event-read
equipment-archive
detail-aggregate
每切片工作量 = 真实表/服务组合 + 字段映射 + 空值口径 + 契约测试 + 联调检查项,并须处理第 3 节的数据质量问题。
本票验收是「全部切片刻非空适配器 + 真实库跑通检查表 1–7」,规模为程序级、跨多次会话,单会话无法诚实完成。需裁定本轮做到哪一层(可选项见下),我按裁定执行并如实记进度。
诊断完成(环境、数据面、规模、数据质量四类事实均已实测)。下一步:等待范围裁定,再摘 needs-triage 进入实施。
认领声明:Gogs 指派接口对本账号无效(同 #60/#61/#62,多参数变体均 {"ok":true} 不落库),以本评论声明认领。
{"ok":true}
阶段判定:未动工——无实施记录、无进度区、无评论,带 needs-triage → 先诊断(本评论),摘标签后进入实施。
@Component
MapSnapshot
MonitoringDistribution/Overview/Situation
MonitoringPointDetail
CurrentEvents
HistoryAnalysis
HandlingEfficiency
MultidimensionalAnalysis
Infrastructure{BaseArchives,OperatingInformation,ManagementInformation,EmergencySupport}
Overview{Infrastructure,Monitoring,WarningSettings}
TypeMetrics
EquipmentArchive
EventRead
Freshness
Foundation
DeviceBoundary
契约阶段刻意只交付「契约 + 空适配器 + demo」,把真实数据留在适配器 seam 之后(spec 约定「先组合既有表与服务,测量后再加投影/索引」)。本票就是补上这 22 个 seam 的真实实现。
192.168.110.30:8848
manhole_base
manhole_device_rel
可用:
equipment_base.equipment_code
alarm_data.device_code
early_warning.device_code
current_status
alarm_status
online_status
order_status
device_code
WORK_ORDER
必须写死口径或降级的坑(真实数据质量,非代码缺陷):
monitor_point.status
压力监测
水质监测
PRESSURE
work_order.order_status
byLegacyCode
JK03
RQJCD01
null
JC001
(12,12)
(1212,1212)
renderable=false
MISSING_*
INVALID
22 个适配器、34 个接口方法、395 个快照字段需要从真实表组合映射;验收还要求「用真实库跑通 docs/cockpit/README.md 第 6 节联调检查表 1–7」,并保持 snapshotAt 分页稳定、监测点不重复、空结果走 200 + EMPTY。
EMPTY
建议的分片优先级(来自交付包 §二,按解除阻塞收益排序):
诊断完成(复现、根因、环境与数据面、坑与规模已实测)。下一步:摘 needs-triage → 按分片优先级逐片接线 → 逐片留真实库证据。
范围:按裁定「纵向样板」交付 map-snapshot 一片的真实数据适配器,为余下 21 片立模板。本票不改 22 片全接,未完成部分如实记进度、不关票。
BusinessCockpitMapSnapshotAdapter
EmptyCockpitMapSnapshotAdapter
@TableLogic
del_flag
EquipmentBaseService.getEquipmentByPoint
parent_type_id
CockpitMapSnapshotService
mapFilter
mvn compile
BusinessCockpitMapSnapshotAdapterTest
CockpitMapSnapshotControllerTest
CockpitContractIntegrationTest
Z-RQXLJC01
Z-RQYLJC01
RQJC01
JC002
typeCode
MANHOLE
industry
余下 21 片仍未接线,按建议优先级分片推进:
按裁定完成第 1 片(map-snapshot 真实适配器 + 4 例新测试 + 真实库端到端证据)。余 21 片未接线,不满足本票「每个切片存在非空适配器」的验收,故不 close;进度按片数记约 5%。
下一步:按分片优先级继续(下一片建议 monitoring/distribution,与 map-snapshot 共用点位/设备/类型链路,边际成本最低);并请裁定上文第 2、5、6 项口径。
范围:按裁定继续「纵向样板」推进,本片交付 monitoring/distribution 真实数据适配器(第 2/22 片)。本票仍不关。
BusinessCockpitDeviceFactResolver
com.zksy.cockpit.point
CockpitTypeIndustry
com.zksy.cockpit.foundation
BusinessCockpitMonitoringDistributionAdapter
EmptyCockpitMonitoringDistributionAdapter
BusinessCockpitMonitoringDistributionAdapterTest
BusinessCockpitDeviceFactResolverTest
CockpitMonitoringDistributionControllerTest
mvn -pl zksy-admin -am test
0..6
equipment_base.equipmentTypeName
@TableField(exist=false)
equipmentTypeId
余 20 片未接线。按优先级继续:地图与监测链路还剩 monitoring/overview、monitoring/situation、monitoring-points/{code};再基础设施 4 片;再预警处置 4 片;其余 9 片。
已交付 2/22 片(map-snapshot + monitoring/distribution)。余 20 片未接线,不满足「每个切片存在非空适配器」验收,故不 close。
下一步:monitoring/overview 或 monitoring/situation(复用同一构图与共享组件,边际成本低)。
范围:按裁定继续纵向推进,本片交付 monitoring/overview 与 monitoring/situation 两个真实数据适配器(第 3、4/22 片)。本票仍不关。
BusinessCockpitMonitoringOverviewAdapter
equipment_status.online_status
monitoringState
ONLINE
OFFLINE
UNKNOWN
STALE
sampledAt
BusinessCockpitMonitoringSituationAdapter
ALARM
WARNING
NORMAL
EXPIRED
device_code → equipment_base → equipment_type
alarm_data.device_type
流量监测
environment
flammable-gas
early_warning.warning_type
GAS_PIPE
WATER_PIPE
equipment_type.type_id
alarm_time
publish_time
BusinessCockpitMonitoringOverviewAdapterTest
BusinessCockpitMonitoringSituationAdapterTest
CockpitMonitoringOverviewControllerTest
CockpitMonitoringSituationControllerTest
excluded
余 18 片未接线。地图与监测链路还剩 monitoring-points/{code},然后基础设施 4 片、预警处置 4 片、其余 9 片。
已交付 4/22 片(map-snapshot、distribution、overview、situation)。余 18 片未接线,不满足「每个切片存在非空适配器」验收,故不 close。
下一步:monitoring-points/{code}(点位详情,收尾地图与监测链路后再进基础设施片)。
本轮按 /ask-matt 路由执行「现状重建 + domain/context/spec/issue 同步」,没有修改 Java/SQL 代码,也没有把历史接线进度继续累加。当前代码、当前 KingbaseES schema、当前领域模型取代 2026-09-18 以前的接线假设。
/ask-matt
id
type_name
parent_id
type_id
getTypeId()
getParentTypeId()
zksy-system
device_id
alarm_id
case_id
hazard_id
alarm_data.order_id → work_order.order_id
WorkOrder::getDeviceCode()
WorkOrderStatusEnum
0 待派单 / 1 待接单 / 2 已接单 / 3 处理中 / 4 待验收 / 5 已结案 / 6 延期中 / 7 已取消
当前真实库不是此前记录的旧测试快照,核心行数为:
order_id=271
order_id
21119740
860347065467627
del_flag=0
case_info
hazard_hidden_account
当前真实样例:
work_order.order_id=271
alarm_data.order_id=271
equipment_type.id
work_order.device_id → equipment_base.equipment_id → equipment_code
alarm_warning_rel → alarm_data → order_id
work_order.device_code
equipment_type.id=4
parent_id=4
#63
0%(等待新基线与口径确认)
已确认并回写 CONTEXT.md、spec.md、docs/cockpit/README.md:
CONTEXT.md
spec.md
CockpitCoordinateValidator
coordinateVerified=false
app_user.sys_dict_type/sys_dict_data
下一步:定位工单状态字典来源/表名并确认其值;随后才将本票从 needs-triage 转为可执行,修复当前编译、实现新类型/行业映射并以当前库重新联调。
人类澄清:“工单字典”指当前代码中的 WorkOrderStatusEnum,不是独立数据库字典表。枚举与 ADR-0010 确认 0 待派单 / 1 待接单 / 2 已接单 / 3 处理中 / 4 待验收 / 5 已结案 / 6 延期中 / 7 已取消;终态 5/7。app_user.sys_dict_type/sys_dict_data 未发现工单状态条目符合该解释,不再作为未决阻塞。
其余需求裁定不变:公开 typeCode 使用当前 equipment_type.id(JSON 字符串);井盖扩为第四正式行业 MANHOLE;无可信坐标校核来源时 renderable=false;以当前真实 KingbaseES 数据联调且不编造业务行。
本轮仅同步文档,不修改代码。#63 仍处于 needs-triage,当前工作树编译失败,历史 4/22 接线不可作为验收。
BT-5 实施/验收更新(2026-09-28)
已完成并推送:
54dd693
station_type
deviceCode
验证:
mvn -pl zksy-admin -am test -DfailIfNoTests=false -q
127.0.0.1:8301
UNAUTHORIZED
INVALID_REQUEST
total=15
/ws/deviceStatus
cockpitSubscribe(scope=all)
cockpitSubscribed
serverUpdatedAt
+08:00
边界:192.168.110.30:8301 部署端口仍不可达,因此本评论不把它当作 HTTP 证据。Issue #63 保持开启,不在本轮关闭。
192.168.110.30:8301
补充说明:5ce0458 已修复快照 token 必须为 +08:00、Redis/缓存故障返回 SERVER_ERROR、本地缓存并发容量边界,并补充 station_type 条件查询与契约测试;15c1c52 已在 README 明确:HTTP 200/readOnly 通过不等于 #63 要求的全部 22 个切片均已非空真实接线,仓库仍有 Empty*Adapter,issue 继续保持开启。
5ce0458
SERVER_ERROR
15c1c52
本轮继续修复并推送:11e5d9a 对齐深层 equipment_type.parent_id 行业上溯、RELEASED 当前预警、未知行业 excluded 统计,以及 work_order_log.oper_type 0–10 到当前 0–7 状态的时间线映射;84a7834 同步 README。定向与全量 Maven 回归均通过。#63 仍保持开启,剩余 Empty*Adapter 全量非空接线和目标部署实例验收未宣称完成。
11e5d9a
equipment_type.parent_id
RELEASED
work_order_log.oper_type
84a7834
本轮继续推进:已完成并推送 11e5d9a(深层类型树行业上溯、RELEASED 预警态、未知行业进入 excluded、工单日志 0–10 操作码映射当前 0–7 时间线),84a7834 同步 README。定向测试和 mvn -pl zksy-admin -am test -DfailIfNoTests=false -q 全量回归均通过。#63 仍保持开启;剩余是详情 freshness/stale、全量检查表逐端点证据和目标部署实例不可达等验收项。
真实数据量补充(本轮只读核对):概览/基础设施/监测概况及事件切片均返回 200;历史预警分析返回 169 行,处置效率返回 2 条事件。监测分布返回 200 且 freshness=EMPTY、点位/未关联设备列表为空,原因是当前点位/设备没有可信坐标校核,按契约 renderable=false,不使用 fixture 强行填充。
freshness=EMPTY
第 2 轮进度:7e0d2c8 已将基础档案/运行信息适配器的共用 pump_station 查询改为显式 station_type IN (water_supply, drainage),与此前总体概览保持一致;678f3e7 同步 README。定向与全量 Maven 回归通过。#63 保持开启,目标部署实例和逐端点完整验收仍待继续。
7e0d2c8
pump_station
station_type IN (water_supply, drainage)
678f3e7
第 3 轮真实 HTTP 验收补充:16/16 个端点非法参数样例均返回 400 INVALID_REQUEST;真实 deviceCode=860347065467627 的 archive、metrics、events、work-orders、detail-aggregate、freshness 均返回 200、readOnly=true,并回显同一 canonical deviceCode。1676396 已同步 README,#63 继续保持开启。
deviceCode=860347065467627
readOnly=true
1676396
第 4 轮最终收口(合并远端并发改动后 HEAD=6ef71ef):严格 snapshotAt 签发/续页契约已通过,未签发或缓存丢失 token 不重建当前库;显式快照丢失统一 SNAPSHOT_EXPIRED;detail-aggregate 时间线校验工单号、设备号和每条日志工单号,错误时间线不泄漏,兄弟分区保留并返回 PARTIAL。定向测试和合并后全量 Maven 回归均通过。目标部署实例仍不可达,#63 保持开启。
6ef71ef
SNAPSHOT_EXPIRED
PARTIAL
第 5 轮静态装配盘点:当前仓库 23 个 Empty*Adapter 均有对应 @Primary Business*Adapter,另有 1 个共享事件事实适配器;fallback 类保留不等于运行时未接线。合并远端监测点重构后全量 Maven 回归仍通过,77b4a34 已同步 README。剩余是逐切片代表性真实数据、空/脏数据和故障注入证据,#63 保持开启。
@Primary Business*Adapter
77b4a34
第 6 轮真实切片核对(重启加载合并后代码):overview/infrastructure、overview/monitoring、overview/warning-settings、基础档案、运行信息、应急、monitoring/overview、monitoring/situation 均 200/readOnly/CURRENT;monitoring/situation 返回 6 个异常设备;历史预警分析 169 行,处置效率 2 条,事件多维分析 7 个维度。monitoring/distribution 合法返回 200/readOnly/EMPTY,点位和未关联设备为 0,因坐标未可信校核而禁止渲染。31597fd 已同步 README;#63 保持开启。
31597fd
第 7 轮完成:补充 Redis GET/SET 运行时异常契约测试,确认适配器包装为 CockpitReadException,控制器映射 500 SERVER_ERROR,不误报 SNAPSHOT_EXPIRED。定向与全量 Maven 回归通过,73a8ae3 已推送并同步 README。#63 继续保持开启。
CockpitReadException
500 SERVER_ERROR
73a8ae3
第 8 轮补充本机受控性能烟测:同一真实 snapshotAt 连续认证请求 30 次,30/30 成功,平均 24.10ms、P95 30.60ms、最大 34.35ms,本次 live 样例 total=7。该数据仅代表本机当前进程/数据量,不替代生产压测;2b9fea9 已同步 README,#63 继续保持开启。
total=7
2b9fea9
第 9 轮时间戳/freshness 扫描:16 个主要 endpoint 全部 HTTP/app code 200;所有观察到的 ISO 时间戳均为 +08:00;11 个 endpoint 显式提供 freshness。events/current、history-analysis、handling-efficiency、multidimensional-analysis 和 device-boundary 尚未提供统一 freshness 字段,已在 README 标为未完成契约项。合并远端监测点改动后全量回归通过,当前 HEAD=c531835,#63 保持开启。
c531835
第 10 轮完成:事件 current/history/handling/multidimensional 与 device-boundary 响应 DTO 补充 freshness getter;重启后真实认证 HTTP 复验五个端点均 200、readOnly=true、freshness=CURRENT;补充事件空态 freshness=EMPTY 断言,定向与全量 Maven 回归通过。355a8af 已推送。#63 继续开启,生产 freshness 实际时效、空/故障数据和目标部署实例仍待验收。
355a8af
票 25 里那段三切片摘要可直接粘贴,我的工具只达本地台账。
背景与证据:23 个 cockpit 适配器接口中 22 个只装配了
Empty*Adapter(@Service,直接返回...Snapshot.empty(...));唯一接入真实数据的是工单读模型BusinessCockpitWorkOrderReadAdapter(@Primary)。各切片docs/cockpit/*-demo.html用的是内嵌 fixtures,不代表真实库数据。(计数口径:若不计/foundation契约自检,则为 22 个读模型接口 / 21 个空实现。)要做什么:按切片补真实适配器(复用既有表与服务,遵循
cockpit-backend-read-contractsspec 的「先组合既有表与服务,测量后再加投影/索引」)。建议优先级:先地图与监测链路(map-snapshot、monitoring/distribution、monitoring/overview、monitoring/situation、monitoring-points/{code}),再基础设施三切片,最后预警处置四切片(其中工单链路已接)。验收标准:每个切片存在非空适配器并被 Spring 装配;用真实库跑通
docs/cockpit/README.md第 6 节的联调检查表 1–7;snapshotAt分页稳定、监测点不重复;空结果仍走 200 +freshness.state=EMPTY,不用 5xx 表达空。解除阻塞:所有前端票「接真实接口」的环节(mock 阶段不受阻)。
诊断(2026-09-18)
认领声明:Gogs 指派接口对本账号无效(同 #60–#62),以本评论声明认领。
阶段判定:未动工——无实施记录、无进度区、无评论,带
needs-triage→ 先诊断(本评论)。一、复现:契约已冻结,数据未接线
Empty*Adapter(返回...Snapshot.empty(...));唯一真实适配器是BusinessCockpitWorkOrderReadAdapter(@Primary)。docs/cockpit/README.md第 6 节联调检查表 1–7」。二、环境核查(本轮新增,决定本票可执行性)
pipe-network-service-dev.yaml可读。jdbc:kingbase8://192.168.110.30:54321/pipi_ner?currentSchema=app_user(不是 MySQL);kingbase8-8.6.0驱动已在本地 Maven 仓库。app_user下 120 张表,契约相关表齐全。equipment_base=37、monitor_point=7、equipment_point_rel=20、equipment_status=22、equipment_type=20、early_warning=29、alarm_data=507、alarm_warning_rel=3、work_order=19。结论:本票技术前提具备(连得上、有数据、驱动在)。
三、真实数据质量问题(实测,直接影响验收)
equipment_point_rel20 行中 10 行已逻辑删除,有效行仅 3 条能 Join 到未删除的monitor_point(覆盖 2 个点位)→ BT-1 (#59) 的deviceCodes/WSmonitoringPointCode接线后近乎全空。这是数据缺口,不是代码缺陷。monitor_point无行业列:行业只能由equipment_type.parent_type_id推导(1=供水、2=排水、3=燃气、4=窨井);point_type/status混用中英文(泄漏检测vsGAS;正常/预警vsACTIVE)。GAS/WATER_SUPPLY/DRAINAGE,而equipment_type有独立根manhole(parent=4)→ 按现有口径窨井设备会被判非正式行业而排除。属契约/业务缺口,需裁定。0(4 条):冻结七态为 1–7;既有适配器把越界码收敛为 7(已取消),真实数据的0会被映射成「已取消」,是否符合业务需确认。pipe_network_base大量逻辑删除(样例del_flag=2),network_type为数字;monitor_point.network_id实测关联不上该表(network_code/network_name全 null)。四、方案(分片优先级,沿用交付包建议)
map-snapshot、monitoring/distribution、monitoring/overview、monitoring/situation、monitoring-points/{code}——决定「一张图」能否出真实点位。base-archives、operating-information、management-information、emergency-support。events/current、history-analysis、handling-efficiency、multidimensional-analysis(工单链路已接)。overview/*、type-metrics、freshness、foundation、event-read、equipment-archive、detail-aggregate。每切片工作量 = 真实表/服务组合 + 字段映射 + 空值口径 + 契约测试 + 联调检查项,并须处理第 3 节的数据质量问题。
五、需要裁定(HITL)
本票验收是「全部切片刻非空适配器 + 真实库跑通检查表 1–7」,规模为程序级、跨多次会话,单会话无法诚实完成。需裁定本轮做到哪一层(可选项见下),我按裁定执行并如实记进度。
进度:0% → 诊断完成
诊断完成(环境、数据面、规模、数据质量四类事实均已实测)。下一步:等待范围裁定,再摘
needs-triage进入实施。诊断(2026-09-18)
认领声明:Gogs 指派接口对本账号无效(同 #60/#61/#62,多参数变体均
{"ok":true}不落库),以本评论声明认领。阶段判定:未动工——无实施记录、无进度区、无评论,带
needs-triage→ 先诊断(本评论),摘标签后进入实施。复现(三条)
Empty*Adapter(@Service/@Component,返回...Snapshot.empty(...)):MapSnapshot、MonitoringDistribution/Overview/Situation、MonitoringPointDetail、CurrentEvents、HistoryAnalysis、HandlingEfficiency、MultidimensionalAnalysis、Infrastructure{BaseArchives,OperatingInformation,ManagementInformation,EmergencySupport}、Overview{Infrastructure,Monitoring,WarningSettings}、TypeMetrics、EquipmentArchive、EventRead、Freshness、Foundation、DeviceBoundary等。BusinessCockpitWorkOrderReadAdapter(@Primary,覆盖同名 Empty 实现)。freshness.state=EMPTY),契约已冻结、数据未接线。根因
契约阶段刻意只交付「契约 + 空适配器 + demo」,把真实数据留在适配器 seam 之后(spec 约定「先组合既有表与服务,测量后再加投影/索引」)。本票就是补上这 22 个 seam 的真实实现。
环境与数据面(本轮只读实测,非推测)
192.168.110.30:8848),pipe-network-service-dev.yaml可读。jdbc:kingbase8://192.168.110.30:54321/pipi_ner?currentSchema=app_user,驱动kingbase8-8.6.0本地可用。不是 MySQL(3306 通但不是本库,容易踩错)。app_user下 120 张表,契约相关表齐全且有数据:equipment_base=37、equipment_status=22、monitor_point=7、equipment_point_rel=20、equipment_type=20、early_warning=29、alarm_data=507、alarm_warning_rel=3、work_order=19、pipe_network_base=5269、manhole_base=4、manhole_device_rel=6。真实数据与契约的对齐情况(决定各切片可行性与口径)
可用:
equipment_base.equipment_code与alarm_data.device_code完全匹配(23/23);early_warning.device_code部分填充(12/29,匹配 4/4)。equipment_status与台账可关联 22 条,提供current_status/alarm_status/online_status,足以支撑点位六态裁决。order_status1–5)可按device_code关联,支撑点位WORK_ORDER态。必须写死口径或降级的坑(真实数据质量,非代码缺陷):
monitor_point没有行业字段,只能由equipment_type.parent_type_id推导(1=water_supply、2=drainage、3=gas、4=manhole)。monitor_point.status同时存在正常/预警与ACTIVE;point_type同时存在泄漏检测/压力监测/水质监测与GAS/PRESSURE。映射需显式列出已知取值,未知值不得静默归类。equipment_point_rel20 行中 10 行del_flag=2(逻辑删除),有效行仅 3 条能 Join 到未删除点位(覆盖 2/7 个点位)。→ BT-1(#59)刚交付的deviceCodes与 WSmonitoringPointCode在真实数据下近乎全空。这是数据缺口,不是响应层 bug。work_order.order_status出现字典外取值0(4 条)。冻结七态是 1–7;既有适配器用byLegacyCode把越界码收敛为 7(已取消)。映射口径需确认(建议:显式记为越界,不冒充已取消)。pipe_network_base大量逻辑删除(样例del_flag=2),network_type是数字;monitor_point.network_id实测关联不上该表(network_code/network_name全为 null)→ 区域/管线维度暂无可靠来源。monitor_point中JK03、RQJCD01经纬度为null,JC001为(12,12);manhole_base为(1212,1212)/(12,12)。按冻结字典一律renderable=false(MISSING_*/INVALID),即不可上图——这是字典要求的正确行为,不是缺陷。GAS/WATER_SUPPLY/DRAINAGE,而equipment_type有独立根manhole(parent=4)且manhole_base/manhole_device_rel是独立域(cockpit 包内无窨井语义)。→ 窨井设备按现有口径会被判「非正式行业」而排除,但前端行业筛选(ADR 0002)里有「井盖」项。属契约/业务缺口。规模(本票为何是「程序级」)
22 个适配器、34 个接口方法、395 个快照字段需要从真实表组合映射;验收还要求「用真实库跑通
docs/cockpit/README.md第 6 节联调检查表 1–7」,并保持snapshotAt分页稳定、监测点不重复、空结果走 200 +EMPTY。建议的分片优先级(来自交付包 §二,按解除阻塞收益排序):
map-snapshot、monitoring/distribution、monitoring/overview、monitoring/situation、monitoring-points/{code};base-archives、operating-information、management-information、emergency-support;events/current、history-analysis、handling-efficiency、multidimensional-analysis(工单链路已接);overview/*、type-metrics、freshness、foundation、event-read、equipment-archive、detail-aggregate。验收自查计划(分片落地时逐片执行)
@Primary装配 + 契约测试保持全绿 + 至少一项真实库联调证据(真实行数/字段抽查),并覆盖空表/脏坐标/非法枚举等降级路径。null+ 不臆造为准,不得用假数据填充。进度:0%
诊断完成(复现、根因、环境与数据面、坑与规模已实测)。下一步:摘
needs-triage→ 按分片优先级逐片接线 → 逐片留真实库证据。实施记录(2026-09-18,第 1 片:map-snapshot 纵向样板)
范围:按裁定「纵向样板」交付 map-snapshot 一片的真实数据适配器,为余下 21 片立模板。本票不改 22 片全接,未完成部分如实记进度、不关票。
改动
BusinessCockpitMapSnapshotAdapter(@Component+@Primary,覆盖EmptyCockpitMapSnapshotAdapter),组合现网既有表与服务,不新增表、不加投影:monitor_point(@TableLogic自动过滤del_flag);equipment_point_rel(经既有EquipmentBaseService.getEquipmentByPoint);equipment_status(在线/报警);early_warning(未关闭视为预警中);work_order;equipment_type(行业由parent_type_id根推导:1 供水、2 排水、3 燃气、4 窨井)。CockpitMapSnapshotService的过滤/分页/mapFilter/坐标校验逻辑,不改契约层(BT-1…BT-4 的成果原样保留)。验收自查(对抗式)
@Primary覆盖空实现;mvn compile通过;契约测试 17 例保持全绿EMPTY)BusinessCockpitMapSnapshotAdapterTest4 例(真实映射 / 全量设备+service 判定关联 / 未知类型根不静默归类 / 缺状态按离线);CockpitMapSnapshotControllerTest14 例、CockpitContractIntegrationTest3 例均全绿EMPTY,不用 5xx真实库实测数据(只读,凭据未落盘/未回显)
Z-RQXLJC01=1、Z-RQYLJC01=2);其余 5 个点位无有效关联(JK03/RQJC01/RQJCD01/JC001/JC002)。本轮实测出的真实数据缺口(阻塞后续切片,需数据侧处理)
equipment_point_rel有效行中仅 3 条能联到未删除点位(覆盖 2/7 点位)→ BT-1(#59)的deviceCodes/WSmonitoringPointCode在真实数据下近乎全空。属数据缺口,代码已如实返回,不臆造。renderable=false(不上图)。这是字典要求,不是缺陷;若业务要上图,需数据侧补校核标志或明确「默认已校核」口径(需裁定)。monitor_point无行业/类型列:点位typeCode只能在其关联设备类型唯一时推导,多类型或零设备时为null。monitor_point.status混用正常/预警与ACTIVE;point_type混用中文与GAS/PRESSURE。本片不读该列做状态裁决(状态由设备事实推导),故不受影响;后续切片若需该列须显式列出取值。work_order.order_status为 0-based(0 待派单 … 5 已结案、7 已取消),cockpit 冻结字典是 1-based(1–7)。本片只判「是否在途」(0–6 视为在途),不冒充冻结字典;跨端对齐需裁定。manhole_base(3 条有效)+manhole_device_rel(6 条有效),equipment_type有独立根manhole(4);但 cockpit 正式行业枚举只有GAS/WATER_SUPPLY/DRAINAGE,而前端筛选有「井盖」项(ADR 0002)。本片已把窨井根映射为MANHOLE并传入类型字典,但契约枚举未含该值 → 需后端负责人裁定是否扩枚举(BT-2 #60 的industry契约会被影响)。manhole_base坐标为(1212,1212)/(12,12),按字典必判INVALID(不上图)。未完成(本票不关)
余下 21 片仍未接线,按建议优先级分片推进:
monitoring/distribution、monitoring/overview、monitoring/situation、monitoring-points/{code};进度:5%(约 1/22 片)
按裁定完成第 1 片(map-snapshot 真实适配器 + 4 例新测试 + 真实库端到端证据)。余 21 片未接线,不满足本票「每个切片存在非空适配器」的验收,故不 close;进度按片数记约 5%。
下一步:按分片优先级继续(下一片建议
monitoring/distribution,与 map-snapshot 共用点位/设备/类型链路,边际成本最低);并请裁定上文第 2、5、6 项口径。实施记录(2026-09-18,第 2 片:monitoring/distribution)
范围:按裁定继续「纵向样板」推进,本片交付 monitoring/distribution 真实数据适配器(第 2/22 片)。本票仍不关。
改动
BusinessCockpitDeviceFactResolver(com.zksy.cockpit.point):从equipment_status+early_warning+work_order组合「单台设备实时事实」(在线/报警/预警/在途工单 + 原因 + 状态时间)。缺状态按离线、状态/工单取值大小写/值域均已固化口径。CockpitTypeIndustry(com.zksy.cockpit.foundation):类型根 → 行业(1 供水、2 排水、3 燃气、4 窨井);窨井映射为MANHOLE传值交服务层判「非正式行业」,不在适配器吞掉。BusinessCockpitMapSnapshotAdapter重构为复用上述共享组件,去掉内联的设备事实推导(行为不变)。BusinessCockpitMonitoringDistributionAdapter(@Primary,覆盖EmptyCockpitMonitoringDistributionAdapter),与地图快照同构图:monitor_point+equipment_point_rel+equipment_base+equipment_type;分布的未关联智能设备额外携带设备事实字段。验收自查(对抗式)
@Primary覆盖空实现;mvn compile通过BusinessCockpitMonitoringDistributionAdapterTest2 例 +BusinessCockpitDeviceFactResolverTest5 例;map 适配器测试重构后仍 4 例;CockpitMonitoringDistributionControllerTest16 例全绿mvn -pl zksy-admin -am test472 测试 0 失败本片修正/固化的事实
order_status是 0-based,上一片把「在途」写成0..6,其中 5=已结案 误判为在途。本片修正为「0..4 或 6(延期中)在途;5 已结案、7 已取消为终态」,并补断言防回归。equipment_base.equipmentTypeName是非库列(@TableField(exist=false))恒为 null,上片直接取它导致设备类型名为空。本片改为从equipment_type字典按equipmentTypeId解析。仍未完成(本票不关)
余 20 片未接线。按优先级继续:地图与监测链路还剩
monitoring/overview、monitoring/situation、monitoring-points/{code};再基础设施 4 片;再预警处置 4 片;其余 9 片。进度:9%(约 2/22 片)
已交付 2/22 片(map-snapshot + monitoring/distribution)。余 20 片未接线,不满足「每个切片存在非空适配器」验收,故不 close。
下一步:
monitoring/overview或monitoring/situation(复用同一构图与共享组件,边际成本低)。实施记录(2026-09-18,第 3、4 片:monitoring/overview + monitoring/situation)
范围:按裁定继续纵向推进,本片交付 monitoring/overview 与 monitoring/situation 两个真实数据适配器(第 3、4/22 片)。本票仍不关。
改动
BusinessCockpitMonitoringOverviewAdapter(@Primary):equipment_base+equipment_status.online_status+equipment_point_rel+monitor_point+equipment_type。monitoringState由现网可得事实映射:有状态且在线→ONLINE、有状态但离线→OFFLINE、无状态记录→UNKNOWN;绝不伪造STALE(现网无样本新鲜度依据),sampledAt取状态更新时间、缺失即 null。BusinessCockpitMonitoringSituationAdapter(@Primary):设备指标态 + 两类事件。UNKNOWN、离线→OFFLINE、报警→ALARM、预警中→WARNING、其余→NORMAL;不产生EXPIRED(无样本新鲜度依据)。early_warning、报警←alarm_data,两列分池不混。device_code → equipment_base → equipment_type反查(一次建索引,避免 N+1)。本轮实测到的关键脏值(决定了上面的反查设计)
alarm_data.device_type(流量监测/environment/flammable-gas)与early_warning.warning_type(GAS_PIPE/WATER_PIPE/MANHOLE)都是描述性字符串,不是equipment_type.type_id。若直接当 typeCode 用,服务层类型字典会全部落空(判定为空快照)。alarm_time/publish_time,统一转成带偏移 ISO 串供服务层入趋势桶。验收自查(对抗式)
@Primary覆盖空实现;mvn compile通过BusinessCockpitMonitoringOverviewAdapterTest3 例 +BusinessCockpitMonitoringSituationAdapterTest3 例;CockpitMonitoringOverviewControllerTest12 例、CockpitMonitoringSituationControllerTest15 例全绿mvn -pl zksy-admin -am test480 测试 0 失败本轮新暴露的真实数据缺口(需数据侧处理)
device_code能在equipment_base匹配到类型(29 条预警中仅 5 条)。其余事件因查不到类型,服务层会按「未知类型」计入excluded而不上分布/趋势。这不是响应层缺陷,是事件表的设备编码与设备台账不一致。equipment_status记录 → 概览计入UNKNOWN、概况计入UNKNOWN。按契约这正确(不冒充离线),但也意味着在线率分母偏小。仍未完成(本票不关)
余 18 片未接线。地图与监测链路还剩
monitoring-points/{code},然后基础设施 4 片、预警处置 4 片、其余 9 片。进度:18%(约 4/22 片)
已交付 4/22 片(map-snapshot、distribution、overview、situation)。余 18 片未接线,不满足「每个切片存在非空适配器」验收,故不 close。
下一步:
monitoring-points/{code}(点位详情,收尾地图与监测链路后再进基础设施片)。需求重建记录(2026-09-24,本轮不改代码)
本轮按
/ask-matt路由执行「现状重建 + domain/context/spec/issue 同步」,没有修改 Java/SQL 代码,也没有把历史接线进度继续累加。当前代码、当前 KingbaseES schema、当前领域模型取代 2026-09-18 以前的接线假设。一、代码基线已发生破坏性变化
equipment_type当前实体/表字段是id、type_name、parent_id;旧type_id、parent_type_id已不存在。此前 4 片适配器与CockpitTypeIndustry仍调用getTypeId()/getParentTypeId(),当前zksy-system编译失败。work_order当前只有device_id作为设备关联,不再有device_code、alarm_id、case_id、hazard_id;报警转工单关系是alarm_data.order_id → work_order.order_id。BusinessCockpitWorkOrderReadAdapter已部分切到新关系,但共享BusinessCockpitDeviceFactResolver仍调用已删除的WorkOrder::getDeviceCode(),当前同样阻断编译。WorkOrderStatusEnum为准:0 待派单 / 1 待接单 / 2 已接单 / 3 处理中 / 4 待验收 / 5 已结案 / 6 延期中 / 7 已取消;终态 5/7,6 是处理旁路。旧 ADR-0008「从 1 开始七态」不能作为当前数据库编码。二、当前 KingbaseES 只读实测(app_user)
当前真实库不是此前记录的旧测试快照,核心行数为:
work_orderorder_id=271,device_id可匹配台账alarm_dataorder_id关联该工单;3 条设备编码均能匹配当前台账/类型early_warningdevice_code → equipment_base → equipment_type解析类型alarm_warning_relequipment_base21119740、860347065467627equipment_statusmonitor_point(12,12)异常坐标equipment_point_reldel_flag=0、10 行del_flag=2;当前有效行引用的设备台账大多已不存在case_infohazard_hidden_account当前真实样例:
work_order.order_id=271、device_id指向设备21119740,对应alarm_data.order_id=271;这是当前报警→工单的可验证链路。equipment_type是纯层级模型(id/type_name/parent_id),不再提供稳定 slug;公开 cockpittypeCode/行业推导仍需需求裁定与重新设计。三、需求重新确认项(本轮只记录,不替用户裁定)
type_id。需决定 cockpittypeCode是使用equipment_type.id的字符串、另建稳定业务编码,还是暂时返回 null 并以 typeName 展示;所有 map/monitoring/events 适配器必须统一。work_order.device_id → equipment_base.equipment_id → equipment_code;报警工单必须走alarm_data.order_id → work_order.order_id;预警工单必须经alarm_warning_rel → alarm_data → order_id。不得恢复对已删除work_order.device_code的查询。equipment_type.id=4「窨井设备」与parent_id=4的窨井监测类型,但当前正式 cockpit 行业枚举仍只有 GAS/WATER_SUPPLY/DRAINAGE;前端「井盖」与后端枚举的冲突仍待裁定。四、当前验收状态
#63进入需求重建/重新诊断,进度回到0%(等待新基线与口径确认);不关闭、不宣称已有适配器通过真实库验收。进度:0%(需求基线重建完成,代码未修改)
需求裁定补记(2026-09-24,本轮仍不修改代码)
已确认并回写
CONTEXT.md、spec.md、docs/cockpit/README.md:typeCode使用当前equipment_type.id,在 JSON 边界序列化为字符串;type_name是展示名,旧type_id/parent_type_id不再使用。MANHOLE,与当前类型树独立根和前端筛选项对齐;目前服务层仍只允许三行业,此为待实现的跨端契约变化,不宣称当前可用。CockpitCoordinateValidator:无可信校核来源时coordinateVerified=false、renderable=false。通用经纬度范围会放过(12,12),不能替代业务校核;区域自动校核需先有权威边界/CRS 来源。WorkOrderStatusEnum/ADR-0010 的 0–7 为准;对app_user.sys_dict_type/sys_dict_data的只读检查未发现工单状态字典条目。用户提到的字典表还未定位,故数据库字典一致性不能标记为已核对。进度:0%(需求基线重建,字典来源待定位;代码未改)
下一步:定位工单状态字典来源/表名并确认其值;随后才将本票从
needs-triage转为可执行,修复当前编译、实现新类型/行业映射并以当前库重新联调。工单字典来源确认(2026-09-24)
人类澄清:“工单字典”指当前代码中的
WorkOrderStatusEnum,不是独立数据库字典表。枚举与 ADR-0010 确认 0 待派单 / 1 待接单 / 2 已接单 / 3 处理中 / 4 待验收 / 5 已结案 / 6 延期中 / 7 已取消;终态 5/7。app_user.sys_dict_type/sys_dict_data未发现工单状态条目符合该解释,不再作为未决阻塞。其余需求裁定不变:公开
typeCode使用当前equipment_type.id(JSON 字符串);井盖扩为第四正式行业MANHOLE;无可信坐标校核来源时renderable=false;以当前真实 KingbaseES 数据联调且不编造业务行。本轮仅同步文档,不修改代码。#63 仍处于
needs-triage,当前工作树编译失败,历史 4/22 接线不可作为验收。进度:0%(需求口径已确认,待实现基线重建)
BT-5 实施/验收更新(2026-09-28)
已完成并推送:
54dd693:基础设施概览接入水厂、按station_type隔离的供水/排水泵站,修正当前 Kingbase schema 的monitor_point/equipment_point_rel映射及关联查询;设施总量与智能设备总量分离。deviceCode和同snapshotAt详情一致性。验证:
mvn -pl zksy-admin -am test -DfailIfNoTests=false -q全量通过。127.0.0.1:8301当前 Kingbase 实例真实登录态:未认证 401UNAUTHORIZED;非法参数 400INVALID_REQUEST;地图同一snapshotAt5 页、total=15稳定且点位不重复;点位详情及 archive / metrics / events / work-orders / detail-aggregate / freshness 均 200 且只读;概览、基础设施、监测、事件、自检端点均 200 且只读。/ws/deviceStatus发送cockpitSubscribe(scope=all)后收到cockpitSubscribed和serverUpdatedAt;抽查时间戳为+08:00。边界:
192.168.110.30:8301部署端口仍不可达,因此本评论不把它当作 HTTP 证据。Issue #63 保持开启,不在本轮关闭。补充说明:
5ce0458已修复快照 token 必须为+08:00、Redis/缓存故障返回SERVER_ERROR、本地缓存并发容量边界,并补充station_type条件查询与契约测试;15c1c52已在 README 明确:HTTP 200/readOnly 通过不等于 #63 要求的全部 22 个切片均已非空真实接线,仓库仍有 Empty*Adapter,issue 继续保持开启。本轮继续修复并推送:
11e5d9a对齐深层equipment_type.parent_id行业上溯、RELEASED当前预警、未知行业 excluded 统计,以及work_order_log.oper_type0–10 到当前 0–7 状态的时间线映射;84a7834同步 README。定向与全量 Maven 回归均通过。#63 仍保持开启,剩余 Empty*Adapter 全量非空接线和目标部署实例验收未宣称完成。本轮继续推进:已完成并推送
11e5d9a(深层类型树行业上溯、RELEASED预警态、未知行业进入 excluded、工单日志 0–10 操作码映射当前 0–7 时间线),84a7834同步 README。定向测试和mvn -pl zksy-admin -am test -DfailIfNoTests=false -q全量回归均通过。#63 仍保持开启;剩余是详情 freshness/stale、全量检查表逐端点证据和目标部署实例不可达等验收项。真实数据量补充(本轮只读核对):概览/基础设施/监测概况及事件切片均返回 200;历史预警分析返回 169 行,处置效率返回 2 条事件。监测分布返回 200 且
freshness=EMPTY、点位/未关联设备列表为空,原因是当前点位/设备没有可信坐标校核,按契约renderable=false,不使用 fixture 强行填充。第 2 轮进度:
7e0d2c8已将基础档案/运行信息适配器的共用pump_station查询改为显式station_type IN (water_supply, drainage),与此前总体概览保持一致;678f3e7同步 README。定向与全量 Maven 回归通过。#63 保持开启,目标部署实例和逐端点完整验收仍待继续。第 3 轮真实 HTTP 验收补充:16/16 个端点非法参数样例均返回 400
INVALID_REQUEST;真实deviceCode=860347065467627的 archive、metrics、events、work-orders、detail-aggregate、freshness 均返回 200、readOnly=true,并回显同一 canonicaldeviceCode。1676396已同步 README,#63 继续保持开启。第 4 轮最终收口(合并远端并发改动后 HEAD=
6ef71ef):严格 snapshotAt 签发/续页契约已通过,未签发或缓存丢失 token 不重建当前库;显式快照丢失统一SNAPSHOT_EXPIRED;detail-aggregate 时间线校验工单号、设备号和每条日志工单号,错误时间线不泄漏,兄弟分区保留并返回PARTIAL。定向测试和合并后全量 Maven 回归均通过。目标部署实例仍不可达,#63 保持开启。第 5 轮静态装配盘点:当前仓库 23 个
Empty*Adapter均有对应@Primary Business*Adapter,另有 1 个共享事件事实适配器;fallback 类保留不等于运行时未接线。合并远端监测点重构后全量 Maven 回归仍通过,77b4a34已同步 README。剩余是逐切片代表性真实数据、空/脏数据和故障注入证据,#63 保持开启。第 6 轮真实切片核对(重启加载合并后代码):overview/infrastructure、overview/monitoring、overview/warning-settings、基础档案、运行信息、应急、monitoring/overview、monitoring/situation 均 200/readOnly/CURRENT;monitoring/situation 返回 6 个异常设备;历史预警分析 169 行,处置效率 2 条,事件多维分析 7 个维度。monitoring/distribution 合法返回 200/readOnly/EMPTY,点位和未关联设备为 0,因坐标未可信校核而禁止渲染。
31597fd已同步 README;#63 保持开启。第 7 轮完成:补充 Redis GET/SET 运行时异常契约测试,确认适配器包装为
CockpitReadException,控制器映射500 SERVER_ERROR,不误报SNAPSHOT_EXPIRED。定向与全量 Maven 回归通过,73a8ae3已推送并同步 README。#63 继续保持开启。第 8 轮补充本机受控性能烟测:同一真实
snapshotAt连续认证请求 30 次,30/30 成功,平均 24.10ms、P95 30.60ms、最大 34.35ms,本次 live 样例total=7。该数据仅代表本机当前进程/数据量,不替代生产压测;2b9fea9已同步 README,#63 继续保持开启。第 9 轮时间戳/freshness 扫描:16 个主要 endpoint 全部 HTTP/app code 200;所有观察到的 ISO 时间戳均为
+08:00;11 个 endpoint 显式提供 freshness。events/current、history-analysis、handling-efficiency、multidimensional-analysis 和 device-boundary 尚未提供统一 freshness 字段,已在 README 标为未完成契约项。合并远端监测点改动后全量回归通过,当前 HEAD=c531835,#63 保持开启。第 10 轮完成:事件 current/history/handling/multidimensional 与 device-boundary 响应 DTO 补充 freshness getter;重启后真实认证 HTTP 复验五个端点均 200、readOnly=true、freshness=CURRENT;补充事件空态 freshness=EMPTY 断言,定向与全量 Maven 回归通过。
355a8af已推送。#63 继续开启,生产 freshness 实际时效、空/故障数据和目标部署实例仍待验收。票 25 里那段三切片摘要可直接粘贴,我的工具只达本地台账。