| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | <?phpnamespace 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;    }}
 |