export type TagTone = | 'default' | 'success' | 'processing' | 'error' | 'warning' | 'gold' | 'blue' | 'cyan' | 'orange' | 'red' | 'purple' | 'geekblue' | 'magenta' | 'volcano' | 'green' export interface StatusMeta { label: string tone: TagTone } export interface StatusOption { label: string value: string } function toOptions(map: Record): StatusOption[] { return Object.entries(map).map(([value, meta]) => ({ value, label: meta.label })) } export const orderStatusMap: Record = { pending_payment: { label: '待支付', tone: 'gold' }, pending_handoff: { label: '待交接', tone: 'blue' }, renting: { label: '使用中', tone: 'cyan' }, overdue: { label: '已逾期', tone: 'volcano' }, pending_checkout_confirm: { label: '待号主确认结账', tone: 'orange' }, pending_checkout_accept: { label: '待租客确认修正', tone: 'orange' }, checkout_disputing: { label: '结账争议中', tone: 'red' }, disputing: { label: '申诉中', tone: 'red' }, completed: { label: '已完成', tone: 'success' }, cancelled: { label: '租客已取消', tone: 'default' }, closed: { label: '客服已关闭', tone: 'default' }, abnormal: { label: '客服介入', tone: 'magenta' }, } export const handoffStatusMap: Record = { none: { label: '未开始', tone: 'default' }, pending_owner: { label: '待号主交接', tone: 'blue' }, owner_timeout: { label: '号主交接超时', tone: 'volcano' }, pending_renter_confirm: { label: '待租客确认', tone: 'blue' }, received: { label: '租客已收号', tone: 'cyan' }, return_overdue: { label: '归还逾期', tone: 'volcano' }, pending_owner_checkout: { label: '待号主确认结账', tone: 'orange' }, pending_renter_checkout: { label: '待租客确认修正', tone: 'orange' }, checkout_disputed: { label: '结账争议中', tone: 'red' }, returned: { label: '已归还', tone: 'success' }, owner_return_confirm_timeout: { label: '号主确认结账超时', tone: 'red' }, owner_checkout_confirm_timeout: { label: '号主确认结账超时', tone: 'red' }, renter_confirm_timeout: { label: '租客确认超时', tone: 'red' }, cancelled: { label: '租客已取消', tone: 'default' }, admin_closed: { label: '客服已关闭', tone: 'default' }, admin_abnormal: { label: '客服介入', tone: 'magenta' }, arbitrated: { label: '已仲裁', tone: 'purple' }, } export const settlementStatusMap: Record = { unsettled: { label: '未结算', tone: 'default' }, pending: { label: '待结算', tone: 'gold' }, frozen: { label: '冻结中', tone: 'magenta' }, settled: { label: '已结算', tone: 'success' }, refunded: { label: '已退款', tone: 'blue' }, cancelled: { label: '结算已取消', tone: 'default' }, closed: { label: '结算已关闭', tone: 'default' }, disputed: { label: '争议中', tone: 'red' }, arbitrated: { label: '已仲裁', tone: 'purple' }, } export const offlineSettlementStatusMap: Record = { none: { label: '无需线下结算', tone: 'default' }, pending: { label: '待确认线下结算', tone: 'gold' }, settled: { label: '已确认线下结算', tone: 'success' }, } export const handoffModeMap: Record = { owner: { label: '正常订单', tone: 'default' }, platform: { label: '平台代管', tone: 'geekblue' }, } export const settlementModeMap: Record = { owner_wallet: { label: '号主钱包', tone: 'default' }, platform_managed: { label: '平台代管', tone: 'geekblue' }, } export const checkoutStatusMap: Record = { submitted: { label: '待确认', tone: 'gold' }, countered: { label: '已修正待确认', tone: 'orange' }, accepted: { label: '已接受', tone: 'success' }, disputed: { label: '争议中', tone: 'red' }, settled: { label: '仲裁已结案', tone: 'purple' }, } export const refundStatusMap: Record = { none: { label: '未退款', tone: 'default' }, pending: { label: '待退款', tone: 'gold' }, pending_review: { label: '待客服审核退款', tone: 'orange' }, refunding: { label: '退款中', tone: 'processing' }, refunded: { label: '已退款', tone: 'success' }, failed: { label: '退款失败', tone: 'red' }, } export function readStatusMeta(map: Record, value?: string | null): StatusMeta { if (!value) return { label: '—', tone: 'default' } return map[value] ?? { label: value, tone: 'default' } } /** * 平台代管订单的交接动作由客服执行,展示文案需要区别于普通号主订单。 */ export function handoffStatusMeta( status?: string | null, order?: { handoff_mode?: string; settlement_mode?: string } | null ) { const platformManaged = order?.handoff_mode === 'platform' || order?.settlement_mode === 'platform_managed' if (!platformManaged || !status) return readStatusMeta(handoffStatusMap, status) const platformCopy: Record = { pending_owner: { label: '待客服交接', tone: 'blue' }, owner_timeout: { label: '客服交接超时', tone: 'volcano' }, pending_owner_checkout: { label: '待客服确认结账', tone: 'orange' }, owner_checkout_confirm_timeout: { label: '客服确认结账超时', tone: 'red' }, } return platformCopy[status] ?? readStatusMeta(handoffStatusMap, status) } export const orderStatusOptions = toOptions(orderStatusMap) export const handoffStatusOptions = [ 'pending_owner', 'owner_timeout', 'pending_renter_confirm', 'received', 'return_overdue', 'pending_owner_checkout', 'pending_renter_checkout', 'checkout_disputed', 'returned', 'admin_closed', 'admin_abnormal', ].map(value => ({ value, label: handoffStatusMap[value].label })) export const handoffModeOptions = toOptions(handoffModeMap) export const settlementStatusOptions = toOptions(settlementStatusMap) export const offlineSettlementStatusOptions = ['pending', 'settled'].map(value => ({ value, label: offlineSettlementStatusMap[value].label, })) export const userStatusMap: Record = { active: { label: '正常', tone: 'success' }, frozen: { label: '已冻结', tone: 'red' }, disabled: { label: '已禁用', tone: 'default' }, } export const realnameStatusMap: Record = { unverified: { label: '未实名', tone: 'default' }, pending: { label: '认证中', tone: 'gold' }, verified: { label: '已实名', tone: 'success' }, rejected: { label: '认证失败', tone: 'red' }, } export const riskStatusMap: Record = { normal: { label: '正常', tone: 'success' }, watch: { label: '观察', tone: 'gold' }, restricted: { label: '受限', tone: 'orange' }, blocked: { label: '已拦截', tone: 'red' }, } export const userStatusOptions = toOptions(userStatusMap) export const realnameStatusOptions = toOptions(realnameStatusMap) export const riskStatusOptions = toOptions(riskStatusMap) export const withdrawalStatusMap: Record = { pending: { label: '待审核', tone: 'gold' }, processing: { label: '待打款', tone: 'blue' }, completed: { label: '已完成', tone: 'success' }, rejected: { label: '已驳回', tone: 'red' }, cancelled: { label: '已取消', tone: 'default' }, } export const withdrawalStatusOptions = toOptions(withdrawalStatusMap) export const financeStatusMap: Record = { normal: { label: '正常', tone: 'success' }, refund_pending: { label: '退款中', tone: 'blue' }, refund_failed: { label: '退款失败', tone: 'red' }, settlement_diff: { label: '结算差异', tone: 'orange' }, offline_settlement_pending: { label: '待线下结算', tone: 'gold' }, } export const announcementStatusMap: Record = { draft: { label: '草稿', tone: 'default' }, published: { label: '已发布', tone: 'success' }, archived: { label: '已归档', tone: 'default' }, } export const announcementCategoryMap: Record = { notice: '通知', tutorial: '教程', rule: '规则', faq: '常见问题', } export const announcementStatusOptions = Object.entries(announcementStatusMap).map( ([value, meta]) => ({ value, label: meta.label }) ) export const announcementCategoryOptions = Object.entries(announcementCategoryMap).map( ([value, label]) => ({ value, label }) )