/** * 统一业务 code → 中文展示入口。 * 图表/Tag/列表禁止直接把英文枚举抛给用户;未知 code 显示「未知(code)」。 */ export type StatusDictType = | 'batchStatus' | 'flowStage' | 'personnelStatus' | 'insuranceMatch' | 'alertHandleStatus' | 'alertType' | 'alertLevel' | 'specialBizType' const BATCH_STATUS: Record = { DRAFT: '草稿', PENDING_TOWN_APPROVE: '待镇经发初审', PENDING_INSURANCE_MATCH: '待居保匹配', PENDING_STATUS_MAINTAIN: '待状态维护', PENDING_LEADER_APPROVE: '待分管领导审批', READY_EXPORT: '可出盘', EXPORTED: '已出盘', RETURNED: '已回盘', ARCHIVED: '已归档', REJECTED: '已驳回', } /** 流程阶段(与业务状态语义分离;EXPORTED 在流程上多为「回盘信息确认」) */ const FLOW_STAGE: Record = { STAGE1_PERSONNEL_INPUT: '人员新增录入', STAGE2_TOWN_PRECHECK: '镇经发中心初审', STAGE3_INSURANCE_MATCH: '居保状态匹配', STAGE4_MONTHLY_LIST: '生成月补贴清单', STAGE5_LEADER_ONLINE_APPROVE: '分管领导审批', STAGE6_COMPARE_FILE: '生成对照文件', STAGE7_OFFLINE_SIGN_PAY: '待线下发放', STAGE8_RETURN_CONFIRM: '回盘信息确认', DRAFT: '人员新增录入', PENDING_TOWN_APPROVE: '镇经发中心初审', PENDING_INSURANCE_MATCH: '居保状态匹配', PENDING_STATUS_MAINTAIN: '比对结果已生成', PENDING_LEADER_APPROVE: '分管领导审批', READY_EXPORT: '待线下发放', EXPORTED: '回盘信息确认', RETURNED: '已回盘确认', ARCHIVED: '已归档', REJECTED: '退回修改', } const PERSONNEL_STATUS: Record = { DRAFT: '草稿', PENDING_TOWN_APPROVE: '待镇初审', PENDING_INSURANCE_MATCH: '待居保匹配', NORMAL: '正常在库', PAUSED: '暂停', STOPPED: '停止', FUNERAL: '死亡丧葬', ABNORMAL: '异常待处理', ARCHIVED: '已归档', } const INSURANCE_MATCH: Record = { PENDING: '未匹配', SUCCESS: '匹配通过', LOSE_ELIGIBILITY: '丧失资格', FAIL: '匹配失败', MANUAL_PASS: '匹配通过', } const ALERT_HANDLE: Record = { PENDING: '待处理', PROCESSING: '处理中', CLOSED: '已关闭', } const ALERT_TYPE: Record = { BANK_CARD_ABNORMAL: '银行卡异常', NAME_MISMATCH: '姓名不一致', INSURANCE_MATCH_FAIL: '居保匹配失败', AMOUNT_ABNORMAL: '金额异常', DEATH_STATUS: '死亡停发预警', MATERIAL_PENDING: '材料待补', RETURN_FAIL: '回盘失败', LAND_MATCH_FAIL: '土地匹配不符合', 民政死亡比对: '死亡停发预警', 回盘发放失败: '回盘失败', } const ALERT_LEVEL: Record = { HIGH: '高', MEDIUM: '中', LOW: '低', } const SPECIAL_BIZ: Record = { FUNERAL: '丧葬补贴', PAUSE: '暂停发放', STOP: '停止发放', RESUME: '恢复发放', STANDARD_ADJUST: '调标差额补发', SUPPLEMENT: '纳入下月补发', REFUND: '多发退款', HEIR_UPDATE: '继承人信息变更', /** 流程留痕 bizType(非特殊业务单,但时间线会展示) */ INSURANCE_MATCH: '居保匹配', PERSONNEL_STATUS: '人员状态变更', } const DICTS: Record> = { batchStatus: BATCH_STATUS, flowStage: FLOW_STAGE, personnelStatus: PERSONNEL_STATUS, insuranceMatch: INSURANCE_MATCH, alertHandleStatus: ALERT_HANDLE, alertType: ALERT_TYPE, alertLevel: ALERT_LEVEL, specialBizType: SPECIAL_BIZ, } /** 是否像未翻译的英文枚举 code */ function looksLikeCode(s: string) { return /^[A-Z][A-Z0-9_]*$/.test(s) } /** 命中字典或已是中文则返回;未知英文 code 返回 null */ export function tryLabelOf(dictType: StatusDictType, code?: string | null): string | null { if (code == null || code === '') return null const raw = String(code).trim() const table = DICTS[dictType] if (table[raw]) return table[raw] const upper = raw.toUpperCase() if (table[upper]) return table[upper] if (!looksLikeCode(raw)) return raw return null } /** * @param dictType 字典册 * @param code 后端枚举或已是中文的文案 */ export function labelOf(dictType: StatusDictType, code?: string | null): string { if (code == null || code === '') return '' const hit = tryLabelOf(dictType, code) if (hit != null) return hit const raw = String(code).trim() if (import.meta.env.DEV) { // eslint-disable-next-line no-console console.warn(`[statusLabels] 未知 ${dictType} code:`, raw) } return `未知(${raw})` } export function batchStatusLabel(code?: string | null) { return labelOf('batchStatus', code) } export function flowStageLabelOf(code?: string | null) { return labelOf('flowStage', code) } export function personnelStatusLabel(code?: string | null) { return labelOf('personnelStatus', code) }