21-21-vs.md 5.1 KB

21: 后端执行票 —— 工单关联标记口径统一(设备维度 vs 时间线)

Type: task Status: claimed Label: ready-for-agent Labels: ready-for-agent, backend-execution, wayfinder:task Category: backend-execution Assignee: Kazerin Blocked by: None

来源

票 18 真人闭环实测(2026-10-10,工单 WO202610101511303516)。

现象

同一张工单在两处返回互相矛盾的「是否关联当前事件」:

端点 associatedWithCurrentEvent eventAssociation
GET /equipments/21119740/work-orders true {ALARM, cd57be42bd18d02f7d3390fb98539b93, 15:11:30}
GET /work-orders/WO202610101511303516/timeline false null

时间线侧缺少关联信息,设备侧完整。前端详情面板按「未关联当前报警明确提示」消费该字段,口径不一致会直接导致同一张工单在两个位置呈现相反结论。

范围

  1. 统一 associatedWithCurrentEvent 与 eventAssociation 的单一权威来源(关联键为 alarm_data.work_order_id = work_order.order_id,已由历史决策确证)。
  2. 时间线与设备维度返回同一判定与同一关联信息;不得一处显式 false、另一处省略。
  3. 事件维度端点一并核对同一口径。
  4. 补契约测试:同一工单在设备维度、报警维度、时间线三处判定一致。

验收

真实环境复验:上述三端点对 WO202610101511303516 返回一致的 associatedWithCurrentEvent=true 与同一 eventAssociation;编译 + Cockpit*Test 全绿 + 提交推送。

关联

发现于票 18;承接决策票 01 的关联键结论。

进度

  • 认领: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,已推 origin/master(0a6b108..894402a);提交限定适配器、两个测试文件和所属领域词汇,共 4 文件。未夹带并行会话的 monitoring 改动。
  • 对抗复查:Standards 首轮无阻断;Spec 首轮发现多关联歧义和失败测试失真,均已据用户裁定修正;修订后源码/测试静态复核无剩余阻断,主代理限定 diff 与 git diff --check 通过。静态复核不等于编译或测试通过。
  • 真实状态:实施已提交推送,待编译、测试及部署后真实环境验收;保留开放。 依 项目规则 本轮跳过自动 build/debug,包括编译、Cockpit*Test 与真实环境调试。下一步在用户明确要求验证后执行 Maven 契约测试、加载本票提交,复验目标工单三端点 true 与完整同一关联对象;步骤见 待验收说明。全部票面验收有证据后才能 close、完成上报并追加 map gist。

口径裁定

维护者本轮 grilling 选择:坚持一对一,重复关联报错。多个报警引用同一工单时,设备、ALARM 事件和时间线均须明确失败,不默认取最早、最新或首条报警;不新增数据库约束,不修改现有关联数据。

Comments

  • 对抗复查发现原设备逻辑允许多报警取首条,而事件逻辑取请求报警;即使修好时间线 false/null,多关联仍可能返回不同关联对象。维护者裁定如上,已据此加一对一校验。
  • 失败场景测试已从人为抛领域异常改为真实 DataAccessResourceFailureException / PersistenceException,用于断言适配器转换后三个入口返回 HTTP 500 + SERVER_ERROR;报警单号回退补 SQL 字段与参数断言。

Answer