t11-equipment-detail.log 6.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. PASS A1-all-eight-sections-present — 8 个分区都有位置(后端没给的也留位)
  2. PASS A2-backend-state-mapped-1to1 — {"archive":"failed","metrics":"success","alarms":"empty","workOrders":"stale"}
  3. PASS A3-failed-section-keeps-backend-message — 界面文案取后端 message:「档案读不到」
  4. PASS A4-stale-keeps-value-and-flag — 过期分区保留最后已知值,并带 retained 标识(票 16:不得伪装成实时)
  5. PASS A5-empty-has-no-data — 空分区不伪造空数组冒充数据
  6. PASS A6-missing-section-counts-as-failed — 后端整段缺失的分区算失败,不算「成功但没内容」
  7. PASS A7-aggregate-state-not-authoritative — 界面分区状态以各分区自己为准,整体态漏标也不会拖垮成功分区
  8. PASS A8-unknown-state-falls-to-failed — 认不出的后端状态不静默混进「已就绪」
  9. PASS B1-zero-is-a-value-not-missing — 后端真给的 0 是有效读数,照原样显示
  10. PASS B2-missing-shows-placeholder — 缺值显示占位符(—),且不拼出「— mg/L」这种半截读数
  11. PASS B3-placeholder-text-per-state — 空 / 失败 / 不可用各有明确且不同的措辞(失败态明确说「不影响其它分区」)
  12. PASS B4-stale-and-success-have-content — 过期是有值(内容照画),空与失败才是没内容
  13. PASS B5-archive-rows-placeholder — 有值的照原样、缺值的占位符
  14. PASS B6-metric-zero-vs-missing — 真 0 → 0;缺 value → —
  15. PASS B7-work-order-state-from-dictionary — 码 3 → 处理中;认不出的码 99 → —(不猜)
  16. PASS B8-unclosed-order-placeholder — 未结案的真实 null 与字段缺失一样显示占位符
  17. PASS B9-event-level-and-color — 等级出文本、配色如实带后端值、缺等级占位符
  18. PASS B10-missing-collected-recursively — 嵌套缺失也收上来:archive.deviceName, metric.value
  19. PASS B11-missing-collector-survives-cycles — 自引用形状不炸(契约缺口造出的怪数据也不能让界面挂掉)
  20. PASS B11b-missing-note-hides-field-paths — 界面文案「后端未提供 2 项字段」不含字段路径;路径只在 tooltip:「archive.deviceName、metric.value」
  21. PASS B11c-source-reason-never-leaks-codes — SAMPLE_OUTDATED → 「采样已超过配置周期」;未知码 → 空串(不泄漏)
  22. PASS B12-empty-list-is-explicit — 「工单当前没有记录」
  23. PASS C1-select-device-loads-by-code — 层级 equipment、请求 1 次
  24. PASS C2-aggregate-carries-requested-code — 按设备编码取数(传错编码能看出来)
  25. PASS C3-same-device-does-not-refetch — 再选同一台后请求数仍为 1
  26. PASS C4-back-and-forth-does-not-refetch — 来回一次后请求数仍为 1
  27. PASS C5-race-latest-wins — B 落地后聚合里是 EQ-FAST-B(A 迟到被丢弃)
  28. PASS C6-stale-aggregate-not-shown-for-new-device — interface 的匹配判据挡住了「把 A 的载荷挂在 B 表头下」
  29. PASS C7-failed-device-can-be-retried — 第一次 failed → 再选一次(第 2 次请求)后 success
  30. PASS C8-close-invalidates-in-flight — {"level":"none","deviceLoading":false}
  31. PASS C9-unassociated-device-loads-aggregate — {"level":"equipment","pointCode":"","deviceCode":"EQ-FREE-9"}
  32. PASS C10-blank-code-does-not-load — 缺编码不取数、不卡加载态
  33. PASS C11-preload-does-not-clobber-user-device — 用户选的 EQ-USER 没被预载的演示设备覆盖(预载迟到被丢弃)
  34. PASS C12-whole-failure-shows-single-truthful-state — 整包失败:判据成立(界面据此只说一句实话,不逐块谎报"其它分区不受影响")
  35. PASS C13-whole-failure-retry-recovers — 重试后第 2 次请求 → success(界面回到六块分区)
  36. PASS D1-six-panels-in-order — 6 块:设备档案 / 最新指标 / 预警 / 报警 / 工单状态 / 最新图片
  37. PASS D2-one-failure-does-not-cover-others — 档案=failed 指标=success 预警=success 报警=success 工单=failed 图片=failed
  38. PASS D3-successful-panels-still-render-content — 指标 2 条、预警 1 条仍然画得出来
  39. PASS D4-failed-panels-say-why — 失败块显示「该分区加载失败(其它分区不受影响)」并带上后端原因
  40. PASS D5-guard-has-teeth — 成功场景下六块全绿(因此 D2 的"部分失败"是有信息量的,不是恒真)
  41. PASS D6-empty-scenario-all-placeholders — 空场景六块都是明确占位说明,没有一块冒充有数据
  42. PASS D7-stale-is-value-not-empty — 指标块 stale 但仍画出 2 条读数;档案块照常 success
  43. PASS D8-whole-failure-detected — 整包失败与分区级失败分得开
  44. PASS D9-partial-failure-still-renders-panels — 分区级失败仍渲染六块(档案=failed、指标=success)
  45. PASS D10-not-loaded-is-not-a-failure — 还没取数时不报"没取到"
  46. PASS D11-whole-failure-carries-no-device-code — 失败分区带不出设备编码(故判定不依赖编码;靠 token 纪律保证归属当前设备)
  47. PASS E1-image-shows-backend-designated-one — 画的是后端给的那一张:/cockpit/a.webp
  48. PASS E2-image-empty-and-missing-safe — 后端没给 / 给了空串都不画空图
  49. PASS E3-image-never-indexes-a-list — 后端若给数组,前端**不**挑第一张(挑图=替后端做业务判断)
  50. PASS E4-adapter-image-is-single-value — 档案里的 latestImage 是单值对象,不是列表
  51. PASS E5-no-picking-among-images — 图片路径里没有 find/filter/sort/slice,组件也不认数组
  52. PASS F1-component-does-not-build-api-paths — 接口路径只在 services/detailApi.js,组件不自己拼
  53. PASS F2-component-has-no-backend-field-names — 组件只读视图对象字段(后端裸字段名只在 domain 适配层出现)
  54. PASS F3-component-does-not-sort — 展示顺序由计划与后端顺序决定,前端不重排
  55. PASS F4-section-state-comes-from-section-state-module — 分区状态色键与文案只来自 domain/sectionState.js(组件不写第二套)
  56. PASS F4b-no-backend-reason-codes-in-ui — 组件零后端代号(都是 domain 翻好的人话)
  57. PASS F4c-no-field-paths-in-visible-text — 缺失只报条数,字段路径只进 title(排查拿得到,值班人员看不到)
  58. PASS F5-deferred-sections-not-rendered — 预警-报警关联(票 13)不在本票渲染计划内:alarmWarningRelations
  59. PASS F6-store-loads-aggregate-on-level-entry — 设备级入口(selectDevice / openDevice)自己负责取数,调用方不必记得多调一次
  60. FAIL F7-card-does-not-hold-its-own-aggregate-state — 组件把状态交给 store,自己不存一份(票 10 的 F6 立场延续)
  61. PASS F8-no-write-operations — 驾驶舱只读:本票不引入任何写操作(spec 验收第 6 条)
  62. T11 逻辑检查:60/61 项通过。
  63. 未通过:F7-card-does-not-hold-its-own-aggregate-state