From 6884b03e593287a550cd5d4375a486bba361000b Mon Sep 17 00:00:00 2001 From: dexcoder6 Date: Sat, 9 May 2026 13:45:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=88=90=E5=8A=9F=E9=A1=B5=E5=85=85=E5=80=BC=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=20NaN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 后端 ent 模型 PaymentOrder.FeeRate 带 omitempty,fee_rate=0 的订单 在 JSON 序列化时该字段会被剔除。前端 baseAmount 计算用 `fee_rate <= 0` 判断走分支,但 `undefined <= 0` 为 false,因此进入除法分支得到 NaN。 将 fee_rate 通过 Number(...) || 0 归一化,使缺失字段等价于 0。 Co-Authored-By: Claude Opus 4.7 --- frontend/src/views/user/PaymentResultView.vue | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/user/PaymentResultView.vue b/frontend/src/views/user/PaymentResultView.vue index f8ed37d9..d4f5feef 100644 --- a/frontend/src/views/user/PaymentResultView.vue +++ b/frontend/src/views/user/PaymentResultView.vue @@ -137,13 +137,17 @@ const refreshAttempts = ref(0) /** 充值金额 = pay_amount / (1 + fee_rate/100),fee_rate=0 时等于 pay_amount */ const baseAmount = computed(() => { - if (!order.value || order.value.fee_rate <= 0) return order.value?.pay_amount ?? 0 - return Math.round((order.value.pay_amount / (1 + order.value.fee_rate / 100)) * 100) / 100 + if (!order.value) return 0 + const feeRate = Number(order.value.fee_rate) || 0 + if (feeRate <= 0) return order.value.pay_amount ?? 0 + return Math.round((order.value.pay_amount / (1 + feeRate / 100)) * 100) / 100 }) /** 手续费 = pay_amount - baseAmount */ const feeAmount = computed(() => { - if (!order.value || order.value.fee_rate <= 0) return 0 + if (!order.value) return 0 + const feeRate = Number(order.value.fee_rate) || 0 + if (feeRate <= 0) return 0 return Math.round((order.value.pay_amount - baseAmount.value) * 100) / 100 }) From ba1c6fa5fdda0c38619bb62a76c7224a2465f83e Mon Sep 17 00:00:00 2001 From: dexcoder6 Date: Sat, 9 May 2026 13:47:57 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=AB=AF=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E5=85=85=E5=80=BC?= =?UTF-8?q?=E9=87=91=E9=A2=9D=E6=98=BE=E7=A4=BA=20NaN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 与支付成功页同源问题:fee_rate=0 时后端 omitempty 剔除字段,前端 `fee_rate <= 0` 判断对 undefined 失效,进入除法分支得到 NaN。 Co-Authored-By: Claude Opus 4.7 --- .../src/components/admin/payment/AdminOrderDetail.vue | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/admin/payment/AdminOrderDetail.vue b/frontend/src/components/admin/payment/AdminOrderDetail.vue index 9ab1ba95..e278a5c6 100644 --- a/frontend/src/components/admin/payment/AdminOrderDetail.vue +++ b/frontend/src/components/admin/payment/AdminOrderDetail.vue @@ -130,13 +130,16 @@ const props = defineProps<{ /** 充值金额 (base amount before fee) = pay_amount - fee = pay_amount / (1 + fee_rate/100) */ const baseAmount = computed(() => { if (!props.order) return 0 - if (props.order.fee_rate <= 0) return props.order.pay_amount - return props.order.pay_amount / (1 + props.order.fee_rate / 100) + const feeRate = Number(props.order.fee_rate) || 0 + if (feeRate <= 0) return props.order.pay_amount + return props.order.pay_amount / (1 + feeRate / 100) }) /** 手续费 = pay_amount - baseAmount */ const feeAmount = computed(() => { - if (!props.order || props.order.fee_rate <= 0) return 0 + if (!props.order) return 0 + const feeRate = Number(props.order.fee_rate) || 0 + if (feeRate <= 0) return 0 return props.order.pay_amount - baseAmount.value })