/** * 统一业务 code → 中文展示入口。 * 图表/Tag/列表禁止直接把英文枚举抛给用户;未知 code 显示「未知(code)」。 */ export type StatusDictType = | 'batchStatus' | 'flowStage' | 'personnelStatus' | 'insuranceMatch' | 'alertHandleStatus' | 'alertType' | 'alertLevel' | 'specialBizType' | 'processAction' 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: '待资格审批', NEW: '新增', PENDING_INSURANCE_MATCH: '待居保匹配', NORMAL: '正常发放', PAUSED: '暂停', STOPPED: '停止', FUNERAL: '死亡丧葬', EXITED: '已退出', 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: '土地匹配不符合', APPROVAL_TIMEOUT: '审批超时', REFUND_FISCAL: '多发退款待退缴', QUALIFY_REJECT: '退养资格驳回', 民政死亡比对: '死亡停发预警', 回盘发放失败: '回盘失败', } const ALERT_LEVEL: Record = { HIGH: '高', MEDIUM: '中', LOW: '低', } const SPECIAL_BIZ: Record = { FUNERAL: '丧葬补贴', PAUSE: '暂停发放', STOP: '停止发放', RESUME: '恢复发放', STANDARD_ADJUST: '调标差额补发', SUPPLEMENT: '纳入下月补发', REFUND: '多发退款', HEIR_UPDATE: '继承人信息变更', STANDARD_CHANGE: '标准变更', INSURANCE_MATCH: '居保匹配', PERSONNEL_STATUS: '人员状态变更', RETIRE_QUALIFY: '退养资格审批', } /** 流程动作 / bizType 英文码 → 中文(禁止直接渲染 code) */ const PROCESS_ACTION: Record = { SPECIAL_BIZ: '特殊业务申请', SPECIAL_APPROVE_PASS: '分管领导审批通过', SPECIAL_APPROVE_REJECT: '分管领导审批驳回', STATUS_STOPPED: '停止发放', STATUS_PAUSED: '暂停发放', STATUS_NORMAL: '恢复发放', STATUS_FUNERAL: '死亡丧葬状态落地', STATUS_ARCHIVED: '人员归档', STATUS_ABNORMAL: '异常待处理', STATUS_PENDING_INSURANCE_MATCH: '待居保匹配', QUALIFY_SUBMIT: '提交退养资格', QUALIFY_PASS: '退养资格审批通过', QUALIFY_REJECT: '退养资格审批驳回', QUALIFY_REJECT_CLOSED: '资格驳回告警已关闭,退回待提交资格', RETIRE_QUALIFY: '退养资格审批', RETIRE_QUALIFY_SNAPSHOT: '退养资格', STATUS_NEW: '新增', PERSONNEL_STATUS: '人员状态变更', PERSONNEL_STATUS_SNAPSHOT: '人员业务状态', FUNERAL: '丧葬/死亡登记', STOP: '停止发放申请', PAUSE: '暂停发放申请', RESUME: '恢复发放申请', SUPPLEMENT: '补发申请', NOTE: '补充备注', INSURANCE_MATCH: '居保匹配', INSURANCE_MATCH_SUCCESS: '居保匹配通过', INSURANCE_MATCH_MANUAL: '居保人工确认', INSURANCE_MATCH_FAIL: '居保匹配失败', INSURANCE_MATCH_PENDING: '居保待确认', INSURANCE_MATCH_SNAPSHOT: '居保匹配结果', CALC_ROUND: '测算轮次', CALC_LOCK: '锁定测算', CALC_UNLOCK: '解锁测算', TODO_READ: '待办已读', PERSONNEL_IMPORT: '人员导入', PERSONNEL_FIELD_CHANGE: '人员字段变更', RETURN_ARREARS: '回盘失败待补发', SYS_USER: '系统用户', SYS_CONFIG: '系统配置', LOGIN_LOG: '登录日志', LOGIN_AUDIT: '登录审计', LOGOUT_AUDIT: '登出审计', OP_LOG: '操作日志', STANDARD_CHANGE: '标准变更', STANDARD_ADJUST: '调标差额补发', REFUND: '多发退款', HEIR_UPDATE: '继承人信息变更', SUCCESS: '成功', FAIL: '失败', PENDING: '待处理', PASS: '通过', REJECT: '驳回', LOGIN: '登录', LOGOUT: '登出', 成功: '成功', 登出: '登出', 失败: '失败', } /** 角色 key / 英文角色码 → 中文称谓 */ const ROLE_LABEL: Record = { village: '村合作社', town: '镇经发中心', social: '镇社区事务受理中心', leader: '分管领导', agri: '区农委', hr: '区人社局', admin: '系统管理员', district: '区级', unknown: '未知角色', 系统: '系统', 业务部门: '业务部门', 分管领导: '分管领导', 历史: '历史', } 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, processAction: PROCESS_ACTION, } /** 是否像未翻译的英文枚举 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) } /** 退养资格类型展示:空/UNSET → 待认定 */ export function retireQualifyLabel(code?: string | null) { const s = String(code || '').trim() if (!s || s === '—' || s === 'UNSET' || s === 'NONE' || s === 'CLEARED') return '待认定' if (s === 'WITH_LAND') return '有土地退养' if (s === 'WITHOUT_LAND') return '无土地有资格' if (s === 'INELIGIBLE') return '无资格' return s } const REFUND_PROGRESS: Record = { REGISTERED: '已登记', VERIFYING: '核实中', DEDUCTING: '下月扣减中', RETURNING: '退缴财政中', VOUCHER_ARCHIVED: '凭证已归档', DONE: '已完成', } export function refundProgressLabel(code?: string | null): string { if (code == null || code === '') return '' const raw = String(code).trim() if (REFUND_PROGRESS[raw]) return REFUND_PROGRESS[raw] if (REFUND_PROGRESS[raw.toUpperCase()]) return REFUND_PROGRESS[raw.toUpperCase()] if (looksLikeCode(raw)) return labelOf('processAction', raw) return raw } /** 流程动作展示:已是中文则原样,英文 code 走字典 */ export function processActionLabelOf(code?: string | null): string { if (code == null || code === '') return '办理' const raw = String(code).trim() if (!looksLikeCode(raw)) return raw return labelOf('processAction', raw) } /** 结果/状态短码展示 */ export function resultLabelOf(code?: string | null): string { if (code == null || code === '') return '' const raw = String(code).trim() if (!looksLikeCode(raw) && !/^(SUCCESS|FAIL|PENDING|PASS|REJECT)$/i.test(raw)) { return raw } return ( tryLabelOf('processAction', raw) || tryLabelOf('alertHandleStatus', raw) || tryLabelOf('insuranceMatch', raw) || tryLabelOf('batchStatus', raw) || labelOf('processAction', raw) ) } /** 角色展示:禁止直接渲染 village/social 等 key */ export function roleLabelOf(code?: string | null): string { if (code == null || code === '') return '' const raw = String(code).trim() if (ROLE_LABEL[raw]) return ROLE_LABEL[raw] if (ROLE_LABEL[raw.toLowerCase()]) return ROLE_LABEL[raw.toLowerCase()] if (!looksLikeCode(raw) && !/^[a-z][a-z0-9_]*$/i.test(raw)) return raw return raw } /** 通用展示:优先中文,疑似英文码则尝试多字典转义 */ export function displayBizText(code?: string | null): string { if (code == null || code === '') return '—' const raw = String(code).trim() if (!looksLikeCode(raw) && !/^[a-z][a-z0-9_]*$/i.test(raw)) return raw return ( tryLabelOf('batchStatus', raw) || tryLabelOf('flowStage', raw) || tryLabelOf('personnelStatus', raw) || tryLabelOf('insuranceMatch', raw) || tryLabelOf('specialBizType', raw) || tryLabelOf('processAction', raw) || tryLabelOf('alertType', raw) || roleLabelOf(raw) || `未知(${raw})` ) }