完成剩余模块 Context 超时控制改造

This commit is contained in:
yml2213
2026-06-10 12:58:59 +08:00
parent d2858c529d
commit 6ae8f0e830
24 changed files with 370 additions and 323 deletions
@@ -1,6 +1,7 @@
package withdrawal
import (
"context"
"crypto/rand"
"encoding/hex"
"encoding/json"
@@ -28,10 +29,11 @@ func NewRepository(db *gorm.DB, walletRepo *wallet.Repository) *Repository {
}
// 用户创建提现申请
func (r *Repository) Create(userID uint64, req CreateWithdrawalRequest) (*WithdrawalDTO, error) {
func (r *Repository) Create(ctx context.Context, userID uint64, req CreateWithdrawalRequest) (*WithdrawalDTO, error) {
db := r.db.WithContext(ctx)
// 验证收款账号
var paymentAccount model.UserPaymentAccount
if err := r.db.Where("id = ? AND user_id = ? AND status = ?", req.PaymentAccountID, userID, "active").
if err := db.Where("id = ? AND user_id = ? AND status = ?", req.PaymentAccountID, userID, "active").
First(&paymentAccount).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("payment account not found")
@@ -71,7 +73,7 @@ func (r *Repository) Create(userID uint64, req CreateWithdrawalRequest) (*Withdr
}
// 事务处理
err = r.db.Transaction(func(tx *gorm.DB) error {
err = db.Transaction(func(tx *gorm.DB) error {
// 创建提现申请
if err := tx.Create(&withdrawal).Error; err != nil {
return err
@@ -105,13 +107,14 @@ func (r *Repository) Create(userID uint64, req CreateWithdrawalRequest) (*Withdr
return nil, err
}
return r.FindByID(userID, withdrawal.ID)
return r.FindByID(ctx, userID, withdrawal.ID)
}
// 用户查询提现列表
func (r *Repository) List(userID uint64, page, pageSize int) (*PaginatedResult, error) {
func (r *Repository) List(ctx context.Context, userID uint64, page, pageSize int) (*PaginatedResult, error) {
db := r.db.WithContext(ctx)
var total int64
if err := r.db.Model(&model.WithdrawalRequest{}).
if err := db.Model(&model.WithdrawalRequest{}).
Where("user_id = ?", userID).
Count(&total).Error; err != nil {
return nil, err
@@ -119,7 +122,7 @@ func (r *Repository) List(userID uint64, page, pageSize int) (*PaginatedResult,
offset := (page - 1) * pageSize
var withdrawals []model.WithdrawalRequest
if err := r.db.Where("user_id = ?", userID).
if err := db.Where("user_id = ?", userID).
Order("created_at DESC").
Offset(offset).Limit(pageSize).
Find(&withdrawals).Error; err != nil {
@@ -140,9 +143,9 @@ func (r *Repository) List(userID uint64, page, pageSize int) (*PaginatedResult,
}
// 用户查询提现详情
func (r *Repository) FindByID(userID, id uint64) (*WithdrawalDTO, error) {
func (r *Repository) FindByID(ctx context.Context, userID, id uint64) (*WithdrawalDTO, error) {
var withdrawal model.WithdrawalRequest
if err := r.db.Where("id = ? AND user_id = ?", id, userID).
if err := r.db.WithContext(ctx).Where("id = ? AND user_id = ?", id, userID).
First(&withdrawal).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrWithdrawalNotFound
@@ -154,9 +157,10 @@ func (r *Repository) FindByID(userID, id uint64) (*WithdrawalDTO, error) {
}
// 用户取消提现
func (r *Repository) Cancel(userID, id uint64) error {
func (r *Repository) Cancel(ctx context.Context, userID, id uint64) error {
db := r.db.WithContext(ctx)
var withdrawal model.WithdrawalRequest
if err := r.db.Where("id = ? AND user_id = ?", id, userID).
if err := db.Where("id = ? AND user_id = ?", id, userID).
First(&withdrawal).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return ErrWithdrawalNotFound
@@ -169,7 +173,7 @@ func (r *Repository) Cancel(userID, id uint64) error {
return ErrWithdrawalLocked
}
return r.db.Transaction(func(tx *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error {
// 更新状态
if err := tx.Model(&withdrawal).Update("status", "cancelled").Error; err != nil {
return err
@@ -201,8 +205,8 @@ func (r *Repository) Cancel(userID, id uint64) error {
}
// 管理员查询提现列表
func (r *Repository) AdminList(query AdminListQuery) (*AdminPaginatedResult, error) {
db := r.db.Model(&model.WithdrawalRequest{})
func (r *Repository) AdminList(ctx context.Context, query AdminListQuery) (*AdminPaginatedResult, error) {
db := r.db.WithContext(ctx).Model(&model.WithdrawalRequest{})
if query.Status != "" {
db = db.Where("status = ?", query.Status)
@@ -226,7 +230,7 @@ func (r *Repository) AdminList(query AdminListQuery) (*AdminPaginatedResult, err
items := make([]WithdrawalDetailDTO, 0, len(withdrawals))
for _, w := range withdrawals {
dto, err := r.toDetailDTO(w)
dto, err := r.toDetailDTO(ctx, w)
if err != nil {
continue
}
@@ -242,21 +246,22 @@ func (r *Repository) AdminList(query AdminListQuery) (*AdminPaginatedResult, err
}
// 管理员查询提现详情
func (r *Repository) AdminFindByID(id uint64) (*WithdrawalDetailDTO, error) {
func (r *Repository) AdminFindByID(ctx context.Context, id uint64) (*WithdrawalDetailDTO, error) {
var withdrawal model.WithdrawalRequest
if err := r.db.First(&withdrawal, id).Error; err != nil {
if err := r.db.WithContext(ctx).First(&withdrawal, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrWithdrawalNotFound
}
return nil, err
}
return r.toDetailDTO(withdrawal)
return r.toDetailDTO(ctx, withdrawal)
}
// 管理员审核提现
func (r *Repository) Review(adminID, id uint64, req ReviewWithdrawalRequest) (*WithdrawalDetailDTO, error) {
func (r *Repository) Review(ctx context.Context, adminID, id uint64, req ReviewWithdrawalRequest) (*WithdrawalDetailDTO, error) {
db := r.db.WithContext(ctx)
var withdrawal model.WithdrawalRequest
if err := r.db.First(&withdrawal, id).Error; err != nil {
if err := db.First(&withdrawal, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrWithdrawalNotFound
}
@@ -282,7 +287,7 @@ func (r *Repository) Review(adminID, id uint64, req ReviewWithdrawalRequest) (*W
withdrawal.ReviewedAt = &now
withdrawal.ReviewRemark = req.Remark
err := r.db.Transaction(func(tx *gorm.DB) error {
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Save(&withdrawal).Error; err != nil {
return err
}
@@ -317,13 +322,14 @@ func (r *Repository) Review(adminID, id uint64, req ReviewWithdrawalRequest) (*W
return nil, err
}
return r.AdminFindByID(id)
return r.AdminFindByID(ctx, id)
}
// 管理员确认打款
func (r *Repository) ConfirmPayment(adminID, id uint64, req ConfirmPaymentRequest) (*WithdrawalDetailDTO, error) {
func (r *Repository) ConfirmPayment(ctx context.Context, adminID, id uint64, req ConfirmPaymentRequest) (*WithdrawalDetailDTO, error) {
db := r.db.WithContext(ctx)
var withdrawal model.WithdrawalRequest
if err := r.db.First(&withdrawal, id).Error; err != nil {
if err := db.First(&withdrawal, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrWithdrawalNotFound
}
@@ -342,7 +348,7 @@ func (r *Repository) ConfirmPayment(adminID, id uint64, req ConfirmPaymentReques
withdrawal.PaymentProofURL = req.PaymentProofURL
withdrawal.PaymentRemark = req.Remark
err := r.db.Transaction(func(tx *gorm.DB) error {
err := db.Transaction(func(tx *gorm.DB) error {
if err := tx.Save(&withdrawal).Error; err != nil {
return err
}
@@ -367,7 +373,7 @@ func (r *Repository) ConfirmPayment(adminID, id uint64, req ConfirmPaymentReques
return nil, err
}
return r.AdminFindByID(id)
return r.AdminFindByID(ctx, id)
}
// 转换为用户DTO
@@ -393,16 +399,17 @@ func toDTO(w model.WithdrawalRequest) WithdrawalDTO {
}
// 转换为管理员详细DTO
func (r *Repository) toDetailDTO(w model.WithdrawalRequest) (*WithdrawalDetailDTO, error) {
func (r *Repository) toDetailDTO(ctx context.Context, w model.WithdrawalRequest) (*WithdrawalDetailDTO, error) {
db := r.db.WithContext(ctx)
// 查询用户信息
var user model.User
r.db.Select("nickname, phone").First(&user, w.UserID)
db.Select("nickname, phone").First(&user, w.UserID)
// 查询审核人信息
var reviewedByName string
if w.ReviewedBy != nil {
var admin model.AdminUser
if err := r.db.Select("nickname").First(&admin, *w.ReviewedBy).Error; err == nil {
if err := db.Select("nickname").First(&admin, *w.ReviewedBy).Error; err == nil {
reviewedByName = admin.Nickname
}
}
@@ -411,7 +418,7 @@ func (r *Repository) toDetailDTO(w model.WithdrawalRequest) (*WithdrawalDetailDT
var paidByName string
if w.PaidBy != nil {
var admin model.AdminUser
if err := r.db.Select("nickname").First(&admin, *w.PaidBy).Error; err == nil {
if err := db.Select("nickname").First(&admin, *w.PaidBy).Error; err == nil {
paidByName = admin.Nickname
}
}
@@ -421,7 +428,7 @@ func (r *Repository) toDetailDTO(w model.WithdrawalRequest) (*WithdrawalDetailDT
var certificateURLs []string
if w.PaymentAccountID != nil {
var paymentAccount model.UserPaymentAccount
if err := r.db.First(&paymentAccount, *w.PaymentAccountID).Error; err == nil {
if err := db.First(&paymentAccount, *w.PaymentAccountID).Error; err == nil {
// 解密账号
decrypted, err := crypto.Decrypt(paymentAccount.AccountNo)
if err == nil {