import assert from 'node:assert/strict' import { eventStatusText, isTerminalEventStatus, eventRowView, currentEventsView, toCurrentEvents } from '../src/modules/cockpit/domain/eventList.js' import { entityDetailView, normalizeEntityDetail } from '../src/modules/cockpit/domain/entityDetail.js' // —— 1) 卡片状态必须中文(实测取值为 PENDING / PROCESSING / UNHANDLED / HANDLED) —— assert.equal(eventStatusText('PENDING'), '待处理') assert.equal(eventStatusText('PROCESSING'), '处理中') assert.equal(eventStatusText('UNHANDLED'), '未处理') assert.equal(eventStatusText('HANDLED'), '已处理') assert.equal(eventStatusText('CLEARED'), '已解除') assert.equal(eventStatusText('CLOSED'), '已关闭') assert.equal(eventStatusText('CANCELLED'), '已取消') assert.equal(eventStatusText('MISREPORT'), '误报') // 认不出的仍回原码(不编造中文) assert.equal(eventStatusText('SOMETHING_NEW'), 'SOMETHING_NEW') // —— 2) 当前列表不展示终态事件 —— for (const terminal of ['HANDLED', 'CLEARED', 'CLOSED', 'CANCELLED', 'MISREPORT', 'RESOLVED']) { assert.equal(isTerminalEventStatus(terminal), true, terminal + ' 应判终态') } for (const live of ['PENDING', 'PROCESSING', 'UNHANDLED', 'ACTIVE', 'SOMETHING_NEW', '']) { assert.equal(isTerminalEventStatus(live), false, live + ' 不应判终态') } const domain = toCurrentEvents({ mode: 'ALARM', pagination: { page: 1, pageSize: 10, total: 3, totalPages: 1 }, sections: { events: { state: 'READY', data: [ { eventNo: 'A-LIVE', eventName: '未处理报警', level: 1, status: 'UNHANDLED' }, { eventNo: 'A-DONE', eventName: '已处理报警', level: 2, status: 'HANDLED' }, { eventNo: 'A-CANCEL', eventName: '已取消报警', level: 3, status: 'CANCELLED' }, ] } }, }) const view = currentEventsView(domain, domain.sections.events) assert.equal(view.rows.length, 1, '终态卡应被过滤') assert.equal(view.rows[0].code, 'A-LIVE') assert.equal(view.hiddenTerminalCount, 2, '过滤条数应如实回显') // 状态是中文 assert.equal(view.rows[0].statusText, '未处理') // —— 3) 等级只在摘要出现一次,且带颜色;事件摘要区不再重复等级 —— const detail = normalizeEntityDetail({ kind: 'event', id: 'A1', family: 'ALARM' }, { alarmNo: 'A1', alarmLevel: 1, status: 'UNHANDLED' }) const levelCards = detail.summary.filter((s) => s.label === '等级') assert.equal(levelCards.length, 1, '摘要里等级只能有一处') assert.equal(levelCards[0].value, '1级') assert.equal(levelCards[0].tone, 'lv1', '等级必须带语义色') const summarySection = detail.sections.find((s) => s.title === '事件摘要') assert.ok(!summarySection.fields.some((f) => f.label === '等级'), '事件摘要里不得再出现等级') // —— 4) 事件编码用业务编号,不是主键 —— assert.equal(detail.displayCode, 'A1') const codeField = summarySection.fields.find((f) => f.label === '事件编码') assert.equal(codeField.value, 'A1') assert.ok(entityDetailView(detail).subtitle.includes('A1'), '副标题应显示业务编号') console.log('t65-event-card-fixes: 36/36')