import assert from 'node:assert/strict' import { entityDetailView, normalizeEntityDetail } from '../src/modules/cockpit/domain/entityDetail.js' import { eventRowView, toEventItem } from '../src/modules/cockpit/domain/eventList.js' // —— 4) 报警详情/卡片:上屏用业务编号 alarmNo,不是主键 UUID —— const raw = { eventNo: '9a0738db9773af8bfb0ccd1ef8680b82', eventCode: 'BJ202610281616136810', eventName: '报警', eventType: 'WARN-LEAK', level: 1, status: 'UNHANDLED' } const item = toEventItem(raw) assert.equal(item.code, '9a0738db9773af8bfb0ccd1ef8680b82', '内部键仍是 eventNo') assert.equal(item.codeText, 'BJ202610281616136810', '展示编号必须是 eventCode') const row = eventRowView(item) assert.equal(row.code, '9a0738db9773af8bfb0ccd1ef8680b82') assert.equal(row.codeText, 'BJ202610281616136810') // 详情(远端已返回 AlarmVO 形状) const detail = normalizeEntityDetail({ kind: 'event', id: raw.eventNo, family: 'ALARM' }, { id: '9a0738db9773af8bfb0ccd1ef8680b82', alarmNo: 'BJ202610281616136810', alarmLevel: 1, alarmStatus: 'UNHANDLED', deviceCode: '8652052334', deviceName: '测试设备', }) assert.equal(detail.displayCode, 'BJ202610281616136810', '详情事件编码必须是 alarmNo') const codeField = detail.sections.find((s) => s.title === '事件摘要').fields.find((f) => f.label === '事件编码') assert.equal(codeField.value, 'BJ202610281616136810') assert.ok(!codeField.value.includes('9a0738db'), '不得显示主键 UUID') assert.ok(entityDetailView(detail).subtitle.includes('BJ202610281616136810')) // 详情 prefill(列表行)也必须是业务编号 const fromPrefill = normalizeEntityDetail({ kind: 'event', id: raw.eventNo, family: 'ALARM' }, row) assert.equal(fromPrefill.displayCode, 'BJ202610281616136810', 'prefill 阶段也不得回落到主键') // —— 5) 关联设备:详情必须带设备编码,定位按钮据此渲染 —— assert.equal(detail.devices.length, 1) assert.equal(detail.devices[0].code, '8652052334') assert.ok(detail.devices[0].name) console.log('t65-alarm-code-and-locate: 17/17')