Files

199 lines
8.9 KiB
Go

package withdrawal
import (
"time"
)
// 用户端 DTO
type WithdrawalDTO struct {
ID uint64 `json:"id"`
WithdrawNo string `json:"withdraw_no"`
UserID uint64 `json:"user_id"`
DistributionSiteID uint64 `json:"distribution_site_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"`
DistributionSiteID uint64 `json:"distribution_site_id"`
DistributionSiteName string `json:"distribution_site_name"`
DistributionSiteCode string `json:"distribution_site_code"`
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"`
}
// WithdrawalListItemDTO 是后台提现分页列表使用的轻量 DTO。
// 收款二维码、完整收款账号、审核和打款详情只在打开详情时查询。
type WithdrawalListItemDTO struct {
ID uint64 `json:"id"`
WithdrawNo string `json:"withdraw_no"`
UserID uint64 `json:"user_id"`
DistributionSiteID uint64 `json:"distribution_site_id"`
DistributionSiteName string `json:"distribution_site_name"`
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"`
AccountType string `json:"account_type"`
AccountName string `json:"account_name"`
AccountNo string `json:"account_no"`
BankName string `json:"bank_name"`
Status string `json:"status"`
CreatedAt time.Time `json:"created_at"`
}
// WithdrawalReviewSummaryDTO 汇总审核员核对提现时最关心的用户财务口径。
// wallet_actual_income_cent 汇总普通钱包结算订单及站内钱包提号的有效结算额;
// platform_managed_income_cent 汇总平台代管订单和平台代管提号的线下结算额。
// reconcile_difference_amount_cent = 钱包收入 - 已打款 - 待处理提现。
type WithdrawalReviewSummaryDTO struct {
OwnerOrderCount int64 `json:"owner_order_count"`
OwnerPickupCount int64 `json:"owner_pickup_count"`
FinalizedOrderCount int64 `json:"finalized_order_count"`
WalletActualIncomeCent int64 `json:"wallet_actual_income_cent"`
PickupIncomeCent int64 `json:"pickup_income_cent"`
WalletPickupIncomeCent int64 `json:"wallet_pickup_income_cent"`
PlatformManagedPickupIncomeCent int64 `json:"platform_managed_pickup_income_cent"`
PlatformManagedIncomeCent int64 `json:"platform_managed_income_cent"`
WithdrawalCount int64 `json:"withdrawal_count"`
WithdrawnAmountCent int64 `json:"withdrawn_amount_cent"`
PendingWithdrawalAmountCent int64 `json:"pending_withdrawal_amount_cent"`
RejectedWithdrawalCount int64 `json:"rejected_withdrawal_count"`
ReconcileDifferenceAmountCent int64 `json:"reconcile_difference_amount_cent"`
}
type WithdrawalReviewOrderDTO struct {
ID uint64 `json:"id"`
OrderNo string `json:"order_no"`
ListingNo string `json:"listing_no"`
Title string `json:"title"`
Status string `json:"status"`
SettlementStatus string `json:"settlement_status"`
SettlementMode string `json:"settlement_mode"`
RentAmountCent int64 `json:"rent_amount_cent"`
OwnerActualIncomeCent *int64 `json:"owner_actual_income_cent,omitempty"`
CreatedAt time.Time `json:"created_at"`
SettledAt *time.Time `json:"settled_at,omitempty"`
}
type WithdrawalReviewPickupDTO struct {
ID uint64 `json:"id"`
PickupNo string `json:"pickup_no"`
ListingNo string `json:"listing_no"`
Title string `json:"title"`
Status string `json:"status"`
SettlementMode string `json:"settlement_mode"`
OfflineSettlementStatus string `json:"offline_settlement_status"`
SettleAmountCent int64 `json:"settle_amount_cent"`
SettleAdjustmentCent int64 `json:"settle_adjustment_cent"`
EffectiveSettleAmountCent int64 `json:"effective_settle_amount_cent"`
CompletedAt *time.Time `json:"completed_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type WithdrawalReviewHistoryDTO struct {
ID uint64 `json:"id"`
WithdrawNo string `json:"withdraw_no"`
AmountCent int64 `json:"amount_cent"`
FeeCent int64 `json:"fee_cent"`
ActualAmountCent int64 `json:"actual_amount_cent"`
Status string `json:"status"`
CreatedAt time.Time `json:"created_at"`
ReviewedAt *time.Time `json:"reviewed_at,omitempty"`
PaidAt *time.Time `json:"paid_at,omitempty"`
}
type WithdrawalReviewContextQuery struct {
OrderPage int `form:"order_page"`
PickupPage int `form:"pickup_page"`
WithdrawalPage int `form:"withdrawal_page"`
PageSize int `form:"page_size"`
}
type WithdrawalReviewContextDTO struct {
Summary WithdrawalReviewSummaryDTO `json:"summary"`
Orders []WithdrawalReviewOrderDTO `json:"orders"`
OrderPage int `json:"order_page"`
OrderPageSize int `json:"order_page_size"`
Pickups []WithdrawalReviewPickupDTO `json:"pickups"`
PickupPage int `json:"pickup_page"`
PickupPageSize int `json:"pickup_page_size"`
Withdrawals []WithdrawalReviewHistoryDTO `json:"withdrawals"`
WithdrawalPage int `json:"withdrawal_page"`
WithdrawalPageSize int `json:"withdrawal_page_size"`
}
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 []WithdrawalListItemDTO `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"`
}