2026-06-23 11:53:00 +08:00

152 lines
6.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"
)
// AdminCreditCoinSellerStock 处理后台币商进货或金币补偿,币商身份由 admin-server 先行校验。
func (s *Server) AdminCreditCoinSellerStock(ctx context.Context, req *walletv1.AdminCreditCoinSellerStockRequest) (*walletv1.AdminCreditCoinSellerStockResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.AdminCreditCoinSellerStock(ctx, ledger.CoinSellerStockCreditCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
SellerUserID: req.GetSellerUserId(),
SellerCountryID: req.GetSellerCountryId(),
SellerRegionID: req.GetSellerRegionId(),
StockType: req.GetStockType(),
CoinAmount: req.GetCoinAmount(),
PaidCurrencyCode: req.GetPaidCurrencyCode(),
PaidAmountMicro: req.GetPaidAmountMicro(),
PaymentRef: req.GetPaymentRef(),
EvidenceRef: req.GetEvidenceRef(),
OperatorUserID: req.GetOperatorUserId(),
Reason: req.GetReason(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.AdminCreditCoinSellerStockResponse{
TransactionId: receipt.TransactionID,
SellerUserId: receipt.SellerUserID,
StockType: receipt.StockType,
CoinAmount: receipt.CoinAmount,
PaidCurrencyCode: receipt.PaidCurrencyCode,
PaidAmountMicro: receipt.PaidAmountMicro,
CountsAsSellerRecharge: receipt.CountsAsSellerRecharge,
BalanceAfter: receipt.BalanceAfter,
CreatedAtMs: receipt.CreatedAtMS,
}, nil
}
// TransferCoinFromSeller 处理币商转玩家金币,调用方必须先完成币商身份校验。
func (s *Server) TransferCoinFromSeller(ctx context.Context, req *walletv1.TransferCoinFromSellerRequest) (*walletv1.TransferCoinFromSellerResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.TransferCoinFromSeller(ctx, ledger.CoinSellerTransferCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
SellerUserID: req.GetSellerUserId(),
TargetUserID: req.GetTargetUserId(),
TargetCountryID: req.GetTargetCountryId(),
SellerRegionID: req.GetSellerRegionId(),
TargetRegionID: req.GetTargetRegionId(),
Amount: req.GetAmount(),
Reason: req.GetReason(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.TransferCoinFromSellerResponse{
TransactionId: receipt.TransactionID,
SellerBalanceAfter: receipt.SellerBalanceAfter,
TargetBalanceAfter: receipt.TargetBalanceAfter,
Amount: receipt.Amount,
RechargeUsdMinor: receipt.RechargeUSDMinor,
RechargeCurrencyCode: receipt.RechargeCurrencyCode,
RechargePolicyId: receipt.RechargePolicyID,
RechargePolicyVersion: receipt.RechargePolicyVersion,
RechargePolicyCoinAmount: receipt.RechargePolicyCoinAmount,
RechargePolicyUsdMinorAmount: receipt.RechargePolicyUSDMinorUnit,
}, nil
}
// ListCoinSellerSalaryExchangeRateTiers 返回工资转币商使用的区域比例区间,调用方用它做预计到账展示。
func (s *Server) ListCoinSellerSalaryExchangeRateTiers(ctx context.Context, req *walletv1.ListCoinSellerSalaryExchangeRateTiersRequest) (*walletv1.ListCoinSellerSalaryExchangeRateTiersResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
tiers, err := s.svc.ListCoinSellerSalaryExchangeRateTiers(ctx, req.GetAppCode(), req.GetRegionId(), req.GetIncludeDisabled())
if err != nil {
return nil, xerr.ToGRPCError(err)
}
response := &walletv1.ListCoinSellerSalaryExchangeRateTiersResponse{Tiers: make([]*walletv1.CoinSellerSalaryExchangeRateTier, 0, len(tiers))}
for _, tier := range tiers {
response.Tiers = append(response.Tiers, &walletv1.CoinSellerSalaryExchangeRateTier{
RegionId: tier.RegionID,
MinUsdMinor: tier.MinUSDMinor,
MaxUsdMinor: tier.MaxUSDMinor,
CoinPerUsd: tier.CoinPerUSD,
Status: tier.Status,
SortOrder: int32(tier.SortOrder),
UpdatedAtMs: tier.UpdatedAtMS,
})
}
return response, nil
}
// ExchangeSalaryToCoin 处理用户工资兑换普通金币,身份资产已经由 gateway 校验并注入。
func (s *Server) ExchangeSalaryToCoin(ctx context.Context, req *walletv1.ExchangeSalaryToCoinRequest) (*walletv1.ExchangeSalaryToCoinResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.ExchangeSalaryToCoin(ctx, ledger.SalaryExchangeCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
UserID: req.GetUserId(),
SalaryAssetType: req.GetSalaryAssetType(),
SalaryUSDMinor: req.GetSalaryUsdMinor(),
Reason: req.GetReason(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.ExchangeSalaryToCoinResponse{
TransactionId: receipt.TransactionID,
SalaryBalanceAfter: receipt.SalaryBalanceAfter,
CoinBalanceAfter: receipt.CoinBalanceAfter,
SalaryUsdMinor: receipt.SalaryUSDMinor,
CoinAmount: receipt.CoinAmount,
CoinPerUsd: receipt.CoinPerUSD,
}, nil
}
// TransferSalaryToCoinSeller 处理用户工资转同区域币商专用金币库存。
func (s *Server) TransferSalaryToCoinSeller(ctx context.Context, req *walletv1.TransferSalaryToCoinSellerRequest) (*walletv1.TransferSalaryToCoinSellerResponse, error) {
ctx = appcode.WithContext(ctx, req.GetAppCode())
receipt, err := s.svc.TransferSalaryToCoinSeller(ctx, ledger.SalaryTransferToCoinSellerCommand{
AppCode: req.GetAppCode(),
CommandID: req.GetCommandId(),
SourceUserID: req.GetSourceUserId(),
SellerUserID: req.GetSellerUserId(),
SalaryAssetType: req.GetSalaryAssetType(),
SalaryUSDMinor: req.GetSalaryUsdMinor(),
RegionID: req.GetRegionId(),
Reason: req.GetReason(),
})
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &walletv1.TransferSalaryToCoinSellerResponse{
TransactionId: receipt.TransactionID,
SourceSalaryBalanceAfter: receipt.SourceSalaryBalanceAfter,
SellerBalanceAfter: receipt.SellerBalanceAfter,
SalaryUsdMinor: receipt.SalaryUSDMinor,
CoinAmount: receipt.CoinAmount,
CoinPerUsd: receipt.CoinPerUSD,
RateMinUsdMinor: receipt.RateMinUSDMinor,
RateMaxUsdMinor: receipt.RateMaxUSDMinor,
}, nil
}