statusLabels.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /**
  2. * 统一业务 code → 中文展示入口。
  3. * 图表/Tag/列表禁止直接把英文枚举抛给用户;未知 code 显示「未知(code)」。
  4. */
  5. export type StatusDictType =
  6. | 'batchStatus'
  7. | 'flowStage'
  8. | 'personnelStatus'
  9. | 'insuranceMatch'
  10. | 'alertHandleStatus'
  11. | 'alertType'
  12. | 'alertLevel'
  13. | 'specialBizType'
  14. const BATCH_STATUS: Record<string, string> = {
  15. DRAFT: '草稿',
  16. PENDING_TOWN_APPROVE: '待镇经发初审',
  17. PENDING_INSURANCE_MATCH: '待居保匹配',
  18. PENDING_STATUS_MAINTAIN: '待状态维护',
  19. PENDING_LEADER_APPROVE: '待分管领导审批',
  20. READY_EXPORT: '可出盘',
  21. EXPORTED: '已出盘',
  22. RETURNED: '已回盘',
  23. ARCHIVED: '已归档',
  24. REJECTED: '已驳回',
  25. }
  26. /** 流程阶段(与业务状态语义分离;EXPORTED 在流程上多为「回盘信息确认」) */
  27. const FLOW_STAGE: Record<string, string> = {
  28. STAGE1_PERSONNEL_INPUT: '人员新增录入',
  29. STAGE2_TOWN_PRECHECK: '镇经发中心初审',
  30. STAGE3_INSURANCE_MATCH: '居保状态匹配',
  31. STAGE4_MONTHLY_LIST: '生成月补贴清单',
  32. STAGE5_LEADER_ONLINE_APPROVE: '分管领导审批',
  33. STAGE6_COMPARE_FILE: '生成对照文件',
  34. STAGE7_OFFLINE_SIGN_PAY: '待线下发放',
  35. STAGE8_RETURN_CONFIRM: '回盘信息确认',
  36. DRAFT: '人员新增录入',
  37. PENDING_TOWN_APPROVE: '镇经发中心初审',
  38. PENDING_INSURANCE_MATCH: '居保状态匹配',
  39. PENDING_STATUS_MAINTAIN: '比对结果已生成',
  40. PENDING_LEADER_APPROVE: '分管领导审批',
  41. READY_EXPORT: '待线下发放',
  42. EXPORTED: '回盘信息确认',
  43. RETURNED: '已回盘确认',
  44. ARCHIVED: '已归档',
  45. REJECTED: '退回修改',
  46. }
  47. const PERSONNEL_STATUS: Record<string, string> = {
  48. DRAFT: '草稿',
  49. PENDING_TOWN_APPROVE: '待镇初审',
  50. PENDING_INSURANCE_MATCH: '待居保匹配',
  51. NORMAL: '正常在库',
  52. PAUSED: '暂停',
  53. STOPPED: '停止',
  54. FUNERAL: '死亡丧葬',
  55. ABNORMAL: '异常待处理',
  56. ARCHIVED: '已归档',
  57. }
  58. const INSURANCE_MATCH: Record<string, string> = {
  59. PENDING: '未匹配',
  60. SUCCESS: '匹配通过',
  61. LOSE_ELIGIBILITY: '丧失资格',
  62. FAIL: '匹配失败',
  63. MANUAL_PASS: '匹配通过',
  64. }
  65. const ALERT_HANDLE: Record<string, string> = {
  66. PENDING: '待处理',
  67. PROCESSING: '处理中',
  68. CLOSED: '已关闭',
  69. }
  70. const ALERT_TYPE: Record<string, string> = {
  71. BANK_CARD_ABNORMAL: '银行卡异常',
  72. NAME_MISMATCH: '姓名不一致',
  73. INSURANCE_MATCH_FAIL: '居保匹配失败',
  74. AMOUNT_ABNORMAL: '金额异常',
  75. DEATH_STATUS: '死亡停发预警',
  76. MATERIAL_PENDING: '材料待补',
  77. RETURN_FAIL: '回盘失败',
  78. LAND_MATCH_FAIL: '土地匹配不符合',
  79. 民政死亡比对: '死亡停发预警',
  80. 回盘发放失败: '回盘失败',
  81. }
  82. const ALERT_LEVEL: Record<string, string> = {
  83. HIGH: '高',
  84. MEDIUM: '中',
  85. LOW: '低',
  86. }
  87. const SPECIAL_BIZ: Record<string, string> = {
  88. FUNERAL: '丧葬补贴',
  89. PAUSE: '暂停发放',
  90. STOP: '停止发放',
  91. RESUME: '恢复发放',
  92. STANDARD_ADJUST: '调标差额补发',
  93. SUPPLEMENT: '纳入下月补发',
  94. REFUND: '多发退款',
  95. HEIR_UPDATE: '继承人信息变更',
  96. /** 流程留痕 bizType(非特殊业务单,但时间线会展示) */
  97. INSURANCE_MATCH: '居保匹配',
  98. PERSONNEL_STATUS: '人员状态变更',
  99. }
  100. const DICTS: Record<StatusDictType, Record<string, string>> = {
  101. batchStatus: BATCH_STATUS,
  102. flowStage: FLOW_STAGE,
  103. personnelStatus: PERSONNEL_STATUS,
  104. insuranceMatch: INSURANCE_MATCH,
  105. alertHandleStatus: ALERT_HANDLE,
  106. alertType: ALERT_TYPE,
  107. alertLevel: ALERT_LEVEL,
  108. specialBizType: SPECIAL_BIZ,
  109. }
  110. /** 是否像未翻译的英文枚举 code */
  111. function looksLikeCode(s: string) {
  112. return /^[A-Z][A-Z0-9_]*$/.test(s)
  113. }
  114. /** 命中字典或已是中文则返回;未知英文 code 返回 null */
  115. export function tryLabelOf(dictType: StatusDictType, code?: string | null): string | null {
  116. if (code == null || code === '') return null
  117. const raw = String(code).trim()
  118. const table = DICTS[dictType]
  119. if (table[raw]) return table[raw]
  120. const upper = raw.toUpperCase()
  121. if (table[upper]) return table[upper]
  122. if (!looksLikeCode(raw)) return raw
  123. return null
  124. }
  125. /**
  126. * @param dictType 字典册
  127. * @param code 后端枚举或已是中文的文案
  128. */
  129. export function labelOf(dictType: StatusDictType, code?: string | null): string {
  130. if (code == null || code === '') return ''
  131. const hit = tryLabelOf(dictType, code)
  132. if (hit != null) return hit
  133. const raw = String(code).trim()
  134. if (import.meta.env.DEV) {
  135. // eslint-disable-next-line no-console
  136. console.warn(`[statusLabels] 未知 ${dictType} code:`, raw)
  137. }
  138. return `未知(${raw})`
  139. }
  140. export function batchStatusLabel(code?: string | null) {
  141. return labelOf('batchStatus', code)
  142. }
  143. export function flowStageLabelOf(code?: string | null) {
  144. return labelOf('flowStage', code)
  145. }
  146. export function personnelStatusLabel(code?: string | null) {
  147. return labelOf('personnelStatus', code)
  148. }