From e761d38fd1655712aa81ab507af9d8cb67debcba Mon Sep 17 00:00:00 2001 From: erio Date: Wed, 15 Apr 2026 01:04:01 +0800 Subject: [PATCH] fix(payment): integrate recharge fee rate in order flow and fix UI display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend: - Use cfg.RechargeFeeRate in order creation instead of hardcoded 0 - Remove dead getFeeRate stub method - All amounts computed server-side: order_amount, pay_amount, fee_rate Frontend - PaymentView: - Read recharge_fee_rate from checkout-info API (not per-method) - Show fee breakdown only when fee_rate > 0 - Show credited amount only when multiplier ≠ 1 Frontend - Order display (user + admin): - Fix fee_rate * 100 bug (fee_rate is already a percentage) - OrderTable: show pay_amount as primary, fee/credited as sub-lines - AdminOrderDetail: full breakdown (base/fee/paid/credited) - AdminRefundDialog: label "到账金额" for clarity - PaymentResultView: show pay_amount with fee info Types + i18n: - Add recharge_fee_rate to CheckoutInfoResponse - Add fee_rate to CreateOrderResult - Add translations: creditedAmount, fee, baseAmount, includedInPayAmount --- backend/internal/service/payment_order.go | 2 +- backend/internal/service/payment_service.go | 1 - .../admin/payment/AdminOrderDetail.vue | 32 +++++++++++++++---- .../admin/payment/AdminOrderTable.vue | 13 +++++--- .../admin/payment/AdminRefundDialog.vue | 2 +- .../src/components/payment/OrderTable.vue | 13 +++++--- frontend/src/i18n/locales/en.ts | 4 +++ frontend/src/i18n/locales/zh.ts | 4 +++ frontend/src/types/payment.ts | 2 ++ .../views/admin/orders/AdminOrdersView.vue | 2 +- frontend/src/views/user/PaymentResultView.vue | 12 ++++--- frontend/src/views/user/PaymentView.vue | 16 +++++----- 12 files changed, 71 insertions(+), 32 deletions(-) diff --git a/backend/internal/service/payment_order.go b/backend/internal/service/payment_order.go index 1d5562dd..a38173fd 100644 --- a/backend/internal/service/payment_order.go +++ b/backend/internal/service/payment_order.go @@ -51,7 +51,7 @@ func (s *PaymentService) CreateOrder(ctx context.Context, req CreateOrderRequest } else if req.OrderType == payment.OrderTypeBalance { orderAmount = calculateCreditedBalance(req.Amount, cfg.BalanceRechargeMultiplier) } - feeRate := s.getFeeRate(req.PaymentType) + feeRate := cfg.RechargeFeeRate payAmountStr := payment.CalculatePayAmount(limitAmount, feeRate) payAmount, _ := strconv.ParseFloat(payAmountStr, 64) order, err := s.createOrderInTx(ctx, req, user, plan, cfg, orderAmount, limitAmount, feeRate, payAmount) diff --git a/backend/internal/service/payment_service.go b/backend/internal/service/payment_service.go index 6d8b185e..f88e4171 100644 --- a/backend/internal/service/payment_service.go +++ b/backend/internal/service/payment_service.go @@ -288,7 +288,6 @@ func psComputeValidityDays(days int, unit string) int { } } -func (s *PaymentService) getFeeRate(_ string) float64 { return 0 } func psStartOfDayUTC(t time.Time) time.Time { y, m, d := t.UTC().Date() diff --git a/frontend/src/components/admin/payment/AdminOrderDetail.vue b/frontend/src/components/admin/payment/AdminOrderDetail.vue index 5a07c097..9ab1ba95 100644 --- a/frontend/src/components/admin/payment/AdminOrderDetail.vue +++ b/frontend/src/components/admin/payment/AdminOrderDetail.vue @@ -18,23 +18,27 @@
-

{{ t('payment.orders.amount') }}

-

{{ order.order_type === 'balance' ? '$' : '¥' }}{{ order.amount.toFixed(2) }}

+

{{ t('payment.orders.baseAmount') }}

+

¥{{ baseAmount.toFixed(2) }}

+
+
+

{{ t('payment.orders.fee') }} ({{ order.fee_rate }}%)

+

¥{{ feeAmount.toFixed(2) }}

{{ t('payment.orders.payAmount') }}

¥{{ order.pay_amount.toFixed(2) }}

+
+

{{ t('payment.orders.creditedAmount') }}

+

{{ order.order_type === 'balance' ? '$' : '¥' }}{{ order.amount.toFixed(2) }}

+

{{ t('payment.orders.paymentMethod') }}

{{ t('payment.methods.' + order.payment_type, order.payment_type) }}

-
-

{{ t('payment.admin.feeRate') }}

-

{{ (order.fee_rate * 100).toFixed(1) }}%

-

{{ t('payment.admin.orderType') }}

@@ -110,6 +114,7 @@