# 19: 后端执行票 —— 预警/事件族故障根因(部署时序错位,非缺列) Type: task Status: resolved Assignee: ASUS Label: ready-for-human Category: backend-deployment ## 根因(已确证,非猜测) **不是缺列需要补,而是部署时序错位:数据库迁移领先于运行中的构建。** | 事实 | 证据 | | --- | --- | | 运行实例是旧构建 | 后端进程 PID 37792 启动于 `2026-10-10 08:28:52`,其源码基线为 `d8a6b03`(2026-10-09) | | 数据库已被上游重构 | `927fad2 refactor(warning): 重构预警系统数据结构和业务逻辑`(林仔,2026-10-10 11:43:10 +0800)提交说明明写「移除预警名称和经纬度字段,优化数据库表结构」,该提交从 `EarlyWarning.java` 删除了 `warningName`、`longitude`、`latitude` 映射 | | 旧构建仍读被删列 | `d8a6b03` 的 `EarlyWarning` 仍映射 `@TableField("warning_name")` → MyBatis-Plus 生成 `SELECT ... warning_name ... FROM early_warning` → KingbaseES 报「字段 "warning_name" 不存在」 | | 修复已在远端 | `927fad2` 与其后的 `94971b5 feat(warning): 添加预警参考服务` **均已包含在 `origin/master`**(远端 master 现为 `94971b5`) | `sql/early_warning_system.sql` 里 `early_warning` 仍写着 `warning_name`,那是**旧版建表脚本**,不能作为当前库结构的依据;`warning_name` 现在只存在于 `warning_type` 表(`WarningType.java`)。 ## 因此本票不需要写新代码 **动作是:用 `origin/master`(≥ `927fad2`)重新构建并部署到联调环境。** 这是一次部署动作,按仓库规则不自动执行,由维护者执行。 ## 受影响范围(随部署一并验证) 部署后应同时恢复的端点:`/equipments/{code}/events/current` 与 `history`、`/events/current`、`/events/history-analysis`、`/events/handling-efficiency`、`/events/multidimensional-analysis`、`/monitoring/situation`、`/overview/warning-settings`、`/infrastructure/emergency-support`。 ## 部署后必须核对的新事实 `927fad2` 同时删除了预警的经纬度字段,因此**预警类事件将不再有坐标**。用户本次提供的真实报警记录本身即 `longitude: null, latitude: null`。这与「地图对象不上图」是同一族问题:需要确认驾驶舱对无坐标预警事件的呈现(不得伪造坐标),并与前端执行票 24 的坐标纪律一致。 ## 验收 1. 记录新部署实例的启动时间与所依据的提交哈希(必须 ≥ `927fad2`,且与 `origin/master` 一致)。 2. 上述八个端点真实返回业务 `code=200`,且报警字段真实(`warningCode`、阈值、报警等级);确认 `warningName` 是改由 `warning_type` 关联取得还是按新契约置空。 3. 重跑 `verify/t18-real-audit.mjs`,`events-*` 与 `warning-*` 相关失败项清零。 4. 若部署后仍有 500,则说明还有第二处结构漂移,需重新取证而非再猜。 ## 关联 发现于票 18;根因为部署时序,与前端执行票 22(前端把 `code=500` 读成 success)叠加放大了故障表现——两处都要修。 ## 进度 - 2026-10-12:本票立票(诊断完成,动作=维护者重新部署)。 - 2026-10-12 晚间:票 30/31 的现场复验已要求「后端重启」,实例随之更新;本票验收证据于 2026-10-12 深夜补齐(见 Answer)。 ## Answer **结论:部署时序前提已被消解,验收四条全部满足,本票按证据收口(无需新代码,也无需再部署)。** 1. **实例与基线**:联调实例 PID 27208(`192.168.110.96:8301`)启动于 **2026-10-12 20:13:30**;后端仓库 `HEAD = origin/master = d81c977b`(工作区干净,`git fetch` 后一致),`927fad2` 是 HEAD 的祖先(`merge-base --is-ancestor` 实测 YES)。票 30/31 的现场复验(票 31 记「后端重启后三端 facilityCount 均 5283」)已把实例带过 `927fad2`。 2. **受影响端点**:带正确入参探测 10 个端点(八端点 + 设备维 `events/current`、`events/history`),**全部 HTTP 200 + 业务 `code=200`**。报警字段真实:`eventName`(如「COD监测」)、`level=4`、`thresholdMaxValue=5`、坐标与 `coordinateValidation.renderable=true` 齐全。**`warningName` 已随新契约整体移除**(五个含事件族的响应中出现 **0** 次)——不是置空、也不是独立字段回联,事件名统一由 `eventName` 携带。 3. **审计复跑**:`verify/t18-real-audit.mjs` 本轮 **140/143**(此前票 22 时代 33 项失败)。**`events-*` / `warning-*` 失败清零**;余 3 项全部是 `monitoring-createdAt`(`/monitoring/{overview,distribution,situation}` 无 `createdAt`),与基线卡 [`map-monitoring`](../handoff/baselines/map-monitoring.md) ③ 行记录的后端缺口完全一致,**不属本票范围**。 4. **无第二处漂移**:审计 141 次只读请求**零 5xx**。 **「部署后必须核对的新事实」的答案**:预警事件**没有**失去坐标。6/6 条预警事件均携带 `longitude/latitude` 且 `coordinateValidation` 为 `VALID/renderable=true` —— 删除的是 `early_warning` 表自己的经纬度列,契约坐标改由**设备回联**给出(与报警事件同源)。故 「驾驶舱如何呈现无坐标预警事件」这一担忧在当前数据下未触发;前端「无位置不伪造锚点」的 既有纪律(票 04/12)仍覆盖将来真无坐标的情形。附带观察(不阻塞本票):预警事件 `location` 字段存在脏值(`"1"`、`"43"`),属数据侧质量问题,界面显示点位详情时可见。 **审计产物**:`verify/artifacts/t18/live-audit-results.json`(本轮 2026-10-12 深夜); 端点探测摘要 `verify/artifacts/t19/probe-summary.txt` 与逐端点响应体。