房间用户列表

This commit is contained in:
2025-12-09 19:34:01 +08:00
parent dd8ec0d7df
commit 6edee924c7

View File

@@ -1800,122 +1800,147 @@ class Room extends Model
//房间在线列表 //房间在线列表
//房间在线列表 public function room_online_list($room_id, $page = 1, $limit = 5)
public function room_online_list($room_id, $page = 1, $limit = 5) {
{ if (!$room_id) {
if (!$room_id) { return ['code' => 0, 'msg' => '参数错误'];
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_onpit1-未上麦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;
} }
}
// 计算麦下用户需要的数量 $lists['on_pit'] = [];
$onPitCount = count($lists['on_pit']); $lists['off_pit'] = [];
$needOffPitCount = $limit - $onPitCount;
// 获取麦下用户(非隐身用户) // 修改count计算逻辑在麦上的用户即使隐身也要计算在内
if ($needOffPitCount > 0) { $lists['count'] = db::name('vs_room_visitor')->alias('a')
// 计算偏移量 ->join('user b', 'a.user_id = b.id','left')
$offset = ($page - 1) * $limit; ->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) { if ($page == 1) {
// 第一页只需要补充到limit数量 $onPitUser = db::name('vs_room_visitor')->alias('a')
$actualOffset = 0; ->join('user b', 'a.user_id = b.id')
} else { ->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_onpit1-未上麦0-已上麦
// 麦上用户只在第一页显示,所以其他页的偏移量需要减去第一页麦上用户的数量 ->select();
$actualOffset = ($page - 1) * $limit - $onPitCount; if(!empty($onPitUser)){
} foreach ($onPitUser as &$v) {
$v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标
$offPitUser = db::name('vs_room_visitor')->alias('a') $v['icon'][1] = model('UserData')->user_charm_icon($v['user_id']);//魅力图标
->join('user b', 'a.user_id = b.id') //判断是否是歌手 如果是 返回等级图标
->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit') $isSinnger = db::name('vs_singer')->where(['user_id' => $v['user_id'], 'status' => 1])->value('level');
->where(['a.room_id' => $room_id,'b.hide_status' => 0,'a.is_onpit' => 1]) // 非隐身且未上麦 if ($isSinnger) {
->limit($actualOffset, $needOffPitCount) $v['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger, 'deletetime' => 0])->value('image');//等级图标
->select(); }
//用户的角色
if(!empty($offPitUser)){ $role = $this->get_user_role($v['user_id'], $room_id);
foreach ($offPitUser as &$v) { $v['role'] = $role['role'];
$v['icon'][0] = model('UserData')->user_wealth_icon($v['user_id']);//财富图标 $v['pit_number'] = $role['pit_number'];
$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');//等级图标
} }
unset($v); // 释放引用
//用户的角色 $lists['on_pit'] = $onPitUser;
$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;
} }
}
// 对麦位上用户按角色排序 // 计算麦下用户需要的数量
if (!empty($lists['on_pit']) && is_array($lists['on_pit'])) { $onPitCount = count($lists['on_pit']);
usort($lists['on_pit'], function ($a, $b) {
if ($a['role'] == $b['role']) { // 获取麦下用户(非隐身用户)
return 0; // 麦下用户分页逻辑:
// 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;
// 对麦位下用户按角色排序 $offPitUser = db::name('vs_room_visitor')->alias('a')
if (!empty($lists['off_pit']) && is_array($lists['off_pit'])) { ->join('user b', 'a.user_id = b.id')
usort($lists['off_pit'], function ($a, $b) { ->field('a.user_id,b.nickname,b.avatar,b.hide_status,a.is_onpit')
if ($a['role'] == $b['role']) { ->where(['a.room_id' => $room_id,'b.hide_status' => 0,'a.is_onpit' => 1]) // 非隐身且未上麦
return 0; ->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];
}
//用户在房间内的角色 //用户在房间内的角色