| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- <?php
- namespace App\Services;
- use App\dao\Estatisticas\RechargeWithDraw;
- use App\Facade\TableName;
- use App\Game\GlobalUserInfo;
- use App\Game\Services\AgentService;
- use App\Http\Controllers\Api\AgentController;
- use App\Http\helper\Helper;
- use App\Http\helper\HttpCurl;
- use App\Http\helper\NumConfig;
- use App\Jobs\AfEvent;
- use App\Models\AgentUser;
- use App\Models\RecordScoreInfo;
- use App\Models\RecordUserDataStatistics;
- use App\Services\HolidayWheelService;
- use App\Util;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Facades\Redis;
- class OrderServices
- {
- public $FirstCharge = 30;
- public $FirstChargeGive = 20;
- public $FirstGiftID = 301;
- private $first_pay = null;
- public function __construct()
- {
- }
- /**
- * 获取支付金额
- * @param int $GiftsID 礼包ID
- * @param int $user_id 用户ID
- * @param int $payAmt 支付金额(元)
- * @return array|void [$give, $favorable_price, $Recharge, $czReason, $cjReason] 赠送金额,赠送金额+充值金额,充值金额,充值原因,彩金原因
- */
- public function getPayInfo($GiftsID, $user_id, $payAmt)
- {
- $give = $czReason = $cjReason = $Recharge = $favorable_price = $second_give = 0;
- $shouldCreateGiftRecord = false; // 是否需要创建首充礼包记录
- // 判断是不是首冲礼包
- if (!empty($GiftsID)) {
- if ($GiftsID == 301) { // 礼包--首冲
- // 检查用户是否已购买过首充礼包
- $hasPurchased = DB::connection('write')->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(),
- ]);
- }
- }
- 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)
- ]
- ]);
- }
- }
|