From 6561f925e027701265650a24b36491f31311c313 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 30 Aug 2026 21:56:22 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=90=8E=E5=8F=B0=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=88=B7=E6=96=B0=E5=B9=B6=E4=BC=98=E5=8C=96=E8=B4=A2?= =?UTF-8?q?=E5=8A=A1=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/adminfinance/disbursement.go | 81 ++++++++----------- .../admin/views/AdminFinanceDetailsView.vue | 2 +- .../views/AdminFinanceDisbursementsView.vue | 2 +- .../views/AdminOperatingExpensesView.vue | 2 +- .../admin/views/AdminPaymentsView.vue | 2 +- .../admin/views/AdminWalletLedgerView.vue | 2 +- .../admin/views/AdminWithdrawalsView.vue | 2 +- 7 files changed, 40 insertions(+), 53 deletions(-) diff --git a/backend/internal/modules/adminfinance/disbursement.go b/backend/internal/modules/adminfinance/disbursement.go index 84ecaa2..df46323 100644 --- a/backend/internal/modules/adminfinance/disbursement.go +++ b/backend/internal/modules/adminfinance/disbursement.go @@ -98,42 +98,29 @@ func (r *Repository) disbursementSummary(ctx context.Context, query DashboardQue return nil, err } - var withdrawalPaid struct { - AmountCent int64 - FeeAmountCent int64 - ActualAmountCent int64 - Count int64 + // 付款、处理中、待审核三类提现在一次条件聚合中完成,避免同一张表重复扫描。 + var withdrawal struct { + PaidAmountCent int64 + PaidFeeAmountCent int64 + PaidActualAmountCent int64 + PaidCount int64 + PendingAmountCent int64 + PendingCount int64 + ReviewAmountCent int64 + ReviewCount int64 } - if err := db.Table("withdrawal_requests"). - Select(`COALESCE(SUM(amount_cent), 0) AS amount_cent, - COALESCE(SUM(fee_cent), 0) AS fee_amount_cent, - COALESCE(SUM(actual_amount_cent), 0) AS actual_amount_cent, - COUNT(id) AS count`). - Where("status = ?", "completed"). - Where("paid_at >= ? AND paid_at <= ?", query.StartDate, query.EndDate). - Scan(&withdrawalPaid).Error; err != nil { - return nil, err - } - - var withdrawalPending struct { - ActualAmountCent int64 - Count int64 - } - if err := db.Table("withdrawal_requests"). - Select(`COALESCE(SUM(actual_amount_cent), 0) AS actual_amount_cent, COUNT(id) AS count`). - Where("status = ?", "processing"). - Scan(&withdrawalPending).Error; err != nil { - return nil, err - } - - var withdrawalReview struct { - ActualAmountCent int64 - Count int64 - } - if err := db.Table("withdrawal_requests"). - Select(`COALESCE(SUM(actual_amount_cent), 0) AS actual_amount_cent, COUNT(id) AS count`). - Where("status = ?", "pending"). - Scan(&withdrawalReview).Error; err != nil { + if err := db.Table("withdrawal_requests").Select(` + COALESCE(SUM(CASE WHEN status = 'completed' AND paid_at >= ? AND paid_at <= ? THEN amount_cent ELSE 0 END), 0) AS paid_amount_cent, + COALESCE(SUM(CASE WHEN status = 'completed' AND paid_at >= ? AND paid_at <= ? THEN fee_cent ELSE 0 END), 0) AS paid_fee_amount_cent, + COALESCE(SUM(CASE WHEN status = 'completed' AND paid_at >= ? AND paid_at <= ? THEN actual_amount_cent ELSE 0 END), 0) AS paid_actual_amount_cent, + COALESCE(SUM(CASE WHEN status = 'completed' AND paid_at >= ? AND paid_at <= ? THEN 1 ELSE 0 END), 0) AS paid_count, + COALESCE(SUM(CASE WHEN status = 'processing' THEN actual_amount_cent ELSE 0 END), 0) AS pending_amount_cent, + COALESCE(SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END), 0) AS pending_count, + COALESCE(SUM(CASE WHEN status = 'pending' THEN actual_amount_cent ELSE 0 END), 0) AS review_amount_cent, + COALESCE(SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END), 0) AS review_count`, + query.StartDate, query.EndDate, query.StartDate, query.EndDate, + query.StartDate, query.EndDate, query.StartDate, query.EndDate). + Scan(&withdrawal).Error; err != nil { return nil, err } @@ -150,22 +137,22 @@ func (r *Repository) disbursementSummary(ctx context.Context, query DashboardQue } return &DisbursementSummaryDTO{ - PaidAmountCent: offlinePaid.AmountCent + pickupPaid.AmountCent + pickupAdjustmentPaid.AmountCent + withdrawalPaid.ActualAmountCent + manualPaid.AmountCent, - PaidCount: offlinePaid.Count + pickupPaid.Count + pickupAdjustmentPaid.Count + withdrawalPaid.Count + manualPaid.Count, - PendingPaymentAmountCent: offlinePending.AmountCent + pickupPending.AmountCent + pickupAdjustmentPending.AmountCent + withdrawalPending.ActualAmountCent, - PendingPaymentCount: offlinePending.Count + pickupPending.Count + pickupAdjustmentPending.Count + withdrawalPending.Count, + PaidAmountCent: offlinePaid.AmountCent + pickupPaid.AmountCent + pickupAdjustmentPaid.AmountCent + withdrawal.PaidActualAmountCent + manualPaid.AmountCent, + PaidCount: offlinePaid.Count + pickupPaid.Count + pickupAdjustmentPaid.Count + withdrawal.PaidCount + manualPaid.Count, + PendingPaymentAmountCent: offlinePending.AmountCent + pickupPending.AmountCent + pickupAdjustmentPending.AmountCent + withdrawal.PendingAmountCent, + PendingPaymentCount: offlinePending.Count + pickupPending.Count + pickupAdjustmentPending.Count + withdrawal.PendingCount, OfflineSettlementPaidAmountCent: offlinePaid.AmountCent + pickupPaid.AmountCent + pickupAdjustmentPaid.AmountCent, OfflineSettlementPaidCount: offlinePaid.Count + pickupPaid.Count + pickupAdjustmentPaid.Count, OfflineSettlementPendingAmountCent: offlinePending.AmountCent, OfflineSettlementPendingCount: offlinePending.Count, - WithdrawalAmountCent: withdrawalPaid.AmountCent, - WithdrawalFeeAmountCent: withdrawalPaid.FeeAmountCent, - WithdrawalPaidAmountCent: withdrawalPaid.ActualAmountCent, - WithdrawalPaidCount: withdrawalPaid.Count, - WithdrawalPendingAmountCent: withdrawalPending.ActualAmountCent, - WithdrawalPendingCount: withdrawalPending.Count, - WithdrawalReviewAmountCent: withdrawalReview.ActualAmountCent, - WithdrawalReviewCount: withdrawalReview.Count, + WithdrawalAmountCent: withdrawal.PaidAmountCent, + WithdrawalFeeAmountCent: withdrawal.PaidFeeAmountCent, + WithdrawalPaidAmountCent: withdrawal.PaidActualAmountCent, + WithdrawalPaidCount: withdrawal.PaidCount, + WithdrawalPendingAmountCent: withdrawal.PendingAmountCent, + WithdrawalPendingCount: withdrawal.PendingCount, + WithdrawalReviewAmountCent: withdrawal.ReviewAmountCent, + WithdrawalReviewCount: withdrawal.ReviewCount, ManualPaidAmountCent: manualPaid.AmountCent, ManualPaidCount: manualPaid.Count, }, nil diff --git a/frontend/src/features/admin/views/AdminFinanceDetailsView.vue b/frontend/src/features/admin/views/AdminFinanceDetailsView.vue index 0031c5c..80241ad 100644 --- a/frontend/src/features/admin/views/AdminFinanceDetailsView.vue +++ b/frontend/src/features/admin/views/AdminFinanceDetailsView.vue @@ -404,7 +404,7 @@ function defaultEndDate() { v-model:current-page="currentPage" v-model:page-size="currentPageSize" :total="total" - @change="handlePageChange" + @page-change="handlePageChange" /> diff --git a/frontend/src/features/admin/views/AdminFinanceDisbursementsView.vue b/frontend/src/features/admin/views/AdminFinanceDisbursementsView.vue index 2083413..732b6e2 100644 --- a/frontend/src/features/admin/views/AdminFinanceDisbursementsView.vue +++ b/frontend/src/features/admin/views/AdminFinanceDisbursementsView.vue @@ -673,7 +673,7 @@ function accountTypeLabel(type: string) { v-model:current-page="currentPage" v-model:page-size="currentPageSize" :total="total" - @change="loadItems" + @page-change="loadItems" /> diff --git a/frontend/src/features/admin/views/AdminOperatingExpensesView.vue b/frontend/src/features/admin/views/AdminOperatingExpensesView.vue index 675094a..323040d 100644 --- a/frontend/src/features/admin/views/AdminOperatingExpensesView.vue +++ b/frontend/src/features/admin/views/AdminOperatingExpensesView.vue @@ -405,7 +405,7 @@ function statusType(status: string): 'success' | 'danger' { v-model:current-page="currentPage" v-model:page-size="currentPageSize" :total="total" - @change="loadItems" + @page-change="loadItems" /> diff --git a/frontend/src/features/admin/views/AdminPaymentsView.vue b/frontend/src/features/admin/views/AdminPaymentsView.vue index ba34dc2..e125c1a 100644 --- a/frontend/src/features/admin/views/AdminPaymentsView.vue +++ b/frontend/src/features/admin/views/AdminPaymentsView.vue @@ -356,7 +356,7 @@ function jsonText(value: unknown) { v-model:current-page="currentPage" v-model:page-size="currentPageSize" :total="total" - @change="handlePageChange" + @page-change="handlePageChange" /> diff --git a/frontend/src/features/admin/views/AdminWalletLedgerView.vue b/frontend/src/features/admin/views/AdminWalletLedgerView.vue index d6e5a12..7a2314c 100644 --- a/frontend/src/features/admin/views/AdminWalletLedgerView.vue +++ b/frontend/src/features/admin/views/AdminWalletLedgerView.vue @@ -267,7 +267,7 @@ function directionLabel(direction: string) { v-model:current-page="currentPage" v-model:page-size="currentPageSize" :total="total" - @change="handlePageChange" + @page-change="handlePageChange" /> diff --git a/frontend/src/features/admin/views/AdminWithdrawalsView.vue b/frontend/src/features/admin/views/AdminWithdrawalsView.vue index dc729be..32a324f 100644 --- a/frontend/src/features/admin/views/AdminWithdrawalsView.vue +++ b/frontend/src/features/admin/views/AdminWithdrawalsView.vue @@ -469,7 +469,7 @@ function money(cent: number | undefined | null) { v-model:current-page="currentPage" v-model:page-size="pageSize" :total="total" - @change="loadWithdrawals" + @page-change="loadWithdrawals" />