核心改造: 1. Wallet模块DTO层全部改为*Cent int64字段 2. Wallet.Entry结构从Amount float64改为AmountCent int64 3. Repository层applyEntry函数使用整数加减,无需浮点运算 4. Withdrawal模块DTO/Request全部改为*Cent字段 5. 所有wallet.AppendEntries调用点改为AmountCent 6. 提现手续费计算改为分单位 技术细节: - 删除了roundWalletMoney函数(不再需要) - toAccountDTO/toLedgerDTO使用*Cent字段 - 最小提现金额:10元=1000分 - 最大提现金额:5000元=500000分 - 编译验证通过 ✅ Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
93 lines
3.3 KiB
Go
93 lines
3.3 KiB
Go
package withdrawal
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
// 用户端 DTO
|
|
type WithdrawalDTO struct {
|
|
ID uint64 `json:"id"`
|
|
WithdrawNo string `json:"withdraw_no"`
|
|
UserID uint64 `json:"user_id"`
|
|
AmountCent int64 `json:"amount_cent"`
|
|
FeeCent int64 `json:"fee_cent"`
|
|
ActualAmountCent int64 `json:"actual_amount_cent"`
|
|
AccountType string `json:"account_type"`
|
|
AccountName string `json:"account_name"`
|
|
AccountNo string `json:"account_no"` // 脱敏
|
|
BankName string `json:"bank_name"`
|
|
Status string `json:"status"`
|
|
ReviewRemark string `json:"review_remark"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
ReviewedAt *time.Time `json:"reviewed_at"`
|
|
PaidAt *time.Time `json:"paid_at"`
|
|
}
|
|
|
|
// 管理员端详细 DTO
|
|
type WithdrawalDetailDTO struct {
|
|
ID uint64 `json:"id"`
|
|
WithdrawNo string `json:"withdraw_no"`
|
|
UserID uint64 `json:"user_id"`
|
|
UserNickname string `json:"user_nickname"`
|
|
UserPhone string `json:"user_phone"`
|
|
AmountCent int64 `json:"amount_cent"`
|
|
FeeCent int64 `json:"fee_cent"`
|
|
ActualAmountCent int64 `json:"actual_amount_cent"`
|
|
PaymentAccountID *uint64 `json:"payment_account_id"`
|
|
AccountType string `json:"account_type"`
|
|
AccountName string `json:"account_name"`
|
|
AccountNo string `json:"account_no"` // 管理员可见完整账号
|
|
BankName string `json:"bank_name"`
|
|
BankBranch string `json:"bank_branch"`
|
|
CertificateURLs []string `json:"certificate_urls"` // 收款二维码图片
|
|
Status string `json:"status"`
|
|
ReviewedBy *uint64 `json:"reviewed_by"`
|
|
ReviewedByName string `json:"reviewed_by_name"`
|
|
ReviewedAt *time.Time `json:"reviewed_at"`
|
|
ReviewRemark string `json:"review_remark"`
|
|
PaidBy *uint64 `json:"paid_by"`
|
|
PaidByName string `json:"paid_by_name"`
|
|
PaidAt *time.Time `json:"paid_at"`
|
|
PaymentProofURL string `json:"payment_proof_url"`
|
|
PaymentRemark string `json:"payment_remark"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type CreateWithdrawalRequest struct {
|
|
PaymentAccountID uint64 `json:"payment_account_id" binding:"required"`
|
|
AmountCent int64 `json:"amount_cent" binding:"required,gt=0"`
|
|
}
|
|
|
|
type ReviewWithdrawalRequest struct {
|
|
Approved bool `json:"approved" binding:"required"`
|
|
Remark string `json:"remark"`
|
|
}
|
|
|
|
type ConfirmPaymentRequest struct {
|
|
PaymentProofURL string `json:"payment_proof_url"`
|
|
Remark string `json:"remark"`
|
|
}
|
|
|
|
type PaginatedResult struct {
|
|
Items []WithdrawalDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type AdminPaginatedResult struct {
|
|
Items []WithdrawalDetailDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type AdminListQuery struct {
|
|
Status string `form:"status"`
|
|
UserID uint64 `form:"user_id"`
|
|
Page int `form:"page"`
|
|
Size int `form:"page_size"`
|
|
}
|