Files
mier-php/application/api/model/KtvRoom.php
2025-08-11 10:22:05 +08:00

639 lines
28 KiB
PHP

<?php
namespace app\api\model;
use think\Db;
use think\Model;
class KtvRoom extends Model
{
//开始K歌活动
public function open_auction($uid, $rid)
{
$config = get_uncache_system_config();
$user_info = db::name('user')->field('uid')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$room_info = db::name('room')->find($rid);
if(!$room_info){
return ['code' => 201, 'msg' => '房间信息不存在', 'data' => null];
}
//是否有权限
if($uid != $room_info['room_host_uid'] && $uid != $room_info['room_owner_uid']){
return ['code' => 201, 'msg' => '您无权限进行该操作', 'data' => null];
}
//是否有人在K歌麦上
$map = [];
$map[] = ['rid', '=', $rid];
$map[] = ['micro_id', 'in', [1,2,3,4]];
$map[] = ['uid', '>', 0];
$room_micro_info = db::name('room_micro')->where($map)->find();
if(!$room_micro_info){
return ['code' => 201, 'msg' => '当前尚未有人在麦上,无法开启', 'data' => null];
}
//当前是否已有进行中的K歌
$map = [];
$map[] = ['rid', '=', $rid];
$map[] = ['is_delete', '=', 1];
$room_auction_info = db::name('room_song_log')->where($map)->find();
if($room_auction_info){
return ['code' => 201, 'msg' => '当前已有进行中的,请勿重复开启', 'data' => null];
}
Db::startTrans();
try {
//当前前四个麦位在线用户
$map = [];
$map[] = ['rid', '=', $rid];
$map[] = ['micro_id', 'in', [1,2,3,4]];
$map[] = ['uid', '>', 0];
$uid_arr = db::name('room_micro')->where($map)->order('micro_id asc')->column('uid');
$uid_array = implode(',', $uid_arr);
//添加K歌活动记录记录
$insert = [];
$insert['rid'] = $rid;
$insert['uid_array'] = $uid_array;
$insert['uid'] = $uid_arr[0];
$insert['status'] = 2;
$insert['add_time'] = time();
$rsid = db::name('room_song_log')->insertGetId($insert);
if(!$rsid){
Db::rollback();
return ['code' => 201, 'msg' => '开始失败', 'data' => null];
}
$now_time = time();
$insert_data = [];
//添加K歌麦上用户记录
foreach ($uid_arr as $k => $v){
$micro_id = db::name('room_micro')->where('rid', $rid)->where('uid', $v)->value('micro_id');
//是否有制作人
$producer_uid = 0;
$user_sign_contract = db::name('user_sign_contract')->where('sign_uid', $v)->where('is_delete', 1)->find();
if($user_sign_contract){
$producer_uid = $user_sign_contract['uid'];
}
//用户身价
$social = $config['initial_user_social'];
$user_social = db::name('user')->where('uid', $v)->find();
if(!empty(ceil($user_social['social']))){
$social = $user_social['social'];
}
$insert = [];
$insert['rid'] = $rid;
$insert['rsid'] = $rsid;
$insert['uid'] = $v;
$insert['micro_id'] = $micro_id;
$insert['producer_uid'] = $producer_uid;
if($k == 0){
$insert['song_start_time'] = $now_time;
$insert['song_end_time'] = $now_time + $config['ktv_room_start_time'];
}else{
$insert['song_start_time'] = 0;
$insert['song_end_time'] = 0;
}
$insert['start_price'] = $social;
$insert['end_price'] = $social;
$insert['add_time'] = $now_time;
$insert_data[] = $insert;
}
$reslut = db::name('room_song_user_log')->insertAll($insert_data);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '开始失败', 'data' => null];
}
Db::commit();
model('api/room')->push_room_micro_data($rid);
return ['code' => 200, 'msg' => '开始成功', 'data' => null];
} catch (\Exception $e) {
// 回滚事务
dump($e);
Db::rollback();
return ['code' => 201, 'msg' => '开始失败', 'data' => null];
}
}
//定时结束唱歌时间
public function colse_room_song_user_status(){
set_time_limit(0);
ini_set('memory_limit', '1024M');
$map = [];
$map[] = ['song_end_time', '>', 0];
$map[] = ['song_end_time', '<', time()];
$map[] = ['status', '=', 1];
$map[] = ['is_delete', '=', 1];
$list = db::name('room_song_user_log')->where($map)->select();
foreach ($list as $k => $v){
db::name('room_song_user_log')->where('id', $v['id'])->update(['status' => 2, 'update_time' => time()]);
model('api/room')->push_room_micro_data($v['rid']);
model('api/Agora')->user_quit_song_del($v['uid'], $v['rid']);
}
echo date('Y-m-d H:i:s').'定时结束唱歌时间 执行成功';
}
//送礼物增加唱歌时长
public function send_gift_add_song_time($uid, $user_id, $rid, $gid, $num, $total_gift_price){
$map = [];
$map[] = ['rid', '=', $rid];
$map[] = ['uid', '=', $user_id];
$map[] = ['song_start_time', '>', 0];
$map[] = ['status', '=', 1];
$map[] = ['is_delete', '=', 1];
$room_song_user_log = db::name('room_song_user_log')->where($map)->find();
if($room_song_user_log){
$surplus_time = $room_song_user_log['song_end_time'] - $room_song_user_log['song_start_time'];
$max_time = $room_song_user_log['song_start_time'] + 300;
if($room_song_user_log['song_end_time'] > time() && $room_song_user_log['song_end_time'] < $max_time){
$add_time = ceil($total_gift_price/10) * 2;
if($add_time > 0){
$song_add_time = $room_song_user_log['song_end_time'] + $add_time;
if($song_add_time > $max_time){
$song_add_time = $max_time;
}
//增加唱歌时长
$reslut = db::name('room_song_user_log')->where('id', $room_song_user_log['id'])->update(['song_end_time' => $song_add_time, 'update_time' => time()]);
if(!$reslut){
return ['code' => 201, 'msg' => '失败', 'data' => null];
}
//记录
$insert = [];
$insert['uid'] = $uid;
$insert['user_id'] = $user_id;
$insert['gid'] = $gid;
$insert['num'] = $num;
$insert['total_price'] = $total_gift_price;
$insert['song_time'] = $song_add_time;
$insert['add_time'] = time();
$reslut = db::name('user_room_song_time')->insert($insert);
if(!$reslut){
return ['code' => 201, 'msg' => '失败', 'data' => null];
}
}
}
}
return ['code' => 200, 'msg' => '获取成功', 'data' => null];
}
//用户出价
public function user_auction_price($uid, $rid, $user_id, $price){
$user_info = db::name('user')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$room_info = db::name('room')->find($rid);
if(!$room_info){
return ['code' => 201, 'msg' => '该房间信息不存在', 'data' => null];
}
//该价位是否存在
$auction_price = db::name('auction_price')->where('price', $price)->where('is_delete', 1)->find();
if(!$auction_price){
return ['code' => 201, 'msg' => '该加价信息不存在', 'data' => null];
}
if($uid == $user_id){
return ['code' => 201, 'msg' => '自己不能竞拍自己', 'data' => null];
}
//当前拍卖信息
$room_song_log = db::name('room_song_log')->where('rid', $rid)->where('is_delete', 1)->find();
if(!$room_song_log){
return ['code' => 201, 'msg' => '当前尚未开始', 'data' => null];
}
//该用户是否处于竞拍阶段
$room_song_user_log = db::name('room_song_user_log')->where('rsid', $room_song_log['id'])->where('uid', $user_id)->where('is_delete', 1)->find();
if(!$room_song_user_log){
return ['code' => 201, 'msg' => '跟当前用户不符', 'data' => null];
}
if($room_song_user_log['status'] != 2){
return ['code' => 201, 'msg' => '当前尚未处于签约阶段', 'data' => null];
}
Db::startTrans();
try {
//当前竞拍价
$now_auction_price = $room_song_user_log['end_price'];
//当前用户金额是否可以加价
$user_auction_price = model('NewRoom')->get_user_auction_price($uid);
if($user_info['integral'] < ($user_auction_price + $price + $now_auction_price)){
return ['code' => 201, 'msg' => '您当前的金币不足以加价', 'data' => null];
}
//用户加价信息
$user_auction_info = db::name('user_room_song_auction')->where('rsid', $room_song_log['id'])->where('auction_uid', $uid)->where('uid', $user_id)->find();
if($user_auction_info){
$update = [];
$update['price'] = $now_auction_price + $price;
$update['update_time'] = time();
$reslut = db::name('user_room_song_auction')->where('id', $user_auction_info['id'])->update($update);
}else{
$insert = [];
$insert['rid'] = $rid;
$insert['rsid'] = $room_song_log['id'];
$insert['uid'] = $user_id;
$insert['auction_uid'] = $uid;
$insert['price'] = $now_auction_price + $price;
$insert['add_time'] = time();
$reslut = db::name('user_room_song_auction')->insert($insert);
}
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '加价失败', 'data' => null];
}
//用户加价记录
$insert_data = [];
$insert_data['rsid'] = $room_song_log['id'];
$insert_data['rid'] = $rid;
$insert_data['auction_uid'] = $uid;
$insert_data['uid'] = $user_id;
$insert_data['now_price'] = $now_auction_price;
$insert_data['price'] = $price;
$insert_data['add_time'] = time();
$reslut = db::name('user_room_song_auction_log')->insert($insert_data);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '开启失败', 'data' => null];
}
//修改当前用户当前最高竞拍价
$update = [];
$update['update_time'] = time();
$reslut = db::name('room_song_user_log')->where('id', $room_song_user_log['id'])->inc('end_price', $price)->update($update);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '开启失败', 'data' => null];
}
//是否提醒制作人
$is_push = 2;
if(!empty($room_song_user_log['producer_uid'])){
$producer_info = db::name('user')->where('uid', $room_song_user_log['producer_uid'])->find();
if($producer_info){
$send_producer_message = db::name('send_producer_message')->where('rsid', $room_song_log['id'])->where('uid', $user_id)->where('producer_uid', $room_song_user_log['producer_uid'])->find();
if(empty($send_producer_message)){
$insert = [];
$insert['rsid'] = $room_song_log['id'];
$insert['uid'] = $user_id;
$insert['producer_uid'] = $room_song_user_log['producer_uid'];
$insert['add_time'] = time();
$reslut = db::name('send_producer_message')->insert($insert);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '开启失败', 'data' => null];
}
$is_push = 1;
}
}
}
Db::commit();
model('api/room')->push_room_micro_data($rid);
//提醒制作人
if($is_push == 1){
$push_message = [];
$push_message['rid'] = $rid;
//提示制作人自己的艺人被拍
$push_data = [];
$push_data['code'] = 3010;
$push_data['msg'] = "提示制作人自己的艺人被拍";
$push_data['data'] = $push_message;
model('api/WebSocketPush')->send_to_one($room_song_user_log['producer_uid'], $push_data);
}
return ['code' => 200, 'msg' => '加价成功', 'data' => null];
} catch (\Exception $e) {
// 回滚事务
dump($e);
Db::rollback();
return ['code' => 201, 'msg' => '加价失败', 'data' => null];
}
}
//结束K歌活动
public function finish_auction($uid, $rid, $user_id){
$config = get_uncache_system_config();
$user_info = db::name('user')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$user_id_info = db::name('user')->find($user_id);
if(!$user_id_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$room_info = db::name('room')->find($rid);
if(!$room_info){
return ['code' => 201, 'msg' => '该房间信息不存在', 'data' => null];
}
//是否有权限结束
if($room_info['room_host_uid'] != $uid){
return ['code' => 201, 'msg' => '当前麦上主持才可结束', 'data' => null];
}
//当前房间是否正在进行的K歌活动
$room_song_log = db::name('room_song_log')->where('rid', $rid)->where('is_delete', 1)->find();
if(!$room_song_log){
return ['code' => 201, 'msg' => '当前尚未开始', 'data' => null];
}
//该用户是否处于竞拍阶段
$room_song_user_log = db::name('room_song_user_log')->where('rsid', $room_song_log['id'])->where('uid', $user_id)->where('is_delete', 1)->find();
if(!$room_song_user_log){
return ['code' => 201, 'msg' => '跟当前用户不符', 'data' => null];
}
if($room_song_user_log['status'] != 2){
return ['code' => 201, 'msg' => '当前尚未处于签约阶段', 'data' => null];
}
//
Db::startTrans();
try {
$now_time = time();
//是否有最高出价
$user_room_song_auction = db::name('user_room_song_auction')->where('rsid', $room_song_log['id'])->where('uid', $user_id)->order('price desc')->limit(1)->find();
if(empty($user_room_song_auction)){//流拍
//当前用户K歌拍卖结束
$reslut = db::name('room_song_user_log')->where('id', $room_song_user_log['id'])->update(['status' => 3, 'is_delete' => 2, 'update_time' => time(), 'end_time' => time()]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
$is_push = 2;
}else{//签约
//是否何他签过约
$user_sign_contract = db::name('user_sign_contract')->where('uid', $user_room_song_auction['auction_uid'])->where('sign_uid', $user_room_song_auction['uid'])->where('is_delete',1)->find();
if(!empty($user_sign_contract)){
$update = [];
$update['price'] = $user_room_song_auction['price'];
$update['end_time'] = $user_sign_contract['end_time'] + (60*60*24*7);
$update['update_time'] = time();
$reslut = db::name('user_sign_contract')->where('id', $user_sign_contract['id'])->update($update);
}else{
//解除该用户之前的签约
$last_sign_contract = db::name('user_sign_contract')->where('sign_uid', $user_room_song_auction['uid'])->where('is_delete', 1)->find();
if(!empty($last_sign_contract)){
$reslut = db::name('user_sign_contract')->where('id', $last_sign_contract['id'])->update(['is_delete' => 2, 'update_time' => time()]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
}
$insert = [];
$insert['uid'] = $user_room_song_auction['auction_uid'];
$insert['sign_uid'] = $user_room_song_auction['uid'];
$insert['price'] = $user_room_song_auction['price'];
$insert['add_time'] = $now_time;
$insert['end_time'] = $now_time + (60*60*24*7);
$reslut = db::name('user_sign_contract')->insert($insert);
}
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
//修改用户身价及是否签约
$reslut = db::name('user')->where('uid', $user_room_song_auction['uid'])->update(['social' => $user_room_song_auction['price'], 'is_sign' => 1, 'update_time' => time()]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
//修改用户制作人身份
$is_producer = db::name('user')->where('uid', $user_room_song_auction['auction_uid'])->value('is_producer');
if($is_producer == 2){
$reslut = db::name('user')->where('uid', $user_room_song_auction['auction_uid'])->update(['is_producer' => 1, 'update_time' => time()]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
}
//扣除拍卖人的金币
$reslut = model('admin/User')->change_user_money_by_uid($user_room_song_auction['auction_uid'], -$user_room_song_auction['price'], 2, 24, "拍卖签约扣除金币", $user_room_song_auction['auction_uid'], 0, $rid);
if ($reslut['code'] == 201) {
Db::rollback();
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
//签约用户是否有制作人,扣除百分之十给前制作人
if(!empty($room_song_user_log['producer_uid'])){
$producer_price = $user_room_song_auction['price'] * 0.9;
$reslut = model('admin/User')->change_user_money_by_uid($room_song_user_log['producer_uid'], $producer_price, 2, 26, "前制作人获取签约用户被拍金币", $room_song_user_log['producer_uid'], 0, $rid);
if ($reslut['code'] == 201) {
Db::rollback();
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
}
//当前用户K歌拍卖结束
$reslut = db::name('room_song_user_log')->where('id', $room_song_user_log['id'])->update(['auction_uid' => $user_room_song_auction['auction_uid'], 'end_price' => $user_room_song_auction['price'],'status' => 3, 'is_delete' => 2, 'update_time' => time(), 'end_time' => time()]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
$is_push = 1;
}
//新人签约用户唱前三首歌获取收益
$user_new_time = $user_id_info['add_time'] + (60*60*24*7);
// if($user_new_time > $now_time){
// //是否是前三首歌
// $user_song_count = db::name('room_song_user_log')->where('uid', $user_id)->where('status', 3)->where('is_delete', 2)->count();
// if($user_song_count < 3){
// $user_song_money = 1;
// $reslut = model('admin/User')->change_user_money_by_uid($user_id, $user_song_money, 1, 27, "新人签约唱歌获取金币", $user_id, 0, $rid);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// }
// }
//是否有下一个用户
$next_user_song_auction = db::name('room_song_user_log')->where('rsid', $room_song_log['id'])->where('is_delete', 1)->order('micro_id asc')->find();
if(!empty($next_user_song_auction)){//有则进行下一个
$update = [];
$update['song_start_time'] = $now_time;
$update['song_end_time'] = $now_time + $config['ktv_room_start_time'];
$update['update_time'] = $now_time;
$reslut = db::name('room_song_user_log')->where('id', $next_user_song_auction['id'])->update($update);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
$reslut = db::name('room_song_log')->where('id', $room_song_log['id'])->update(['uid' => $next_user_song_auction['uid'], 'update_time' => time()]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
}else{//没有则结束该活动
$reslut = db::name('room_song_log')->where('id', $room_song_log['id'])->update(['uid' => 0, 'status' => 3, 'update_time' => time(), 'is_delete' => 2]);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
//拍卖用户下麦
$map = [];
$map[] = ['rid', '=', $rid];
$map[] = ['micro_id', 'in', [1,2,3,4]];
$map[] = ['uid', '>', 0];
$reslut = db::name('room_micro')->where($map)->update(['uid' => 0, 'frame_gid' => 0, 'centre_gid' => 0, 'above_gid' => 0, 'below_gid' => 0, 'left_gid'=> 0, 'right_gid' => 0, 'update_time' => time()]);
// if(!$reslut){
// Db::rollback();
// return ['code' => 201, 'msg' => '结束失败10', 'data' => null];
// }
//更新老板麦位
model('RoomBossMicro')->update_room_boss_micro($rid);
}
Db::commit();
model('api/room')->push_room_micro_data($rid);
if($is_push == 1){
$auction_user_info = db::name('user')->find($user_room_song_auction['auction_uid']);
$sign_user_info = db::name('user')->find($user_room_song_auction['uid']);
$push_message = [];
$push_message['auction_user_info']['uid'] = $user_room_song_auction['auction_uid'];
$push_message['auction_user_info']['nick_name'] = mb_convert_encoding(base64_decode($auction_user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
$push_message['auction_user_info']['head_pic'] = localpath_to_netpath($auction_user_info['head_pic']);
$push_message['sign_user_info']['uid'] = $user_room_song_auction['uid'];
$push_message['sign_user_info']['nick_name'] = mb_convert_encoding(base64_decode($sign_user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
$push_message['sign_user_info']['head_pic'] = localpath_to_netpath($sign_user_info['head_pic']);
//提示签约成功
$push_data = [];
$push_data['code'] = 3012;
$push_data['msg'] = "签约成功";
$push_data['data'] = $push_message;
model('api/WebSocketPush')->send_to_group($rid, $push_data);
}
return ['code' => 200, 'msg' => '结束成功', 'data' => null];
} catch (\Exception $e) {
// 回滚事务
dump($e);
Db::rollback();
return ['code' => 201, 'msg' => '结束失败', 'data' => null];
}
}
//结束当前用户唱歌阶段
public function finish_user_song($uid, $rid, $user_id){
$user_info = db::name('user')->find($uid);
if(!$user_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$user_id_info = db::name('user')->find($user_id);
if(!$user_id_info){
return ['code' => 201, 'msg' => '参数错误', 'data' => null];
}
$room_info = db::name('room')->find($rid);
if(!$room_info){
return ['code' => 201, 'msg' => '该房间信息不存在', 'data' => null];
}
//是否有权限结束
if($room_info['room_host_uid'] != $uid){
return ['code' => 201, 'msg' => '当前麦上主持才可操作', 'data' => null];
}
//当前房间是否正在进行的K歌活动
$room_song_log = db::name('room_song_log')->where('rid', $rid)->where('is_delete', 1)->find();
if(!$room_song_log){
return ['code' => 201, 'msg' => '当前尚未开始', 'data' => null];
}
//该用户是否处于竞拍阶段
$room_song_user_log = db::name('room_song_user_log')->where('rsid', $room_song_log['id'])->where('uid', $user_id)->where('is_delete', 1)->find();
if(!$room_song_user_log){
return ['code' => 201, 'msg' => '跟当前用户不符', 'data' => null];
}
if($room_song_user_log['status'] != 1){
return ['code' => 201, 'msg' => '当前尚未处于唱歌阶段', 'data' => null];
}
Db::startTrans();
try {
$reslut = db::name('room_song_user_log')->where('id', $room_song_user_log['id'])->update(['status' => 2, 'update_time' => time()]);
if(!$reslut){
return ['code' => 201, 'msg' => '失败', 'data' => null];
}
Db::commit();
model('api/room')->push_room_micro_data($rid);
model('api/Agora')->user_quit_song_del($user_id, $rid);
return ['code' => 200, 'msg' => '成功', 'data' => null];
} catch (\Exception $e) {
// 回滚事务
dump($e);
Db::rollback();
return ['code' => 201, 'msg' => '失败', 'data' => null];
}
}
}