lotteryPlayer(); abort_if($player === null, 500, 'lottery_player missing'); $currencyCode = $this->resolveCurrencyCode($request, $player); if ($currencyCode instanceof JsonResponse) { return $currencyCode; } if (PlayerFundingMode::usesCredit($player)) { $credit = DB::table('player_credit_accounts')->where('player_id', $player->id)->first(); $limitMajor = (int) ($credit->credit_limit ?? 0); $usedMajor = (int) ($credit->used_credit ?? 0); $frozenMajor = (int) ($credit->frozen_credit ?? 0); $availableMajor = max(0, $limitMajor - $usedMajor - $frozenMajor); $limitMinor = CreditAmountScale::majorToMinor($limitMajor, $currencyCode); $usedMinor = CreditAmountScale::majorToMinor($usedMajor, $currencyCode); $frozenMinor = CreditAmountScale::majorToMinor($frozenMajor, $currencyCode); $availableMinor = CreditAmountScale::majorToMinor($availableMajor, $currencyCode); return ApiResponse::success([ 'balance' => $limitMinor, 'balance_formatted' => CurrencyFormatter::fromMinor($limitMinor), 'available_balance' => $availableMinor, 'available_balance_formatted' => CurrencyFormatter::fromMinor($availableMinor), 'credit_limit' => $limitMinor, 'used_credit' => $usedMinor, 'credit_line_mode' => true, 'funding_mode' => PlayerFundingMode::CREDIT, 'auth_source' => $player->auth_source, 'main_balance' => null, 'main_balance_formatted' => null, 'currency_code' => $currencyCode, 'wallet_type' => self::WALLET_TYPE_LOTTERY, 'frozen_balance' => $frozenMinor, 'frozen_balance_formatted' => CurrencyFormatter::fromMinor($frozenMinor), ]); } $wallet = PlayerWallet::query()->firstOrCreate( [ 'player_id' => $player->id, 'wallet_type' => self::WALLET_TYPE_LOTTERY, 'currency_code' => $currencyCode, ], [ 'balance' => 0, 'frozen_balance' => 0, 'status' => 0, 'version' => 0, ], ); $balance = (int) $wallet->balance; $frozen = (int) $wallet->frozen_balance; $available = max(0, $balance - $frozen); $mainBalance = $this->mainSiteBalanceClient->fetch($player, $currencyCode); return ApiResponse::success([ 'balance' => $balance, 'balance_formatted' => CurrencyFormatter::fromMinor($balance), 'available_balance' => $available, 'available_balance_formatted' => CurrencyFormatter::fromMinor($available), 'credit_line_mode' => false, 'funding_mode' => PlayerFundingMode::WALLET, 'auth_source' => $player->auth_source, 'main_balance' => $mainBalance, 'main_balance_formatted' => $mainBalance !== null ? CurrencyFormatter::fromMinor($mainBalance) : null, 'currency_code' => $wallet->currency_code, 'wallet_type' => $wallet->wallet_type, 'frozen_balance' => $frozen, 'frozen_balance_formatted' => CurrencyFormatter::fromMinor($frozen), ]); } /** * @return string|JsonResponse 合法币种码或错误响应({@see ErrorCode::WalletInvalidCurrency}) */ private function resolveCurrencyCode(Request $request, Player $player): string|JsonResponse { $code = CurrencyResolver::resolve($request, $player, 'currency'); if (! CurrencyResolver::isEnabled($code)) { return ApiResponse::error( ApiMessage::get($request, 'wallet.invalid_currency'), ErrorCode::WalletInvalidCurrency->value, null, 400, ); } return $code; } }