work-order-association-verification.md 5.7 KB

工单关联标记口径统一:验收通过

对应 后端执行票 —— 工单关联标记口径统一(设备维度 vs 时间线)。本票验收通过:编译、Cockpit 系列契约测试、真实三端点正向关联、旧工单负向对照均已完成。用户已明确要求再次验证并提供新真实样本;本轮未修改真实业务数据,未启动或重启服务。

最终基线

  • 修复提交:894402a,已推送且仍是当前 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。产物写入早于本次实例启动,真实时间线已显示修复后的正向关联行为。此证据限于本票适配器,不声明整个运行实例对应一个纯净提交。
  • 结构化最终证据见 最终验收记录。

编译与契约测试

用户授权后,在上述隔离工作树执行:

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,完整关联对象完全一致:

{
  "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。

可复制的只读复验命令:

$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 测试通过,记录见 首次验收记录。当时原报警查询为空,设备与时间线的原工单均 false/null,故未关票,未把一致 false 当作正向通过。

维护者随后指出原工单 WO202610101511303516 应为待接单;11:06 与 11:13 复验确认两处均 1 / 待接单,关联仍为 false/null。工单流程状态与是否关联报警是两个独立事实;原工单作为负向对照通过。

请求新样本期间出现一次连接拒绝,随后检测到现有实例恢复监听并完成全部只读验收。连接拒绝未被当作数据不一致,也未以旧响应冒充本轮证据。

结论

本票的实施、契约测试、正向真实三端点一致性、负向未关联显式提示及提交推送要求均满足;无需再补本票验收项。上位前端阶段的其它工单流程或界面验收仍由所属阶段票承担。