177 lines
7.5 KiB
Go
177 lines
7.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"
|
|
)
|
|
|
|
// 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
|
|
}
|
|
|
|
// TransferCoinSellerStockToChild 处理父币商转直属子币商专用金币库存,调用方必须先完成父子关系校验。
|
|
func (s *Server) TransferCoinSellerStockToChild(ctx context.Context, req *walletv1.TransferCoinSellerStockToChildRequest) (*walletv1.TransferCoinSellerStockToChildResponse, error) {
|
|
ctx = appcode.WithContext(ctx, req.GetAppCode())
|
|
receipt, err := s.svc.TransferCoinSellerStockToChild(ctx, ledger.CoinSellerSubTransferCommand{
|
|
AppCode: req.GetAppCode(),
|
|
CommandID: req.GetCommandId(),
|
|
ParentUserID: req.GetParentUserId(),
|
|
ChildUserID: req.GetChildUserId(),
|
|
RegionID: req.GetRegionId(),
|
|
Amount: req.GetAmount(),
|
|
Reason: req.GetReason(),
|
|
})
|
|
if err != nil {
|
|
return nil, xerr.ToGRPCError(err)
|
|
}
|
|
|
|
return &walletv1.TransferCoinSellerStockToChildResponse{
|
|
TransactionId: receipt.TransactionID,
|
|
ParentBalanceAfter: receipt.ParentBalanceAfter,
|
|
ChildBalanceAfter: receipt.ChildBalanceAfter,
|
|
Amount: receipt.Amount,
|
|
CreatedAtMs: receipt.CreatedAtMS,
|
|
}, 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
|
|
}
|