Files
yusheng-php/application/api/model/SingerSong.php
2025-12-03 18:55:12 +08:00

445 lines
22 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\api\model;
use think\Db;
use think\Model;
class SingerSong extends Model
{
/*
* 歌手认证 状态及等级
*/
public function singerAuthStatus($user_id)
{
$res = db::name('vs_singer')->where(['user_id' => $user_id])->find();
if ($res) {
$data = [
'status' => $res['status'],
'level' => $res['level'],
];
} else {
$data = [
'status' => -1,
'level' => 0,
];
}
return $data ;
}
/*
* 歌手认证
*/
public function singerAuth($user_id, $song)
{
//查询是否提交过认证
$res = db::name('vs_singer')->where(['user_id' => $user_id])->find();
if ($res && $res['status'] == 1) {
return ['code' => 0, 'msg' => '认证已通过,无需重复提交', 'data' => null];
}
if ($res) {
$data = [
'song' => $song,
'status' => 0,
'updatetime' => time()
];
$result = db::name('vs_singer')->where(['id' => $res['id']])->update($data);
}else{
$data = [
'user_id' => $user_id,
'song' => $song,
'status' => 0,
'createtime' => time()
];
$result = db::name('vs_singer')->insert($data);
}
if ($result) {
return ['code' => 1, 'msg' => '提交成功', 'data' => null];
} else {
return ['code' => 0, 'msg' => '提交失败', 'data' => null];
}
}
/*
* 歌手添加歌曲
* @param song_name 歌曲名称
* @param gift_id 礼物id
* @param gift_num 礼物数量
*/
public function singerAddSong($user_id, $song_name, $gift_id, $gift_num)
{
//查询是否是认证歌手
$res = db::name('vs_singer')->where(['user_id' => $user_id])->find();
if (!$res || $res['status'] != 1) {
return ['code' => 0, 'msg' => '请先认证歌手', 'data' => null];
}
//查询是否提交过歌曲
$res = db::name('vs_singer_song')->where(['user_id' => $user_id, 'song_name' => $song_name])->find();
if ($res) {
return ['code' => 0, 'msg' => '请勿重复提交歌曲', 'data' => null];
}
//礼物不能是CP礼物
$cp_gift_ids = explode(',', get_system_config_value('cp_gift_id'));
if (in_array($gift_id, $cp_gift_ids)) {
return ['code' => 0, 'msg' => '礼物不能是CP礼物请重新选择', 'data' => null];
}
$data = [
'user_id' => $user_id,
'song_name' => $song_name,
'gift_id' => $gift_id,
'gift_num' => $gift_num,
'createtime' => time()
];
$result = db::name('vs_singer_song')->insert($data);
if ($result) {
return ['code' => 1, 'msg' => '提交成功', 'data' => null];
} else {
return ['code' => 0, 'msg' => '提交失败', 'data' => null];
}
}
/*
* 获取房间内麦位上歌手歌曲
* @param room_id 房间id
* @param user_id 用户id
*/
public function getSong($uid, $user_id, $room_id, $page, $page_limit)
{
if($user_id > 0){
$count = db::name('vs_singer_song')->where(['user_id' => $user_id,'deletetime' => 0])->count();
$res = db::name('vs_singer_song')->where(['user_id' => $user_id,'deletetime' => 0])->page($page, $page_limit)->select();
}else{
//查询当前房间内麦位上的歌手
$room_singer = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => ['<',9]])->column('user_id');
if ($room_singer) {
//$uid 是当前自己,有自己就去除自己
$room_singer = array_diff($room_singer, [$uid]);
$count = db::name('vs_singer_song')->where(['user_id' => ['in', $room_singer],'deletetime' => 0])->count();
$res = db::name('vs_singer_song')->where(['user_id' => ['in', $room_singer],'deletetime' => 0])->page($page, $page_limit)->select();
}else{
$res = [];
$count = 0;
}
}
if ($res) {
foreach ($res as $k => $v) {
$res[$k]['gift_name'] = db::name('vs_gift')->where(['gid' => $v['gift_id']])->value('gift_name');
$res[$k]['gift_price'] = db::name('vs_gift')->where(['gid' => $v['gift_id']])->value('gift_price');
$res[$k]['base_image'] = db::name('vs_gift')->where(['gid' => $v['gift_id']])->value('base_image');
$res[$k]['singer_nickname'] = db::name('user')->where(['id' => $v['user_id']])->value('nickname');
}
return ['code' => 1, 'msg' => '获取成功', 'data' => ['count' => $count, 'lists' =>$res]];
} else {
return ['code' => 1, 'msg' => '暂无数据', 'data' => ['count' => $count, 'lists' =>$res]];
}
}
/*
* 点歌
* @param song_id 歌曲id
* @param user_id 用户id
*/
public function singerSong($user_id, $song_id, $room_id)
{
//查询歌曲信息
$song = db::name('vs_singer_song')->where(['id' => $song_id])->find();
if (!$song) {
return ['code' => 0, 'msg' => '歌曲不存在', 'data' => null];
}
//查询歌曲是否是自己的
if ($song['user_id'] == $user_id) {
return ['code' => 0, 'msg' => '不能点自己歌曲', 'data' => null];
}
//查询用户余额
$user_money = db::name('user_wallet')->where(['user_id' => $user_id])->value('coin');
$gift_price = db::name('vs_gift')->where(['gid' => $song['gift_id']])->value('gift_price');
if ($user_money < $gift_price * $song['gift_num']) {
return ['code' => 0, 'msg' => '余额不足', 'data' => null];
}
//走送礼流程
$res = model('GiveGift')->give_gift($user_id,$song['user_id'],$song['gift_id'],$song['gift_num'],2,1,$room_id);
if ($res['code'] == 1) {
$data = [
'user_id' => $user_id,
'room_id' => $room_id,
'singer_song_id' => $song_id,
'createtime' => time()
];
//插入数据库并获取ID
$result = db::name('vs_song_log')->insertGetId($data);
if (!$result) {
return ['code' => 0, 'msg' => '点歌失败', 'data' => null];
}
//获取当前房间内点歌总数
$song_info_count = db::name('vs_song_log')->where(['room_id' => $room_id,'status' => ['in',[0,1]]])->count();
//给前端推送
$text = [
'text' => '房间点歌数量变化',
'count' => $song_info_count
];
model('Chat')->sendMsg(1072,$room_id,$text);
if($song_info_count == 1){
//修改房间当前演唱歌曲
db::name('vs_song_log')->where(['id' => $result])->update(['status' => 1]);
$song_info = db::name('vs_song_log')->where(['id' => $result])->find();
$song_info['boss_user_id'] = $song_info['user_id'];
$song_info['boss_nickname'] = db::name('user')->where(['id' => $song_info['user_id']])->value('nickname');
$song_info['boss_avatar'] = db::name('user')->where(['id' => $song_info['user_id']])->value('avatar');
$song_info['boss_dress'] = model('api/Decorate')->user_decorate_detail($song_info['user_id'], 1);
$song_info['boss_mic_cycle'] = model('api/Decorate')->user_decorate_detail($song_info['user_id'],3);
$singer_song = db::name('vs_singer_song')->where(['id' => $song_info['singer_song_id']])->find();
$song_info['singer_user_id'] = $singer_song['user_id'];
$song_info['singer_nickname'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('nickname');
$song_info['singer_avatar'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('avatar');
$song_info['singer_dress'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'], 1);
$song_info['singer_mic_cycle'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'],3);
$song_info['song_name'] = $singer_song['song_name'];
$song_info_data = [
'text' => '房间当前演唱歌曲变化',
'song_info' => $song_info
];
model('Chat')->sendMsg(1070,$room_id,$song_info_data);
}elseif ($song_info_count == 2){
//给前端推送下首歌曲信息
$next_song_info = db::name('vs_song_log')->where(['id' => $result])->find();
$next_song_info['boss_user_id'] = $next_song_info['user_id'];
$next_song_info['boss_nickname'] = db::name('user')->where(['id' => $next_song_info['user_id']])->value('nickname');
$next_song_info['boss_avatar'] = db::name('user')->where(['id' => $next_song_info['user_id']])->value('avatar');
$next_song_info['boss_dress'] = model('api/Decorate')->user_decorate_detail($next_song_info['user_id'], 1);
$next_song_info['boss_mic_cycle'] = model('api/Decorate')->user_decorate_detail($next_song_info['user_id'],3);
$singer_song = db::name('vs_singer_song')->where(['id' => $next_song_info['singer_song_id']])->find();
$next_song_info['singer_user_id'] = $singer_song['user_id'];
$next_song_info['singer_nickname'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('nickname');
$next_song_info['singer_avatar'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('avatar');
$next_song_info['singer_dress'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'], 1);
$next_song_info['singer_mic_cycle'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'],3);
$next_song_info['song_name'] = $singer_song['song_name'];
$data = [
'text' => '房间下一首演唱歌曲变化',
'next_song_info' => $next_song_info
];
model('Chat')->sendMsg(1071,$next_song_info['room_id'],$data);
}
return ['code' => 1, 'msg' => '点歌成功', 'data' => null];
} else {
return ['code' => 0, 'msg' => $res['msg'], 'data' => null];
}
}
/*
* 点歌列表
* @param room_id 房间id
* @param type 类型 1:已点列表2:今日列表3昨日列表4本周列表5本月列表
*/
public function singerSongList($room_id,$type,$page,$page_limit)
{
$where = [
'room_id' => $room_id
];
switch ($type) {
case 2:
$where['createtime'] = ['between time',[strtotime(date('Y-m-d')),time()]];
break;
case 3:
$where['createtime'] = ['between time',[strtotime(date('Y-m-d',strtotime("-1 day"))),strtotime(date('Y-m-d'))]];
$where['status'] = 2;
break;
case 4:
$where['createtime'] = ['between time',[strtotime(date('Y-m-d',strtotime("-1 week"))),time()]];
$where['status'] = 2;
break;
case 5:
$where['createtime'] = ['between time',[strtotime(date('Y-m-d',strtotime("-1 month"))),time()]];
$where['status'] = 2;
break;
case 1:
default:
$where['status'] = ['in','1,0'];
break;
}
$count = db::name('vs_song_log')->where($where)->count();
if($type == 1){
$res1 = db::name('vs_song_log')->where(['status' => 1,'room_id' => $room_id])->order('id desc')->select();
$res2 = db::name('vs_song_log')->where(['status' => 0,'room_id' => $room_id])->order('sort desc')->page($page,$page_limit-1)->select();
//把$res2 添加到$res1的 最后
$res = array_merge($res1,$res2);
}else{
$res = db::name('vs_song_log')->where($where)->order('sort desc')->page($page,$page_limit)->select();
}
if ($res) {
foreach ($res as $k => $v) {
$res[$k]['boss_nickname'] = db::name('user')->where(['id' => $v['user_id']])->value('nickname');
$res[$k]['song_name'] = db::name('vs_singer_song')->where(['id' => $v['singer_song_id']])->value('song_name');
$res[$k]['gift_name'] = db::name('vs_gift')->where(['gid' => db::name('vs_singer_song')->where(['id' => $v['singer_song_id']])->value('gift_id')])->value('gift_name');
$res[$k]['gift_price'] = db::name('vs_gift')->where(['gid' => db::name('vs_singer_song')->where(['id' => $v['singer_song_id']])->value('gift_id')])->value('gift_price');
$res[$k]['base_image'] = db::name('vs_gift')->where(['gid' => db::name('vs_singer_song')->where(['id' => $v['singer_song_id']])->value('gift_id')])->value('base_image');
$res[$k]['gift_num'] = db::name('vs_singer_song')->where(['id' => $v['singer_song_id']])->value('gift_num');
$res[$k]['singer_nickname'] = db::name('user')->where(['id' => db::name('vs_singer_song')->where(['id' => $v['singer_song_id']])->value('user_id')])->value('nickname');
}
}
return ['code' => 1, 'msg' => '获取成功', 'data' => ['count' => $count, 'lists' =>$res]];
}
/*
* 点歌各类型各个总数
* @param type 类型 1:已点列表2:今日列表3昨日列表4本周列表5本月列表
* @param room_id 房间id
*/
public function singerSongCount($room_id)
{
$where = [
'room_id' => $room_id
];
$res = [
'already' => db::name('vs_song_log')->where($where)->where(['status' => ['in','1,0']])->count(),
'total' => db::name('vs_song_log')->where($where)->count(),
'today' => db::name('vs_song_log')->where($where)->where('createtime', 'between time', [strtotime(date('Y-m-d')), time()])->count(),
'yesterday' => db::name('vs_song_log')->where($where)->where('createtime', 'between time', [strtotime(date('Y-m-d', strtotime("-1 day"))), strtotime(date('Y-m-d'))])->count(),
'week' => db::name('vs_song_log')->where($where)->where('createtime', 'between time', [strtotime(date('Y-m-d', strtotime("-1 week"))), time()])->count(),
'month' => db::name('vs_song_log')->where($where)->where('createtime', 'between time', [strtotime(date('Y-m-01')), strtotime(date('Y-m-t'))])->count()
];
return ['code' => 1, 'msg' => '获取成功', 'data' => $res];
}
/*
* 歌手等级收礼升级
* @param user_id 用户id
*/
public function singerLevelUp($user_id,$coin)
{
//判断用户是否认证歌手
$is_singer = db::name('vs_singer')->where(['user_id' => $user_id,'status' => 1])->find();
if ($is_singer) {
//增加经验值并且判断是否可以升级
$exp = db::name('vs_singer')->where(['id' => $is_singer['id']])->value('exp');
$exp_coin = round($coin / get_system_config_value('singer_coin_exp'), 2);
$exps = $exp + $exp_coin;
//查询等级
$level = db::name('vs_singer_level')->where(['change_value' => ['<=', $exps]])->order('change_value desc')->find();
if ($level) {
db::name('vs_singer')->where(['id' => $is_singer['id']])->update(['exp' => $exps,'level' => $level['level']]);
}
}
return true;
}
/*
* 切歌
* @param room_id 房间id
* @param user_id 用户id
* @param song_id 歌曲id
*/
public function singerSongCut($user_id,$song_id)
{
$sonng_log = db::name('vs_song_log')->where(['id' => $song_id])->find();
$singer_user_id = db::name('vs_singer_song')->where(['id' => $sonng_log['singer_song_id']])->value('user_id');
//判断用户是否是房主
$room_info = db::name('vs_room')->where('id', $sonng_log['room_id'])->field('user_id')->find();
//判断用户是否是主持
$room_user_info = db::name('vs_room_host')->where(['room_id' => $sonng_log['room_id'], 'user_id' => $user_id,'delete_time' => null])->find();
if ($room_info['user_id'] != $user_id && !$room_user_info && $singer_user_id != $user_id) {
return ['code' => 0, 'msg' => '您没有权限切歌','data' => null];
}
if ($sonng_log) {
if ($sonng_log['status'] == 1) {
$up = db::name('vs_song_log')->where(['id' => $song_id])->update(['status' => 2]);
if ($up) {
$id = db::name('vs_song_log')->where(['room_id' => $sonng_log['room_id'],'status' => 0])->order('sort desc')->value('id');
if($id){
db::name('vs_song_log')->where(['id' => $id])->update(['status' => 1]);
//给前端推送
//获取当前房间内点歌总数
$song_info_count = db::name('vs_song_log')->where(['room_id' => $sonng_log['room_id'],'status' => ['in',[0,1]]])->count();
//给前端推送
$text = [
'text' => '房间点歌数量变化',
'count' => $song_info_count
];
model('Chat')->sendMsg(1072,$sonng_log['room_id'],$text);
//房间当前演唱歌曲
$song_info = db::name('vs_song_log')->where(['id' => $id])->find();
$song_info['boss_user_id'] = $song_info['user_id'];
$song_info['boss_nickname'] = db::name('user')->where(['id' => $song_info['user_id']])->value('nickname');
$song_info['boss_avatar'] = db::name('user')->where(['id' => $song_info['user_id']])->value('avatar');
$song_info['boss_dress'] = model('api/Decorate')->user_decorate_detail($song_info['user_id'], 1);
$song_info['boss_mic_cycle'] = model('api/Decorate')->user_decorate_detail($song_info['user_id'],3);
$singer_song = db::name('vs_singer_song')->where(['id' => $song_info['singer_song_id']])->find();
$song_info['singer_user_id'] = $singer_song['user_id'];
$song_info['singer_nickname'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('nickname');
$song_info['singer_avatar'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('avatar');
$song_info['singer_dress'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'], 1);
$song_info['singer_mic_cycle'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'],3);
$song_info['song_name'] = $singer_song['song_name'];
$song_info_data = [
'text' => '房间当前演唱歌曲变化',
'song_info' => $song_info
];
model('Chat')->sendMsg(1070,$sonng_log['room_id'],$song_info_data);
//给前端推送下首歌曲信息
$next_song_info = db::name('vs_song_log')->where(['room_id' => $sonng_log['room_id'],'status' => 0])->order('sort desc')->find();
if($next_song_info){
$next_song_info['boss_user_id'] = $next_song_info['user_id'];
$next_song_info['boss_nickname'] = db::name('user')->where(['id' => $next_song_info['user_id']])->value('nickname');
$next_song_info['boss_avatar'] = db::name('user')->where(['id' => $next_song_info['user_id']])->value('avatar');
$next_song_info['boss_dress'] = model('api/Decorate')->user_decorate_detail($next_song_info['user_id'], 1);
$next_song_info['boss_mic_cycle'] = model('api/Decorate')->user_decorate_detail($next_song_info['user_id'],3);
$singer_song = db::name('vs_singer_song')->where(['id' => $next_song_info['singer_song_id']])->find();
$next_song_info['singer_user_id'] = $singer_song['user_id'];
$next_song_info['singer_nickname'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('nickname');
$next_song_info['singer_avatar'] = db::name('user')->where(['id' => $singer_song['user_id']])->value('avatar');
$next_song_info['singer_dress'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'], 1);
$next_song_info['singer_mic_cycle'] = model('api/Decorate')->user_decorate_detail($singer_song['user_id'],3);
$next_song_info['song_name'] = $singer_song['song_name'];
}else{
$next_song_info = null;
}
$data = [
'text' => '房间下一首演唱歌曲变化',
'next_song_info' => $next_song_info
];
model('Chat')->sendMsg(1071,$sonng_log['room_id'],$data);
}else{
$song_info_data = [
'text' => '房间当前演唱歌曲变化',
'song_info' => null
];
model('Chat')->sendMsg(1070,$sonng_log['room_id'],$song_info_data);
$data = [
'text' => '房间下一首演唱歌曲变化',
'next_song_info' => null
];
model('Chat')->sendMsg(1071,$sonng_log['room_id'],$data);
return ['code' => 0, 'msg' => '暂无歌曲,请点歌吧','data' => null];
}
}else{
return ['code' => 0, 'msg' => '切歌失败','data' => null];
}
}
}else{
return ['code' => 0, 'msg' => '网络错误','data' => null];
}
return ['code' => 1, 'msg' => '切歌成功','data' => null];
}
}