From 1ca65ed7bad1e002b0566abd0c2d65308230723b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E6=B8=85?= <18691022700@163.com> Date: Tue, 9 Dec 2025 15:31:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=BF=E9=97=B4=E7=94=A8=E6=88=B7=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/model/Room.php | 180 ++++++++++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 2 deletions(-) diff --git a/application/api/model/Room.php b/application/api/model/Room.php index 12a5ee00..29b93177 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -1504,7 +1504,7 @@ class Room extends Model //房间在线列表 - public function room_online_list($room_id, $page, $limit) + public function room_online_lists($room_id, $page, $limit) { $lists['on_pit'] = []; $lists['off_pit'] = []; @@ -1623,6 +1623,182 @@ class Room extends Model } + //房间在线列表 + public function room_online_list($room_id, $page, $limit) + { + if (!$room_id) { + return ['code' => 0, 'msg' => '参数错误']; + } + + $roomType = db::name('vs_room')->where(['id' => $room_id])->field('type_id,label_id')->find(); + if (!$roomType) { + return ['code' => 0, 'msg' => '房间不存在']; + } + + $onPitUserIds = []; + $lists['on_pit'] = db::name('vs_room_pit')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->where(['a.room_id' => $room_id, 'a.user_id' => ['>', 0]]) + ->field('a.user_id,b.nickname,b.avatar,a.pit_number') + ->select(); + + // 处理麦位上的用户信息 + if (!empty($lists['on_pit']) && is_array($lists['on_pit'])) { + foreach ($lists['on_pit'] as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_wealth_icon($v['user_id'], 1);//等级图标 + $isSinger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinger, 'deletetime' => 0])->value('image');//等级图标 + } + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + } + unset($v); // 释放引用 + + // 根据角色排序 房主>管理员>主持人>普通用户 + usort($lists['on_pit'], function ($a, $b) { + if ($a['role'] == $b['role']) { + return 0; + } + return ($a['role'] < $b['role']) ? -1 : 1; + }); + + $onPitUserIds = array_column($lists['on_pit'], 'user_id'); + } else { + $lists['on_pit'] = []; + } + + // 根据房间类型处理不同情况下的麦位用户 + if ($roomType['type_id'] == 10 || $roomType['type_id'] == 9 || $roomType['type_id'] == 7 || + ($roomType['type_id'] == 1 && $roomType['label_id'] == 1)) { + // 这些房间类型已处理过麦位用户,无需额外处理 + } elseif ($roomType['type_id'] == 1 && $roomType['label_id'] == 2) { // K歌房 + // 处理K歌房的模拟麦位用户 + $onPitUser = db::name('vs_room_pit_simulate')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->field('a.user_id,b.nickname,b.avatar') + ->where(['a.room_id' => $room_id]) + ->select(); + + if (!empty($onPitUser) && is_array($onPitUser)) { + foreach ($onPitUser as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_wealth_icon($v['user_id'], 1);//等级图标 + $isSinger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinger, 'deletetime' => 0])->value('image');//等级图标 + } + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + } + unset($v); // 释放引用 + + // 把模拟麦位用户添加到麦位用户列表后面 + $lists['on_pit'] = array_merge($lists['on_pit'], $onPitUser); + + // 重新根据角色排序 房主>管理员>主持人>普通用户 + usort($lists['on_pit'], function ($a, $b) { + if ($a['role'] == $b['role']) { + return 0; + } + return ($a['role'] < $b['role']) ? -1 : 1; + }); + + $onPitUserIds = array_column($lists['on_pit'], 'user_id'); + } + } elseif ($roomType['type_id'] == 2) { // 拍卖房 + $auction_id = db::name('vs_room_auction') + ->where(['room_id' => $room_id]) + ->order('auction_id', 'desc') + ->field('auction_id,status,gift_price') + ->find(); + + if ($auction_id && $auction_id['status'] == 2) { + $auct = db::name('vs_room_auction_bid_log')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->field('a.user_id, SUM(a.gift_price) AS gift_prices, b.nickname,b.avatar') + ->where(['a.auction_id' => $auction_id['auction_id']]) + ->group('user_id') + ->having('gift_prices >= ' . $auction_id['gift_price']) + ->order('gift_prices DESC') + ->limit(6) + ->select(); + + if (!empty($auct) && is_array($auct)) { + foreach ($auct as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_wealth_icon($v['user_id'], 1);//等级图标 + $isSinger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinger, 'deletetime' => 0])->value('image');//等级图标 + } + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + } + unset($v); // 释放引用 + + // 把竞拍用户添加到麦位用户列表后面 + $lists['on_pit'] = array_merge($lists['on_pit'], $auct); + + // 重新根据角色排序 房主>管理员>主持人>普通用户 + usort($lists['on_pit'], function ($a, $b) { + if ($a['role'] == $b['role']) { + return 0; + } + return ($a['role'] < $b['role']) ? -1 : 1; + }); + + $onPitUserIds = array_column($lists['on_pit'], 'user_id'); + } + } + } + + // 处理不在麦位上的用户(观众) + $lists['off_pit'] = db::name('vs_room_visitor')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->field('a.user_id,b.nickname,b.avatar') + ->where([ + 'a.room_id' => $room_id, + 'b.hide_status' => 0, // 非隐身用户 + 'a.user_id' => ['not in', empty($onPitUserIds) ? [0] : $onPitUserIds] // 不在麦位上的用户 + ]) + ->page($page, $limit) + ->select(); + + if (!empty($lists['off_pit']) && is_array($lists['off_pit'])) { + foreach ($lists['off_pit'] as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_wealth_icon($v['user_id'], 1);//等级图标 + $isSinger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinger, 'deletetime' => 0])->value('image');//等级图标 + } + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + } + unset($v); // 释放引用 + + // 根据角色排序 房主>管理员>主持人>普通用户 + usort($lists['off_pit'], function ($a, $b) { + if ($a['role'] == $b['role']) { + return 0; + } + return ($a['role'] < $b['role']) ? -1 : 1; + }); + } else { + $lists['off_pit'] = []; + } + + return ['code' => 1, 'msg' => '成功', 'data' => $lists]; + } + + + //用户在房间内的角色 public function get_user_role($user_id, $room_id) { @@ -1639,7 +1815,7 @@ class Room extends Model }else{ $return['role'] = 4; } - $return['pit_number'] = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $user_id])->value('pit_number') ?? 0; +// $return['pit_number'] = db::name('vs_room_pit')->where(['room_id' => $room_id, 'user_id' => $user_id])->value('pit_number') ?? 0; return $return; }