2025-08-13 10:43:56 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace app\api\model;
|
|
|
|
|
|
|
|
|
|
|
|
use think\Db;
|
|
|
|
|
|
use think\Model;
|
|
|
|
|
|
use think\Cache;
|
|
|
|
|
|
|
|
|
|
|
|
class RoomSong extends Model
|
|
|
|
|
|
{
|
|
|
|
|
|
protected $name = 'vs_room_song';
|
|
|
|
|
|
|
|
|
|
|
|
//申请点歌模式
|
|
|
|
|
|
public function apply_song($uid,$room_id){
|
|
|
|
|
|
if(!$room_id){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'请选择房间','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//查找当房间的主持麦有无主持
|
|
|
|
|
|
$host_id = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 9])->value('user_id');
|
|
|
|
|
|
if($host_id <= 0){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'当前暂无主持人!,不能申请点歌!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//查询当前房间是否在PK中
|
|
|
|
|
|
$is_pk = db::name('vs_room_pk')->where(['room_id_a' => $room_id])->where(['status' => ['in',[2,3,4,7]]])
|
|
|
|
|
|
->field('pk_id')->find();
|
|
|
|
|
|
if(!$is_pk){
|
|
|
|
|
|
$is_pk = db::name('vs_room_pk')->where(['room_id_b' => $room_id])->where(['status' => ['in',[2,3,4,7]]])
|
|
|
|
|
|
->field('pk_id')->find();
|
|
|
|
|
|
}
|
|
|
|
|
|
if($is_pk){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'当前房间PK中!不能申请点歌!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//查询当前房间的状态 点歌状态:1-等待点歌申请,2-申请中,3-点歌中 4-拒绝'
|
|
|
|
|
|
$room_status = db::name('vs_room')->where('id',$room_id)->value('is_song');
|
|
|
|
|
|
if($room_status == 1 || $room_status == 4){
|
|
|
|
|
|
$res = db::name('vs_room')->where('id',$room_id)->update(['is_song' => 2]);
|
|
|
|
|
|
//缓存申请时间
|
|
|
|
|
|
Cache::set('apply_song_time_'.$room_id,time());
|
|
|
|
|
|
//缓存申请用户
|
|
|
|
|
|
Cache::set('apply_song_user_'.$room_id,$uid);
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'申请失败!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//推送消息
|
|
|
|
|
|
$FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find();
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'FromUserInfo' => $FromUserInfo,
|
|
|
|
|
|
'action' => 1 //申请点歌
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$room_id,$text);
|
|
|
|
|
|
return ['code'=>1,'msg'=>'申请成功!等待主持同意!','data'=>null];
|
|
|
|
|
|
}elseif($room_status == 2){
|
|
|
|
|
|
//获取申请时间
|
|
|
|
|
|
$apply_song_time = Cache::get('apply_song_time_'.$room_id);
|
|
|
|
|
|
if(time() - $apply_song_time > 20){
|
|
|
|
|
|
//修改房间状态
|
|
|
|
|
|
$res = db::name('vs_room')->where('id',$room_id)->update(['is_song' => 1]);
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'操作失败!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//拒绝上一次的申请
|
|
|
|
|
|
//获取上次申请用户
|
|
|
|
|
|
$apply_song_user = Cache::get('apply_song_user_'.$room_id);
|
|
|
|
|
|
if($apply_song_user != $uid){
|
|
|
|
|
|
$FromUserInfo = db::name('user')->where('id',$apply_song_user)->field('id as user_id,nickname,avatar,sex')->find();
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'FromUserInfo' => $FromUserInfo,
|
|
|
|
|
|
'action' => 4 //拒绝申请点歌
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$room_id,$text);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$this->apply_song($uid,$room_id);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
return ['code'=>1,'msg'=>'已经申请,等待主持同意!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
return ['code'=>0,'msg'=>'点歌中!请稍后再试!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//同意点歌
|
|
|
|
|
|
public function agree_song($user_id,$room_id,$type){
|
|
|
|
|
|
//判断用户是否在主持麦
|
|
|
|
|
|
$host_id = db::name('vs_room_pit')->where(['room_id' => $room_id,'user_id' => $user_id])->value('pit_number');
|
|
|
|
|
|
if($host_id != 9){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'您不在主持麦,不能操作!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
$res1 = db::name('vs_room')->where('id',$room_id)->where(['label_id'=>2,'is_song'=>3])->find();
|
|
|
|
|
|
if($res1){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'点歌中!请稍后再试!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
if($type == 1){//1同意 2拒绝
|
|
|
|
|
|
//开启事务
|
|
|
|
|
|
db::startTrans();
|
|
|
|
|
|
$res2 = db::name('vs_room')->where('id',$room_id)->field('room_up_pit_type')->find();
|
|
|
|
|
|
if($res2['room_up_pit_type'] == 2){
|
|
|
|
|
|
$data['room_up_pit_type'] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
//修改房间label
|
|
|
|
|
|
$data['label_id'] = 2;
|
|
|
|
|
|
$data['is_song'] = 3;
|
|
|
|
|
|
$res = db::name('vs_room')->where('id',$room_id)->update($data);
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
db::rollback();
|
|
|
|
|
|
return ['code'=>0,'msg'=>'操作失败,','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$roomPit = db::name('vs_room_pit')->where(['room_id' => $room_id])
|
|
|
|
|
|
->where('pit_number','<',9)
|
|
|
|
|
|
->where('user_id','>',0)->select();
|
|
|
|
|
|
if(!empty($roomPit)){
|
|
|
|
|
|
foreach ($roomPit as $k=>$v){
|
|
|
|
|
|
model('RoomPit')->DownPit($v['user_id'],$room_id,$v['pit_number']);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//获取房间麦位
|
|
|
|
|
|
// $roomPit = db::name('vs_room_pit')->where(['room_id' => $room_id])->count();
|
|
|
|
|
|
// if($roomPit == 10){
|
|
|
|
|
|
// //麦位增加到22个
|
|
|
|
|
|
// $add_pit = model('RoomPit')->create_room_pit(2,$room_id);
|
|
|
|
|
|
// if($add_pit['code'] == 0){
|
|
|
|
|
|
// Db::rollback();
|
|
|
|
|
|
// return ['code' => 0, 'msg' => '操作失败了', 'data' => null];
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }elseif($roomPit == 22){
|
|
|
|
|
|
// //开启11-22麦位
|
|
|
|
|
|
// $pit_up = db::name('vs_room_pit')->where(['room_id' => $room_id])
|
|
|
|
|
|
// ->where('pit_number','>',10)
|
|
|
|
|
|
// ->update(['status'=>1]);
|
|
|
|
|
|
// if(!$pit_up){
|
|
|
|
|
|
// Db::rollback();
|
|
|
|
|
|
// return ['code' => 0, 'msg' => '操作失败了.', 'data' => null];
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
db::commit();
|
|
|
|
|
|
//推送消息
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'text' => '房间类型变成k歌--2'
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1012,$room_id,$text);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$res = db::name('vs_room')->where('id',$room_id)->update(['is_song'=>4]);
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'操作失败','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//推送消息
|
|
|
|
|
|
$uid = Cache::get('apply_song_user_'.$room_id);
|
|
|
|
|
|
if($uid){
|
|
|
|
|
|
$FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find();
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'FromUserInfo' => $FromUserInfo,
|
|
|
|
|
|
'action' => 4 //拒绝申请点歌
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$room_id,$text);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//删除申请缓存
|
|
|
|
|
|
Cache::rm('apply_song_time_'.$room_id);
|
|
|
|
|
|
Cache::rm('apply_song_user_'.$room_id);
|
|
|
|
|
|
return ['code'=>1,'msg'=>'操作成功','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//点歌
|
|
|
|
|
|
public function song($room_id,$user_id,$song_code,$song_name,$singer,$poster,$duration){
|
|
|
|
|
|
$action = 0;//初始值,1-申请点歌,2-切歌,3-下一首歌曲变化,4-拒绝申请点歌
|
|
|
|
|
|
//查询当前房间中的场次状态
|
|
|
|
|
|
$times_status = db::name('vs_room_song')->where('room_id',$room_id)->field('times,times_status')->order('did desc')->find();
|
|
|
|
|
|
if(!empty($times_status)){//已经有歌曲
|
|
|
|
|
|
if($times_status['times_status'] == 2){//这一场次结束了
|
|
|
|
|
|
$data['sort'] = 10000;//排序,新场次第一首歌
|
|
|
|
|
|
$data['times'] = $times_status['times'] + 1;//新场次
|
|
|
|
|
|
//本场次无歌曲
|
|
|
|
|
|
$action = 2;//走切歌,当前要唱的歌
|
|
|
|
|
|
}else{//正在进行中
|
|
|
|
|
|
$data['times'] = $times_status['times'];
|
|
|
|
|
|
//获取当前进行中的 最后一位歌曲
|
|
|
|
|
|
$qq = db::name('vs_room_song')
|
|
|
|
|
|
->where('room_id',$room_id)
|
|
|
|
|
|
->where('times',$times_status['times'])
|
|
|
|
|
|
->field('sort,status')->order('sort asc')->find();
|
|
|
|
|
|
$data['sort'] = $qq['sort'] - 100;
|
|
|
|
|
|
|
|
|
|
|
|
//查询本场次本次点歌是否等待位第一首(也是就是本场次的第二首歌)
|
|
|
|
|
|
$song_status = db::name('vs_room_song')
|
|
|
|
|
|
->where('room_id',$room_id)
|
|
|
|
|
|
->where('times',$times_status['times'])
|
|
|
|
|
|
->where('status',1)//待唱
|
|
|
|
|
|
->order('sort desc')->select();
|
|
|
|
|
|
$nowSong = db::name('vs_room_song') ->where('room_id',$room_id)
|
|
|
|
|
|
->where('times',$times_status['times'])
|
|
|
|
|
|
->where('status',2)
|
|
|
|
|
|
->find();
|
|
|
|
|
|
if(empty($song_status) && $nowSong){//本场次无待唱歌曲,本此点歌是下一首播放歌曲
|
|
|
|
|
|
$action = 3;//下一首歌曲有变化,推送给前端
|
|
|
|
|
|
}elseif(empty($song_status) && empty($nowSong)){
|
|
|
|
|
|
$action = 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{//没有歌曲,新场次
|
|
|
|
|
|
$data['sort'] = 10000;
|
|
|
|
|
|
$data['times'] = 1;//本房间第一场
|
|
|
|
|
|
$action = 2;//走切歌,当前要唱的歌
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$data['room_id'] = $room_id;
|
|
|
|
|
|
$data['user_id'] = $user_id;
|
|
|
|
|
|
|
|
|
|
|
|
$data['song_code'] = $song_code;
|
|
|
|
|
|
$data['song_name'] = $song_name;
|
|
|
|
|
|
$data['singer'] = $singer;
|
|
|
|
|
|
$data['poster'] = $poster;
|
|
|
|
|
|
$data['duration'] = $duration;
|
|
|
|
|
|
if($action == 2){//切歌 当前歌曲为正要唱的歌
|
|
|
|
|
|
$data['status'] = 2;//把当前歌曲设为演唱中
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$data['status'] = 1;//放入等待区
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$data['times_status'] = 1;
|
|
|
|
|
|
$data['createtime'] = time();
|
|
|
|
|
|
$res = db::name('vs_room_song')->insertGetId($data,false,'did');
|
|
|
|
|
|
$did = $res;
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'申请失败','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//房间中待唱歌曲总数
|
|
|
|
|
|
$total = db::name('vs_room_song')
|
|
|
|
|
|
->where(['room_id' => $room_id,'status' => 1,'times_status' => 1])
|
|
|
|
|
|
->count();
|
|
|
|
|
|
|
|
|
|
|
|
$info = [
|
|
|
|
|
|
'did' => $did,
|
|
|
|
|
|
'song_code' => $song_code,
|
|
|
|
|
|
'song_name' => $song_name,
|
|
|
|
|
|
'singer' => $singer,
|
|
|
|
|
|
'poster' => $poster,
|
|
|
|
|
|
'duration' => $duration,
|
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
|
'dress' => model('Decorate')->user_decorate_detail($user_id, 1),
|
|
|
|
|
|
'nickname' => db::name('user')->where('id',$user_id)->value('nickname'),
|
|
|
|
|
|
'avatar' => db::name('user')->where('id',$user_id)->value('avatar'),
|
|
|
|
|
|
'charm' => db::name('vs_room_user_charm')->where(['user_id' =>$user_id,'room_id' => $room_id])->value('charm'),
|
|
|
|
|
|
];
|
|
|
|
|
|
$nowInfo = null;
|
|
|
|
|
|
$nextInfo = null;
|
|
|
|
|
|
if($action == 2){//切歌 应该播放的歌曲推给前端
|
|
|
|
|
|
$nowInfo = $info;
|
|
|
|
|
|
}elseif ($action == 3){//下一首变化后 推给前端做预加载歌词
|
|
|
|
|
|
$nextInfo = $info;
|
|
|
|
|
|
//把这个信息存储到redis
|
|
|
|
|
|
Cache::set("api:room:song:nextInfo:" . $room_id, $did);
|
|
|
|
|
|
}
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'action' => $action,
|
|
|
|
|
|
'total' => $total,
|
|
|
|
|
|
'songInfo' => $nowInfo,
|
|
|
|
|
|
'nextInfo' => $nextInfo
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$room_id,$text);
|
|
|
|
|
|
//1-禁麦位,2-清空消息,3-清空魅力值,4-加入黑名单,5-踢出房间,6-关闭麦克风,7-申请上麦,8-同意上麦,9-拒绝上麦,10-点歌,11-开启PK',
|
|
|
|
|
|
model('Room')->room_operation_record($user_id,$room_id,10,0,0,$did);
|
|
|
|
|
|
return ['code'=>1,'msg'=>'申请成功','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//已点歌曲列表
|
|
|
|
|
|
public function song_list($room_id){
|
|
|
|
|
|
$list = db::name('vs_room_song')
|
|
|
|
|
|
->field('did,room_id,song_code,song_name,singer,poster,duration,sort,user_id')
|
|
|
|
|
|
->where(['room_id' => $room_id,'status' => 1,'times_status' => 1])
|
|
|
|
|
|
->order('sort desc')->select();
|
|
|
|
|
|
if($list){
|
|
|
|
|
|
foreach ($list as &$v){
|
|
|
|
|
|
$v['nickname'] = db::name('user')->where('id',$v['user_id'])->value('nickname');
|
|
|
|
|
|
$v['avatar'] = db::name('user')->where('id',$v['user_id'])->value('avatar');
|
|
|
|
|
|
$v['dress'] = model('Decorate')->user_decorate_detail($v['user_id'], 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return ['code'=>1,'msg'=>'操作成功','data'=>$list];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//上移歌 $type 1上移 2置顶
|
2025-09-15 18:51:36 +08:00
|
|
|
|
public function up_song($user_id,$room_song_id,$type=1){
|
2025-08-13 10:43:56 +08:00
|
|
|
|
//查询当前数据的信息
|
|
|
|
|
|
$sort = db::name('vs_room_song')->where('did',$room_song_id)->field('room_id,sort,times')->find();
|
2025-09-15 18:51:36 +08:00
|
|
|
|
//查询当前用户是否是在9号麦的主持
|
|
|
|
|
|
$is_host = db::name('vs_room_pit')->where(['user_id' => $user_id,'room_id' => $sort['room_id'],'pit_number' =>9])->find();
|
|
|
|
|
|
if(!$is_host){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'您没有权限操作','data'=>null];
|
|
|
|
|
|
}
|
2025-08-13 10:43:56 +08:00
|
|
|
|
//根据房间ID查询当前房间中正在排序的歌曲 并获取当前排序的前一位的ID
|
|
|
|
|
|
$sort_up = db::name('vs_room_song')->where(['room_id' => $sort['room_id'],'status' => 1,'times' =>$sort['times'],'times_status' => 1])->field('did')->order('sort desc')->select();
|
|
|
|
|
|
if($sort_up[0]['did'] == $room_song_id){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'已经是第一首歌了','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
if($type == 1){ //上移
|
|
|
|
|
|
foreach ($sort_up as $k=>$v){
|
|
|
|
|
|
if($v['did'] == $room_song_id){
|
|
|
|
|
|
$sort_ups = $sort_up[$k-1]['did'];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$fa_zhi = 0;
|
|
|
|
|
|
}else{ //置顶
|
|
|
|
|
|
foreach ($sort_up as $k=>$v){
|
|
|
|
|
|
$sort_ups = $sort_up[0]['did'];
|
|
|
|
|
|
}
|
|
|
|
|
|
$fa_zhi = 9;//阈值 为了防止置顶后被上移歌曲覆盖
|
|
|
|
|
|
}
|
|
|
|
|
|
$sortt = db::name('vs_room_song')->where('did',$sort_ups)->value('sort');
|
|
|
|
|
|
$sort_upp = $sortt + 1 + $fa_zhi;
|
|
|
|
|
|
$res = db::name('vs_room_song')->where('did',$room_song_id)->update(['sort'=>$sort_upp]);
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'操作失败','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
$data = db::name('vs_room_song')->where(['room_id' => $sort['room_id'],'status' => 1,'times' =>$sort['times'],'times_status' => 1])
|
|
|
|
|
|
->order('sort desc')->select();
|
|
|
|
|
|
$did = Cache::get("api:room:song:nextInfo:" . $sort['room_id']);
|
|
|
|
|
|
//歌曲移动后,下一首播放歌曲信息 发生改变 推送给前端
|
|
|
|
|
|
if($data[0]['did'] != $did){
|
|
|
|
|
|
$total = db::name('vs_room_song')
|
|
|
|
|
|
->where(['room_id' => $sort['room_id'],'status' => 1,'times_status' => 1])
|
|
|
|
|
|
->count();
|
|
|
|
|
|
$info = [
|
|
|
|
|
|
'did' => $data[0]['did'],
|
|
|
|
|
|
'song_code' => $data[0]['song_code'],
|
|
|
|
|
|
'song_name' => $data[0]['song_name'],
|
|
|
|
|
|
'singer' => $data[0]['singer'],
|
|
|
|
|
|
'poster' => $data[0]['poster'],
|
|
|
|
|
|
'duration' => $data[0]['duration'],
|
|
|
|
|
|
'user_id' => $data[0]['user_id'],
|
|
|
|
|
|
'dress' => model('Decorate')->user_decorate_detail($data[0]['user_id'], 1),
|
|
|
|
|
|
'nickname' => db::name('user')->where('id',$data[0]['user_id'])->value('nickname'),
|
|
|
|
|
|
'avatar' => db::name('user')->where('id',$data[0]['user_id'])->value('avatar'),
|
|
|
|
|
|
'charm' => db::name('vs_room_user_charm')->where(['user_id' => $data[0]['user_id'],'room_id' => $sort['room_id']])->value('charm'),
|
|
|
|
|
|
];
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'action' => 3,//下一首播放歌曲信息推送给前端
|
|
|
|
|
|
'total' => $total,
|
|
|
|
|
|
'songInfo' => null,
|
|
|
|
|
|
'nextInfo' => $info
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$sort['room_id'],$text);
|
|
|
|
|
|
Cache::set("api:room:song:nextInfo:" . $sort['room_id'],$data[0]['did']);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ['code'=>1,'msg'=>'操作成功','data'=>$data];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//切歌
|
|
|
|
|
|
public function change_song($room_id,$now_room_song_id){
|
|
|
|
|
|
//根据传过来的参数查询当前场次
|
|
|
|
|
|
$times = db::name('vs_room_song')->where('did',$now_room_song_id)->value('times');
|
|
|
|
|
|
//查询下一首歌曲
|
|
|
|
|
|
$data = db::name('vs_room_song')->where(['room_id' => $room_id,'status' => 1,'times' =>$times,'times_status' => 1])
|
|
|
|
|
|
->order('sort desc')->select();
|
|
|
|
|
|
//结束本首歌
|
|
|
|
|
|
$now_song = db::name('vs_room_song')->where('did',$now_room_song_id)->update(['status'=>3]);
|
|
|
|
|
|
if(empty($data)){
|
|
|
|
|
|
Cache::rm("api:room:song:nextInfo:" . $room_id);
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'action' => 2,
|
|
|
|
|
|
'total' => 0,
|
|
|
|
|
|
'songInfo' => null,
|
|
|
|
|
|
'nextInfo' => null
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$room_id,$text);
|
|
|
|
|
|
return ['code'=>0,'msg'=>'已经是最后一首歌了','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
$total = db::name('vs_room_song')
|
|
|
|
|
|
->where(['room_id' => $room_id,'status' => 1,'times' =>$times,'times_status' => 1])
|
|
|
|
|
|
->count();
|
|
|
|
|
|
|
|
|
|
|
|
//修改 准备唱的歌曲状态
|
|
|
|
|
|
$next_song = db::name('vs_room_song')->where('did',$data[0]['did'])->update(['status' => 2]);
|
|
|
|
|
|
if(!$now_song || !$next_song){
|
|
|
|
|
|
return ['code'=>0,'msg'=>'切歌失败','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
if(array_count_dim($data) > 1){
|
|
|
|
|
|
//有两首以上的歌曲 第二首放入 推送的下一首中
|
|
|
|
|
|
$next_song_info = [
|
|
|
|
|
|
'did' => $data[1]['did'],
|
|
|
|
|
|
'song_code' => $data[1]['song_code'],
|
|
|
|
|
|
'song_name' => $data[1]['song_name'],
|
|
|
|
|
|
'singer' => $data[1]['singer'],
|
|
|
|
|
|
'poster' => $data[1]['poster'],
|
|
|
|
|
|
'duration' => $data[1]['duration'],
|
|
|
|
|
|
'user_id' => $data[1]['user_id'],
|
|
|
|
|
|
'dress' => model('Decorate')->user_decorate_detail($data[1]['user_id'], 1),
|
|
|
|
|
|
'nickname' => db::name('user')->where('id',$data[1]['user_id'])->value('nickname'),
|
|
|
|
|
|
'avatar' => db::name('user')->where('id',$data[1]['user_id'])->value('avatar'),
|
|
|
|
|
|
'charm' => db::name('vs_room_user_charm')->where(['user_id' =>$data[1]['user_id'],'room_id' => $room_id])->value('charm'),
|
|
|
|
|
|
];
|
|
|
|
|
|
//缓存
|
|
|
|
|
|
Cache::set("api:room:song:nextInfo:" . $room_id,$data[1]['did']);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
//一首歌曲 推送下一首没有
|
|
|
|
|
|
$next_song_info = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'action' => 2,
|
|
|
|
|
|
'total' => $total,
|
|
|
|
|
|
'songInfo' => [
|
|
|
|
|
|
'did' => $data[0]['did'],
|
|
|
|
|
|
'song_code' => $data[0]['song_code'],
|
|
|
|
|
|
'song_name' => $data[0]['song_name'],
|
|
|
|
|
|
'singer' => $data[0]['singer'],
|
|
|
|
|
|
'poster' => $data[0]['poster'],
|
|
|
|
|
|
'duration' => $data[0]['duration'],
|
|
|
|
|
|
'user_id' => $data[0]['user_id'],
|
|
|
|
|
|
'dress' => model('Decorate')->user_decorate_detail($data[0]['user_id'], 1),
|
|
|
|
|
|
'nickname' => db::name('user')->where('id',$data[0]['user_id'])->value('nickname'),
|
|
|
|
|
|
'avatar' => db::name('user')->where('id',$data[0]['user_id'])->value('avatar'),
|
|
|
|
|
|
'charm' => db::name('vs_room_user_charm')->where(['user_id' =>$data[0]['user_id'],'room_id' => $room_id])->value('charm'),
|
|
|
|
|
|
],
|
|
|
|
|
|
'nextInfo' => $next_song_info
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1013,$room_id,$text);
|
|
|
|
|
|
return ['code'=>1,'msg'=>'切歌成功','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//结束本场唱歌
|
|
|
|
|
|
public function end_song($room_id){
|
|
|
|
|
|
//开启事务
|
|
|
|
|
|
db::startTrans();
|
|
|
|
|
|
//本场次结束
|
|
|
|
|
|
db::name('vs_room_song')->where(['room_id' => $room_id,'times_status' => 1,'status' => 1])->update(['status'=>4]);
|
|
|
|
|
|
if(db::name('vs_room_song')->where(['room_id' => $room_id,'times_status' => 1,'status' => 2])->find()){
|
|
|
|
|
|
db::name('vs_room_song')->where(['room_id' => $room_id,'times_status' => 1,'status' => 2])->update(['status'=>3]);
|
|
|
|
|
|
}
|
|
|
|
|
|
if(db::name('vs_room_song')->where('room_id',$room_id)->where(['times_status'=>1])->find()){
|
|
|
|
|
|
$times_status = db::name('vs_room_song')->where('room_id',$room_id)->update(['times_status'=>2]);
|
|
|
|
|
|
if(!$times_status){
|
|
|
|
|
|
db::rollback();
|
|
|
|
|
|
return ['code'=>0,'msg'=>'操作失败!','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//修改房间类型
|
|
|
|
|
|
//修改房间label
|
|
|
|
|
|
$res = db::name('vs_room')->where('id',$room_id)->update(['label_id'=>1,'is_song'=>1]);
|
|
|
|
|
|
if(!$res){
|
|
|
|
|
|
db::rollback();
|
|
|
|
|
|
return ['code'=>0,'msg'=>'操作失败','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//关闭11-22麦位
|
|
|
|
|
|
// $pit_up = db::name('vs_room_pit')->where(['room_id' => $room_id])
|
|
|
|
|
|
// ->where('pit_number','>',10)
|
|
|
|
|
|
// ->update(['status'=>2]);
|
|
|
|
|
|
// if(!$pit_up){
|
|
|
|
|
|
// Db::rollback();
|
|
|
|
|
|
// return ['code' => 0, 'msg' => '操作失败了.', 'data' => null];
|
|
|
|
|
|
// }
|
|
|
|
|
|
$roomPit = db::name('vs_room_pit')->where(['room_id' => $room_id])
|
|
|
|
|
|
->where('pit_number','<',9)
|
|
|
|
|
|
->where('pit_number','>',10)
|
|
|
|
|
|
->where('user_id','>',0)->select();
|
|
|
|
|
|
if(!empty($roomPit)){
|
|
|
|
|
|
foreach ($roomPit as $k=>$v){
|
|
|
|
|
|
model('RoomPit')->DownPit($v['user_id'],$room_id,$v['pit_number']);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
db::name('vs_room_pit_simulate')->where(['room_id' => $room_id])->delete();
|
|
|
|
|
|
//推送消息
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'text' => '房间类型变成聊天--1'
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1012,$room_id,$text);
|
|
|
|
|
|
Cache::rm("api:room:song:nextInfo:" . $room_id);
|
|
|
|
|
|
db::commit();
|
|
|
|
|
|
return ['code'=>1,'msg'=>'操作成功','data'=>null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//申请上麦
|
|
|
|
|
|
public function apply_kpit($user_id,$room_id,$pit_number = 0){
|
|
|
|
|
|
|
|
|
|
|
|
//查询房间状态
|
|
|
|
|
|
$room_info = db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->field('id,room_status,room_up_pit_type')->find();
|
|
|
|
|
|
if(!$room_info){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '房间不存在', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
if($room_info['room_status'] != 1){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '房间违规或关闭', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
if($pit_number == 10){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '请等待主持抱麦', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if($pit_number > 0){
|
|
|
|
|
|
if(!in_array($pit_number,[9,10])){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '请选择正确的麦位', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//查询是否在下面麦位
|
|
|
|
|
|
$ompit = db::name('vs_room_pit_simulate')->where(['room_id' => $room_id, 'user_id' => $user_id])->field('id,status')->find();
|
|
|
|
|
|
if($ompit && $ompit['status'] == 1){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '您已上麦', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//检查坑位是否被占用
|
|
|
|
|
|
$pit_number9 = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $pit_number])->value('user_id');
|
|
|
|
|
|
if($pit_number9){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '该麦位已被占用', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//检查是否是主持管理或房主
|
|
|
|
|
|
if($pit_number == 9){
|
|
|
|
|
|
//判断用户是否是房主 管理主持
|
|
|
|
|
|
$owner = db::name('vs_room')->where(['id' => $room_id])->value('user_id');
|
|
|
|
|
|
$host = db::name('vs_room_host')->where(['room_id' => $room_id,'user_id' =>$user_id,'delete_time' =>null])->find();
|
|
|
|
|
|
if(!$host && $owner != $user_id){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '您没有权限上麦', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$ompit = model('RoomPit')->OnPit($user_id,$room_id,$pit_number);//用户上了这个房间的几号麦位
|
|
|
|
|
|
if($ompit['code'] != 1){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '上麦失败', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//查找是否在申请列表里
|
|
|
|
|
|
$apply_pit = db::name('vs_room_pit_apply')->where(['room_id' => $room_id, 'user_id' => $user_id])->find();
|
|
|
|
|
|
if($apply_pit){
|
|
|
|
|
|
model('RoomPit')->clear_apply_pit_list($user_id, $room_id, $user_id);
|
|
|
|
|
|
}
|
|
|
|
|
|
return ['code' => 1, 'msg' => '上麦成功', 'data' => null];
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if(db::name('vs_room_pit_simulate')->where(['room_id' => $room_id])->count() >= 20){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '暂无空麦位', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//检查是否在坑位上
|
|
|
|
|
|
$pit_infos = db::name('vs_room_pit_simulate')->where(['room_id' => $room_id, 'user_id' => $user_id])->field('id,status')->find();
|
|
|
|
|
|
if(isset($pit_infos)){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '用户已在麦上,请先下麦后再申请', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
$FromUserInfo = db::name('user')->where('id',$user_id)->field('id as user_id,nickname,avatar,sex')->find();
|
|
|
|
|
|
$FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($user_id);//财富图标
|
|
|
|
|
|
$FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($user_id);//魅力图标
|
|
|
|
|
|
$FromUserInfo['dress'] = model('Decorate')->user_decorate_detail($user_id,1);
|
|
|
|
|
|
$text['text'] = $FromUserInfo['nickname'].' 上麦了 ';
|
|
|
|
|
|
$text['FromUserInfo'] = $FromUserInfo;
|
|
|
|
|
|
$text['pit_number'] = 9999;
|
|
|
|
|
|
|
|
|
|
|
|
//自由麦
|
|
|
|
|
|
if($room_info['room_up_pit_type'] == 2){
|
|
|
|
|
|
$ompit = db::name('vs_room_pit_simulate')->insert(
|
|
|
|
|
|
[
|
|
|
|
|
|
'room_id' => $room_id,
|
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
|
'status' => 1,//1-K歌模式虚假上麦
|
|
|
|
|
|
]
|
|
|
|
|
|
);//用户上了这个房间的麦位
|
|
|
|
|
|
if(!$ompit){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '上麦失败', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
//聊天室推送系统消息
|
|
|
|
|
|
model('Chat')->sendMsg(1003,$room_id,$text);
|
|
|
|
|
|
return ['code' => 1, 'msg' => '上麦成功', 'data' => null];
|
|
|
|
|
|
}else{
|
|
|
|
|
|
//检查用户是否已经申请
|
|
|
|
|
|
$apply_pit_info = db::name('vs_room_pit_apply')->where(['room_id' => $room_id, 'user_id' => $user_id])->field('id')->find();
|
|
|
|
|
|
if($apply_pit_info){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '请勿重复申请', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//放入等待区
|
|
|
|
|
|
$data = [
|
|
|
|
|
|
'room_id' => $room_id,
|
|
|
|
|
|
'user_id' => $user_id,
|
|
|
|
|
|
'status' => 0,
|
|
|
|
|
|
'apply_type' => 2
|
|
|
|
|
|
];
|
|
|
|
|
|
$reslut = db::name('vs_room_pit_apply')->insert($data);
|
|
|
|
|
|
if(!$reslut){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '申请失败', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
$count = db::name('vs_room_pit_apply')->where(['room_id' => $room_id,'status' => 0])->count();
|
|
|
|
|
|
//申请上麦推送消息
|
|
|
|
|
|
$text = [
|
|
|
|
|
|
'text' => '申请上麦',
|
|
|
|
|
|
'count' => $count
|
|
|
|
|
|
];
|
|
|
|
|
|
model('Chat')->sendMsg(1034,$room_id,$text);
|
|
|
|
|
|
return ['code' => 1, 'msg' => '申请成功,请等待主持审核', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//下麦
|
|
|
|
|
|
public function down_kpit($user_id,$room_id){
|
|
|
|
|
|
//唱歌的时候不让下麦
|
|
|
|
|
|
$now_song = db::name('vs_room_song')->where(['room_id' => $room_id,'status' => 2])->order('did desc')->value('user_id');
|
|
|
|
|
|
if($now_song == $user_id){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '正在唱歌,请勿下麦', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$host_user_id = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 9])->value('user_id');
|
|
|
|
|
|
$host_user_id2 = db::name('vs_room_pit')->where(['room_id' => $room_id,'pit_number' => 10])->value('user_id');
|
|
|
|
|
|
if($user_id == $host_user_id){
|
|
|
|
|
|
return model('RoomPit')->DownPit($user_id,$room_id,9);
|
|
|
|
|
|
}elseif ($user_id == $host_user_id2){
|
|
|
|
|
|
return model('RoomPit')->DownPit($user_id,$room_id,10);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
|
|
|
|
|
|
$down = db::name('vs_room_pit_simulate')->where(['room_id' => $room_id, 'user_id' => $user_id,'status' => 1])->delete();
|
|
|
|
|
|
if(!$down){
|
|
|
|
|
|
return ['code' => 0, 'msg' => '下麦失败', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
$FromUserInfo = db::name('user')->where('id',$user_id)->field('id as user_id,nickname,avatar,sex')->find();
|
|
|
|
|
|
$FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($user_id);//财富图标
|
|
|
|
|
|
$FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($user_id);//魅力图标
|
|
|
|
|
|
//推送告诉前端下了几号麦位
|
|
|
|
|
|
$text['text'] = $FromUserInfo['nickname'].' 下麦了 ';
|
|
|
|
|
|
$text['FromUserInfo'] = $FromUserInfo;
|
|
|
|
|
|
$text['pit_number'] = '';
|
|
|
|
|
|
model('Chat')->sendMsg(1004,$room_id,$text);
|
|
|
|
|
|
return ['code' => 1, 'msg' => '下麦成功', 'data' => null];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//房间用户列表
|
|
|
|
|
|
public function get_charm_rank($room_id){
|
|
|
|
|
|
$room_pit = db::name('vs_room_pit')->where(['room_id' => $room_id])
|
|
|
|
|
|
->where(['pit_number' =>['>=',9]])->column('user_id');
|
|
|
|
|
|
|
|
|
|
|
|
if(!empty($room_pit)){
|
|
|
|
|
|
$where['user_id'] = ['not in', $room_pit];
|
|
|
|
|
|
}
|
|
|
|
|
|
$where['room_id'] = $room_id;
|
|
|
|
|
|
|
|
|
|
|
|
// $room_visitor = db::name('vs_room_visitor')
|
|
|
|
|
|
$room_visitor = db::name('vs_room_pit_simulate')
|
|
|
|
|
|
->where($where)->field('user_id')->order('id asc')->select();
|
|
|
|
|
|
|
|
|
|
|
|
if($room_visitor){
|
|
|
|
|
|
foreach ($room_visitor as &$v){
|
|
|
|
|
|
$v['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $v['user_id'],'room_id' => $room_id])->value('charm');
|
|
|
|
|
|
$v['nickname'] = db::name('user')->where('id',$v['user_id'])->value('nickname');
|
|
|
|
|
|
$v['avatar'] = db::name('user')->where('id',$v['user_id'])->value('avatar');
|
|
|
|
|
|
$v['dress'] = model('Decorate')->user_decorate_detail($v['user_id'], 1);
|
|
|
|
|
|
$v['sex'] = db::name('user')->where('id',$v['user_id'])->value('sex');
|
|
|
|
|
|
$v['user_code'] = model('Decorate')->user_decorate_detail($v['user_id'], 6);
|
|
|
|
|
|
$v['is_lock'] = 0;
|
|
|
|
|
|
$v['is_mute'] = 0;
|
|
|
|
|
|
$v['count_down'] = 0;
|
|
|
|
|
|
$v['pit_number'] = 9999;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ['code' => 1, 'msg' => '获取成功', 'data' => $room_visitor];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|