fix: 退款弹窗修正——星尘数按金额×100兜底(旧订单metadata.coins缺失);去掉强制退款按钮(风控拦截直接展示原因);弹窗内展示退款规则和流程说明
This commit is contained in:
@@ -87,11 +87,14 @@
|
||||
</template>
|
||||
|
||||
<!-- 退款确认 -->
|
||||
<el-dialog v-model="refundDlg" title="确认退款" width="380px">
|
||||
<p>订单:{{ refundTarget?.orderNo }}</p>
|
||||
<p>金额:¥{{ refundTarget?.amount }}</p>
|
||||
<p>将扣回星尘:{{ refundTarget?.metadata?.coins || 0 }}</p>
|
||||
<el-alert type="warning" :closable="false" title="退款后星尘将从用户余额扣除,请确认用户余额充足" style="margin-top:10px" />
|
||||
<el-dialog v-model="refundDlg" title="确认退款" width="420px">
|
||||
<p><b>订单:</b>{{ refundTarget?.orderNo }}</p>
|
||||
<p><b>金额:</b>¥{{ refundTarget?.amount }}</p>
|
||||
<p><b>将扣回星尘:</b>{{ refundCoins }}(余额不足将拒绝退款)</p>
|
||||
<el-alert type="warning" :closable="false" style="margin-top:10px"
|
||||
title="退款规则:余额必须足够扣回 | 支付后7天内 | 每人每月限1次" />
|
||||
<el-alert type="info" :closable="false" style="margin-top:6px"
|
||||
title="流程:先冻结星尘 → 调微信退款 → 成功后完成 | 微信失败自动恢复星尘" />
|
||||
<template #footer>
|
||||
<el-button @click="refundDlg = false">取消</el-button>
|
||||
<el-button type="danger" @click="doRefund">确认退款</el-button>
|
||||
@@ -126,6 +129,11 @@ const stats = ref({})
|
||||
const orders = ref([]), total = ref(0), page = ref(1), pageSize = 20, q = ref(''), statusFilter = ref(''), loading = ref(false)
|
||||
const ledger = ref([]), ledgerTotal = ref(0), ledgerPage = ref(1), ledgerType = ref(''), ledgerQ = ref(''), ledgerLoading = ref(false)
|
||||
const refundDlg = ref(false), refundTarget = ref(null)
|
||||
const refundCoins = computed(() => {
|
||||
const o = refundTarget.value
|
||||
if (!o) return 0
|
||||
return o.metadata?.coins || Math.round((o.amount || 0) * 100)
|
||||
})
|
||||
const adjustDlg = ref(false), adjustForm = ref({ openid: '', amount: 100, reason: '' })
|
||||
|
||||
function fmt(t) { return t ? new Date(t).toLocaleString('zh-CN', { hour12: false }) : '—' }
|
||||
@@ -153,19 +161,16 @@ function refund(row) { refundTarget.value = row; refundDlg.value = true }
|
||||
async function doRefund() {
|
||||
try {
|
||||
await ElMessageBox.confirm('退款后无法撤销,确认执行?', '最终确认', { type: 'warning' })
|
||||
let r
|
||||
try {
|
||||
r = await apiPost(`/api/admin/vpay/orders/${refundTarget.value._id}/refund`)
|
||||
} catch (e1) {
|
||||
if (e1.message && e1.message.includes('余额不足')) {
|
||||
await ElMessageBox.confirm(e1.message + '\n强制退款后余额将变为负数,用户下次充值时自动抵扣。', '余额不足', { type: 'warning', confirmText: '强制退款' })
|
||||
r = await apiPost(`/api/admin/vpay/orders/${refundTarget.value._id}/refund`, { force: true })
|
||||
} else { throw e1 }
|
||||
}
|
||||
ElMessage.success('退款成功(微信侧已退钱)')
|
||||
const r = await apiPost(`/api/admin/vpay/orders/${refundTarget.value._id}/refund`)
|
||||
ElMessage.success('退款成功(微信已退钱,星尘已扣回)')
|
||||
refundDlg.value = false
|
||||
load(); loadStats()
|
||||
} catch (e) { if (e !== 'cancel') ElMessage.error(e.message || '退款失败') }
|
||||
} catch (e) {
|
||||
if (e !== 'cancel') {
|
||||
// 风控拦截(余额不足/超期/频率限制)直接展示拒绝原因,无强制退款
|
||||
ElMessage({ type: 'error', message: e.message || '退款失败', duration: 5000, showClose: true })
|
||||
}
|
||||
}
|
||||
}
|
||||
async function doAdjust() {
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user