waterSupplyUiModel.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. const alarmLevelLabels = {
  2. 1: '一级报警',
  3. 2: '二级报警',
  4. 3: '三级报警',
  5. 4: '四级报警'
  6. }
  7. // 工单状态:0-待派单 1-待接单 2-已接单 3-处理中 4-待验收 5-已结案 6-延期中 7-已取消
  8. const workOrderStatusLabels = {
  9. 0: '待派单',
  10. 1: '待接单',
  11. 2: '已接单',
  12. 3: '处理中',
  13. 4: '待验收',
  14. 5: '已结案',
  15. 6: '延期中',
  16. 7: '已取消'
  17. }
  18. // 终态:5-已结案、7-已取消
  19. const terminalWorkOrderStatuses = new Set([5, 7])
  20. const deviceCurrentStatusLabels = {
  21. 1: '在用',
  22. 2: '闲置',
  23. 3: '维修',
  24. 4: '报废',
  25. 5: '待入库'
  26. }
  27. const onlineStatusLabels = {
  28. 1: '在线',
  29. 0: '离线'
  30. }
  31. const deviceImageBaseUrl = import.meta.env?.VITE_APP_BASE_API || ''
  32. export function normalizeDeviceImageUrl(value) {
  33. const url = String(value ?? '').trim()
  34. if (!url || /^(https?:|blob:|data:)/i.test(url)) return url
  35. if (deviceImageBaseUrl && (url === deviceImageBaseUrl || url.startsWith(`${deviceImageBaseUrl}/`))) return url
  36. return url.startsWith('/') ? `${deviceImageBaseUrl}${url}` : `${deviceImageBaseUrl}/${url}`
  37. }
  38. export function normalizeDeviceRow(row = {}) {
  39. const alarmStatus = Number(row.alarmStatus)
  40. const currentStatus = Number(row.currentStatus)
  41. const onlineStatus = Number(row.onlineStatus)
  42. const alarmLevel = Number(row.alertLevel ?? row.alarmLevel ?? 0)
  43. const relatedOrderNo = row.relatedWorkOrderNo
  44. ?? row.latestOrderNo
  45. ?? row.orderNo
  46. ?? '-'
  47. const rawOrderStatus = row.relatedWorkOrderStatus
  48. ?? row.latestMaintainStatus
  49. ?? row.orderStatus
  50. ?? row.statusText
  51. const currentStatusText = deviceCurrentStatusLabels[currentStatus]
  52. ?? (currentStatus ? `状态${currentStatus}` : '未知')
  53. const onlineStatusText = onlineStatusLabels[onlineStatus]
  54. ?? (Number.isFinite(onlineStatus) && onlineStatus !== 0 ? '在线' : '离线')
  55. const alarmStatusText = alarmStatus === 1 ? '报警' : '正常'
  56. const workOrderStatus = normalizeWorkOrderStatus(rawOrderStatus)
  57. return {
  58. ...row,
  59. equipmentImageUrl: normalizeDeviceImageUrl(row.equipmentImage),
  60. deviceStatusText: currentStatusText,
  61. currentStatusText,
  62. onlineStatusText,
  63. alarmStatusText,
  64. abnormalReasonText: row.abnormalReason
  65. || (alarmStatus === 1 ? '设备报警' : currentStatus === 3 ? '设备维修中' : '-'),
  66. alarmLevelText: alarmLevelLabels[alarmLevel] ?? (alarmLevel ? `${alarmLevel}级报警` : '未分级'),
  67. relatedOrderNo,
  68. relatedWorkOrderPerson: row.relatedWorkOrderPerson ?? '-',
  69. workOrderStatusCode: workOrderStatus.code,
  70. workOrderTerminal: workOrderStatus.terminal,
  71. workOrderStatusText: workOrderStatus.text
  72. }
  73. }
  74. export function normalizeWorkOrderStatus(value) {
  75. if (value === null || value === undefined || value === '') {
  76. return { code: null, text: '暂无工单', terminal: false }
  77. }
  78. const numeric = typeof value === 'number' || /^\s*\d+\s*$/.test(String(value))
  79. if (numeric) {
  80. const code = Number(value)
  81. return {
  82. code: Number.isFinite(code) ? code : null,
  83. text: workOrderStatusLabels[code] ?? '未知',
  84. terminal: terminalWorkOrderStatuses.has(code)
  85. }
  86. }
  87. const text = String(value)
  88. const code = Object.entries(workOrderStatusLabels).find(([, label]) => label === text)?.[0]
  89. return { code: code ? Number(code) : null, text: text || '暂无工单', terminal: code ? terminalWorkOrderStatuses.has(Number(code)) : false }
  90. }
  91. /** 关联工单是否仍未结束;已结案(5)与已取消(7)不再代表处置进行中 */
  92. export function isActiveWorkOrderStatus(status) {
  93. const normalized = normalizeWorkOrderStatus(status)
  94. return normalized.code !== null && !normalized.terminal
  95. }
  96. export function canDispatchDevice(row = {}) {
  97. const orderNo = row.relatedOrderNo ?? row.latestOrderNo ?? row.orderNo
  98. if (!orderNo || orderNo === '-') return true
  99. return normalizeWorkOrderStatus(row.relatedWorkOrderStatus ?? row.latestMaintainStatus ?? row.orderStatus).terminal
  100. }
  101. export function preserveDevicePageOnError(page) {
  102. return { page, error: '设备数据加载失败,请点击重试' }
  103. }
  104. export function normalizeDeviceGisPoints(response) {
  105. const data = response?.data ?? response
  106. const points = Array.isArray(data) ? data : (data?.features || data?.records || data?.rows || data?.points || [])
  107. return points.map(point => ({
  108. ...point,
  109. _longitude: Number(point.longitude ?? point.lng),
  110. _latitude: Number(point.latitude ?? point.lat)
  111. })).filter(point => Number.isFinite(point._longitude) && Number.isFinite(point._latitude))
  112. }
  113. export function normalizeAssigneeUser(user = {}) {
  114. const status = String(user.status ?? '0')
  115. const delFlag = String(user.delFlag ?? '0')
  116. const deptName = user.dept?.deptName ?? user.deptName ?? '-'
  117. const phone = user.phonenumber ?? user.phoneNumber ?? user.phone
  118. return {
  119. userId: user.userId ?? user.id,
  120. userName: user.userName ?? '',
  121. nickName: user.nickName ?? '',
  122. deptName,
  123. phone: phone || '未登记手机号',
  124. statusText: status === '0' && delFlag === '0' ? '正常' : '停用',
  125. eligible: status === '0' && delFlag === '0'
  126. }
  127. }
  128. export function buildAssigneeQuery({ deptId, keyword = '', pageNum = 1, pageSize = 10 } = {}) {
  129. const normalizedKeyword = String(keyword ?? '').trim()
  130. const searchField = normalizedKeyword
  131. ? (/^\+?[\d\s-]+$/.test(normalizedKeyword)
  132. ? 'phonenumber'
  133. : /[\u3400-\u9fff]/u.test(normalizedKeyword) ? 'nickName' : 'userName')
  134. : null
  135. return {
  136. pageNum: Number(pageNum) > 0 ? Number(pageNum) : 1,
  137. pageSize: Number(pageSize) > 0 ? Number(pageSize) : 10,
  138. ...(deptId == null || deptId === '' ? {} : { deptId }),
  139. status: '0',
  140. ...(searchField ? { [searchField]: normalizedKeyword } : {})
  141. }
  142. }
  143. export function selectSingleAssignee(selection = []) {
  144. return Array.isArray(selection) && selection.length ? selection[selection.length - 1] : null
  145. }
  146. export function normalizeDispatchOrderResponse(response) {
  147. const candidates = [response?.data?.data, response?.data, response]
  148. const summary = candidates.find(value => value && typeof value === 'object' && !Array.isArray(value)
  149. && value.orderId != null && String(value.orderNo ?? '').trim())
  150. // 派单成功后的工单应为「待接单」
  151. if (!summary || Number(summary.orderStatus) !== 1) return null
  152. return {
  153. ...summary,
  154. orderId: summary.orderId,
  155. orderNo: String(summary.orderNo).trim(),
  156. orderStatus: Number(summary.orderStatus)
  157. }
  158. }
  159. export function buildMaintainOrderPayload(device = {}, form = {}) {
  160. const payload = {
  161. equipmentId: device.equipmentId ?? device.id,
  162. equipmentCode: device.equipmentCode,
  163. equipmentName: device.equipmentName,
  164. maintainType: '故障维修',
  165. maintainContent: form.description?.trim() || '异常设备维修派单',
  166. orderLevel: form.orderLevel ?? 2
  167. }
  168. if (form.receiveUserId != null && form.receiveUserId !== '') {
  169. payload.receiveUserId = Number(form.receiveUserId)
  170. }
  171. return payload
  172. }
  173. export function getDeviceOrderEndpoint(view) {
  174. return view === 'dispatch' || view === 'abnormal'
  175. ? '/waterSupply/device/abnormal/order'
  176. : null
  177. }
  178. function normalizeThresholdValue(value) {
  179. if (value === '' || value === null || value === undefined) {
  180. return undefined
  181. }
  182. const parsed = Number(value)
  183. return Number.isFinite(parsed) ? parsed : value
  184. }
  185. function normalizeThresholdPeriod(form = {}) {
  186. const periodStart = form.periodStart?.trim() || undefined
  187. const periodEnd = form.periodEnd?.trim() || undefined
  188. return { periodStart, periodEnd }
  189. }
  190. function removeUndefined(payload) {
  191. return Object.fromEntries(
  192. Object.entries(payload).filter(([, value]) => value !== undefined)
  193. )
  194. }
  195. export function buildThresholdSavePayload(form = {}) {
  196. const deviceCodes = Array.from(new Set((form.deviceCodes || [])
  197. .map(code => code?.trim())
  198. .filter(Boolean)))
  199. const { periodStart, periodEnd } = normalizeThresholdPeriod(form)
  200. return removeUndefined({
  201. deviceCodes,
  202. warningType: form.warningType?.trim() || undefined,
  203. warningCode: form.warningCode?.trim() || undefined,
  204. minValue: normalizeThresholdValue(form.minValue),
  205. maxValue: normalizeThresholdValue(form.maxValue),
  206. periodStart,
  207. periodEnd,
  208. remark: form.remark?.trim() || undefined
  209. })
  210. }
  211. export function buildThresholdUpdatePayload(form = {}) {
  212. const { periodStart, periodEnd } = normalizeThresholdPeriod(form)
  213. return removeUndefined({
  214. id: form.id,
  215. deviceCode: form.deviceCode?.trim() || undefined,
  216. warningType: form.warningType?.trim() || undefined,
  217. warningCode: form.warningCode?.trim() || undefined,
  218. minValue: normalizeThresholdValue(form.minValue),
  219. maxValue: normalizeThresholdValue(form.maxValue),
  220. periodStart,
  221. periodEnd,
  222. remark: form.remark?.trim() || undefined
  223. })
  224. }
  225. export function buildThresholdQuery(query = {}) {
  226. return removeUndefined({
  227. pageNum: query.pageNum || 1,
  228. pageSize: query.pageSize || 10,
  229. deviceCode: query.deviceCode?.trim() || undefined,
  230. warningType: query.warningType?.trim() || undefined,
  231. keyword: query.keyword?.trim() || undefined
  232. })
  233. }