From 664e083cf6aad274d3f6cd59a51e2d6463259e1d Mon Sep 17 00:00:00 2001 From: martin Date: Sat, 6 Jun 2026 23:36:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(billing):=E6=B7=BB=E5=8A=A0=E4=BA=A4?= =?UTF-8?q?=E6=98=93=E8=AE=B0=E5=BD=95=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/tenant/v1/wallet_tenant.go | 24 +++- internal/logic/tenant/billing.go | 48 +++++++- .../src/views/finance/TransactionsPage.vue | 105 ++++++++++++++++-- 3 files changed, 160 insertions(+), 17 deletions(-) diff --git a/api/tenant/v1/wallet_tenant.go b/api/tenant/v1/wallet_tenant.go index d289657..afd3cdc 100644 --- a/api/tenant/v1/wallet_tenant.go +++ b/api/tenant/v1/wallet_tenant.go @@ -22,9 +22,16 @@ type TenantWalletRes struct { } type TenantWalletTransactionsReq struct { - g.Meta `path:"/wallet/transactions" method:"get" mime:"json" tags:"租户控制台-钱包" summary:"交易记录"` - Page int `json:"page" in:"query" d:"1"` - PageSize int `json:"page_size" in:"query" d:"20"` + g.Meta `path:"/wallet/transactions" method:"get" mime:"json" tags:"租户控制台-钱包" summary:"交易记录"` + Page int `json:"page" in:"query" d:"1"` + PageSize int `json:"page_size" in:"query" d:"20"` + Type string `json:"type" in:"query" dc:"交易类型筛选"` + StartDate string `json:"start_date" in:"query" dc:"开始日期"` + EndDate string `json:"end_date" in:"query" dc:"结束日期"` + AmountMin float64 `json:"amount_min" in:"query" dc:"最小金额"` + AmountMax float64 `json:"amount_max" in:"query" dc:"最大金额"` + Username string `json:"username" in:"query" dc:"用户名筛选"` + ModelName string `json:"model_name" in:"query" dc:"模型名称筛选"` } type TenantWalletTransactionsRes struct { @@ -36,8 +43,15 @@ type TenantWalletTransactionsRes struct { // TenantWalletTransactionsExportReq 导出交易记录请求 type TenantWalletTransactionsExportReq struct { - g.Meta `path:"/wallet/transactions/export" method:"get" mime:"json" tags:"租户控制台-钱包" summary:"导出交易记录"` - Format string `json:"format" in:"query" d:"csv" v:"in:csv,xlsx" dc:"导出格式:csv / xlsx"` + g.Meta `path:"/wallet/transactions/export" method:"get" mime:"json" tags:"租户控制台-钱包" summary:"导出交易记录"` + Format string `json:"format" in:"query" d:"csv" v:"in:csv,xlsx" dc:"导出格式:csv / xlsx"` + Type string `json:"type" in:"query" dc:"交易类型筛选"` + StartDate string `json:"start_date" in:"query" dc:"开始日期"` + EndDate string `json:"end_date" in:"query" dc:"结束日期"` + AmountMin float64 `json:"amount_min" in:"query" dc:"最小金额"` + AmountMax float64 `json:"amount_max" in:"query" dc:"最大金额"` + Username string `json:"username" in:"query" dc:"用户名筛选"` + ModelName string `json:"model_name" in:"query" dc:"模型名称筛选"` } type TenantWalletTransactionsExportRes struct{} diff --git a/internal/logic/tenant/billing.go b/internal/logic/tenant/billing.go index 850a00a..231db6f 100644 --- a/internal/logic/tenant/billing.go +++ b/internal/logic/tenant/billing.go @@ -84,6 +84,28 @@ func (s *sTenant) WalletTransactions(ctx context.Context, req *v1.TenantWalletTr query := dao.BilTransactions.Ctx(ctx). Where("bil_transactions.tenant_id", tenantID) + if req.Type != "" { + query = query.Where("bil_transactions.type", req.Type) + } + if req.StartDate != "" { + query = query.Where("bil_transactions.created_at >= ?", req.StartDate+" 00:00:00") + } + if req.EndDate != "" { + query = query.Where("bil_transactions.created_at <= ?", req.EndDate+" 23:59:59") + } + if req.AmountMin != 0 { + query = query.Where("bil_transactions.amount >= ?", req.AmountMin) + } + if req.AmountMax != 0 { + query = query.Where("bil_transactions.amount <= ?", req.AmountMax) + } + if req.Username != "" { + query = query.Where("tu.username LIKE ?", "%"+req.Username+"%") + } + if req.ModelName != "" { + query = query.Where("bil_transactions.model_name LIKE ?", "%"+req.ModelName+"%") + } + type transactionRow struct { Id int64 `json:"id"` Type string `json:"type"` @@ -410,10 +432,30 @@ func (s *sTenant) ExportWalletTransactions(ctx context.Context, req *v1.TenantWa CreatedAt *gtime.Time `json:"created_at"` } + q := dao.BilTransactions.Ctx(ctx). + Where("tenant_id", tenantID) + + if req.Type != "" { + q = q.Where("type", req.Type) + } + if req.StartDate != "" { + q = q.Where("created_at >= ?", req.StartDate+" 00:00:00") + } + if req.EndDate != "" { + q = q.Where("created_at <= ?", req.EndDate+" 23:59:59") + } + if req.AmountMin != 0 { + q = q.Where("amount >= ?", req.AmountMin) + } + if req.AmountMax != 0 { + q = q.Where("amount <= ?", req.AmountMax) + } + if req.ModelName != "" { + q = q.Where("model_name LIKE ?", "%"+req.ModelName+"%") + } + var records []transactionRow - err := dao.BilTransactions.Ctx(ctx). - Where("tenant_id", tenantID). - Fields("id, type, amount, balance_after, user_id, request_id, model_name, description, created_at"). + err := q.Fields("id, type, amount, balance_after, user_id, request_id, model_name, description, created_at"). OrderDesc("created_at"). Limit(1000).Offset(offset). Scan(&records) diff --git a/web/tenant/src/views/finance/TransactionsPage.vue b/web/tenant/src/views/finance/TransactionsPage.vue index 3ed7154..092782b 100644 --- a/web/tenant/src/views/finance/TransactionsPage.vue +++ b/web/tenant/src/views/finance/TransactionsPage.vue @@ -1,6 +1,7 @@