waterAlarmGisModel.test.mjs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. import test from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import {
  4. buildAlarmGisPoints,
  5. deriveAlarmGisStatus,
  6. filterAlarmGisPoints,
  7. summarizeAlarmGisPoints
  8. } from '../src/utils/waterAlarmGisModel.js'
  9. import { isActiveWorkOrderStatus } from '../src/utils/waterSupplyUiModel.js'
  10. test('alarm gis points take the highest-risk status by documented priority', () => {
  11. assert.equal(deriveAlarmGisStatus({}), 'normal')
  12. assert.equal(deriveAlarmGisStatus({ onlineStatus: 0 }), 'offline')
  13. assert.equal(deriveAlarmGisStatus({ currentStatus: 3 }), 'warning')
  14. assert.equal(deriveAlarmGisStatus({ deviceAlarmStatus: 1 }), 'alarm')
  15. assert.equal(deriveAlarmGisStatus({ orderNo: 'WO-1', orderStatus: 3 }), 'workOrder')
  16. assert.equal(deriveAlarmGisStatus({ orderNo: 'WO-1', orderStatus: 3, deviceAlarmStatus: 1, currentStatus: 3, onlineStatus: 0 }), 'workOrder')
  17. assert.equal(deriveAlarmGisStatus({ deviceAlarmStatus: 1, currentStatus: 3, onlineStatus: 0 }), 'alarm')
  18. assert.equal(deriveAlarmGisStatus({ currentStatus: 3, onlineStatus: 0 }), 'warning')
  19. assert.equal(deriveAlarmGisStatus({ onlineStatus: 0, deviceAlarmStatus: 0 }), 'offline')
  20. })
  21. test('a closed or cancelled work order no longer counts as an active related order', () => {
  22. assert.equal(isActiveWorkOrderStatus(0), true)
  23. assert.equal(isActiveWorkOrderStatus('2'), true)
  24. assert.equal(isActiveWorkOrderStatus(6), true)
  25. assert.equal(isActiveWorkOrderStatus(5), false)
  26. assert.equal(isActiveWorkOrderStatus('7'), false)
  27. assert.equal(isActiveWorkOrderStatus(undefined), false)
  28. assert.equal(deriveAlarmGisStatus({ orderNo: 'WO-5', orderStatus: 5, deviceAlarmStatus: 1 }), 'alarm')
  29. assert.equal(deriveAlarmGisStatus({ orderNo: 'WO-7', orderStatus: 7, onlineStatus: 0 }), 'offline')
  30. })
  31. test('renders every valid alarm point and drops points without coordinates', () => {
  32. const points = buildAlarmGisPoints({
  33. alarmPoints: [
  34. { alarmId: 'A-1', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1', alarmLevel: 2 },
  35. { alarmId: 'A-2', deviceCode: 'D-2', longitude: '110.2', latitude: '28.2', alarmLevel: 3 },
  36. { alarmId: 'A-3', deviceCode: 'D-3', longitude: '', latitude: '28.3', alarmLevel: 1 }
  37. ]
  38. })
  39. assert.deepEqual(points.map(point => point.alarmId), ['A-1', 'A-2'])
  40. assert.deepEqual(points.map(point => point.lng), [110.1, 110.2])
  41. assert.deepEqual(points.map(point => point.lat), [28.1, 28.2])
  42. })
  43. test('merges the alarms of one device into a single highest-risk point', () => {
  44. const points = buildAlarmGisPoints({
  45. alarmPoints: [
  46. { alarmId: 'A-LOW', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1', alarmLevel: 4, alarmTime: '2026-09-16 08:00:00' },
  47. { alarmId: 'A-HIGH', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1', alarmLevel: 1, alarmTime: '2026-09-16 09:00:00' }
  48. ]
  49. })
  50. assert.equal(points.length, 1)
  51. assert.equal(points[0].alarmId, 'A-HIGH')
  52. assert.equal(points[0].alarmCount, 2)
  53. })
  54. test('enriches alarm points with independent device, record and work-order state', () => {
  55. const points = buildAlarmGisPoints({
  56. alarmPoints: [
  57. { alarmId: 'A-1', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1', alarmLevel: 1, warningType: '压力预警' }
  58. ],
  59. ledgerRows: [
  60. {
  61. id: 'A-1',
  62. deviceCode: 'D-1',
  63. alarmStatus: 1,
  64. alarmStatusText: '已处理',
  65. deviceAlarmStatus: 1,
  66. deviceAlarmStatusText: '报警中',
  67. displayStatus: 2,
  68. displayStatusText: '已转工单',
  69. orderNo: 'WO-2026-1',
  70. orderStatus: 3
  71. }
  72. ],
  73. devicePoints: [
  74. { equipmentCode: 'D-1', onlineStatus: 1, currentStatus: 3, onlineStatusText: '在线', currentStatusText: '维修' }
  75. ]
  76. })
  77. assert.equal(points.length, 1)
  78. assert.equal(points[0].recordStatus, 1)
  79. assert.equal(points[0].deviceAlarmStatus, 1)
  80. assert.equal(points[0].displayStatus, 2)
  81. assert.equal(points[0].orderNo, 'WO-2026-1')
  82. assert.equal(points[0].orderStatus, 3)
  83. assert.equal(points[0].onlineStatus, 1)
  84. assert.equal(points[0].currentStatus, 3)
  85. assert.equal(points[0].onlineStatusText, '在线')
  86. assert.equal(points[0].currentStatusText, '维修')
  87. // 关联工单进行中时点位取最高风险语义;设备报警状态与记录状态仍各自保留
  88. assert.equal(points[0].statusKey, 'workOrder')
  89. })
  90. test('marks unavailable device and record state as unknown without substituting either one', () => {
  91. const [pending] = buildAlarmGisPoints({
  92. alarmPoints: [{ alarmId: 'A-1', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1', alarmLevel: 1 }]
  93. })
  94. assert.equal(pending.deviceAlarmStatus, undefined)
  95. assert.equal(pending.deviceAlarmStatusText, '未获取')
  96. assert.equal(pending.recordStatus, undefined)
  97. assert.equal(pending.recordStatusText, '未获取')
  98. assert.equal(pending.statusKey, 'alarm')
  99. const [handled] = buildAlarmGisPoints({
  100. alarmPoints: [{ alarmId: 'A-2', deviceCode: 'D-2', longitude: '110.1', latitude: '28.1', alarmLevel: 4 }],
  101. ledgerRows: [{ id: 'A-2', deviceCode: 'D-2', alarmStatus: 1, alarmStatusText: '已处理' }]
  102. })
  103. assert.equal(handled.deviceAlarmStatus, undefined)
  104. assert.equal(handled.deviceAlarmStatusText, '未获取')
  105. assert.equal(handled.recordStatus, 1)
  106. assert.equal(handled.statusKey, 'normal')
  107. })
  108. test('keeps an offline or repairing device out of the alarm colour even when its order is closed', () => {
  109. const [offline, warning] = buildAlarmGisPoints({
  110. alarmPoints: [
  111. { alarmId: 'A-1', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1' },
  112. { alarmId: 'A-2', deviceCode: 'D-2', longitude: '110.2', latitude: '28.2' }
  113. ],
  114. ledgerRows: [
  115. { id: 'A-1', deviceCode: 'D-1', deviceAlarmStatus: 0, orderNo: 'WO-1', orderStatus: 5 },
  116. { id: 'A-2', deviceCode: 'D-2', deviceAlarmStatus: 0 }
  117. ],
  118. devicePoints: [
  119. { equipmentCode: 'D-1', onlineStatus: 0, currentStatus: 1 },
  120. { equipmentCode: 'D-2', onlineStatus: 1, currentStatus: 3 }
  121. ]
  122. })
  123. assert.equal(offline.statusKey, 'offline')
  124. assert.equal(warning.statusKey, 'warning')
  125. })
  126. test('searches alarm points by device, alarm type and location', () => {
  127. const points = buildAlarmGisPoints({
  128. alarmPoints: [
  129. { alarmId: 'A-1', deviceCode: 'CN-GS-001', deviceName: '一号压力计', warningType: '压力预警', equipmentLocation: '迎宾路', longitude: '110.1', latitude: '28.1', alarmLevel: 1 },
  130. { alarmId: 'A-2', deviceCode: 'CN-GS-002', deviceName: '二号流量计', warningType: '流量预警', equipmentLocation: '沅水大道', longitude: '110.2', latitude: '28.2', alarmLevel: 3 }
  131. ]
  132. })
  133. assert.deepEqual(filterAlarmGisPoints(points, '').map(point => point.alarmId), ['A-1', 'A-2'])
  134. assert.deepEqual(filterAlarmGisPoints(points, '压力').map(point => point.alarmId), ['A-1'])
  135. assert.deepEqual(filterAlarmGisPoints(points, 'cn-gs-002').map(point => point.alarmId), ['A-2'])
  136. assert.deepEqual(filterAlarmGisPoints(points, '沅水').map(point => point.alarmId), ['A-2'])
  137. assert.deepEqual(filterAlarmGisPoints(points, '不存在的关键字'), [])
  138. })
  139. test('summarizes alarm points by the five documented map states', () => {
  140. const points = buildAlarmGisPoints({
  141. alarmPoints: [
  142. { alarmId: 'A-1', deviceCode: 'D-1', longitude: '110.1', latitude: '28.1', alarmLevel: 1 },
  143. { alarmId: 'A-2', deviceCode: 'D-2', longitude: '110.2', latitude: '28.2', alarmLevel: 4 },
  144. { alarmId: 'A-3', deviceCode: 'D-3', longitude: '110.3', latitude: '28.3', alarmLevel: 2 },
  145. { alarmId: 'A-4', deviceCode: 'D-4', longitude: '110.4', latitude: '28.4', alarmLevel: 3 }
  146. ],
  147. ledgerRows: [
  148. { id: 'A-1', deviceCode: 'D-1', deviceAlarmStatus: 1 },
  149. { id: 'A-2', deviceCode: 'D-2', deviceAlarmStatus: 0 },
  150. { id: 'A-3', deviceCode: 'D-3', deviceAlarmStatus: 0, orderNo: 'WO-1', orderStatus: 2 },
  151. { id: 'A-4', deviceCode: 'D-4', deviceAlarmStatus: 0 }
  152. ],
  153. devicePoints: [
  154. { equipmentCode: 'D-1', onlineStatus: 1, currentStatus: 1 },
  155. { equipmentCode: 'D-2', onlineStatus: 0, currentStatus: 1 },
  156. { equipmentCode: 'D-3', onlineStatus: 1, currentStatus: 1 },
  157. { equipmentCode: 'D-4', onlineStatus: 1, currentStatus: 3 }
  158. ]
  159. })
  160. const summary = summarizeAlarmGisPoints(points)
  161. assert.equal(summary.total, 4)
  162. assert.equal(summary.highLevel, 2)
  163. assert.deepEqual(summary.byStatus, { normal: 0, alarm: 1, warning: 1, workOrder: 1, offline: 1 })
  164. assert.deepEqual(summarizeAlarmGisPoints([]).byStatus, { normal: 0, alarm: 0, warning: 0, workOrder: 0, offline: 0 })
  165. })