feat: 取消退款次数限制(每人每月1次)——保留余额够扣+7天窗口;后台退款弹窗规则文案同步
This commit is contained in:
@@ -92,7 +92,7 @@
|
|||||||
<p><b>金额:</b>¥{{ refundTarget?.amount }}</p>
|
<p><b>金额:</b>¥{{ refundTarget?.amount }}</p>
|
||||||
<p><b>将扣回星尘:</b>{{ refundCoins }}(余额不足将拒绝退款)</p>
|
<p><b>将扣回星尘:</b>{{ refundCoins }}(余额不足将拒绝退款)</p>
|
||||||
<el-alert type="warning" :closable="false" style="margin-top:10px"
|
<el-alert type="warning" :closable="false" style="margin-top:10px"
|
||||||
title="退款规则:余额必须足够扣回 | 支付后7天内 | 每人每月限1次" />
|
title="退款规则:余额必须足够扣回 | 支付后7天内" />
|
||||||
<el-alert type="info" :closable="false" style="margin-top:6px"
|
<el-alert type="info" :closable="false" style="margin-top:6px"
|
||||||
title="流程:先冻结星尘 → 调微信退款 → 成功后完成 | 微信失败自动恢复星尘" />
|
title="流程:先冻结星尘 → 调微信退款 → 成功后完成 | 微信失败自动恢复星尘" />
|
||||||
<template #footer>
|
<template #footer>
|
||||||
|
|||||||
@@ -1257,17 +1257,6 @@ router.post('/vpay/orders/:id/refund', requirePermission('orders:write'), async
|
|||||||
409, { blocked: 'expired' })
|
409, { blocked: 'expired' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 第三层:同一用户 30 天内最多 1 次退款
|
|
||||||
const recentRefund = await Order.findOne({
|
|
||||||
userId: user._id, status: 'refunded',
|
|
||||||
refundedAt: { $gte: new Date(Date.now() - 30 * 86400000) },
|
|
||||||
})
|
|
||||||
if (recentRefund) {
|
|
||||||
return ApiResponse.error(res,
|
|
||||||
`不可退款:该用户 30 天内已有退款记录(${recentRefund.orderNo})。每人每月限退 1 次。`,
|
|
||||||
409, { blocked: 'rate_limited', lastRefund: recentRefund.orderNo })
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===== 冻结星尘(原子操作,防并发竞态) =====
|
// ===== 冻结星尘(原子操作,防并发竞态) =====
|
||||||
// findOneAndUpdate + $gte 条件 = 原子扣减:
|
// findOneAndUpdate + $gte 条件 = 原子扣减:
|
||||||
// 如果在预检和这里之间用户消费了星尘导致余额不足,此操作会失败(返回 null)
|
// 如果在预检和这里之间用户消费了星尘导致余额不足,此操作会失败(返回 null)
|
||||||
|
|||||||
Reference in New Issue
Block a user