t116-facility-effects.mjs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import assert from 'node:assert/strict'
  2. import { test } from 'node:test'
  3. import { planMarker } from '../src/modules/cockpit/domain/markerPlan.js'
  4. import { facilityStatusTone } from '../src/modules/cockpit/domain/entityDetail.js'
  5. import { effectProfileFor, planDeviceEffects, combineEffectPlans } from '../src/modules/cockpit/domain/deviceEffects.js'
  6. import { facilityPointsWithDetails, facilityPointMarkers } from '../src/modules/cockpit/domain/facilityPoints.js'
  7. test('维护中设施使用蓝色工单状态,并复用设备旋转环参数', () => {
  8. const plan = planMarker({ kind: 'facility-point', facilityType: 'WATER_PLANT', status: '1' })
  9. assert.equal(plan.tint, 'lv3')
  10. assert.equal(facilityStatusTone('1'), 'lv3')
  11. assert.equal(plan.effectStatus, 'WORK_ORDER')
  12. assert.equal(plan.inner.icon, 'facilityPlant')
  13. const profile = effectProfileFor(plan.effectStatus)
  14. assert.deepEqual([profile.effect, profile.layers, profile.periodMs, profile.glow], ['spin', 1, 18000, false])
  15. })
  16. test('报警、显式预警与正常设施按真实状态取特效,未知码不按色键猜测', () => {
  17. for (const [status, tint, effectStatus, effect] of [
  18. ['2', 'lv1', 'ALARM', 'pulse'], ['WARNING', 'lv2', 'WARNING', 'blink'],
  19. [0, 'lv4', 'NORMAL', ''], ['OFFLINE', 'neutral', 'OFFLINE', ''],
  20. [undefined, 'neutral', '', ''], ['3', 'neutral', '', ''], ['constructor', 'neutral', '', ''],
  21. ]) {
  22. const plan = planMarker({ kind: 'facility-point', facilityType: 'PUMP_STATION', status })
  23. assert.equal(plan.tint, tint)
  24. assert.equal(plan.effectStatus, effectStatus)
  25. assert.equal(effectProfileFor(plan.effectStatus)?.effect || '', effect)
  26. }
  27. const overridden = planMarker({ kind: 'facility-point', status: '0', tone: 'lv1' })
  28. assert.equal(effectProfileFor(overridden.effectStatus), null)
  29. })
  30. test('详情状态优先,设施原始状态和实体主键不被视觉归一覆盖', () => {
  31. const rows = [{ key: 'WATER_PLANT|A', id: 'A', code: 'WP001', type: 'WATER_PLANT', status: '2' }]
  32. const points = facilityPointsWithDetails(rows, {
  33. 'WATER_PLANT|A': { ok: true, detail: { status: '1', coordinates: { longitude: 110.38, latitude: 28.43 } } },
  34. })
  35. const [row] = facilityPointMarkers(points)
  36. assert.equal(row.key, 'facility-point|WATER_PLANT|A')
  37. assert.equal(row.status, '1')
  38. assert.equal(row.tone, 'lv3')
  39. assert.equal(planMarker({ kind: row.kind, facilityType: row.type, status: row.status }).effectStatus, 'WORK_ORDER')
  40. assert.equal(rows[0].status, '2')
  41. })
  42. test('设施与设备共用开关和阈值,维修不计异常,跨图层超限只收敛', () => {
  43. const devices = ['1', '2', 'WARNING', '0', 'unknown'].map((status, index) => ({
  44. code: `facility-point|${index}`,
  45. status: planMarker({ kind: 'facility-point', status }).effectStatus,
  46. }))
  47. const off = planDeviceEffects({ devices, enabled: false })
  48. assert.deepEqual(off.animated, [])
  49. const on = planDeviceEffects({ devices, enabled: true, abnormalLimit: 2 })
  50. assert.deepEqual(on.animated.map((row) => row.effect), ['spin', 'pulse', 'blink'])
  51. assert.equal(on.ownAbnormalCount, 2)
  52. assert.equal(on.degraded, false)
  53. const other = planDeviceEffects({ devices: [{ code: 'device-A', status: 'ALARM' }], enabled: true })
  54. const combined = combineEffectPlans([on, other], { enabled: true, abnormalLimit: 2 })
  55. assert.equal(combined.abnormalCount, 3)
  56. assert.equal(combined.animatedCount, 4)
  57. assert.equal(combined.degraded, true)
  58. assert.deepEqual(combined.converge, { peak: 0.6, alpha: 0.5 })
  59. })