t52-device-plan.mjs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import assert from 'node:assert/strict'
  2. import { createPinia, setActivePinia } from 'pinia'
  3. import { planPipeEnhancement } from '../../../src/modules/cockpit/domain/pipeEnhancement.js'
  4. import { planEnhancementDevices } from '../../../src/modules/cockpit/domain/enhancementDevices.js'
  5. import { useEnhancementDevicesStore } from '../../../src/modules/cockpit/stores/enhancementDevicesStore.js'
  6. const pipe = { code: 'P', networkId: 'real-id', industry: 'WATER_SUPPLY', positions: [[110, 28], [110.001, 28]] }
  7. const plan = planPipeEnhancement({ selected: { kind: 'pipe', code: 'P' }, visiblePipes: [pipe] })
  8. const base = { industry: 'WATER_SUPPLY', longitude: 110.0005, latitude: 28.0001, coordinate: { renderable: true } }
  9. const rows = [{ ...base, code: 'near' }, { ...base, code: 'linked', networkId: 'real-id' },
  10. { ...base, code: 'wrong-id', networkId: 'P' }, { ...base, code: 'no-position', longitude: null },
  11. { ...base, code: 'gas', industry: 'GAS' }, { ...base, code: 'denied', coordinate: { renderable: false } }]
  12. const original = JSON.stringify(rows)
  13. const result = planEnhancementDevices(plan, rows)
  14. assert.equal(result.devices.find((d) => d.code === 'linked').placement, 'linked')
  15. assert.equal(result.devices.find((d) => d.code === 'wrong-id').placement, 'nearby')
  16. assert.equal(result.devices.find((d) => d.code === 'near').placementText, '邻近设备 · 示意安装')
  17. assert.equal(result.devices.find((d) => d.code === 'gas').placement, 'standalone')
  18. assert.equal(result.deviceList.find((d) => d.code === 'no-position').placement, 'list-only')
  19. assert.ok(!result.devices.some((d) => d.code === 'denied'))
  20. assert.equal(new Set(result.devices.filter((d) => d.pipeCode === 'P').map((d) => d.slot)).size, 3)
  21. assert.equal(JSON.stringify(rows), original)
  22. setActivePinia(createPinia())
  23. const store = useEnhancementDevicesStore()
  24. let finishA
  25. const a = store.open({ code: 'A' }, { fetchDetail: () => new Promise((resolve) => { finishA = resolve }) })
  26. await store.open({ code: 'B' }, { fetchDetail: async () => ({ state: 'success', data: { deviceCode: 'B', sections: {} } }) })
  27. finishA({ state: 'success', data: { deviceCode: 'A', sections: {} } })
  28. await a
  29. assert.equal(store.aggregate.data.deviceCode, 'B')
  30. assert.equal(store.selected.code, 'B')
  31. store.clear()
  32. assert.equal(store.aggregate, null)
  33. assert.equal(store.selected, null)
  34. let finishOutside
  35. const pending = store.open({ code: 'outside' }, { fetchDetail: () => new Promise((resolve) => { finishOutside = resolve }) })
  36. store.reconcile([])
  37. finishOutside({ state: 'success', data: { deviceCode: 'outside' } })
  38. await pending
  39. assert.equal(store.selected, null)
  40. assert.equal(store.aggregate, null)
  41. store.invalidate()
  42. assert.equal(store.source.loading, true)
  43. assert.deepEqual(store.source.rows, [])
  44. assert.equal(planEnhancementDevices(plan, rows, { mode: 'infrastructure' }).devices.length, result.devices.length)
  45. const alertRows = [{ ...base, code: 'ok', status: 'NORMAL' }, { ...base, code: 'alarm', status: 'ALARM' }]
  46. const warnings = planEnhancementDevices(plan, alertRows, { mode: 'warningResponse', abnormalDevices: [{ code: 'alarm', status: 'ALARM' }] })
  47. assert.deepEqual(warnings.devices.map((d) => d.code), ['alarm'])
  48. const linkedManhole = planEnhancementDevices(plan, [{ ...base, industry: 'MANHOLE', code: 'MH-device', networkId: 'real-id', longitude: null }])
  49. assert.equal(linkedManhole.devices[0].placement, 'linked')
  50. console.log('PASS 范围移除取消详情/在途响应、刷新失效、模式过滤及真实跨行业关联')
  51. console.log('PASS 真实ID关联优先、邻近示意、无位置清单、行业分离、不改源及内部详情旧响应隔离')