| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import assert from 'node:assert/strict'
- import { readFile } from 'node:fs/promises'
- import test from 'node:test'
- import {
- WATER_ALARM_ROOT_TYPE_ID,
- buildWaterAlarmQuery,
- buildWaterAlarmExportRows,
- normalizeAlarmDashboard,
- normalizeWaterAlarmRow,
- toAlarmCsv
- } from '../src/utils/waterAlarmManagementModel.js'
- test('water alarm queries are scoped to the water equipment root', () => {
- assert.deepEqual(buildWaterAlarmQuery({ keyword: '压力', alarmLevel: 1 }), {
- rootTypeId: WATER_ALARM_ROOT_TYPE_ID,
- pageNum: 1,
- pageSize: 10,
- keyword: '压力',
- alarmLevel: 1
- })
- assert.deepEqual(buildWaterAlarmQuery({ startDate: '2026-09-01', endDate: '2026-09-28' }), {
- rootTypeId: 1,
- pageNum: 1,
- pageSize: 10,
- startTime: '2026-09-01 00:00:00',
- endTime: '2026-09-28 23:59:59.999999'
- })
- })
- test('dashboard normalizes the four alarm-level trends and ratio ledgers', () => {
- const dashboard = normalizeAlarmDashboard({
- totalCount: 8,
- pendingAuditCount: 2,
- transferredCount: 3,
- releasedCount: 3,
- alarmingDeviceCount: 2,
- trend: [{ date: '2026-09-27', level1Count: 1, level2Count: 2, level3Count: 0, level4Count: 3 }],
- warningTypeRatio: [{ name: '压力过低', count: 4 }],
- deviceTypeRatio: [{ name: '压力计', count: 8 }]
- })
- assert.equal(dashboard.totalCount, 8)
- assert.deepEqual(dashboard.trend.levels.map(level => level.data), [[1], [2], [0], [3]])
- assert.deepEqual(dashboard.warningTypeRatio, [{ name: '压力过低', count: 4 }])
- })
- test('alarm ledger row keeps independent monitoring, display and work-order states', () => {
- const row = normalizeWaterAlarmRow({
- id: 7,
- alarmNo: 'BJ202609281200001234',
- deviceCode: 'CN-GS-202609020001',
- deviceName: '测试压力计',
- alarmStatus: 0,
- monitorStatusName: '异常',
- deviceAlarmStatus: 0,
- displayStatus: 2,
- displayStatusText: '已转工单',
- orderStatus: 3,
- orderStatusName: '处理中'
- })
- assert.equal(row.monitorStatusText, '异常')
- assert.equal(row.deviceAlarmStatusText, '正常')
- assert.equal(row.displayStatusText, '已转工单')
- assert.equal(row.orderStatusText, '处理中')
- })
- test('alarm export contains Chinese headers and preserves alarm number', () => {
- const csv = toAlarmCsv(buildWaterAlarmExportRows([{ alarmNo: 'BJ202609281200001234', deviceName: '测试压力计', alarmLevelName: '一级报警', displayStatusText: '待审核' }]))
- assert.ok(csv.startsWith('\ufeff'))
- assert.match(csv, /报警单号/u)
- assert.match(csv, /BJ202609281200001234/u)
- assert.match(csv, /测试压力计/u)
- })
- test('water alarm management page exposes ledger, trend and scoped read-only detail', async () => {
- const source = await readFile('src/views/subSystem/waterSupply/components/WaterAlarmPage.vue', 'utf8')
- assert.match(source, /getAlarms\(/u)
- assert.match(source, /getAlarmDashboard\(/u)
- assert.match(source, /rootTypeId: WATER_ALARM_ROOT_TYPE_ID/u)
- assert.match(source, /报警流水/u)
- assert.match(source, /报警趋势/u)
- assert.match(source, /报警台账/u)
- assert.match(source, /<AlarmDetail[^>]*water-shortcuts/u)
- assert.match(source, /批量导出/u)
- assert.doesNotMatch(source, /dispatchAlarm|auditAlarm|resolveAlarm/u)
- })
- test('the water alarm management menu resolves to the dedicated page without changing other subsystems', async () => {
- const { resolveAlarmMenuView } = await import('../src/router/alarmMenuView.js')
- assert.equal(resolveAlarmMenuView('subSystem/alarm/common/list', '{"rootTypeId":1}'), 'subSystem/waterSupply/monitorAlarm/index')
- assert.equal(resolveAlarmMenuView('subSystem/alarm/common/list', '{"rootTypeId":2}'), 'subSystem/alarm/common/list')
- })
- test('water alarm detail offers audit and related work-order shortcuts without changing other systems', async () => {
- const detail = await readFile('src/views/subSystem/alarm/AlarmDetail.vue', 'utf8')
- assert.match(detail, /waterShortcuts/u)
- assert.match(detail, /goWaterWorkOrder/u)
- assert.match(detail, /navigate\('alarmAudit'/u)
- })
- test('water menu resolver is wired into dynamic route loading', async () => {
- const source = await readFile('src/store/modules/permission.js', 'utf8')
- assert.match(source, /loadView\(resolveAlarmMenuView\(route.component, route.query\)\)/u)
- assert.equal(normalizeWaterAlarmRow({ alarmStatus: 0 }).deviceAlarmStatusText, '未获取')
- })
- test('misreport remains distinct and the detail shortcut targets a searchable work order', async () => {
- assert.equal(normalizeWaterAlarmRow({ displayStatus: 4, displayStatusText: '误报警' }).displayStatusText, '误报警')
- const detail = await readFile('src/views/subSystem/alarm/AlarmDetail.vue', 'utf8')
- assert.match(detail, /keyword: alarm.value.orderNo/u)
- assert.ok(detail.includes('min(680px, 100vw)'))
- })
|