table('agent.dbo.first_pay_gift_records') ->where('user_id', $user_id) ->exists(); if ($hasPurchased) { // 已购买首充礼包,走普通充值逻辑(只加本金) $Recharge = $payAmt; $give = 0; $favorable_price = $Recharge + $give; $czReason = 1; $cjReason = 45; } else { // 首次购买首充礼包,走赠送逻辑(立即获得bonus_instantly%) $Gifts = DB::connection('write')->table('agent.dbo.recharge_gift')->where('gift_id', $GiftsID)->first(); $favorable_price = round($Gifts->bonus_instantly*$payAmt/100,2); $give = $favorable_price-$payAmt; $Recharge = $payAmt; $czReason = 50; $cjReason = 51; // 创建首充礼包记录 try { $this->createFirstPayGiftRecord($user_id, $GiftsID, $payAmt); } catch (\Exception $e) { \Log::error('首充礼包记录创建失败', [ 'user_id' => $user_id, 'gift_id' => $GiftsID, 'error' => $e->getMessage() ]); } } }if ($GiftsID == 302) { // 破产礼包 // 首次购买首充礼包,走赠送逻辑(立即获得bonus_instantly%) $Gifts = DB::connection('write')->table('agent.dbo.recharge_gift')->where('gift_id', $GiftsID)->where('recommend', $payAmt)->first(); if($Gifts){ $favorable_price = round($Gifts->bonus_instantly*$payAmt/100,2); $give = $favorable_price-$payAmt; $Recharge = $payAmt; $czReason = 50; $cjReason = 51; }else{ $Recharge = $payAmt; $give = 0; $favorable_price = $Recharge + $give; $czReason = 1; $cjReason = 45; } }else if ($GiftsID > 400) { $Status = 1; $recharge_gear = DB::connection('write')->table('agent.dbo.recharge_gear')->where('status', $Status)->where('money', $payAmt)->select('favorable_price', 'give')->first(); if(!$recharge_gear){ $Recharge=$payAmt; $give=0; }else{ $Recharge = $recharge_gear->favorable_price; $give = $recharge_gear->give; } $favorable_price = $Recharge + $give; $czReason = 1; $cjReason = 45; } } else { // 普通订单 $Status = 1; $recharge_gear = DB::connection('write')->table('agent.dbo.recharge_gear')->where('status', $Status)->where('money', $payAmt)->select('favorable_price', 'give')->first(); if(!$recharge_gear){ $Recharge=$payAmt; $give=0; }else{ $Recharge = $recharge_gear->favorable_price; $give = $recharge_gear->give; } $favorable_price = $Recharge + $give; $czReason = 1; $cjReason = 45; } return [$give, $favorable_price, $Recharge, $czReason, $cjReason, $second_give]; } /** * 添加玩家充值记录 * @param $user_id * @param $payAmt * @param $favorable_price * @param $order_sn * @param $GiftsID * @param $Recharge * @param $czReason * @param $give * @param $cjReason * @param $AdId * @param $eventType */ public function addRecord($user_id, $payAmt, $favorable_price, $order_sn, $GiftsID, $Recharge, $czReason, $give, $cjReason, $AdId, $eventType) { if ($payAmt > 0) { // 增加玩家充值金额 $query = DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount') ->where('UserID', $user_id) ->value('Recharge'); if ($query) { DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount') ->where('UserID', $user_id) ->increment('Recharge', $payAmt); } else { DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount') ->where('UserID', $user_id) ->insert(['Recharge' => $payAmt, 'UserID' => $user_id]); // 首次充值:金币银币切换 + 数据清理 /* * 金币银币切换 GameScoreInfo 将score的数据复制到 InsureScore 把Score 字段置0 把 ScoreChange字段设置成1 * 清理用户的数据 * GameScoreInfo的MaxScore MaxWinscore清0 * RecordUserTotalStatistics 表 数据清0 * RecordUserDataStatisticsNew 表数据 清0 * RecordUserGameCount 关于用户的数据删除 * */ try { $this->switchToInsureScoreAndCleanData($user_id); } catch (\Exception $e) { \Log::error('首次充值-金币银币切换失败', [ 'user_id' => $user_id, 'error' => $e->getMessage() ]); } } //在这里更新 RecordUserTotalStatistics 数据 将LastRechargeValue字段更新为payAmt 如果不存在则插入 DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics') ->updateOrInsert(['UserID' => $user_id], ['LastRechargeValue' => $payAmt]); // 节假日大转盘:根据充值金额增加转盘次数(首充礼包/破产礼包不计入) try { (new HolidayWheelService())->grantTimesOnRecharge($user_id, $payAmt, (int)$GiftsID); } catch (\Throwable $e) { \Log::error('holiday wheel grant times failed', [ 'user_id' => $user_id, 'payAmt' => $payAmt, 'GiftsID' => $GiftsID, 'error' => $e->getMessage(), ]); } // 圣诞大转盘:根据充值金额增加转盘次数(首充礼包/破产礼包不计入) try { (new \App\Services\ChristmasWheelService())->grantTimesOnRecharge($user_id, $payAmt, (int)$GiftsID); } catch (\Throwable $e) { \Log::error('christmas wheel grant times failed', [ 'user_id' => $user_id, 'payAmt' => $payAmt, 'GiftsID' => $GiftsID, 'error' => $e->getMessage(), ]); } } if ($Recharge > 0) { // 添加日志记录表 StoredProcedure::addPlatformData($user_id, 3, $Recharge * NumConfig::NUM_VALUE); // 增加用户金币变化记录 $AfterScore = RecordScoreInfo::addScore($user_id, ($Recharge * NumConfig::NUM_VALUE), $czReason); #充值 if ($AfterScore) { RecordScoreInfo::addScore($user_id, ($give * NumConfig::NUM_VALUE), $cjReason, $AfterScore); #赠送彩金 } } $favorable_price = (int) round($favorable_price * NumConfig::NUM_VALUE); $firstScore = DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user_id)->value('Score'); $Score = $favorable_price + $firstScore; if ($payAmt > 0) { // 记录订单变化后金币 DB::connection('write')->table('agent.dbo.order') ->where('order_sn', $order_sn) ->update(['after_amount' => $Score]); // 增加用户充值变化值 RecordUserDataStatistics::updateOrAdd($user_id, 0, $payAmt); } // 不是周卡的时候执行 if ($GiftsID < 100 || $GiftsID >= 200) { // 增加用户金币 DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user_id)->increment('Score', $favorable_price); } // 充值推广佣金 // (new AgentUser())->reward($user_id, $payAmt, $order_sn); // // 周卡 -- 执行存储过程 // if (isset($GiftsID) && $GiftsID > 100 && $GiftsID < 200) { // $CardID = (int)$GiftsID - 100; // StoredProcedure::BuyMonthCard($user_id, $CardID, $order_sn); // // 开始执行时间 // $startTime = Helper::millisecond(); // Log::info('GSP_GP_BuyMonthCard 执行时间:' . ((Helper::millisecond() - $startTime) / 1000)); // } //设置第二天要领取 // if (isset($GiftsID) && $GiftsID >= 200 && $GiftsID < 300 ) { // $first = DB::table('agent.dbo.recharge_gear')->where('gift_id', $GiftsID)->select('gift_id', 'money', 'give', 'favorable_price', 'second_give')->first(); // if ($first && $first->second_give > 0) { // $fpkey = 'Firstpay_' . $user_id; // $data = (array)$first; // $data['buytime'] = time(); // $data['czReason'] = $czReason; // $data['cjReason'] = $cjReason; // Redis::set($fpkey, json_encode($data)); // DB::table(TableName::agent() . 'guide_payment')->updateOrInsert([ // 'UserID' => $user_id, // 'GiftID' => $GiftsID, // 'CreateTime' => now() // ], ['UserID' => $user_id]); // } // } //设置第二天要领取 // if (!empty($GiftsID) && $GiftsID >= 300 && $GiftsID < 400 ) { // Redis::del('repay_temp_'.$user_id); // } // 数据统计后台 -- 充值记录添加 (new RechargeWithDraw())->recharge($user_id, $payAmt); // (new RechargeWithDraw())->recharge($user_id, $Recharge); if ($AdId && $payAmt) AfEvent::dispatch([$user_id, $payAmt, $AdId, $eventType]); try { //新邀请 //(new AgentController())->processDeposit($user_id, $payAmt,$order_sn); AgentService::recordPerformance($user_id, $payAmt * NumConfig::NUM_VALUE); } catch (\Exception $exception) { Util::WriteLog("AgentService", $exception->getTraceAsString()); } return [$Score]; } /** * 执行存储过程 * @param $user_id * @param $payAmt * @param $favorable_price * @param $Score * @param $GiftsID */ public function storedProcedure($user_id, $payAmt, $favorable_price, $Score, $GiftsID) { // 开始执行时间 $startTime = Helper::millisecond(); // 执行存储过程 -- 防刷机制 StoredProcedure::SetUserTabType($user_id); Log::info('GSP_GP_SetUserTabType12 执行时间:' . ((Helper::millisecond() - $startTime) / 1000)); # 单控标签 -- 执行存储过程 StoredProcedure::user_label($user_id, 1, $payAmt); Log::info('CheckAccountsLabel 执行时间:' . ((Helper::millisecond() - $startTime) / 1000)); // 服务器通知 // $url = config('transfer.stock')['url'] . 'notifyPay'; // Log::info('中转服参数 ' . json_encode([ // 'userid' => $user_id, 'getScore' => $favorable_price, 'score' => $Score, // 'giftsid' => empty($GiftsID) ? 0 : $GiftsID, // 'url' => $url // ])); // $res = (new HttpCurl())->service($url, ['userid' => $user_id, 'getScore' => $favorable_price, 'score' => $Score, 'giftsid' => empty($GiftsID) ? 0 : $GiftsID]); // // Log::info('中转服 执行时间:' . ((Helper::millisecond() - $startTime) / 1000), [ // 'res' => $res, // ]); // AF 事件 // (new AppflyerEvent())->event($user_id, '', 'af_purchase_new', $payAmt); // Log::info('AF 执行时间:' . ((Helper::millisecond() - $startTime) / 1000)); } /** * 首次充值:金币银币切换 + 数据清理 * @param int $user_id 用户ID */ private function switchToInsureScoreAndCleanData($user_id) { \Log::info('开始执行金币银币切换', ['user_id' => $user_id]); try { // 1. GameScoreInfo: 将Score的数据复制到InsureScore,把Score字段置0,把ScoreChange字段设置成1 $scoreInfo = DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo') ->where('UserID', $user_id) ->first(); if ($scoreInfo) { DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo') ->where('UserID', $user_id) ->update([ 'InsureScore' => max($scoreInfo->Score,4000), // 将Score复制到InsureScore 'Score' => 0, // Score置0 'ScoreChange' => 1, // ScoreChange设置成1 'MaxScore' => 0, // MaxScore清0 'MaxWinScore' => 0 // MaxWinScore清0 ]); \Log::info('GameScoreInfo切换成功', [ 'user_id' => $user_id, 'original_score' => $scoreInfo->Score, 'insure_score' => $scoreInfo->Score ]); } // 2. RecordUserTotalStatistics 表数据清0 $totalStats = DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics') ->where('UserID', $user_id) ->first(); if ($totalStats) { DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics') ->where('UserID', $user_id) ->update([ 'WinInning' => 0, 'LostInning' => 0, 'Revenue' => 0, 'WinScore' => 0, 'LostScore' => 0, 'Handsel' => 0, 'DrawBase' => 0, 'TotalBet' => 0, // 'TotalScore' => 0, 'MaxDrawBase' => 0, 'MaxScore' => 0, 'MaxWinScore' => 0, 'Rounds' => 0, 'ProtectedRounds' => 0 ]); \Log::info('RecordUserTotalStatistics清0成功', ['user_id' => $user_id]); } // 3. RecordUserDataStatisticsNew 表数据清0 DB::connection('write')->table('QPRecordDB.dbo.RecordUserDataStatisticsNew') ->where('UserID', $user_id) ->delete(); \Log::info('RecordUserDataStatisticsNew清0成功', ['user_id' => $user_id]); // 4. RecordUserGameCount 关于用户的数据删除 DB::connection('write')->table('QPRecordDB.dbo.RecordUserGameCount') ->where('UserID', $user_id) ->delete(); \Log::info('RecordUserGameCount清除成功', ['user_id' => $user_id]); \Log::info('金币银币切换完成', [ 'user_id' => $user_id, 'insure_score' => $scoreInfo->Score ?? 0 ]); } catch (\Exception $e) { \Log::error('金币银币切换异常', [ 'user_id' => $user_id, 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); throw $e; } } /** * 创建首充礼包记录 */ public function createFirstPayGiftRecord($user_id, $gift_id, $payAmt) { // 检查是否已有记录 $existing = DB::connection('write')->table('agent.dbo.first_pay_gift_records') ->where('user_id', $user_id) ->first(); if ($existing) { \Log::info('首充礼包记录已存在', ['user_id' => $user_id]); return; } // 获取礼包配置 $giftConfig = DB::connection('write')->table('agent.dbo.recharge_gift') ->where('gift_id', $gift_id) ->first(); if (!$giftConfig) { \Log::error('首充礼包配置不存在', ['gift_id' => $gift_id]); return; } // 计算金额 $totalBonusAmount = round($giftConfig->total_bonus * $payAmt / 100, 2); $bonusInstantlyAmount = round($giftConfig->bonus_instantly * $payAmt / 100, 2); // 解析JSON数据 $dayRewards = $giftConfig->day_rewards ? json_decode($giftConfig->day_rewards, true) : null; $bettingBonus = $giftConfig->betting_bonus ? json_decode($giftConfig->betting_bonus, true) : null; $bettingTask = $giftConfig->betting_task ? json_decode($giftConfig->betting_task, true) : null; // 计算各部分金额 $dayRewardsTotal = $dayRewards ? round($dayRewards['total_bonus'] * $payAmt / 100, 2) : 0; $bettingBonusTotal = $bettingBonus ? round($bettingBonus['total_bonus'] * $payAmt / 100, 2) : 0; $bettingTaskTotal = $bettingTask ? round($bettingTask['total_bonus'] * $payAmt / 100, 2) : 0; // 创建记录 $data = [ 'user_id' => $user_id, 'gift_id' => $gift_id, 'pay_amount' => $payAmt, 'total_bonus' => $totalBonusAmount, 'bonus_instantly' => $bonusInstantlyAmount, 'gift_name' => $giftConfig->gift_name, // 每日奖励 'day_rewards_total' => $dayRewardsTotal, 'day_rewards_claimed' => 0, 'day_rewards_data' => $giftConfig->day_rewards, 'day_last_claim_date' => null, // 下注奖励 'betting_bonus_total' => $bettingBonusTotal, 'betting_bonus_claimed' => 0, 'betting_bonus_data' => $giftConfig->betting_bonus, 'betting_current_bet' => 0, // 下注任务 'betting_task_total' => $bettingTaskTotal, 'betting_task_claimed' => 0, 'betting_task_data' => $giftConfig->betting_task, 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s') ]; DB::connection('write')->table('agent.dbo.first_pay_gift_records')->insert($data); $dayRewardsTotal = $dayRewards ? round($dayRewards['total_bonus'] * $payAmt / 100, 2) : 0; $bettingBonusTotal = $bettingBonus ? round($bettingBonus['total_bonus'] * $payAmt / 100, 2) : 0; $bettingTaskTotal = $bettingTask ? round($bettingTask['total_bonus'] * $payAmt / 100, 2) : 0; \Log::info('首充礼包记录创建成功', [ 'user_id' => $user_id, 'gift_id' => $gift_id, 'pay_amount' => $payAmt, 'total_bonus' => $totalBonusAmount, 'rw' => [ $dayRewardsTotal, $bettingBonusTotal, $bettingTaskTotal, round($dayRewards['total_bonus'] * $payAmt / 100, 2), round($bettingBonus['total_bonus'] * $payAmt / 100, 2), round($bettingTask['total_bonus'] * $payAmt / 100, 2) ] ]); } }