t65-card-actions.mjs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import assert from 'node:assert/strict'
  2. import { CARD_ACTION, cardActionFor } from '../src/modules/cockpit/domain/panelBlocks.js'
  3. import { workOrderCardRows } from '../src/modules/cockpit/domain/warningResponsePanels.js'
  4. import { entityIdentity, normalizeEntityDetail } from '../src/modules/cockpit/domain/entityDetail.js'
  5. import { entityDetailPath } from '../src/modules/cockpit/services/entityDetailApi.js'
  6. const cases = [
  7. [{ identityKind: CARD_ACTION.POINT, identityCode: 'P1' }, CARD_ACTION.POINT],
  8. [{ identityKind: CARD_ACTION.DEVICE, identityCode: 'D1' }, CARD_ACTION.DEVICE],
  9. [{ identityKind: CARD_ACTION.EVENT, identityCode: 'E1' }, CARD_ACTION.EVENT],
  10. [{ identityKind: CARD_ACTION.WORK_ORDER, identityCode: 'W1' }, CARD_ACTION.WORK_ORDER],
  11. [{ identityKind: CARD_ACTION.FACILITY, identityCode: 'F1' }, CARD_ACTION.FACILITY],
  12. [{ identityKind: CARD_ACTION.EMERGENCY, identityCode: 'R1' }, CARD_ACTION.EMERGENCY],
  13. [{ identityKind: CARD_ACTION.POINT, identityCode: '' }, CARD_ACTION.NONE],
  14. [{ identityKind: 'unknown', identityCode: 'X1' }, CARD_ACTION.NONE],
  15. ]
  16. for (const [row, kind] of cases) assert.equal(cardActionFor(row).kind, kind)
  17. const [order] = workOrderCardRows([{ id: '42', code: 'W1', stateCode: 0 }])
  18. assert.equal(cardActionFor(order).kind, CARD_ACTION.WORK_ORDER)
  19. assert.equal(cardActionFor(order).code, '42')
  20. assert.deepEqual(entityIdentity({ kind: 'facility', id: 'F1', category: 'water_plant' }), { kind: 'facility', id: 'F1', category: 'WATER_PLANT', family: '', valid: true })
  21. assert.equal(entityDetailPath({ kind: 'facility', id: 'F1', category: 'WATER_PLANT' }), '/entities/F1/detail?category=WATER_PLANT')
  22. assert.equal(entityDetailPath({ kind: 'emergency', id: 'H1', category: 'HAZARD' }), '/entities/H1/detail?category=HAZARD')
  23. assert.equal(entityDetailPath({ kind: 'event', id: 'A1', family: 'ALARM' }), '/events/A1/detail?family=ALARM')
  24. assert.equal(entityDetailPath({ kind: 'event', id: 'W2', family: 'WARNING' }), '/events/W2/detail?family=WARNING')
  25. assert.equal(entityDetailPath({ kind: 'work-order', id: '42' }), '/work-orders/42/detail')
  26. assert.equal(entityDetailPath({ kind: 'facility', id: 'F1' }), '')
  27. assert.equal(entityDetailPath({ kind: 'emergency', id: 'R1' }), '')
  28. const mobileOrder = normalizeEntityDetail({ kind: 'work-order', id: '42' }, { order: { orderId: 42, orderNo: 'WO42', orderStatus: 3, orderDesc: '测试故障', deviceName: '水位计', deviceLocation: '城南', receiveUserName: '运维员' }, logs: [{ operationType: '接单', operationTime: '2026-10-28 10:00:00', orderStatus: 2 }] })
  29. assert.equal(mobileOrder.order.id, '42')
  30. assert.equal(mobileOrder.order.code, 'WO42')
  31. assert.equal(mobileOrder.statusText, '处理中')
  32. assert.ok(mobileOrder.track)
  33. const warning = normalizeEntityDetail({ kind: 'event', id: 'W1', family: 'WARNING' }, { basicInfo: { warningNo: 'YJ1', warningLevel: 2, status: 'PENDING', deviceName: '压力计' }, disposalHistory: [{}], attachmentList: [{}, {}] })
  34. assert.equal(warning.kindLabel, '预警')
  35. assert.ok(warning.sections.some((section) => section.title === '处置与附件'))
  36. const facility = normalizeEntityDetail({ kind: 'facility', id: 'P1', category: 'WATER_PLANT' }, { category: 'WATER_PLANT', id: 'P1', code: 'WP-1', name: '一水厂', location: '城南', districtName: '城南', coordinates: { longitude: 110, latitude: 28 }, attributes: { designCapacity: 5000, treatmentProcess: '沉淀过滤', principal: '张三', contactPhone: '123' } })
  37. assert.ok(facility.sections.some((section) => section.fields.some((field) => field.label === '设计能力' && field.value === '5000 万m³/d')))
  38. assert.ok(facility.sections.some((section) => section.fields.some((field) => field.label === '处理工艺' && field.value === '沉淀过滤')))
  39. const resource = normalizeEntityDetail({ kind: 'emergency', id: 'E1', category: 'EMERGENCY_RESOURCE' }, { category: 'EMERGENCY_RESOURCE', id: 'E1', name: '应急泵', attributes: { model: 'M1', maintainer: '李四' } })
  40. assert.ok(resource.sections.some((section) => section.fields.some((field) => field.label === '型号' && field.value === 'M1')))
  41. const hazard = normalizeEntityDetail({ kind: 'emergency', id: 'H1', category: 'HAZARD' }, { category: 'HAZARD', id: 'H1', name: '泄漏隐患', attributes: { rectifyPlan: '立即整改', level: 'HIGH' } })
  42. assert.ok(hazard.sections.some((section) => section.fields.some((field) => field.label === '整改方案' && field.value === '立即整改')))
  43. const target = normalizeEntityDetail({ kind: 'emergency', id: 'R1', category: 'PROTECTION_TARGET' }, { category: 'PROTECTION_TARGET', id: 'R1', name: '学校', attributes: { riskLevel: 'HIGH', riskScore: 88 } })
  44. assert.ok(target.sections.some((section) => section.fields.some((field) => field.label === '风险分值' && field.value === '88 分')))
  45. const engineeringDetail = normalizeEntityDetail({ kind: 'facility', id: 'eng-1', category: 'ENGINEERING_FACILITY' }, { category: 'ENGINEERING_FACILITY', id: 'eng-1', name: '排水闸门', attributes: { facilityLevel: '一级', designFlow: 3.5, devices: [{ id: 'd1', code: 'D1', name: '闸门控制器', location: '城南', onlineStatus: 1, alarmStatus: 0 }] } })
  46. assert.ok(engineeringDetail.sections.some((section) => section.fields.some((field) => field.label === '设计流量' && field.value === '3.5 m³/s')))
  47. assert.deepEqual(engineeringDetail.devices.map((item) => item.code), ['D1'])
  48. assert.equal(engineeringDetail.devices[0].name, '闸门控制器')
  49. assert.equal(engineeringDetail.devices[0].status, '在线')
  50. assert.deepEqual(warning.tabs.map((item) => item.key), ['overview','records','alarms','attachments'])
  51. assert.deepEqual(mobileOrder.tabs.map((item) => item.key), ['overview','flow','devices','attachments'])
  52. assert.deepEqual(facility.tabs.map((item) => item.key), ['overview','business','related'])
  53. console.log('t65-card-actions: 38/38')