From 85bfb9351803d97a33329d507f30a2f78bf1fc75 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期一, 28 九月 2026 10:53:14 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/main'
---
talent-card-admin/src/views/OrderDetailView.vue | 49 +++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 41 insertions(+), 8 deletions(-)
diff --git a/talent-card-admin/src/views/OrderDetailView.vue b/talent-card-admin/src/views/OrderDetailView.vue
index 6458a2c..b94d781 100644
--- a/talent-card-admin/src/views/OrderDetailView.vue
+++ b/talent-card-admin/src/views/OrderDetailView.vue
@@ -76,6 +76,12 @@
return detail.value?.orderStatus === 1 && detail.value?.verifyStatus !== 1
}
+// 已成功 + 退款中的金额都算「已经退掉的」,剩下的才是可退金额(与后端 prepare 的口径一致)。
+const refundedAmount = computed(() => refunds.value
+ .filter((item: Detail) => Number(item.refundStatus) === 1 || Number(item.refundStatus) === 2)
+ .reduce((sum: number, item: Detail) => sum + Number(item.refundAmount || 0), 0))
+const refundableAmount = computed(() => Math.max(0, Number(detail.value?.payAmount || 0) - refundedAmount.value))
+
async function load() {
const orderNo = String(route.params.orderNo || '')
if (!orderNo) return
@@ -96,14 +102,41 @@
}
async function refund() {
- if (!detail.value?.orderNo) return
- const defaultAmount = (Number(detail.value.payAmount || 0) / 100).toFixed(2)
- const { value } = await ElMessageBox.prompt('请输入退款金额(元)', '订单退款', {
- inputValue: defaultAmount,
- inputPattern: /^(0|[1-9]\d*)(\.\d{1,2})?$/,
- inputErrorMessage: '请输入正确的金额',
- })
- await refundOrder(detail.value.orderNo, Number(value))
+ const orderNo = detail.value?.orderNo
+ if (!orderNo) return
+ // 实付 0 元的订单(整单被权益免费额度覆盖)在通道里没有钱可退:要还回去的是这一单占用的免费额度,
+ // 金额只能是 0。弹一个让人填金额的框,填出任何大于 0 的数都会被后端按「退款金额非法」拒掉。
+ if (Number(detail.value?.payAmount || 0) <= 0) {
+ try {
+ await ElMessageBox.confirm('该订单实付 0 元(由人才权益免费额度覆盖),确认退款将退回本单占用的免费额度。', '订单退款', { type: 'warning' })
+ } catch {
+ return
+ }
+ await refundOrder(orderNo, 0)
+ await load()
+ ElMessage.success('退款成功,已退回占用的免费额度')
+ return
+ }
+ const refundable = refundableAmount.value
+ if (refundable <= 0) {
+ ElMessage.warning('该订单已无可退金额')
+ return
+ }
+ let value = ''
+ try {
+ const result = await ElMessageBox.prompt(`本单可退 ${yuan(refundable)},请输入退款金额(元)`, '订单退款', {
+ inputValue: (refundable / 100).toFixed(2),
+ inputPattern: /^(0|[1-9]\d*)(\.\d{1,2})?$/,
+ inputErrorMessage: '请输入正确的金额',
+ inputValidator: (input: string) => Number(input) > 0 && Number(input) <= refundable / 100
+ ? true
+ : `退款金额需大于 0 且不超过 ${yuan(refundable)}`,
+ })
+ value = String(result.value ?? '')
+ } catch {
+ return
+ }
+ await refundOrder(orderNo, Number(value))
await load()
ElMessage.success('退款申请已提交')
}
--
Gitblit v1.7.1