| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | 
							- <?php
 
- namespace App\Services;
 
- use App\Constants\StepStatus;
 
- use App\Exceptions\MessageException;
 
- use App\Models\BalanceLog;
 
- use App\Models\Config;
 
- use App\Models\Room;
 
- use App\Models\RoomUser;
 
- use App\Models\User;
 
- use App\Models\Wallet;
 
- use Illuminate\Support\Facades\Cache;
 
- use Illuminate\Support\Facades\Storage;
 
- use Telegram\Bot\Api;
 
- //结算相关
 
- class SettlementService
 
- {
 
-     private $telegram;
 
-     public function __construct()
 
-     {
 
-         $this->telegram = new Api(config('services.telegram.token'));
 
-     }
 
-     //用户提交结算数据
 
-     public function submitSettle($chatId, $score, $messageId = null)
 
-     {
 
-         if (!preg_match('/^-?\d+$/', $score)) {
 
-             return [
 
-                 'status' => false,
 
-                 'data' => [[
 
-                     'chat_id' => $chatId,
 
-                     'text' => '输入错误,请发送结算分数',
 
-                     'reply_to_message_id' => $messageId
 
-                 ]]
 
-             ];
 
-         }
 
-         $score = intval($score);
 
-         $ru = RoomUser::whereIn('status', [2, 3])
 
-             ->where('member_id', $chatId)->first();
 
-         if (!$ru) {
 
-             return [
 
-                 'status' => false,
 
-                 'data' => [['chat_id' => $chatId, 'text' => '没有待结算的对局']]
 
-             ];
 
-         }
 
-         $ru->status = 3;
 
-         $ru->score = $score;
 
-         $ru->save();
 
-         $list = RoomUser::where('status', 3)
 
-             ->where('room_id', $ru->room_id)
 
-             ->orderBy('score', 'desc')->get();
 
-         $count = RoomUser::where('room_id', $ru->room_id)->count();
 
-         if (count($list) == $count) {
 
-             $totalAmount = RoomUser::where('status', 3)
 
-                 ->where('room_id', $ru->room_id)->sum('score');
 
-             if ($totalAmount != 0) {
 
-                 $text = "❌经过系统结算,盈利额与亏损\n";
 
-                 $text .= "额度无法匹配,无法进行结算,\n";
 
-                 $text .= "请检查战绩是否正确,如果错误\n";
 
-                 $text .= "请重新输入正确的战绩!\n\n";
 
-                 $text .= "您输入的战绩如下:\n";
 
-                 $arr = [];
 
-                 foreach ($list as $item) {
 
-                     $str = $text . "--------------------------------\n";
 
-                     $str .= "房间号:{$item->room_id}\n";
 
-                     $str .= "用户:{$item->game_id}\n";
 
-                     $str .= "战绩:{$item->score}\n";
 
-                     $arr[] = [
 
-                         'chat_id' => $item->member_id,
 
-                         'text' => $str
 
-                     ];
 
-                 }
 
-                 return ['status' => false, 'data' => $arr];
 
-             }
 
-             //抽佣比例
 
-             $brokerage = Config::where('field', 'brokerage')->first();
 
-             $brokerage = $brokerage->val;
 
-             $room = Room::where('room_id', $ru->room_id)->first();
 
-             $room->status = 3;
 
-             $room->save();
 
-             $maxScore = 0;
 
-             foreach ($list as $index => $item) {
 
-                 $a = bcmul($item->score, $room->base_score, 0);
 
-                 if ($index == 0) $maxScore = $item->score;
 
-                 //最赢着
 
-                 if ($item->score == $maxScore) {
 
-                     $item->brokerage = bcmul($a, $brokerage, 10);
 
-                     $item->real_score = bcsub($a, $item->brokerage, 10);
 
-                 }//
 
-                 //其余人员
 
-                 else {
 
-                     $item->brokerage = 0;
 
-                     $item->real_score = $a;
 
-                 }
 
-                 $item->status = 4;
 
-                 $item->save();
 
-                 $wallet = Wallet::where('member_id', $item->member_id)->first();
 
-                 $available_balance = $wallet->available_balance;
 
- //                $user = User::where('member_id', $item->member_id)->first();
 
-                 $usdt = bcadd($available_balance, $item->real_score, 10);
 
-                 if ($usdt < 0) {
 
-                     $ttt = floatval($available_balance);
 
-                     $rr = "❌结算失败\n";
 
-                     $rr .= "您的余额不足\n\n";
 
-                     $rr .= "钱包余额:{$ttt} USDT\n";
 
-                     $ttt = floatval($item->real_score);
 
-                     $rr .= "结算金额:{$ttt} USDT\n";
 
-                     $rr .= "请充值后重新进行结算";
 
-                     $keyboard = [[
 
-                         ['text' => '➕充值', 'callback_data' => "topup@@topup"],
 
-                     ]];
 
-                     $errorMsg = json_encode([
 
-                         'chat_id' => $item->member_id,
 
-                         'text' => $rr,
 
-                         'reply_markup' => json_encode(['inline_keyboard' => $keyboard])
 
-                     ]);
 
-                     throw new MessageException($errorMsg, 400);
 
-                 }
 
-                 $wallet->available_balance = $usdt;
 
-                 $wallet->save();
 
-                 $newRoomId = RoomService::resetRoomId($item->room_id);
 
-                 BalanceLogService::addLog(
 
-                     $item->member_id,
 
-                     $item->real_score,
 
-                     $available_balance,
 
-                     $wallet->available_balance,
 
-                     '结算',
 
-                     $item->id,
 
-                     '',
 
-                     $newRoomId
 
-                 );
 
-             }
 
-             $arr = [];
 
-             foreach ($list as $item) {
 
-                 $text = "✅ 所有用户已经上传并且输入战绩结果,系统计算完毕!如果有纠纷,余额已变动,请及时联系在线客服\n";
 
-                 $text .= "🗂 {$room->game_name}   {$room->participants}人   {$room->rounds}局\n";
 
-                 $text .= "房间号:{$room->room_id}\n";
 
-                 $text .= "底分:{$room->base_score} USDT\n";
 
-                 $text .= "-------------------------------------\n";
 
-                 foreach ($list as $item1) {
 
-                     $text .= "用户:{$item1->first_name}({$item1->game_id})\n";
 
-                     $text .= "战绩:{$item1->score}\n";
 
-                     $temp = floatval($item1->real_score);
 
-                     $text .= "盈亏:{$temp} USDT\n";
 
-                     $temp = floatval($item1->brokerage);
 
-                     if ($temp > 0) $text .= "抽佣:{$temp} USDT\n";
 
-                     $text .= "-------------------------------------\n";
 
-                 }
 
-                 $arr[] = [
 
-                     'chat_id' => $item->member_id,
 
-                     'text' => $text
 
-                 ];
 
-             }
 
-             return ['status' => true, 'data' => $arr];
 
-         }
 
-         $keyboard = [[
 
-             ['text' => '返回', 'callback_data' => "games@@home{$ru->room_id}"],
 
-         ]];
 
-         $score = $score >= 0 ? "+{$score}" : $score;
 
-         Cache::delete(get_step_key($chatId));
 
-         return ['status' => false, 'data' => [[
 
-             'chat_id' => $chatId,
 
-             'text' => "🏆用户(ID:{$chatId})已上传战绩,并输入结果:\n{$score}。请等待其余用户完成上传,系统将在所有\n人输入后进行结算。",
 
-             'reply_markup' => json_encode(['inline_keyboard' => $keyboard])
 
-         ]]];
 
-     }
 
-     //用户点击结算游戏
 
-     public function settle($roomId, $chatId, $messageId)
 
-     {
 
-         $ru = RoomUser::where('room_id', $roomId)
 
-             ->whereIn('status', [2, 3])
 
-             ->where('member_id', $chatId)->first();
 
-         if (!$ru) return ['chat_id' => $chatId, 'text' => '❌游戏未开始或已结束', 'message_id' => $messageId];
 
-         $keyboard = [[
 
-             ['text' => '返回', 'callback_data' => "games@@home{$roomId}"],
 
-         ]];
 
-         Cache::put(get_step_key($chatId), StepStatus::INPUT_IMAGE);
 
-         return [
 
-             'chat_id' => $chatId,
 
-             'text' => "‼️ 请务必上传战绩截图!如出现纠纷,系统将以截图\n作为处理依据。若未上传战绩截图,产生的纠纷责任\n将由您自行承担。",
 
- //            'message_id' => $messageId,
 
- //            'reply_markup' => json_encode(['inline_keyboard' => $keyboard])
 
-         ];
 
-     }
 
-     //用户发送结算截图
 
-     public function photo($photo, $chatId)
 
-     {
 
-         $file = $this->telegram->getFile(['file_id' => $photo['file_id']]);
 
-         $filePath = $file->getFilePath();
 
-         $token = config('services.telegram.token');
 
-         $file_url = "https://api.telegram.org/file/bot{$token}/{$filePath}";
 
-         $file_info = pathinfo($file_url);
 
-         $roomUser = RoomUser::whereIn('status', [2, 3])
 
-             ->where('member_id', $chatId)->first();
 
-         if ($roomUser) {
 
-             $roomId = $roomUser->room_id;
 
-             $save_path = storage_path("app/public/images/{$roomId}/");
 
-             if (!is_dir($save_path)) {
 
-                 mkdir($save_path, 0777, true);
 
-             }
 
-             $fileName = "{$chatId}.{$file_info['extension']}";
 
-             $save_path .= $fileName;
 
-             file_put_contents($save_path, file_get_contents($file_url));
 
-             $path = Storage::url("images/{$roomId}/" . $fileName);
 
-             $roomUser->screenshot = $path;
 
-             $roomUser->save();
 
-             $text = "✅ 已收到您的战绩截图。请根据结果输入战绩分数:\n";
 
-             $text .= "如果盈利 10,输入 10\n";
 
-             $text .= "如果亏损 10,输入 -10\n";
 
-             $text .= "系统将在所有人输入战绩后进行结算。";
 
-             Cache::put(get_step_key($chatId), StepStatus::INPUT_SCORE);
 
-             $keyboard = [[
 
-                 ['text' => '返回', 'callback_data' => "games@@home{$roomId}"],
 
-             ]];
 
-             return [
 
-                 'chat_id' => $chatId,
 
-                 'text' => $text,
 
- //                'reply_markup' => json_encode(['inline_keyboard' => $keyboard])
 
-             ];
 
-         }
 
-         return false;
 
-     }
 
- }
 
 
  |