waterAlarmManagement.test.mjs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import assert from 'node:assert/strict'
  2. import { readFile } from 'node:fs/promises'
  3. import test from 'node:test'
  4. import {
  5. WATER_ALARM_ROOT_TYPE_ID,
  6. buildWaterAlarmQuery,
  7. buildWaterAlarmExportRows,
  8. normalizeAlarmDashboard,
  9. normalizeWaterAlarmRow,
  10. toAlarmCsv
  11. } from '../src/utils/waterAlarmManagementModel.js'
  12. test('water alarm queries are scoped to the water equipment root', () => {
  13. assert.deepEqual(buildWaterAlarmQuery({ keyword: '压力', alarmLevel: 1 }), {
  14. rootTypeId: WATER_ALARM_ROOT_TYPE_ID,
  15. pageNum: 1,
  16. pageSize: 10,
  17. keyword: '压力',
  18. alarmLevel: 1
  19. })
  20. assert.deepEqual(buildWaterAlarmQuery({ startDate: '2026-09-01', endDate: '2026-09-28' }), {
  21. rootTypeId: 1,
  22. pageNum: 1,
  23. pageSize: 10,
  24. startTime: '2026-09-01 00:00:00',
  25. endTime: '2026-09-28 23:59:59.999999'
  26. })
  27. })
  28. test('dashboard normalizes the four alarm-level trends and ratio ledgers', () => {
  29. const dashboard = normalizeAlarmDashboard({
  30. totalCount: 8,
  31. pendingAuditCount: 2,
  32. transferredCount: 3,
  33. releasedCount: 3,
  34. alarmingDeviceCount: 2,
  35. trend: [{ date: '2026-09-27', level1Count: 1, level2Count: 2, level3Count: 0, level4Count: 3 }],
  36. warningTypeRatio: [{ name: '压力过低', count: 4 }],
  37. deviceTypeRatio: [{ name: '压力计', count: 8 }]
  38. })
  39. assert.equal(dashboard.totalCount, 8)
  40. assert.deepEqual(dashboard.trend.levels.map(level => level.data), [[1], [2], [0], [3]])
  41. assert.deepEqual(dashboard.warningTypeRatio, [{ name: '压力过低', count: 4 }])
  42. })
  43. test('alarm ledger row keeps independent monitoring, display and work-order states', () => {
  44. const row = normalizeWaterAlarmRow({
  45. id: 7,
  46. alarmNo: 'BJ202609281200001234',
  47. deviceCode: 'CN-GS-202609020001',
  48. deviceName: '测试压力计',
  49. alarmStatus: 0,
  50. monitorStatusName: '异常',
  51. deviceAlarmStatus: 0,
  52. displayStatus: 2,
  53. displayStatusText: '已转工单',
  54. orderStatus: 3,
  55. orderStatusName: '处理中'
  56. })
  57. assert.equal(row.monitorStatusText, '异常')
  58. assert.equal(row.deviceAlarmStatusText, '正常')
  59. assert.equal(row.displayStatusText, '已转工单')
  60. assert.equal(row.orderStatusText, '处理中')
  61. })
  62. test('alarm export contains Chinese headers and preserves alarm number', () => {
  63. const csv = toAlarmCsv(buildWaterAlarmExportRows([{ alarmNo: 'BJ202609281200001234', deviceName: '测试压力计', alarmLevelName: '一级报警', displayStatusText: '待审核' }]))
  64. assert.ok(csv.startsWith('\ufeff'))
  65. assert.match(csv, /报警单号/u)
  66. assert.match(csv, /BJ202609281200001234/u)
  67. assert.match(csv, /测试压力计/u)
  68. })
  69. test('water alarm management page exposes ledger, trend and scoped read-only detail', async () => {
  70. const source = await readFile('src/views/subSystem/waterSupply/components/WaterAlarmPage.vue', 'utf8')
  71. assert.match(source, /getAlarms\(/u)
  72. assert.match(source, /getAlarmDashboard\(/u)
  73. assert.match(source, /rootTypeId: WATER_ALARM_ROOT_TYPE_ID/u)
  74. assert.match(source, /报警流水/u)
  75. assert.match(source, /报警趋势/u)
  76. assert.match(source, /报警台账/u)
  77. assert.match(source, /<AlarmDetail[^>]*water-shortcuts/u)
  78. assert.match(source, /批量导出/u)
  79. assert.doesNotMatch(source, /dispatchAlarm|auditAlarm|resolveAlarm/u)
  80. })
  81. test('the water alarm management menu resolves to the dedicated page without changing other subsystems', async () => {
  82. const { resolveAlarmMenuView } = await import('../src/router/alarmMenuView.js')
  83. assert.equal(resolveAlarmMenuView('subSystem/alarm/common/list', '{"rootTypeId":1}'), 'subSystem/waterSupply/monitorAlarm/index')
  84. assert.equal(resolveAlarmMenuView('subSystem/alarm/common/list', '{"rootTypeId":2}'), 'subSystem/alarm/common/list')
  85. })
  86. test('water alarm detail offers audit and related work-order shortcuts without changing other systems', async () => {
  87. const detail = await readFile('src/views/subSystem/alarm/AlarmDetail.vue', 'utf8')
  88. assert.match(detail, /waterShortcuts/u)
  89. assert.match(detail, /goWaterWorkOrder/u)
  90. assert.match(detail, /navigate\('alarmAudit'/u)
  91. })
  92. test('water menu resolver is wired into dynamic route loading', async () => {
  93. const source = await readFile('src/store/modules/permission.js', 'utf8')
  94. assert.match(source, /loadView\(resolveAlarmMenuView\(route.component, route.query\)\)/u)
  95. assert.equal(normalizeWaterAlarmRow({ alarmStatus: 0 }).deviceAlarmStatusText, '未获取')
  96. })
  97. test('misreport remains distinct and the detail shortcut targets a searchable work order', async () => {
  98. assert.equal(normalizeWaterAlarmRow({ displayStatus: 4, displayStatusText: '误报警' }).displayStatusText, '误报警')
  99. const detail = await readFile('src/views/subSystem/alarm/AlarmDetail.vue', 'utf8')
  100. assert.match(detail, /keyword: alarm.value.orderNo/u)
  101. assert.ok(detail.includes('min(680px, 100vw)'))
  102. })