bxFormat.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /** 对齐 bx-mobile/src/utils/format.ts(Batch2 所需子集) */
  2. export function statusLabel(status) {
  3. if (status == null || status === '') return '-'
  4. const map = {
  5. 1: '启用',
  6. 0: '禁用',
  7. draft: '待提交',
  8. pending: '审批中',
  9. approved: '已通过',
  10. rejected: '已驳回',
  11. withdrawn: '已撤回',
  12. issued: '已发放',
  13. paid: '已支付',
  14. offset: '已冲抵',
  15. partial: '部分冲抵',
  16. processed: '已处理'
  17. }
  18. return map[status] ?? String(status)
  19. }
  20. export function statusTone(status) {
  21. if (status == null) return 'info'
  22. const map = {
  23. 1: 'done',
  24. 0: 'error',
  25. draft: 'info',
  26. pending: 'warn',
  27. approved: 'done',
  28. rejected: 'error',
  29. withdrawn: 'warn',
  30. issued: 'done',
  31. paid: 'done',
  32. offset: 'done',
  33. partial: 'warn',
  34. processed: 'done'
  35. }
  36. return map[status] ?? 'info'
  37. }
  38. export function workflowListStatusTagClass(status) {
  39. const raw = status == null || status === '' ? 'draft' : String(status)
  40. return `s-${raw}`
  41. }
  42. export function ticketHeaderStatusToneClass(status) {
  43. const tone = statusTone(status)
  44. const map = {
  45. info: 'advance-ticket-status--info',
  46. warn: 'advance-ticket-status--warn',
  47. done: 'advance-ticket-status--done',
  48. error: 'advance-ticket-status--err',
  49. processing: 'advance-ticket-status--processing'
  50. }
  51. return map[tone] || 'advance-ticket-status--info'
  52. }
  53. export function formatAmount(amount) {
  54. const n = typeof amount === 'string' ? parseFloat(amount) : amount
  55. if (Number.isNaN(n)) return '0.00'
  56. return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
  57. }
  58. export function formatDate(dateStr) {
  59. if (!dateStr) return '-'
  60. return String(dateStr).substring(0, 10)
  61. }
  62. export function formatDateTime(dateStr) {
  63. if (!dateStr) return '-'
  64. return String(dateStr).substring(0, 16).replace('T', ' ')
  65. }
  66. export function pickApplyTime(row) {
  67. if (!row || typeof row !== 'object') return undefined
  68. const v = row.applyTime ?? row.createTime ?? row.apply_time ?? row.create_time
  69. if (v == null || v === '') return undefined
  70. return String(v)
  71. }
  72. export function formatApplyDateTime(row) {
  73. return formatDateTime(pickApplyTime(row))
  74. }
  75. export function formatApplyDate(row) {
  76. return formatDate(pickApplyTime(row))
  77. }
  78. /** 费用树扁平化(tree → flatList) */
  79. export function flattenExpenseTree(tree) {
  80. const result = []
  81. for (const node of tree || []) {
  82. result.push(node)
  83. if (node.children?.length) result.push(...flattenExpenseTree(node.children))
  84. }
  85. return result
  86. }
  87. export function normalizeExpenseItem(raw) {
  88. const children = Array.isArray(raw?.children)
  89. ? raw.children.map(normalizeExpenseItem)
  90. : undefined
  91. return {
  92. id: String(raw?.id ?? ''),
  93. parentId: raw?.parentId == null || raw?.parentId === '' ? '0' : String(raw.parentId),
  94. itemName: raw?.itemName ?? '',
  95. itemCode: raw?.itemCode ?? '',
  96. level: Number(raw?.level ?? 0),
  97. sortOrder: Number(raw?.sortOrder ?? 0),
  98. status: raw?.status,
  99. childCount: Number(raw?.childCount ?? children?.length ?? 0),
  100. children
  101. }
  102. }
  103. export function formatExpenseName(id, flatList) {
  104. if (id == null || id === '') return '-'
  105. const sid = String(id)
  106. const parts = []
  107. let cur = (flatList || []).find((i) => String(i.id) === sid)
  108. const guard = new Set()
  109. while (cur && !guard.has(cur.id)) {
  110. guard.add(cur.id)
  111. parts.unshift(cur.itemName)
  112. const pid = cur.parentId
  113. cur =
  114. pid != null && pid !== '' && pid !== '0'
  115. ? (flatList || []).find((i) => String(i.id) === pid)
  116. : undefined
  117. }
  118. return parts.length ? parts.join('/') : '-'
  119. }
  120. export function pickExpenseItemId(row) {
  121. if (!row || typeof row !== 'object') return null
  122. const raw = row.expenseId ?? row.expense_id ?? row.expenseItemId ?? row.expense_item_id
  123. if (raw == null || raw === '') return null
  124. return String(raw)
  125. }
  126. export function resolveExpenseDisplay(row, flatList) {
  127. if (!row) return '-'
  128. const id = pickExpenseItemId(row)
  129. const nameFb = row.expenseName ?? row.expense_name
  130. if (id != null && flatList && flatList.length) {
  131. const p = formatExpenseName(id, flatList)
  132. if (p && p !== '-') return p
  133. }
  134. const fb = nameFb != null ? String(nameFb).trim() : ''
  135. return fb || '-'
  136. }