2026-07-02 10:53:44 +08:00

88 lines
3.4 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"
)
// FreezeSalaryWithdrawal 处理 H5 提现申请提交前的工资冻结,调用方必须已完成用户身份校验。
func (s *Server) FreezeSalaryWithdrawal(ctx context.Context, req *walletv1.FreezeSalaryWithdrawalRequest) (*walletv1.FreezeSalaryWithdrawalResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.FreezeSalaryWithdrawal(ctx, ledger.SalaryWithdrawalCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
UserID: req.GetUserId(),
SalaryAssetType: req.GetSalaryAssetType(),
SalaryUSDMinor: req.GetSalaryUsdMinor(),
Reason: req.GetReason(),
WithdrawalRef: req.GetWithdrawalRef(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.FreezeSalaryWithdrawalResponse{
TransactionId: receipt.TransactionID,
Balance: salaryWithdrawalBalance(receipt),
SalaryUsdMinor: receipt.SalaryUSDMinor,
}, nil
}
// SettleSalaryWithdrawal 在后台审核通过后扣掉冻结工资;失败时 admin 不会更新申请终态。
func (s *Server) SettleSalaryWithdrawal(ctx context.Context, req *walletv1.SettleSalaryWithdrawalRequest) (*walletv1.SettleSalaryWithdrawalResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.SettleSalaryWithdrawal(ctx, ledger.SalaryWithdrawalCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
UserID: req.GetUserId(),
SalaryAssetType: req.GetSalaryAssetType(),
SalaryUSDMinor: req.GetSalaryUsdMinor(),
OperatorUserID: req.GetOperatorUserId(),
Reason: req.GetReason(),
WithdrawalApplicationID: req.GetWithdrawalApplicationId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.SettleSalaryWithdrawalResponse{
TransactionId: receipt.TransactionID,
Balance: salaryWithdrawalBalance(receipt),
SalaryUsdMinor: receipt.SalaryUSDMinor,
}, nil
}
// ReleaseSalaryWithdrawal 在后台拒绝或申请创建回滚时释放冻结工资回可用余额。
func (s *Server) ReleaseSalaryWithdrawal(ctx context.Context, req *walletv1.ReleaseSalaryWithdrawalRequest) (*walletv1.ReleaseSalaryWithdrawalResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.ReleaseSalaryWithdrawal(ctx, ledger.SalaryWithdrawalCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
UserID: req.GetUserId(),
SalaryAssetType: req.GetSalaryAssetType(),
SalaryUSDMinor: req.GetSalaryUsdMinor(),
OperatorUserID: req.GetOperatorUserId(),
Reason: req.GetReason(),
WithdrawalApplicationID: req.GetWithdrawalApplicationId(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ReleaseSalaryWithdrawalResponse{
TransactionId: receipt.TransactionID,
Balance: salaryWithdrawalBalance(receipt),
SalaryUsdMinor: receipt.SalaryUSDMinor,
}, nil
}
func salaryWithdrawalBalance(receipt ledger.SalaryWithdrawalReceipt) *walletv1.AssetBalance {
return &walletv1.AssetBalance{
AssetType: receipt.SalaryAssetType,
AvailableAmount: receipt.AvailableAfter,
FrozenAmount: receipt.FrozenAfter,
Version: receipt.Version,
}
}