Files
hfb_jysh/frontend/src/features/admin/labels.ts
T

405 lines
15 KiB
TypeScript

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<string, StatusMeta>): StatusOption[] {
return Object.entries(map).map(([value, meta]) => ({ value, label: meta.label }))
}
export const orderStatusMap: Record<string, StatusMeta> = {
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<string, StatusMeta> = {
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<string, StatusMeta> = {
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<string, StatusMeta> = {
none: { label: '无需线下结算', tone: 'default' },
pending: { label: '待确认线下结算', tone: 'gold' },
settled: { label: '已确认线下结算', tone: 'success' },
}
export const handoffModeMap: Record<string, StatusMeta> = {
owner: { label: '正常订单', tone: 'default' },
platform: { label: '平台代管', tone: 'geekblue' },
}
export const settlementModeMap: Record<string, StatusMeta> = {
owner_wallet: { label: '号主钱包', tone: 'default' },
platform_managed: { label: '平台代管', tone: 'geekblue' },
}
export const checkoutStatusMap: Record<string, StatusMeta> = {
submitted: { label: '待确认', tone: 'gold' },
countered: { label: '已修正待确认', tone: 'orange' },
accepted: { label: '已接受', tone: 'success' },
disputed: { label: '争议中', tone: 'red' },
settled: { label: '仲裁已结案', tone: 'purple' },
}
export const refundStatusMap: Record<string, StatusMeta> = {
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<string, StatusMeta>, 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<string, StatusMeta> = {
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<string, StatusMeta> = {
active: { label: '正常', tone: 'success' },
frozen: { label: '已冻结', tone: 'red' },
disabled: { label: '已禁用', tone: 'default' },
}
export const realnameStatusMap: Record<string, StatusMeta> = {
unverified: { label: '未实名', tone: 'default' },
pending: { label: '认证中', tone: 'gold' },
verified: { label: '已实名', tone: 'success' },
rejected: { label: '认证失败', tone: 'red' },
}
export const riskStatusMap: Record<string, StatusMeta> = {
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<string, StatusMeta> = {
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<string, StatusMeta> = {
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<string, StatusMeta> = {
draft: { label: '草稿', tone: 'default' },
published: { label: '已发布', tone: 'success' },
archived: { label: '已归档', tone: 'default' },
}
export const announcementCategoryMap: Record<string, string> = {
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 })
)
export const auditActorTypeMap: Record<string, string> = {
admin: '管理员',
user: '用户',
system: '系统',
}
export const auditBizTypeMap: Record<string, string> = {
order: '订单',
listing: '商品',
dispute: '申诉',
admin_user: '用户资料',
admin: '后台账号',
system_config: '系统配置',
payment_config: '支付配置',
manual_disbursement: '人工打款',
operating_expense: '运营支出',
pickup: '线下提号',
pickup_shop: '提号店铺',
distribution: '分销',
announcement: '公告',
}
export const auditActionMap: Record<string, string> = {
'order.admin_close': '后台关闭订单',
'order.admin_seal': '订单封存',
'order.deposit_hold': '冻结押金',
'order.deposit_release': '释放押金',
'order.force_handoff': '强制交接',
'order.mark_abnormal': '标记异常订单',
'order.offline_settlement': '线下结算',
'order.platform_handoff': '平台代交接',
'order.platform_checkout_confirm': '平台代确认结账',
'order.platform_checkout_counter': '平台修正结账',
'order.platform_checkout_dispute': '平台发起结账争议',
'order.reset_checkout_confirm': '重置结账确认',
'order.reset_handoff': '重置交接状态',
'order.reset_renter_confirm': '重置租客确认',
'order.reset_return_overdue': '重置归还逾期',
'listing.adjust_external': '调整外部同步',
'listing.adjust_review_price': '调整审核价',
'listing.admin_offline': '后台下架商品',
'listing.mark_abnormal': '标记异常商品',
'listing.transfer_owner': '转移商品归属',
'listing.update_screenshots': '更新商品截图',
'dispute.admin_create': '代建申诉',
'dispute.arbitrate': '提交仲裁',
'admin_user.freeze': '冻结用户',
'admin_user.unfreeze': '解冻用户',
'admin_user.set_deposit_free_quota': '设置免押额度',
'admin_user.adjust_growth_points': '调整成长值',
'admin_user.manual_realname': '人工实名',
'admin_user.revoke_realname': '撤销实名',
'admin_user.wallet_adjust': '调整钱包余额',
'system_config.create': '新增系统配置',
'system_config.update': '更新系统配置',
'payment_config.create': '新增支付配置',
'payment_config.update': '更新支付配置',
'payment_config.delete': '删除支付配置',
'payment_config.export': '导出支付配置',
'payment_config.import': '导入支付配置',
'payment_config.view_secret': '查看支付密钥',
'manual_disbursement_create': '新建人工打款',
'manual_disbursement_void': '作废人工打款',
'operating_expense_create': '登记运营支出',
'operating_expense_void': '作废运营支出',
'pickup_create': '创建线下提号',
'pickup_cancel': '取消线下提号',
'pickup_complete': '完成线下提号',
'pickup_profit_update': '更新提号利润',
'pickup_offline_settlement': '提号线下结算',
'pickup_financial_adjustment_create': '新建提号财务调整',
'pickup_financial_adjustment_settle': '结算提号财务调整',
'pickup_shop_create': '新增提号店铺',
'pickup_shop_update': '更新提号店铺',
'pickup_shop_delete': '删除提号店铺',
'pickup_shop_map_historical': '关联历史捡漏店铺',
'pickup_shop_unmap_historical': '解除历史捡漏店铺',
'pickup_third_party_order_no_update': '更新第三方单号',
'distribution_financial_snapshot_create': '生成分销财务快照',
'auth.token_version.bump': '刷新登录令牌版本',
}
export const auditActionOptions = Object.entries(auditActionMap).map(([value, label]) => ({
value,
label,
}))
export const auditBizTypeOptions = Object.entries(auditBizTypeMap).map(([value, label]) => ({
value,
label,
}))
export const systemConfigCategoryMap: Record<string, string> = {
chat: '聊天与群组',
distribution: '分销',
handoff: '交接与超时',
integration: '第三方集成',
listing: '商品发布',
mobile: '移动端首页',
order: '订单',
profile: '个人中心',
renter: '租客成长',
sms: '短信',
}
export const systemConfigCategoryOptions = Object.entries(systemConfigCategoryMap).map(
([value, label]) => ({ value, label })
)
export function systemConfigCategory(key: string) {
return key.split('.')[0] || 'other'
}
export function systemConfigCategoryLabel(key: string) {
const category = systemConfigCategory(key)
return systemConfigCategoryMap[category] ?? category
}
export const distributionSiteStatusMap: Record<string, StatusMeta> = {
active: { label: '运营中', tone: 'success' },
disabled: { label: '已停用', tone: 'default' },
}
export const distributionSiteStatusOptions = toOptions(distributionSiteStatusMap)
export const distributionMemberTypeMap: Record<string, string> = {
operator: '运营',
finance: '财务',
customer_service: '客服',
}
export const announcementModeMap: Record<string, string> = {
inherit: '继承主站公告',
own_only: '仅本站公告',
}
export const financeDisbursementSourceMap: Record<string, string> = {
platform_managed: '平台代管',
pickup: '线下提号',
pickup_adjustment: '提号调整',
withdrawal: '钱包提现',
manual_offline: '线下出款',
}
export const financeDisbursementStatusMap: Record<string, StatusMeta> = {
review_pending: { label: '待审核', tone: 'gold' },
payment_pending: { label: '待打款', tone: 'blue' },
paid: { label: '已打款', tone: 'success' },
rejected: { label: '已驳回', tone: 'red' },
cancelled: { label: '已取消', tone: 'default' },
voided: { label: '已作废', tone: 'default' },
}
export const financeDisbursementStatusOptions = Object.entries(financeDisbursementStatusMap).map(
([value, meta]) => ({ value, label: meta.label })
)
export const financeDisbursementSourceOptions = Object.entries(financeDisbursementSourceMap).map(
([value, label]) => ({ value, label })
)
export const manualDisbursementCategoryMap: Record<string, string> = {
user_compensation: '用户补偿',
seller_supplement: '卖家补款',
operating_expense: '运营支出',
channel_fee: '渠道费用',
duoduo_deposit_refund: '多多退押金',
other: '其他',
custom: '自定义分类',
}
export const manualDisbursementCategoryOptions = Object.entries(manualDisbursementCategoryMap).map(
([value, label]) => ({ value, label })
)
export const operatingExpenseStatusMap: Record<string, StatusMeta> = {
paid: { label: '已记账', tone: 'success' },
voided: { label: '已作废', tone: 'default' },
}
export const operatingExpenseStatusOptions = Object.entries(operatingExpenseStatusMap).map(
([value, meta]) => ({ value, label: meta.label })
)