100 lines
3.6 KiB
TypeScript
100 lines
3.6 KiB
TypeScript
/**
|
||
* 退款管理展示与规则常量
|
||
*/
|
||
|
||
import {
|
||
RefundStatus,
|
||
RefundMethod,
|
||
ChannelRefundStatus,
|
||
RefundFailureReason
|
||
} from '@/types/api/refund'
|
||
|
||
/** 退款状态名称映射 */
|
||
export const RefundStatusNameMap: Record<RefundStatus, string> = {
|
||
[RefundStatus.PENDING]: '待审批',
|
||
[RefundStatus.APPROVED]: '已通过',
|
||
[RefundStatus.REJECTED]: '已拒绝',
|
||
[RefundStatus.RETURNED]: '已退回',
|
||
[RefundStatus.REFUNDING]: '原路退款处理中',
|
||
[RefundStatus.REFUND_FAILED]: '原路退款失败',
|
||
[RefundStatus.APPROVAL_SUBMISSION_FAILED]: '审批提交失败'
|
||
}
|
||
|
||
/** 退款状态标签类型映射 */
|
||
export const RefundStatusTypeMap: Record<RefundStatus, 'warning' | 'success' | 'danger' | 'info'> =
|
||
{
|
||
[RefundStatus.PENDING]: 'warning',
|
||
[RefundStatus.APPROVED]: 'success',
|
||
[RefundStatus.REJECTED]: 'danger',
|
||
[RefundStatus.RETURNED]: 'info',
|
||
[RefundStatus.REFUNDING]: 'warning',
|
||
[RefundStatus.REFUND_FAILED]: 'danger',
|
||
[RefundStatus.APPROVAL_SUBMISSION_FAILED]: 'danger'
|
||
}
|
||
|
||
/** 退款方式名称映射 */
|
||
export const RefundMethodNameMap: Record<RefundMethod, string> = {
|
||
[RefundMethod.ORIGINAL_ROUTE]: '原路退回',
|
||
[RefundMethod.CUSTOMER_ACCOUNT]: '客户收款信息',
|
||
[RefundMethod.ASSET_WALLET]: '资产钱包',
|
||
[RefundMethod.AGENT_WALLET]: '代理钱包'
|
||
}
|
||
|
||
/** 渠道退款状态名称映射 */
|
||
export const ChannelRefundStatusNameMap: Record<ChannelRefundStatus, string> = {
|
||
[ChannelRefundStatus.NOT_STARTED]: '未发起或不适用',
|
||
[ChannelRefundStatus.PROCESSING]: '处理中',
|
||
[ChannelRefundStatus.SUCCEEDED]: '已成功',
|
||
[ChannelRefundStatus.FAILED]: '已失败'
|
||
}
|
||
|
||
/** 失败分类名称映射 */
|
||
export const RefundFailureReasonNameMap: Record<RefundFailureReason, string> = {
|
||
[RefundFailureReason.CHANNEL_REJECTED]: '渠道明确拒绝',
|
||
[RefundFailureReason.CREDENTIAL_INVALID]: '渠道凭证失效',
|
||
[RefundFailureReason.INSUFFICIENT_BALANCE]: '渠道余额不足',
|
||
[RefundFailureReason.TIMEOUT_UNKNOWN]: '超时或结果未知',
|
||
[RefundFailureReason.APPROVAL_REJECTED]: '企微驳回或关闭',
|
||
[RefundFailureReason.REVOKED_AFTER_APPROVED]: '企微通过后撤销',
|
||
[RefundFailureReason.PAYMENT_FACT_INVALID]: '本地原支付事实不可用'
|
||
}
|
||
|
||
/** 退款方式选项(表单用,原路退回暂不开放;历史记录仍保留名称映射) */
|
||
export const RefundMethodOptions = [
|
||
{ label: '线下退款', value: RefundMethod.CUSTOMER_ACCOUNT },
|
||
{ label: '资产钱包', value: RefundMethod.ASSET_WALLET },
|
||
{ label: '代理钱包', value: RefundMethod.AGENT_WALLET }
|
||
]
|
||
|
||
/**
|
||
* 是否可重提:3 已拒绝 / 4 已退回 / 6 原路退款失败(anomaly_flag=1 时禁止)
|
||
*/
|
||
export const canResubmitRefund = (item: {
|
||
status?: RefundStatus
|
||
anomaly_flag?: number
|
||
}): boolean => {
|
||
if (!item.status) return false
|
||
if (
|
||
item.status === RefundStatus.REJECTED ||
|
||
item.status === RefundStatus.RETURNED ||
|
||
item.status === RefundStatus.APPROVAL_SUBMISSION_FAILED
|
||
)
|
||
return true
|
||
if (item.status === RefundStatus.REFUND_FAILED) return item.anomaly_flag !== 1
|
||
return false
|
||
}
|
||
|
||
/**
|
||
* 审批操作是否可用:仅待审批且未关联企微审批实例(存量无实例)的申请
|
||
*/
|
||
export const canManualApproveRefund = (item: {
|
||
status?: RefundStatus
|
||
approval_instance_id?: number | null
|
||
}): boolean => item.status === RefundStatus.PENDING && !item.approval_instance_id
|
||
|
||
export const canRecoverRefundApproval = (item: {
|
||
status?: RefundStatus
|
||
approval_recoverable?: boolean
|
||
}): boolean =>
|
||
item.status !== RefundStatus.APPROVAL_SUBMISSION_FAILED && item.approval_recoverable === true
|