132 lines
6.3 KiB
TypeScript
132 lines
6.3 KiB
TypeScript
/** 审计日志动作 / 业务类型中文映射(展示用,存储仍为英文 code) */
|
||
|
||
export interface AuditOption {
|
||
value: string
|
||
label: string
|
||
/** 筛选下拉分组 */
|
||
group?: string
|
||
/** 是否高风险操作 */
|
||
highRisk?: boolean
|
||
}
|
||
|
||
export const AUDIT_ACTION_OPTIONS: AuditOption[] = [
|
||
// 用户
|
||
{ value: 'admin_user.freeze', label: '冻结用户', group: '用户', highRisk: true },
|
||
{ value: 'admin_user.unfreeze', label: '解冻用户', group: '用户' },
|
||
{
|
||
value: 'admin_user.set_deposit_free_quota',
|
||
label: '设置免押额度',
|
||
group: '用户',
|
||
highRisk: true,
|
||
},
|
||
{ value: 'admin_user.manual_realname', label: '人工实名', group: '用户', highRisk: true },
|
||
{ value: 'admin_user.revoke_realname', label: '撤销实名', group: '用户', highRisk: true },
|
||
{ value: 'admin_user.wallet_adjust', label: '调整用户余额', group: '用户', highRisk: true },
|
||
// 商品
|
||
{ value: 'listing.admin_offline', label: '后台下架商品', group: '商品', highRisk: true },
|
||
{ value: 'listing.mark_abnormal', label: '商品标记异常', group: '商品', highRisk: true },
|
||
{ value: 'listing.transfer_owner', label: '转移商品所有权', group: '商品', highRisk: true },
|
||
{ value: 'listing.adjust_review_price', label: '审核调价', group: '商品' },
|
||
// 订单
|
||
{ value: 'order.admin_close', label: '客服关闭订单', group: '订单', highRisk: true },
|
||
{ value: 'order.admin_seal', label: '客服封存订单', group: '订单', highRisk: true },
|
||
{ value: 'order.mark_abnormal', label: '订单标记异常', group: '订单', highRisk: true },
|
||
{ value: 'order.reset_handoff', label: '重置交接流程', group: '订单' },
|
||
{ value: 'order.reset_renter_confirm', label: '重置租客确认', group: '订单' },
|
||
{ value: 'order.reset_checkout_confirm', label: '重置结账确认', group: '订单' },
|
||
{ value: 'order.reset_return_overdue', label: '重置归还逾期', group: '订单' },
|
||
{ value: 'order.deposit_hold', label: '押金暂扣', group: '订单', highRisk: true },
|
||
{ value: 'order.deposit_release', label: '押金归还', group: '订单', highRisk: true },
|
||
// 超时任务(system)
|
||
{ value: 'order.timeout.pending_payment', label: '超时关闭待支付', group: '系统任务' },
|
||
{ value: 'order.timeout.owner_submit', label: '超时号主提交交接', group: '系统任务' },
|
||
{ value: 'order.timeout.renter_confirm', label: '超时租客确认收号', group: '系统任务' },
|
||
{ value: 'order.timeout.return_overdue', label: '超时归还逾期', group: '系统任务' },
|
||
{ value: 'order.timeout.owner_checkout_confirm', label: '超时号主确认结账', group: '系统任务' },
|
||
{ value: 'chat.renter_retention.remove', label: '到期移除租客会话', group: '系统任务' },
|
||
// 提号
|
||
{ value: 'pickup_create', label: '创建提号', group: '提号' },
|
||
{ value: 'pickup_complete', label: '完成提号结算', group: '提号', highRisk: true },
|
||
{ value: 'pickup_cancel', label: '取消提号', group: '提号' },
|
||
// 申诉
|
||
{ value: 'dispute.arbitrate', label: '申诉仲裁', group: '申诉', highRisk: true },
|
||
// 系统配置
|
||
{ value: 'system_config.create', label: '创建系统配置', group: '系统配置', highRisk: true },
|
||
{ value: 'system_config.update', label: '更新系统配置', group: '系统配置', highRisk: true },
|
||
// 支付配置
|
||
{ value: 'payment_config.create', label: '创建支付配置', group: '支付配置', highRisk: true },
|
||
{ value: 'payment_config.update', label: '更新支付配置', group: '支付配置', highRisk: true },
|
||
{ value: 'payment_config.delete', label: '删除支付配置', group: '支付配置', highRisk: true },
|
||
{ value: 'payment_config.view_secret', label: '查看支付密钥', group: '支付配置', highRisk: true },
|
||
{ value: 'payment_config.export', label: '导出支付配置', group: '支付配置', highRisk: true },
|
||
{ value: 'payment_config.import', label: '导入支付配置', group: '支付配置', highRisk: true },
|
||
]
|
||
|
||
export const AUDIT_BIZ_TYPE_OPTIONS: AuditOption[] = [
|
||
{ value: 'user', label: '用户' },
|
||
{ value: 'listing', label: '商品' },
|
||
{ value: 'order', label: '订单' },
|
||
{ value: 'dispute', label: '申诉' },
|
||
{ value: 'system_config', label: '系统配置' },
|
||
{ value: 'payment_config', label: '支付配置' },
|
||
{ value: 'admin_pickup', label: '提号' },
|
||
]
|
||
|
||
const actionLabelMap = Object.fromEntries(
|
||
AUDIT_ACTION_OPTIONS.map(item => [item.value, item.label])
|
||
)
|
||
const bizTypeLabelMap = Object.fromEntries(
|
||
AUDIT_BIZ_TYPE_OPTIONS.map(item => [item.value, item.label])
|
||
)
|
||
const highRiskActions = new Set(
|
||
AUDIT_ACTION_OPTIONS.filter(item => item.highRisk).map(item => item.value)
|
||
)
|
||
|
||
/** 动作 code → 中文;未知 code 原样返回 */
|
||
export function auditActionLabel(action: string | undefined | null): string {
|
||
if (!action) return '-'
|
||
return actionLabelMap[action] || action
|
||
}
|
||
|
||
/** 业务类型 code → 中文 */
|
||
export function auditBizTypeLabel(bizType: string | undefined | null): string {
|
||
if (!bizType) return '-'
|
||
return bizTypeLabelMap[bizType] || bizType
|
||
}
|
||
|
||
export function isHighRiskAuditAction(action: string | undefined | null): boolean {
|
||
if (!action) return false
|
||
if (highRiskActions.has(action)) return true
|
||
// 兜底:未登记但含敏感关键词
|
||
return /freeze|delete|import|export|secret|wallet_adjust|seal|close|arbitrate|offline|abnormal/i.test(
|
||
action
|
||
)
|
||
}
|
||
|
||
/** 表格标签颜色 */
|
||
export function auditActionTagType(
|
||
action: string | undefined | null
|
||
): 'danger' | 'warning' | 'success' | 'info' {
|
||
if (!action) return 'info'
|
||
if (isHighRiskAuditAction(action)) return 'danger'
|
||
if (action.startsWith('order.timeout') || action.startsWith('chat.')) return 'info'
|
||
if (action.includes('create') || action.includes('update') || action.includes('reset')) {
|
||
return 'warning'
|
||
}
|
||
if (action.includes('complete') || action.includes('release') || action.includes('unfreeze')) {
|
||
return 'success'
|
||
}
|
||
return 'info'
|
||
}
|
||
|
||
/** 按 group 分组,供 el-option-group 使用 */
|
||
export function groupedAuditActionOptions(): Array<{ group: string; options: AuditOption[] }> {
|
||
const map = new Map<string, AuditOption[]>()
|
||
for (const item of AUDIT_ACTION_OPTIONS) {
|
||
const group = item.group || '其他'
|
||
if (!map.has(group)) map.set(group, [])
|
||
map.get(group)!.push(item)
|
||
}
|
||
return Array.from(map.entries()).map(([group, options]) => ({ group, options }))
|
||
}
|