From 6edee924c7185a39008d029883eac32e94f194c6 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 19:34:01 +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 | 231 ++++++++++++++++++--------------- 1 file changed, 128 insertions(+), 103 deletions(-) diff --git a/application/api/model/Room.php b/application/api/model/Room.php index d6469a85..82bf26a3 100644 --- a/application/api/model/Room.php +++ b/application/api/model/Room.php @@ -1800,122 +1800,147 @@ class Room extends Model //房间在线列表 - //房间在线列表 -public function room_online_list($room_id, $page = 1, $limit = 5) -{ - if (!$room_id) { - return ['code' => 0, 'msg' => '参数错误']; - } - - $lists['on_pit'] = []; - $lists['off_pit'] = []; - - // 修改count计算逻辑:在麦上的用户即使隐身也要计算在内 - $lists['count'] = db::name('vs_room_visitor')->alias('a') - ->join('user b', 'a.user_id = b.id','left') - ->where(function($query) use ($room_id) { - $query->where(['a.room_id' => $room_id,'b.hide_status'=>0]) // 非隐身用户 - ->whereOr(function($query2) use ($room_id) { - // 或者是隐身但已在麦上的用户 - $query2->where(['a.room_id' => $room_id,'b.hide_status'=>1,'a.is_onpit'=>0]); - }); - }) - ->count(); - - // 第一页特殊处理,显示麦上用户 - if ($page == 1) { - $onPitUser = db::name('vs_room_visitor')->alias('a') - ->join('user b', 'a.user_id = b.id') - ->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit') - ->where(['a.room_id' => $room_id,'a.is_onpit' => 0])//is_onpit:1-未上麦,0-已上麦 - ->select(); - if(!empty($onPitUser)){ - foreach ($onPitUser as &$v) { - $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 - $v['icon'][1] = model('UserData')->user_charm_icon($v['user_id']);//魅力图标 - //判断是否是歌手 如果是 返回等级图标 - $isSinnger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); - if ($isSinnger) { - $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger, 'deletetime' => 0])->value('image');//等级图标 - } - //用户的角色 - $role = $this->get_user_role($v['user_id'], $room_id); - $v['role'] = $role['role']; - $v['pit_number'] = $role['pit_number']; - } - unset($v); // 释放引用 - $lists['on_pit'] = $onPitUser; + public function room_online_list($room_id, $page = 1, $limit = 5) + { + if (!$room_id) { + return ['code' => 0, 'msg' => '参数错误']; } - } - // 计算麦下用户需要的数量 - $onPitCount = count($lists['on_pit']); - $needOffPitCount = $limit - $onPitCount; + $lists['on_pit'] = []; + $lists['off_pit'] = []; - // 获取麦下用户(非隐身用户) - if ($needOffPitCount > 0) { - // 计算偏移量 - $offset = ($page - 1) * $limit; + // 修改count计算逻辑:在麦上的用户即使隐身也要计算在内 + $lists['count'] = db::name('vs_room_visitor')->alias('a') + ->join('user b', 'a.user_id = b.id','left') + ->where(function($query) use ($room_id) { + $query->where(['a.room_id' => $room_id,'b.hide_status'=>0]) // 非隐身用户 + ->whereOr(function($query2) use ($room_id) { + // 或者是隐身但已在麦上的用户 + $query2->where(['a.room_id' => $room_id,'b.hide_status'=>1,'a.is_onpit'=>0]); + }); + }) + ->count(); + + // 第一页特殊处理,显示麦上用户 if ($page == 1) { - // 第一页只需要补充到limit数量 - $actualOffset = 0; - } else { - // 其他页需要考虑麦上用户占用的位置 - // 麦上用户只在第一页显示,所以其他页的偏移量需要减去第一页麦上用户的数量 - $actualOffset = ($page - 1) * $limit - $onPitCount; - } - - $offPitUser = db::name('vs_room_visitor')->alias('a') - ->join('user b', 'a.user_id = b.id') - ->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit') - ->where(['a.room_id' => $room_id,'b.hide_status' => 0,'a.is_onpit' => 1]) // 非隐身且未上麦 - ->limit($actualOffset, $needOffPitCount) - ->select(); - - if(!empty($offPitUser)){ - foreach ($offPitUser as &$v) { - $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 - $v['icon'][1] = model('UserData')->user_charm_icon($v['user_id']);//魅力图标 - //判断是否是歌手 如果是 返回等级图标 - $isSinnger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); - if ($isSinnger) { - $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger, 'deletetime' => 0])->value('image');//等级图标 + $onPitUser = db::name('vs_room_visitor')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit') + ->where(['a.room_id' => $room_id,'a.is_onpit' => 0])//is_onpit:1-未上麦,0-已上麦 + ->select(); + if(!empty($onPitUser)){ + foreach ($onPitUser as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_charm_icon($v['user_id']);//魅力图标 + //判断是否是歌手 如果是 返回等级图标 + $isSinnger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinnger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger, 'deletetime' => 0])->value('image');//等级图标 + } + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + $v['pit_number'] = $role['pit_number']; } - - //用户的角色 - $role = $this->get_user_role($v['user_id'], $room_id); - $v['role'] = $role['role']; - $v['pit_number'] = $role['pit_number']; + unset($v); // 释放引用 + $lists['on_pit'] = $onPitUser; } - unset($v); // 释放引用 - $lists['off_pit'] = $offPitUser; } - } - // 对麦位上用户按角色排序 - if (!empty($lists['on_pit']) && is_array($lists['on_pit'])) { - usort($lists['on_pit'], function ($a, $b) { - if ($a['role'] == $b['role']) { - return 0; + // 计算麦下用户需要的数量 + $onPitCount = count($lists['on_pit']); + + // 获取麦下用户(非隐身用户) + // 麦下用户分页逻辑: + // 1. 第一页:显示部分麦下用户,使得总数量为limit(如果有足够的麦下用户) + // 2. 后续页:只显示麦下用户,按照正常的分页逻辑 + + if ($page == 1) { + // 第一页:需要的麦下用户数量 = limit - 麦上用户数量 + $needOffPitCount = $limit - $onPitCount; + if ($needOffPitCount > 0) { + $offPitUser = db::name('vs_room_visitor')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit') + ->where(['a.room_id' => $room_id,'b.hide_status' => 0,'a.is_onpit' => 1]) // 非隐身且未上麦 + ->limit(0, $needOffPitCount) + ->select(); + + if(!empty($offPitUser)){ + foreach ($offPitUser as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_charm_icon($v['user_id']);//魅力图标 + //判断是否是歌手 如果是 返回等级图标 + $isSinnger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinnger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger, 'deletetime' => 0])->value('image');//等级图标 + } + + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + $v['pit_number'] = $role['pit_number']; + } + unset($v); // 释放引用 + $lists['off_pit'] = $offPitUser; + } } - return ($a['role'] < $b['role']) ? -1 : 1; - }); - } + } else { + // 第二页及以后:只显示麦下用户 + // 偏移量计算:(页码-1)*每页数量 - 麦上用户数量 + // 因为第一页包含了麦上用户,所以从第二页开始需要调整偏移量 + $offset = ($page - 1) * $limit - $onPitCount; - // 对麦位下用户按角色排序 - if (!empty($lists['off_pit']) && is_array($lists['off_pit'])) { - usort($lists['off_pit'], function ($a, $b) { - if ($a['role'] == $b['role']) { - return 0; + $offPitUser = db::name('vs_room_visitor')->alias('a') + ->join('user b', 'a.user_id = b.id') + ->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit') + ->where(['a.room_id' => $room_id,'b.hide_status' => 0,'a.is_onpit' => 1]) // 非隐身且未上麦 + ->limit($offset, $limit) + ->select(); + + if(!empty($offPitUser)){ + foreach ($offPitUser as &$v) { + $v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 + $v['icon'][1] = model('UserData')->user_charm_icon($v['user_id']);//魅力图标 + //判断是否是歌手 如果是 返回等级图标 + $isSinnger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level'); + if ($isSinnger) { + $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger, 'deletetime' => 0])->value('image');//等级图标 + } + + //用户的角色 + $role = $this->get_user_role($v['user_id'], $room_id); + $v['role'] = $role['role']; + $v['pit_number'] = $role['pit_number']; + } + unset($v); // 释放引用 + $lists['off_pit'] = $offPitUser; } - return ($a['role'] < $b['role']) ? -1 : 1; - }); + } + + // 对麦位上用户按角色排序 + if (!empty($lists['on_pit']) && is_array($lists['on_pit'])) { + usort($lists['on_pit'], function ($a, $b) { + if ($a['role'] == $b['role']) { + return 0; + } + return ($a['role'] < $b['role']) ? -1 : 1; + }); + } + + // 对麦位下用户按角色排序 + if (!empty($lists['off_pit']) && is_array($lists['off_pit'])) { + usort($lists['off_pit'], function ($a, $b) { + if ($a['role'] == $b['role']) { + return 0; + } + return ($a['role'] < $b['role']) ? -1 : 1; + }); + } + + return ['code' => 1, 'msg' => '成功', 'data' => $lists]; } - return ['code' => 1, 'msg' => '成功', 'data' => $lists]; -} - - //用户在房间内的角色