waterSupplyUiModel.test.mjs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import test from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import {
  4. normalizeDeviceRow,
  5. buildMaintainOrderPayload,
  6. getDeviceOrderEndpoint,
  7. normalizeWorkOrderStatus,
  8. canDispatchDevice,
  9. preserveDevicePageOnError,
  10. normalizeDeviceGisPoints,
  11. normalizeAssigneeUser,
  12. buildAssigneeQuery,
  13. selectSingleAssignee,
  14. normalizeDispatchOrderResponse
  15. } from '../src/utils/waterSupplyUiModel.js'
  16. test('normalizes alarm and related work-order fields for device pages', () => {
  17. const row = normalizeDeviceRow({
  18. equipmentId: 'EQ-1',
  19. equipmentCode: 'P-001',
  20. equipmentName: '一号压力计',
  21. alarmStatus: 1,
  22. alertLevel: 2,
  23. alarmLevelName: '字典配置等级',
  24. latestOrderNo: 'WO202606101703482640',
  25. latestMaintainStatus: '处理中'
  26. })
  27. assert.equal(row.alarmStatusText, '报警')
  28. assert.equal(row.alarmLevelText, '字典配置等级')
  29. assert.equal(row.relatedOrderNo, 'WO202606101703482640')
  30. assert.equal(row.workOrderStatusText, '处理中')
  31. })
  32. test('keeps device operation, online, alarm, and work-order states distinct', () => {
  33. const row = normalizeDeviceRow({
  34. equipmentId: 'EQ-T6',
  35. equipmentCode: 'CN-GS-202609020001',
  36. equipmentName: 'T6压力监测点',
  37. currentStatus: 3,
  38. onlineStatus: 0,
  39. alarmStatus: 1,
  40. alertLevel: 1,
  41. abnormalReason: '供水压力超限',
  42. relatedWorkOrderNo: 'WO202609020001',
  43. relatedWorkOrderStatus: 3,
  44. relatedWorkOrderPerson: '张三'
  45. })
  46. assert.equal(row.currentStatusText, '维修')
  47. assert.equal(row.onlineStatusText, '离线')
  48. assert.equal(row.alarmStatusText, '报警')
  49. assert.equal(row.abnormalReasonText, '供水压力超限')
  50. assert.equal(row.relatedOrderNo, 'WO202609020001')
  51. assert.equal(row.workOrderStatusText, '处理中')
  52. assert.equal(row.relatedWorkOrderPerson, '张三')
  53. })
  54. test('builds a repair dispatch payload with the selected responsible user', () => {
  55. const payload = buildMaintainOrderPayload(
  56. { equipmentId: 'EQ-1', equipmentCode: 'P-001', equipmentName: '一号压力计' },
  57. { description: '压力低于阈值', receiveUserId: 18, orderLevel: 1 }
  58. )
  59. assert.deepEqual(payload, {
  60. equipmentId: 'EQ-1',
  61. equipmentCode: 'P-001',
  62. equipmentName: '一号压力计',
  63. maintainType: '故障维修',
  64. maintainContent: '压力低于阈值',
  65. orderLevel: 1,
  66. receiveUserId: 18
  67. })
  68. })
  69. test('uses the abnormal-device order endpoint for device repair dispatch', () => {
  70. assert.equal(getDeviceOrderEndpoint('dispatch'), '/waterSupply/device/abnormal/order')
  71. assert.equal(getDeviceOrderEndpoint('abnormal'), '/waterSupply/device/abnormal/order')
  72. })
  73. test('maps numeric and numeric-string work-order statuses and marks terminal states', () => {
  74. assert.deepEqual(normalizeWorkOrderStatus(3), { code: 3, text: '处理中', terminal: false })
  75. assert.deepEqual(normalizeWorkOrderStatus(6), { code: 6, text: '延期中', terminal: false })
  76. assert.deepEqual(normalizeWorkOrderStatus('5'), { code: 5, text: '已结案', terminal: true })
  77. assert.deepEqual(normalizeWorkOrderStatus('7'), { code: 7, text: '已取消', terminal: true })
  78. assert.deepEqual(normalizeWorkOrderStatus('暂无工单'), { code: null, text: '暂无工单', terminal: false })
  79. })
  80. test('allows dispatch when the latest order is terminal, including numeric-string status', () => {
  81. assert.equal(canDispatchDevice({ relatedOrderNo: 'WO-5', relatedWorkOrderStatus: '5' }), true)
  82. assert.equal(canDispatchDevice({ relatedOrderNo: 'WO-7', relatedWorkOrderStatus: 7 }), true)
  83. assert.equal(canDispatchDevice({ relatedOrderNo: 'WO-3', relatedWorkOrderStatus: '3' }), false)
  84. assert.equal(canDispatchDevice({ relatedOrderNo: 'WO-6', relatedWorkOrderStatus: '6' }), false)
  85. assert.equal(canDispatchDevice({ relatedOrderNo: '-' }), true)
  86. })
  87. test('does not treat a maintenance record id as a unified work-order number', () => {
  88. const row = normalizeDeviceRow({
  89. equipmentId: 'EQ-RECENT-MAINTENANCE',
  90. latestMaintainId: 42,
  91. latestMaintainStatus: '已完成'
  92. })
  93. assert.equal(row.relatedOrderNo, '-')
  94. assert.equal(row.workOrderStatusText, '已完成')
  95. assert.equal(canDispatchDevice(row), true)
  96. })
  97. test('retains existing page rows and total when a reload fails', () => {
  98. const previous = { records: [{ equipmentId: 'EQ-1' }], total: 1 }
  99. assert.deepEqual(preserveDevicePageOnError(previous), {
  100. page: previous,
  101. error: '设备数据加载失败,请点击重试'
  102. })
  103. })
  104. test('normalizes GIS responses to point records without inventing coordinates', () => {
  105. assert.deepEqual(normalizeDeviceGisPoints({ data: [{ equipmentId: 'EQ-1', longitude: '110.1', latitude: '28.2' }] }), [
  106. { equipmentId: 'EQ-1', longitude: '110.1', latitude: '28.2', _longitude: 110.1, _latitude: 28.2 }
  107. ])
  108. assert.deepEqual(normalizeDeviceGisPoints({ data: [{ equipmentId: 'EQ-2' }] }), [])
  109. assert.deepEqual(normalizeDeviceGisPoints({
  110. data: {
  111. type: 'FeatureCollection',
  112. features: [{ equipmentId: 'EQ-GIS', longitude: '110.3', latitude: '28.4' }]
  113. }
  114. }), [
  115. { equipmentId: 'EQ-GIS', longitude: '110.3', latitude: '28.4', _longitude: 110.3, _latitude: 28.4 }
  116. ])
  117. })
  118. test('normalizes eligible assignee display fields with safe fallbacks', () => {
  119. assert.deepEqual(normalizeAssigneeUser({
  120. userId: 18,
  121. userName: 'zhangsan',
  122. nickName: '张三',
  123. phonenumber: '',
  124. status: '0',
  125. delFlag: '0',
  126. dept: { deptName: '供水运行部' }
  127. }), {
  128. userId: 18,
  129. userName: 'zhangsan',
  130. nickName: '张三',
  131. deptName: '供水运行部',
  132. phone: '未登记手机号',
  133. statusText: '正常',
  134. eligible: true
  135. })
  136. assert.equal(normalizeAssigneeUser({ userId: 19, status: '1', delFlag: '0' }).eligible, false)
  137. })
  138. test('builds server-paged assignee queries using the matching user field', () => {
  139. assert.deepEqual(buildAssigneeQuery({ keyword: 'zhang', deptId: 7, pageNum: 2, pageSize: 20 }), {
  140. pageNum: 2,
  141. pageSize: 20,
  142. deptId: 7,
  143. status: '0',
  144. userName: 'zhang'
  145. })
  146. assert.equal(buildAssigneeQuery({ keyword: '张', pageNum: 1, pageSize: 10 }).nickName, '张')
  147. assert.equal(buildAssigneeQuery({ keyword: '1380013' }).phonenumber, '1380013')
  148. })
  149. test('keeps only the last clicked assignee for single selection', () => {
  150. assert.deepEqual(selectSingleAssignee([{ userId: 1 }, { userId: 2 }]), { userId: 2 })
  151. assert.equal(selectSingleAssignee([]), null)
  152. })
  153. test('accepts only a real dispatched order summary', () => {
  154. assert.equal(normalizeDispatchOrderResponse({ data: { orderId: 12, orderNo: 'WO-12', orderStatus: '1' } }).orderNo, 'WO-12')
  155. assert.equal(normalizeDispatchOrderResponse({ data: { orderId: 12, orderNo: 'WO-12', orderStatus: 2 } }), null)
  156. assert.equal(normalizeDispatchOrderResponse({ data: { orderId: 12, orderStatus: 1 } }), null)
  157. })