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, /]*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)')) })