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