# 工单关联标记口径统一:验收通过 对应 [后端执行票 —— 工单关联标记口径统一(设备维度 vs 时间线)](../issues/21-21-vs.md)。**本票验收通过**:编译、Cockpit 系列契约测试、真实三端点正向关联、旧工单负向对照均已完成。用户已明确要求再次验证并提供新真实样本;本轮未修改真实业务数据,未启动或重启服务。 ## 最终基线 - 修复提交:[`894402a`](http://192.168.110.30:3000/shaoy/pipe-ner-server/commit/894402a6d495be28265014b316742fac355b311a),已推送且仍是当前 `origin/master` 的祖先。 - 本轮隔离测试提交:`7fb7c2ccb62a78ef52c69eb399b0a6fc0264e112`;本票适配器与关联测试相对修复提交没有变化。独立工作树为 `E:\pipe-ner-server-verify-workorder-final`,未夹带主工作树中的并行未提交改动。 - 联调环境:`http://192.168.110.96:8301/api/cockpit/v1`。实例 PID **36420**,启动于 `2026-10-12T11:09:02+08:00`。 - 主工作树编译产物与隔离测试产物的本票适配器 SHA-256 完全相同:`DB89DE226BD28BD8ED7A6E967FA780CACE1EFB7A6AD02913C61D0F6ED8DF77EC`。产物写入早于本次实例启动,真实时间线已显示修复后的正向关联行为。此证据限于本票适配器,不声明整个运行实例对应一个纯净提交。 - 结构化最终证据见 [最终验收记录](../verify/t21-work-order-association-final.json)。 ## 编译与契约测试 用户授权后,在上述隔离工作树执行: ```powershell mvn -o -pl pipe-network-service/zksy-admin -am '-Dtest=Cockpit*Test,BusinessCockpit*Test' '-Dsurefire.failIfNoSpecifiedTests=false' test ``` 结果:**BUILD SUCCESS**,完成于 `2026-10-12T11:10:00+08:00`。58 份 Surefire XML 汇总 **428 个测试,Failures / Errors / Skipped 均为 0**;admin 模块 426,另 2 个在其它模块。 本票关联契约 **7/7**、业务适配器 **3/3**、工单控制器 **9/9**。关联契约经真实适配器贯穿三个 HTTP 入口,覆盖单源关联一致、报警单号别名与查询参数、未关联 false/null、同设备工单隔离、未知工单、重复关联正反序失败,以及真实 DAO/MyBatis 异常转换。 维护者裁定的一对一及重复关联失败,由契约测试验证;未为实测制造真实重复关联或数据库故障。 ## 真实正向验收 维护者本轮提供:设备 `21119740`,工单 `WO202610121103507623`,报警单号 `BJ202610121103101791`。该样本替代已无关联的首次正向样本。 `2026-10-12T11:11:17+08:00` 三端点均 HTTP 200、业务 `code=200`,目标工单唯一命中;三个入口工单状态均 **0 / 待派单**,关联标记均 **true**,完整关联对象完全一致: ```json { "eventSource": "ALARM", "eventCode": "e68a942d92c48ac709fca8cee3160f3b", "associatedAt": "2026-10-12T11:03:51+08:00" } ``` | 入口 | 目标工单 | 标记 | 关联对象比较 | | --- | --- | --- | --- | | 设备工单 | 唯一命中 | true | 三字段一致 | | ALARM 工单(报警单号查询) | 唯一命中 | true | 三字段一致 | | 工单时间线 | 唯一命中 | true | 三字段一致 | 报警单号解析为其真实 ID;额外用该 ID 查询 ALARM 工单,关联字段与单号查询一致(`11:13:35` 核验)。设备共有 6 张工单,其中 5 张未关联;返回 `unassociatedWorkOrderCount=5` 与逐条布尔值重算一致,报警端点未关联计数为 0。 可复制的只读复验命令: ```powershell $base = 'http://192.168.110.96:8301/api/cockpit/v1' $deviceCode = '21119740' $orderCode = 'WO202610121103507623' $alarmCode = 'BJ202610121103101791' $device = Invoke-RestMethod "$base/equipments/$deviceCode/work-orders" $alarm = Invoke-RestMethod "$base/events/ALARM/$alarmCode/work-orders" $timeline = Invoke-RestMethod "$base/work-orders/$orderCode/timeline" $deviceOrder = @($device.data.workOrders | Where-Object workOrderCode -EQ $orderCode) $alarmOrder = @($alarm.data.workOrders | Where-Object workOrderCode -EQ $orderCode) if ($deviceOrder.Count -ne 1 -or $alarmOrder.Count -ne 1) { throw '目标工单缺失或重复' } $expected = $deviceOrder[0].eventAssociation foreach ($order in @($deviceOrder[0], $alarmOrder[0], $timeline.data.workOrder)) { if ($order.workOrderCode -ne $orderCode -or $order.deviceCode -ne $deviceCode -or $order.associatedWithCurrentEvent -ne $true -or $null -eq $order.eventAssociation -or $order.eventAssociation.eventSource -ne 'ALARM' -or $order.eventAssociation.eventCode -cne $expected.eventCode -or $order.eventAssociation.associatedAt -cne $expected.associatedAt) { throw '三端点关联标记或关联信息不一致' } } if ($alarm.data.eventCode -cne $expected.eventCode) { throw '报警单号解析标识不一致' } ``` ## 历史样本与负向对照 首次在精确修复提交上验证:`2026-10-12 10:38`,**417/417** 测试通过,记录见 [首次验收记录](../verify/t21-work-order-association-results.json)。当时原报警查询为空,设备与时间线的原工单均 false/null,故未关票,未把一致 false 当作正向通过。 维护者随后指出原工单 `WO202610101511303516` 应为待接单;`11:06` 与 `11:13` 复验确认两处均 **1 / 待接单**,关联仍为 false/null。工单流程状态与是否关联报警是两个独立事实;原工单作为负向对照通过。 请求新样本期间出现一次连接拒绝,随后检测到现有实例恢复监听并完成全部只读验收。连接拒绝未被当作数据不一致,也未以旧响应冒充本轮证据。 ## 结论 本票的实施、契约测试、正向真实三端点一致性、负向未关联显式提示及提交推送要求均满足;无需再补本票验收项。上位前端阶段的其它工单流程或界面验收仍由所属阶段票承担。