Explorar o código

docs(cockpit): record work order association implementation and pending verification

Kazerin hai 1 semana
pai
achega
2737dae21a

+ 55 - 0
.scratch/cockpit-real-data-wayfinding/handoff/work-order-association-verification.md

@@ -0,0 +1,55 @@
+# 工单关联标记口径统一:待验收步骤
+
+对应 [后端执行票 —— 工单关联标记口径统一(设备维度 vs 时间线)](../issues/21-21-vs.md)。本文件提供下一步验收命令,**本轮未执行编译、测试或真实环境复验**;当前仅完成源码实施与静态检查。
+
+后端实施提交:[`894402a`](http://192.168.110.30:3000/shaoy/pipe-ner-server/commit/894402a6d495be28265014b316742fac355b311a),已推送 `origin/master`。维护者裁定:报警与工单一对一,重复关联明确失败。
+
+## 编译与契约测试
+
+在 `E:\pipe-ner-server` 根目录执行(需用户明确要求运行验证):
+
+```powershell
+mvn -o -pl pipe-network-service/zksy-admin -am '-Dtest=Cockpit*Test,BusinessCockpit*Test' '-Dsurefire.failIfNoSpecifiedTests=false' test
+```
+
+必须记录提交版本、BUILD SUCCESS、实际测试数、Failures/Errors/Skipped。新增 `CockpitWorkOrderAssociationContractTest` 含 7 个测试方法,贯穿控制器、服务及真实适配器,覆盖三入口正关联一致、报警单号别名与 SQL 条件、未关联 false/null、同设备工单不串联、未知工单、重复关联正反序均失败,以及真实数据库异常转换;既有适配器测试已补共享反查的数据桩。若离线依赖不齐,记录缺失依赖后按环境实际情况处理,不把未执行视为通过。
+
+## 部署后真实复验
+
+确认运行实例已加载本票提交,记录实例启动时间/版本。历史联调环境为 `http://192.168.110.96:8301`,本轮没有确认其当前运行状态;以下命令须在部署后执行:
+
+```powershell
+$base = 'http://192.168.110.96:8301/api/cockpit/v1'
+$orderCode = 'WO202610101511303516'
+$alarmCode = 'cd57be42bd18d02f7d3390fb98539b93'
+$deviceCode = '21119740'
+$deviceResponse = Invoke-RestMethod "$base/equipments/$deviceCode/work-orders" -TimeoutSec 60
+$alarmResponse = Invoke-RestMethod "$base/events/ALARM/$alarmCode/work-orders" -TimeoutSec 60
+$timelineResponse = Invoke-RestMethod "$base/work-orders/$orderCode/timeline" -TimeoutSec 60
+$deviceOrders = @($deviceResponse.data.workOrders | Where-Object workOrderCode -EQ $orderCode)
+$alarmOrders = @($alarmResponse.data.workOrders | Where-Object workOrderCode -EQ $orderCode)
+if ($deviceOrders.Count -ne 1 -or $alarmOrders.Count -ne 1) {
+    throw '目标工单在设备/报警端点中缺失或重复,不能判定一致性通过'
+}
+$orders = @($deviceOrders[0], $alarmOrders[0], $timelineResponse.data.workOrder)
+$expectedAssociation = $deviceOrders[0].eventAssociation
+foreach ($order in $orders) {
+    if ($null -eq $order -or $order.workOrderCode -ne $orderCode -or
+        $order.associatedWithCurrentEvent -ne $true -or
+        $null -eq $order.eventAssociation -or
+        $order.eventAssociation.eventSource -ne 'ALARM' -or
+        $order.eventAssociation.eventCode -ne $alarmCode -or
+        $order.eventAssociation.associatedAt -ne $expectedAssociation.associatedAt) {
+        throw '三端点关联标记或关联信息不一致'
+    }
+}
+$orders | Select-Object workOrderCode, associatedWithCurrentEvent, eventAssociation | ConvertTo-Json -Depth 5
+```
+
+若样本已被外部系统删除或解除关联,先说明真实数据变化,不能改用 mock 冒充该工单的部署验收。未关联工单须另选真实无报警引用样本:设备与时间线均显式 false/null,报警维度不返回该工单。
+
+维护者已裁定**一对一,重复关联报错**。如有现成真实重复关联样本,其设备工单、两个 ALARM 查询和时间线均应 HTTP 500 + `SERVER_ERROR`,不得返回成功的首条关联。若无此真实样本,先以新增契约测试覆盖;不要为复验修改真实关联数据。
+
+## 收口
+
+编译、测试、目标真实样本复验与提交推送均有真实证据后,写回执行票正文和 resolution comment,关闭并调用 `deck_issue_report`,最后在所属 map 的 Decisions so far 追加票名链接与一句结论。任何一项缺证据则保留开放,明确下一步。

+ 17 - 6
.scratch/cockpit-real-data-wayfinding/issues/21-21-vs.md

@@ -3,9 +3,12 @@
 # 21: 后端执行票 —— 工单关联标记口径统一(设备维度 vs 时间线)
 
 Type: task
-Status: ready-for-agent
+Status: claimed
 Label: ready-for-agent
+Labels: ready-for-agent, backend-execution, wayfinder:task
 Category: backend-execution
+Assignee: Kazerin
+Blocked by: None
 
 ## 来源
 
@@ -39,14 +42,22 @@ Category: backend-execution
 
 ## 进度
 
-<!-- 做到哪一步了,在这里一行一行记 -->
+- 认领:Kazerin(后端 Git 身份已核验);本地后端 assignees 操作未实际写入,按 tracker 约定使用 `Status: claimed`,已调用 deck_issue_report 上报。
+- 阶段闸门:完整正文、评论、标签和父子/阻塞边已读;初始 `ready-for-agent`,无 `needs-triage`,无已有实施记录,无阻塞;所属 map 允许后端执行票实施。
+- 根因已核验:`BusinessCockpitWorkOrderReadAdapter.loadByDevice` 经 `alarm_data.work_order_id = work_order.order_id` 查询真实关联;旧 `loadTimeline` 未查关联,直接 `toSummary(order, null, null, false)`;报警维度另有独立组装逻辑。
+- 实施已完成:设备、ALARM 事件、时间线共用 `alarmsByOrderId` 与报警摘要转换;唯一真实关联为 true + 关联对象,未关联显式 false/null。按维护者裁定,重复报警引用同一工单抛类型化读取异常,三个入口返回 HTTP 500 + `SERVER_ERROR`,不选主报警。批量关联查询的 Spring DAO / MyBatis 持久化异常转换为相同失败契约。WARNING 分支和既有时间字段语义保持原实现。
+- 契约测试已编写:新增 `CockpitWorkOrderAssociationContractTest` 共 7 个测试方法,经真实适配器贯穿 HTTP 三端点,覆盖正向一致性、报警单号别名与 SQL 查询条件、未关联、同设备串单隔离、未知工单、重复关联正反序及两个真实数据库异常类型;旧适配器测试补共享反查数据桩。**本轮未执行测试,不能称通过。**
+- 后端提交与推送:`E:\pipe-ner-server` / `master` / [`894402a`](http://192.168.110.30:3000/shaoy/pipe-ner-server/commit/894402a6d495be28265014b316742fac355b311a),已推 `origin/master`(`0a6b108..894402a`);提交限定适配器、两个测试文件和所属领域词汇,共 4 文件。未夹带并行会话的 monitoring 改动。
+- 对抗复查:Standards 首轮无阻断;Spec 首轮发现多关联歧义和失败测试失真,均已据用户裁定修正;修订后源码/测试静态复核无剩余阻断,主代理限定 diff 与 `git diff --check` 通过。**静态复核不等于编译或测试通过。**
+- **真实状态:实施已提交推送,待编译、测试及部署后真实环境验收;保留开放。** 依 [项目规则](../../../AGENTS.md) 本轮跳过自动 build/debug,包括编译、`Cockpit*Test` 与真实环境调试。下一步在用户明确要求验证后执行 Maven 契约测试、加载本票提交,复验目标工单三端点 true 与完整同一关联对象;步骤见 [待验收说明](../handoff/work-order-association-verification.md)。全部票面验收有证据后才能 close、完成上报并追加 map gist。
 
-Status: ready-for-agent
-Type: task
-Blocked by:
-Labels: ready-for-agent, backend-execution, wayfinder:task
+## 口径裁定
+
+维护者本轮 grilling 选择:**坚持一对一,重复关联报错**。多个报警引用同一工单时,设备、ALARM 事件和时间线均须明确失败,不默认取最早、最新或首条报警;不新增数据库约束,不修改现有关联数据。
 
 ## Comments
 
+- 对抗复查发现原设备逻辑允许多报警取首条,而事件逻辑取请求报警;即使修好时间线 false/null,多关联仍可能返回不同关联对象。维护者裁定如上,已据此加一对一校验。
+- 失败场景测试已从人为抛领域异常改为真实 `DataAccessResourceFailureException` / `PersistenceException`,用于断言适配器转换后三个入口返回 HTTP 500 + `SERVER_ERROR`;报警单号回退补 SQL 字段与参数断言。
 
 ## Answer