OrderServices.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. <?php
  2. namespace App\Services;
  3. use App\dao\Estatisticas\RechargeWithDraw;
  4. use App\Facade\TableName;
  5. use App\Game\GlobalUserInfo;
  6. use App\Game\Services\AgentService;
  7. use App\Http\Controllers\Api\AgentController;
  8. use App\Http\helper\Helper;
  9. use App\Http\helper\HttpCurl;
  10. use App\Http\helper\NumConfig;
  11. use App\Jobs\AfEvent;
  12. use App\Models\AgentUser;
  13. use App\Models\RecordScoreInfo;
  14. use App\Models\RecordUserDataStatistics;
  15. use App\Util;
  16. use Illuminate\Support\Facades\DB;
  17. use Illuminate\Support\Facades\Log;
  18. use Illuminate\Support\Facades\Redis;
  19. class OrderServices
  20. {
  21. public $FirstCharge = 30;
  22. public $FirstChargeGive = 20;
  23. public $FirstGiftID = 301;
  24. private $first_pay = null;
  25. public function __construct()
  26. {
  27. }
  28. /**
  29. * 获取支付金额
  30. * @param int $GiftsID 礼包ID
  31. * @param int $user_id 用户ID
  32. * @param int $payAmt 支付金额(元)
  33. * @return array|void [$give, $favorable_price, $Recharge, $czReason, $cjReason] 赠送金额,赠送金额+充值金额,充值金额,充值原因,彩金原因
  34. */
  35. public function getPayInfo($GiftsID, $user_id, $payAmt)
  36. {
  37. $give = $czReason = $cjReason = $Recharge = $favorable_price = $second_give = 0;
  38. $shouldCreateGiftRecord = false; // 是否需要创建首充礼包记录
  39. // 判断是不是首冲礼包
  40. if (!empty($GiftsID)) {
  41. if ($GiftsID == 301) { // 礼包--首冲
  42. // 检查用户是否已购买过首充礼包
  43. $hasPurchased = DB::connection('write')->table('agent.dbo.first_pay_gift_records')
  44. ->where('user_id', $user_id)
  45. ->exists();
  46. if ($hasPurchased) {
  47. // 已购买首充礼包,走普通充值逻辑(只加本金)
  48. $Recharge = $payAmt;
  49. $give = 0;
  50. $favorable_price = $Recharge + $give;
  51. $czReason = 1;
  52. $cjReason = 45;
  53. } else {
  54. // 首次购买首充礼包,走赠送逻辑(立即获得bonus_instantly%)
  55. $Gifts = DB::connection('write')->table('agent.dbo.recharge_gift')->where('gift_id', $GiftsID)->first();
  56. $favorable_price = round($Gifts->bonus_instantly*$payAmt/100,2);
  57. $give = $favorable_price-$payAmt;
  58. $Recharge = $payAmt;
  59. $czReason = 50;
  60. $cjReason = 51;
  61. // 创建首充礼包记录
  62. try {
  63. $this->createFirstPayGiftRecord($user_id, $GiftsID, $payAmt);
  64. } catch (\Exception $e) {
  65. \Log::error('首充礼包记录创建失败', [
  66. 'user_id' => $user_id,
  67. 'gift_id' => $GiftsID,
  68. 'error' => $e->getMessage()
  69. ]);
  70. }
  71. }
  72. }else if ($GiftsID > 400) {
  73. $Status = 1;
  74. $recharge_gear = DB::connection('write')->table('agent.dbo.recharge_gear')->where('status', $Status)->where('money', $payAmt)->select('favorable_price', 'give')->first();
  75. if(!$recharge_gear){
  76. $Recharge=$payAmt;
  77. $give=0;
  78. }else{
  79. $Recharge = $recharge_gear->favorable_price;
  80. $give = $recharge_gear->give;
  81. }
  82. $favorable_price = $Recharge + $give;
  83. $czReason = 1;
  84. $cjReason = 45;
  85. }
  86. } else { // 普通订单
  87. $Status = 1;
  88. $recharge_gear = DB::connection('write')->table('agent.dbo.recharge_gear')->where('status', $Status)->where('money', $payAmt)->select('favorable_price', 'give')->first();
  89. if(!$recharge_gear){
  90. $Recharge=$payAmt;
  91. $give=0;
  92. }else{
  93. $Recharge = $recharge_gear->favorable_price;
  94. $give = $recharge_gear->give;
  95. }
  96. $favorable_price = $Recharge + $give;
  97. $czReason = 1;
  98. $cjReason = 45;
  99. }
  100. return [$give, $favorable_price, $Recharge, $czReason, $cjReason, $second_give];
  101. }
  102. /**
  103. * 添加玩家充值记录
  104. * @param $user_id
  105. * @param $payAmt
  106. * @param $favorable_price
  107. * @param $order_sn
  108. * @param $GiftsID
  109. * @param $Recharge
  110. * @param $czReason
  111. * @param $give
  112. * @param $cjReason
  113. * @param $AdId
  114. * @param $eventType
  115. */
  116. public function addRecord($user_id, $payAmt, $favorable_price, $order_sn, $GiftsID, $Recharge, $czReason, $give, $cjReason, $AdId, $eventType)
  117. {
  118. if ($payAmt > 0) {
  119. // 增加玩家充值金额
  120. $query = DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount')
  121. ->where('UserID', $user_id)
  122. ->value('Recharge');
  123. if ($query) {
  124. DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount')
  125. ->where('UserID', $user_id)
  126. ->increment('Recharge', $payAmt);
  127. } else {
  128. DB::connection('write')->table('QPAccountsDB.dbo.YN_VIPAccount')
  129. ->where('UserID', $user_id)
  130. ->insert(['Recharge' => $payAmt, 'UserID' => $user_id]);
  131. // 首次充值:金币银币切换 + 数据清理
  132. /*
  133. * 金币银币切换 GameScoreInfo 将score的数据复制到 InsureScore 把Score 字段置0 把 ScoreChange字段设置成1
  134. * 清理用户的数据
  135. * GameScoreInfo的MaxScore MaxWinscore清0
  136. * RecordUserTotalStatistics 表 数据清0
  137. * RecordUserDataStatisticsNew 表数据 清0
  138. * RecordUserGameCount 关于用户的数据删除
  139. *
  140. */
  141. try {
  142. $this->switchToInsureScoreAndCleanData($user_id);
  143. } catch (\Exception $e) {
  144. \Log::error('首次充值-金币银币切换失败', [
  145. 'user_id' => $user_id,
  146. 'error' => $e->getMessage()
  147. ]);
  148. }
  149. }
  150. //在这里更新 RecordUserTotalStatistics 数据 将LastRechargeValue字段更新为payAmt 如果不存在则插入
  151. DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics')
  152. ->updateOrInsert(['UserID' => $user_id], ['LastRechargeValue' => $payAmt]);
  153. }
  154. if ($Recharge > 0) {
  155. // 添加日志记录表
  156. StoredProcedure::addPlatformData($user_id, 3, $Recharge * NumConfig::NUM_VALUE);
  157. // 增加用户金币变化记录
  158. $AfterScore = RecordScoreInfo::addScore($user_id, ($Recharge * NumConfig::NUM_VALUE), $czReason); #充值
  159. if ($AfterScore) {
  160. RecordScoreInfo::addScore($user_id, ($give * NumConfig::NUM_VALUE), $cjReason, $AfterScore); #赠送彩金
  161. }
  162. }
  163. $favorable_price = (int) round($favorable_price * NumConfig::NUM_VALUE);
  164. $firstScore = DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user_id)->value('Score');
  165. $Score = $favorable_price + $firstScore;
  166. if ($payAmt > 0) {
  167. // 记录订单变化后金币
  168. DB::connection('write')->table('agent.dbo.order')
  169. ->where('order_sn', $order_sn)
  170. ->update(['after_amount' => $Score]);
  171. // 增加用户充值变化值
  172. RecordUserDataStatistics::updateOrAdd($user_id, 0, $payAmt);
  173. }
  174. // 不是周卡的时候执行
  175. if ($GiftsID < 100 || $GiftsID >= 200) {
  176. // 增加用户金币
  177. DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')->where('UserID', $user_id)->increment('Score', $favorable_price);
  178. }
  179. // 充值推广佣金
  180. // (new AgentUser())->reward($user_id, $payAmt, $order_sn);
  181. //
  182. // 周卡 -- 执行存储过程
  183. // if (isset($GiftsID) && $GiftsID > 100 && $GiftsID < 200) {
  184. // $CardID = (int)$GiftsID - 100;
  185. // StoredProcedure::BuyMonthCard($user_id, $CardID, $order_sn);
  186. // // 开始执行时间
  187. // $startTime = Helper::millisecond();
  188. // Log::info('GSP_GP_BuyMonthCard 执行时间:' . ((Helper::millisecond() - $startTime) / 1000));
  189. // }
  190. //设置第二天要领取
  191. // if (isset($GiftsID) && $GiftsID >= 200 && $GiftsID < 300 ) {
  192. // $first = DB::table('agent.dbo.recharge_gear')->where('gift_id', $GiftsID)->select('gift_id', 'money', 'give', 'favorable_price', 'second_give')->first();
  193. // if ($first && $first->second_give > 0) {
  194. // $fpkey = 'Firstpay_' . $user_id;
  195. // $data = (array)$first;
  196. // $data['buytime'] = time();
  197. // $data['czReason'] = $czReason;
  198. // $data['cjReason'] = $cjReason;
  199. // Redis::set($fpkey, json_encode($data));
  200. // DB::table(TableName::agent() . 'guide_payment')->updateOrInsert([
  201. // 'UserID' => $user_id,
  202. // 'GiftID' => $GiftsID,
  203. // 'CreateTime' => now()
  204. // ], ['UserID' => $user_id]);
  205. // }
  206. // }
  207. //设置第二天要领取
  208. if (!empty($GiftsID) && $GiftsID >= 300 && $GiftsID < 400 ) {
  209. Redis::del('repay_temp_'.$user_id);
  210. }
  211. // 数据统计后台 -- 充值记录添加
  212. (new RechargeWithDraw())->recharge($user_id, $payAmt);
  213. // (new RechargeWithDraw())->recharge($user_id, $Recharge);
  214. if ($AdId && $payAmt) AfEvent::dispatch([$user_id, $payAmt, $AdId, $eventType]);
  215. try {
  216. //新邀请
  217. (new AgentController())->processDeposit($user_id, $payAmt,$order_sn);
  218. // AgentService::recordPerformance($user_id, $payAmt * NumConfig::NUM_VALUE);
  219. } catch (\Exception $exception) {
  220. Util::WriteLog("AgentService", $exception->getTraceAsString());
  221. }
  222. return [$Score];
  223. }
  224. /**
  225. * 执行存储过程
  226. * @param $user_id
  227. * @param $payAmt
  228. * @param $favorable_price
  229. * @param $Score
  230. * @param $GiftsID
  231. */
  232. public function storedProcedure($user_id, $payAmt, $favorable_price, $Score, $GiftsID)
  233. {
  234. // 开始执行时间
  235. $startTime = Helper::millisecond();
  236. // 执行存储过程 -- 防刷机制
  237. StoredProcedure::SetUserTabType($user_id);
  238. Log::info('GSP_GP_SetUserTabType12 执行时间:' . ((Helper::millisecond() - $startTime) / 1000));
  239. # 单控标签 -- 执行存储过程
  240. StoredProcedure::user_label($user_id, 1, $payAmt);
  241. Log::info('CheckAccountsLabel 执行时间:' . ((Helper::millisecond() - $startTime) / 1000));
  242. // 服务器通知
  243. // $url = config('transfer.stock')['url'] . 'notifyPay';
  244. // Log::info('中转服参数 ' . json_encode([
  245. // 'userid' => $user_id, 'getScore' => $favorable_price, 'score' => $Score,
  246. // 'giftsid' => empty($GiftsID) ? 0 : $GiftsID,
  247. // 'url' => $url
  248. // ]));
  249. // $res = (new HttpCurl())->service($url, ['userid' => $user_id, 'getScore' => $favorable_price, 'score' => $Score, 'giftsid' => empty($GiftsID) ? 0 : $GiftsID]);
  250. //
  251. // Log::info('中转服 执行时间:' . ((Helper::millisecond() - $startTime) / 1000), [
  252. // 'res' => $res,
  253. // ]);
  254. // AF 事件
  255. // (new AppflyerEvent())->event($user_id, '', 'af_purchase_new', $payAmt);
  256. // Log::info('AF 执行时间:' . ((Helper::millisecond() - $startTime) / 1000));
  257. }
  258. /**
  259. * 首次充值:金币银币切换 + 数据清理
  260. * @param int $user_id 用户ID
  261. */
  262. private function switchToInsureScoreAndCleanData($user_id)
  263. {
  264. \Log::info('开始执行金币银币切换', ['user_id' => $user_id]);
  265. try {
  266. // 1. GameScoreInfo: 将Score的数据复制到InsureScore,把Score字段置0,把ScoreChange字段设置成1
  267. $scoreInfo = DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')
  268. ->where('UserID', $user_id)
  269. ->first();
  270. if ($scoreInfo) {
  271. DB::connection('write')->table('QPTreasureDB.dbo.GameScoreInfo')
  272. ->where('UserID', $user_id)
  273. ->update([
  274. 'InsureScore' => max($scoreInfo->Score,4000), // 将Score复制到InsureScore
  275. 'Score' => 0, // Score置0
  276. 'ScoreChange' => 1, // ScoreChange设置成1
  277. 'MaxScore' => 0, // MaxScore清0
  278. 'MaxWinScore' => 0 // MaxWinScore清0
  279. ]);
  280. \Log::info('GameScoreInfo切换成功', [
  281. 'user_id' => $user_id,
  282. 'original_score' => $scoreInfo->Score,
  283. 'insure_score' => $scoreInfo->Score
  284. ]);
  285. }
  286. // 2. RecordUserTotalStatistics 表数据清0
  287. $totalStats = DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics')
  288. ->where('UserID', $user_id)
  289. ->first();
  290. if ($totalStats) {
  291. DB::connection('write')->table('QPRecordDB.dbo.RecordUserTotalStatistics')
  292. ->where('UserID', $user_id)
  293. ->update([
  294. 'WinInning' => 0,
  295. 'LostInning' => 0,
  296. 'Revenue' => 0,
  297. 'WinScore' => 0,
  298. 'LostScore' => 0,
  299. 'Handsel' => 0,
  300. 'DrawBase' => 0,
  301. 'TotalBet' => 0,
  302. // 'TotalScore' => 0,
  303. 'MaxDrawBase' => 0,
  304. 'MaxScore' => 0,
  305. 'MaxWinScore' => 0,
  306. 'Rounds' => 0,
  307. 'ProtectedRounds' => 0
  308. ]);
  309. \Log::info('RecordUserTotalStatistics清0成功', ['user_id' => $user_id]);
  310. }
  311. // 3. RecordUserDataStatisticsNew 表数据清0
  312. DB::connection('write')->table('QPRecordDB.dbo.RecordUserDataStatisticsNew')
  313. ->where('UserID', $user_id)
  314. ->delete();
  315. \Log::info('RecordUserDataStatisticsNew清0成功', ['user_id' => $user_id]);
  316. // 4. RecordUserGameCount 关于用户的数据删除
  317. DB::connection('write')->table('QPRecordDB.dbo.RecordUserGameCount')
  318. ->where('UserID', $user_id)
  319. ->delete();
  320. \Log::info('RecordUserGameCount清除成功', ['user_id' => $user_id]);
  321. \Log::info('金币银币切换完成', [
  322. 'user_id' => $user_id,
  323. 'insure_score' => $scoreInfo->Score ?? 0
  324. ]);
  325. } catch (\Exception $e) {
  326. \Log::error('金币银币切换异常', [
  327. 'user_id' => $user_id,
  328. 'error' => $e->getMessage(),
  329. 'trace' => $e->getTraceAsString()
  330. ]);
  331. throw $e;
  332. }
  333. }
  334. /**
  335. * 创建首充礼包记录
  336. */
  337. public function createFirstPayGiftRecord($user_id, $gift_id, $payAmt)
  338. {
  339. // 检查是否已有记录
  340. $existing = DB::connection('write')->table('agent.dbo.first_pay_gift_records')
  341. ->where('user_id', $user_id)
  342. ->first();
  343. if ($existing) {
  344. \Log::info('首充礼包记录已存在', ['user_id' => $user_id]);
  345. return;
  346. }
  347. // 获取礼包配置
  348. $giftConfig = DB::connection('write')->table('agent.dbo.recharge_gift')
  349. ->where('gift_id', $gift_id)
  350. ->first();
  351. if (!$giftConfig) {
  352. \Log::error('首充礼包配置不存在', ['gift_id' => $gift_id]);
  353. return;
  354. }
  355. // 计算金额
  356. $totalBonusAmount = round($giftConfig->total_bonus * $payAmt / 100, 2);
  357. $bonusInstantlyAmount = round($giftConfig->bonus_instantly * $payAmt / 100, 2);
  358. // 解析JSON数据
  359. $dayRewards = $giftConfig->day_rewards ? json_decode($giftConfig->day_rewards, true) : null;
  360. $bettingBonus = $giftConfig->betting_bonus ? json_decode($giftConfig->betting_bonus, true) : null;
  361. $bettingTask = $giftConfig->betting_task ? json_decode($giftConfig->betting_task, true) : null;
  362. // 计算各部分金额
  363. $dayRewardsTotal = $dayRewards ? round($dayRewards['total_bonus'] * $payAmt / 100, 2) : 0;
  364. $bettingBonusTotal = $bettingBonus ? round($bettingBonus['total_bonus'] * $payAmt / 100, 2) : 0;
  365. $bettingTaskTotal = $bettingTask ? round($bettingTask['total_bonus'] * $payAmt / 100, 2) : 0;
  366. // 创建记录
  367. $data = [
  368. 'user_id' => $user_id,
  369. 'gift_id' => $gift_id,
  370. 'pay_amount' => $payAmt,
  371. 'total_bonus' => $totalBonusAmount,
  372. 'bonus_instantly' => $bonusInstantlyAmount,
  373. 'gift_name' => $giftConfig->gift_name,
  374. // 每日奖励
  375. 'day_rewards_total' => $dayRewardsTotal,
  376. 'day_rewards_claimed' => 0,
  377. 'day_rewards_data' => $giftConfig->day_rewards,
  378. 'day_last_claim_date' => null,
  379. // 下注奖励
  380. 'betting_bonus_total' => $bettingBonusTotal,
  381. 'betting_bonus_claimed' => 0,
  382. 'betting_bonus_data' => $giftConfig->betting_bonus,
  383. 'betting_current_bet' => 0,
  384. // 下注任务
  385. 'betting_task_total' => $bettingTaskTotal,
  386. 'betting_task_claimed' => 0,
  387. 'betting_task_data' => $giftConfig->betting_task,
  388. 'created_at' => date('Y-m-d H:i:s'),
  389. 'updated_at' => date('Y-m-d H:i:s')
  390. ];
  391. DB::connection('write')->table('agent.dbo.first_pay_gift_records')->insert($data);
  392. $dayRewardsTotal = $dayRewards ? round($dayRewards['total_bonus'] * $payAmt / 100, 2) : 0;
  393. $bettingBonusTotal = $bettingBonus ? round($bettingBonus['total_bonus'] * $payAmt / 100, 2) : 0;
  394. $bettingTaskTotal = $bettingTask ? round($bettingTask['total_bonus'] * $payAmt / 100, 2) : 0;
  395. \Log::info('首充礼包记录创建成功', [
  396. 'user_id' => $user_id,
  397. 'gift_id' => $gift_id,
  398. 'pay_amount' => $payAmt,
  399. 'total_bonus' => $totalBonusAmount,
  400. 'rw' => [
  401. $dayRewardsTotal,
  402. $bettingBonusTotal,
  403. $bettingTaskTotal,
  404. round($dayRewards['total_bonus'] * $payAmt / 100, 2),
  405. round($bettingBonus['total_bonus'] * $payAmt / 100, 2),
  406. round($bettingTask['total_bonus'] * $payAmt / 100, 2)
  407. ]
  408. ]);
  409. }
  410. }