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,
}
}