用户管理增加余额调账功能

支持后台加减可用余额并写入资金流水与审计,优化操作列按钮样式。
This commit is contained in:
yml2213
2026-07-13 21:30:38 +08:00
parent a2a9ade68e
commit b96d6141f5
10 changed files with 642 additions and 57 deletions
@@ -13,8 +13,15 @@ var (
ErrInvalidRealnameInput = errors.New("invalid realname input")
ErrRealnameAlreadyVerified = errors.New("realname already verified")
ErrRealnameNotRevocable = errors.New("realname not revocable")
ErrInvalidWalletDirection = errors.New("invalid wallet direction")
ErrInvalidWalletAmount = errors.New("invalid wallet amount")
ErrInvalidWalletReason = errors.New("invalid wallet reason")
ErrInsufficientBalance = errors.New("insufficient balance")
)
// 单笔人工调账上限:10 万元,防止误填。
const maxWalletAdjustAmountCent int64 = 10_000_000
var manualRealnameIDPattern = regexp.MustCompile(`^\d{17}[\dXx]$`)
type Service struct {
@@ -85,6 +92,29 @@ func (s *Service) ManualRealname(ctx context.Context, adminID uint64, userID uin
return s.repo.ManualRealname(ctx, adminID, userID, req, meta)
}
func (s *Service) AdjustWallet(ctx context.Context, adminID uint64, userID uint64, req WalletAdjustRequest, meta AuditMeta) (*UserDTO, error) {
if s.repo == nil {
return nil, ErrDependencyUnavailable
}
if userID == 0 {
return nil, ErrInvalidUser
}
direction := strings.TrimSpace(strings.ToLower(req.Direction))
if direction != "in" && direction != "out" {
return nil, ErrInvalidWalletDirection
}
if req.AmountCent <= 0 || req.AmountCent > maxWalletAdjustAmountCent {
return nil, ErrInvalidWalletAmount
}
if reasonLen := len([]rune(strings.TrimSpace(req.Reason))); reasonLen < 2 || reasonLen > 200 {
return nil, ErrInvalidWalletReason
}
req.Direction = direction
req.Reason = strings.TrimSpace(req.Reason)
req.ReferenceNo = strings.TrimSpace(req.ReferenceNo)
return s.repo.AdjustWallet(ctx, adminID, userID, req, meta)
}
func validManualRealname(name string, idNo string) bool {
name = strings.TrimSpace(name)
idNo = strings.TrimSpace(idNo)