t65-event-card-fixes.mjs 3.1 KB

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