t52-device-plan.mjs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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.ok(!result.deviceList.some((d) => d.code === 'no-position'), '无坐标且无真实关联的设备在详情视图中必须完全隐藏(维护者 2026-10-22)')
  19. assert.ok(!result.devices.some((d) => d.code === 'no-position'))
  20. assert.ok(!result.devices.some((d) => d.code === 'denied'))
  21. assert.equal(new Set(result.devices.filter((d) => d.pipeCode === 'P').map((d) => d.slot)).size, 3)
  22. assert.equal(JSON.stringify(rows), original)
  23. setActivePinia(createPinia())
  24. const store = useEnhancementDevicesStore()
  25. let finishA
  26. const a = store.open({ code: 'A' }, { fetchDetail: () => new Promise((resolve) => { finishA = resolve }) })
  27. await store.open({ code: 'B' }, { fetchDetail: async () => ({ state: 'success', data: { deviceCode: 'B', sections: {} } }) })
  28. finishA({ state: 'success', data: { deviceCode: 'A', sections: {} } })
  29. await a
  30. assert.equal(store.aggregate.data.deviceCode, 'B')
  31. assert.equal(store.selected.code, 'B')
  32. store.clear()
  33. assert.equal(store.aggregate, null)
  34. assert.equal(store.selected, null)
  35. let finishOutside
  36. const pending = store.open({ code: 'outside' }, { fetchDetail: () => new Promise((resolve) => { finishOutside = resolve }) })
  37. store.reconcile([])
  38. finishOutside({ state: 'success', data: { deviceCode: 'outside' } })
  39. await pending
  40. assert.equal(store.selected, null)
  41. assert.equal(store.aggregate, null)
  42. store.invalidate()
  43. assert.equal(store.source.loading, true)
  44. assert.deepEqual(store.source.rows, [])
  45. assert.equal(planEnhancementDevices(plan, rows, { mode: 'infrastructure' }).devices.length, result.devices.length)
  46. const alertRows = [{ ...base, code: 'ok', status: 'NORMAL' }, { ...base, code: 'alarm', status: 'ALARM' }]
  47. const warnings = planEnhancementDevices(plan, alertRows, { mode: 'warningResponse', abnormalDevices: [{ code: 'alarm', status: 'ALARM' }] })
  48. assert.deepEqual(warnings.devices.map((d) => d.code), ['alarm'])
  49. const linkedManhole = planEnhancementDevices(plan, [{ ...base, industry: 'MANHOLE', code: 'MH-device', networkId: 'real-id', longitude: null }])
  50. assert.equal(linkedManhole.devices[0].placement, 'linked')
  51. console.log('PASS 范围移除取消详情/在途响应、刷新失效、模式过滤及真实跨行业关联')
  52. console.log('PASS 真实ID关联优先、邻近示意、无位置清单、行业分离、不改源及内部详情旧响应隔离')