112 lines
4.5 KiB
Go
112 lines
4.5 KiB
Go
package grpc
|
|
|
|
import (
|
|
"context"
|
|
|
|
walletv1 "hyapp.local/api/proto/wallet/v1"
|
|
"hyapp/pkg/appcode"
|
|
"hyapp/pkg/xerr"
|
|
"hyapp/services/wallet-service/internal/domain/ledger"
|
|
)
|
|
|
|
// FreezePointWithdrawal 处理 Huwaa POINT 提现申请提交前的积分冻结,调用方负责用户身份和提现地址校验。
|
|
func (s *Server) FreezePointWithdrawal(ctx context.Context, req *walletv1.FreezePointWithdrawalRequest) (*walletv1.FreezePointWithdrawalResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
receipt, err := s.svc.FreezePointWithdrawal(ctx, ledger.PointWithdrawalCommand{
|
|
AppCode: req.GetAppCode(),
|
|
CommandID: req.GetCommandId(),
|
|
UserID: req.GetUserId(),
|
|
AssetType: req.GetAssetType(),
|
|
GrossPointAmount: req.GetGrossPointAmount(),
|
|
FeePointAmount: req.GetFeePointAmount(),
|
|
NetPointAmount: req.GetNetPointAmount(),
|
|
PointsPerUSD: req.GetPointsPerUsd(),
|
|
FeeBPS: int64(req.GetFeeBps()),
|
|
Reason: req.GetReason(),
|
|
WithdrawalRef: req.GetWithdrawalRef(),
|
|
})
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
return &walletv1.FreezePointWithdrawalResponse{
|
|
TransactionId: receipt.TransactionID,
|
|
Balance: pointWithdrawalBalance(receipt),
|
|
GrossPointAmount: receipt.GrossPointAmount,
|
|
FeePointAmount: receipt.FeePointAmount,
|
|
NetPointAmount: receipt.NetPointAmount,
|
|
PointsPerUsd: receipt.PointsPerUSD,
|
|
FeeBps: int32(receipt.FeeBPS),
|
|
}, nil
|
|
}
|
|
|
|
// SettlePointWithdrawal 在后台审核通过后扣掉 frozen 积分;失败时 admin 不应更新申请终态。
|
|
func (s *Server) SettlePointWithdrawal(ctx context.Context, req *walletv1.SettlePointWithdrawalRequest) (*walletv1.SettlePointWithdrawalResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
receipt, err := s.svc.SettlePointWithdrawal(ctx, ledger.PointWithdrawalCommand{
|
|
AppCode: req.GetAppCode(),
|
|
CommandID: req.GetCommandId(),
|
|
UserID: req.GetUserId(),
|
|
AssetType: req.GetAssetType(),
|
|
GrossPointAmount: req.GetGrossPointAmount(),
|
|
FeePointAmount: req.GetFeePointAmount(),
|
|
NetPointAmount: req.GetNetPointAmount(),
|
|
PointsPerUSD: req.GetPointsPerUsd(),
|
|
FeeBPS: int64(req.GetFeeBps()),
|
|
OperatorUserID: req.GetOperatorUserId(),
|
|
Reason: req.GetReason(),
|
|
WithdrawalApplicationID: req.GetWithdrawalApplicationId(),
|
|
})
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
return &walletv1.SettlePointWithdrawalResponse{
|
|
TransactionId: receipt.TransactionID,
|
|
Balance: pointWithdrawalBalance(receipt),
|
|
GrossPointAmount: receipt.GrossPointAmount,
|
|
FeePointAmount: receipt.FeePointAmount,
|
|
NetPointAmount: receipt.NetPointAmount,
|
|
PointsPerUsd: receipt.PointsPerUSD,
|
|
FeeBps: int32(receipt.FeeBPS),
|
|
}, nil
|
|
}
|
|
|
|
// ReleasePointWithdrawal 在后台拒绝或申请创建回滚时释放 frozen 积分回 available。
|
|
func (s *Server) ReleasePointWithdrawal(ctx context.Context, req *walletv1.ReleasePointWithdrawalRequest) (*walletv1.ReleasePointWithdrawalResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
receipt, err := s.svc.ReleasePointWithdrawal(ctx, ledger.PointWithdrawalCommand{
|
|
AppCode: req.GetAppCode(),
|
|
CommandID: req.GetCommandId(),
|
|
UserID: req.GetUserId(),
|
|
AssetType: req.GetAssetType(),
|
|
GrossPointAmount: req.GetGrossPointAmount(),
|
|
FeePointAmount: req.GetFeePointAmount(),
|
|
NetPointAmount: req.GetNetPointAmount(),
|
|
PointsPerUSD: req.GetPointsPerUsd(),
|
|
FeeBPS: int64(req.GetFeeBps()),
|
|
OperatorUserID: req.GetOperatorUserId(),
|
|
Reason: req.GetReason(),
|
|
WithdrawalApplicationID: req.GetWithdrawalApplicationId(),
|
|
})
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
return &walletv1.ReleasePointWithdrawalResponse{
|
|
TransactionId: receipt.TransactionID,
|
|
Balance: pointWithdrawalBalance(receipt),
|
|
GrossPointAmount: receipt.GrossPointAmount,
|
|
FeePointAmount: receipt.FeePointAmount,
|
|
NetPointAmount: receipt.NetPointAmount,
|
|
PointsPerUsd: receipt.PointsPerUSD,
|
|
FeeBps: int32(receipt.FeeBPS),
|
|
}, nil
|
|
}
|
|
|
|
func pointWithdrawalBalance(receipt ledger.PointWithdrawalReceipt) *walletv1.AssetBalance {
|
|
return &walletv1.AssetBalance{
|
|
AssetType: receipt.AssetType,
|
|
AvailableAmount: receipt.AvailableAfter,
|
|
FrozenAmount: receipt.FrozenAfter,
|
|
Version: receipt.Version,
|
|
}
|
|
}
|