Files
yusheng-php/application/api/model/Sign.php

690 lines
32 KiB
PHP
Raw Normal View History

2025-11-26 11:36:08 +08:00
<?php
namespace app\api\model;
use think\Db;
use think\Model;
class Sign extends Model
{
/*
* 开始签约
* @param int $user_id 用户id
* @param int $room_id 房间id
* @param int $sign_user_id 签约麦的用户id
*/
2025-11-27 16:32:41 +08:00
public function start_sign($user_id,$room_id,$sign_user_id){
2025-11-26 11:36:08 +08:00
//权限判断主持及以上才可操作
$owner = db::name('vs_room')->where(['id' => $room_id, 'user_id' => $user_id])->field('id')->find();
$host = db::name('vs_room_host')->where(['room_id' => $room_id, 'user_id' => $user_id,'delete_time' => null])->find();
if(!$owner && !$host){
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
}
2025-12-02 15:36:17 +08:00
//查询签约用户是否在麦位上
$accept_user_is_on_pit = db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => 1])->find();
if($accept_user_is_on_pit['user_id'] == 0){
return ['code' => 0, 'msg' => '签约麦位没有用户', 'data' => null];
}
2025-11-28 10:50:54 +08:00
$is_first_sign = db::name('vs_user_sign')->where('sign_user_id',$sign_user_id)->count();
if($is_first_sign < 1){
//第一次被签平台抽成
$sign_times = get_system_config_value('first_sign_times');
}else{
//不是第一次被签平台抽成
$sign_times = get_system_config_value('sign_times');
}
2025-11-26 11:36:08 +08:00
//修改房间状态
2025-11-27 18:34:07 +08:00
db::name('vs_room')->where('id',$room_id)->update([
'sign_type' => 1,//签约房状态0-等待开始1-进行中
2025-11-26 11:36:08 +08:00
'updatetime' => time()
]);
2025-12-01 16:48:05 +08:00
$market_value = db::name('user')->where('id', $sign_user_id)->value('market_value');
2025-11-27 15:51:58 +08:00
$res = db::name('vs_room_sign')->insertGetId([
'room_id' => $room_id,
'sign_type' => 1,
'end_time' => time() + 60 * 5,//签约时长5分钟
2025-11-27 16:32:41 +08:00
'sign_user_id' => $sign_user_id,
2025-11-28 10:50:54 +08:00
'sign_day' => $sign_times,
2025-12-01 16:48:05 +08:00
'market_value' => $market_value,
2025-11-27 15:51:58 +08:00
'createtime' => time()
]);
2025-11-27 18:34:07 +08:00
if($res){
2025-11-26 11:36:08 +08:00
//给前端推送数据
$text['text'] = '开始签约';
2025-11-27 15:51:58 +08:00
$text['sign_id'] = $res;
2025-11-28 10:50:54 +08:00
$text['sign_day'] = $sign_times;
2025-12-01 16:48:05 +08:00
$text['current_body_value'] = $market_value;
2025-11-28 09:30:29 +08:00
$text['end_time'] = time() + 60 * 5;//签约时长5分钟
2025-11-26 11:36:08 +08:00
model('api/Chat')->sendMsg(1090,$room_id,$text);
2025-11-27 18:34:07 +08:00
return ['code' => 1, 'msg' => '成功','data' => $res];
2025-11-26 11:36:08 +08:00
}else{
return ['code' => 0, 'msg' => '网络错误,请重试','data' => null];
}
}
/*
* 签约出价
* @param int $user_id 用户id
* @param int $room_id 房间id
* @param int $sign_user_id 签约麦的用户id
* @param int $sign_value 出价
* @param int $sign_time 签约场次
* @return array
*/
public function sign_coin($user_id,$room_id,$sign_user_id,$sign_value,$sign_time){
//查询用户金币
$user_coin = db::name('user_wallet')->where('user_id',$user_id)->value('coin');
if($user_coin < $sign_value){
return ['code' => 0, 'msg' => '金币不足','data' => null];
}
2025-12-01 12:27:15 +08:00
2025-11-26 11:36:08 +08:00
//开启事务
db::startTrans();
//扣除用户金币并记录日志
$wallet_update = model('api/GiveGift') -> change_user_cion_or_earnings_log($user_id,$sign_value,$room_id,1,50,'用户签约关系');
if(!$wallet_update){
Db::rollback();
return ['code' => 0, 'msg' => '扣除用户金币失败', 'data' => null];
}
//记录签约出价
$data = [
'user_id' => $user_id,
'room_id' => $room_id,
'sign_time' => $sign_time,
'sign_user_id' => $sign_user_id,
'sign_value' => $sign_value,
'createtime' => time(),
];
$result = db::name('vs_user_sign_auction')->insert($data);
if(!$result){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试!','data' => null];
}
2025-12-01 12:41:12 +08:00
//记录房间流水及明细
//收礼记录行为日志
$give_gift = model('api/GiveGift') -> change_user_give_gift_log($user_id,0,$sign_value,0,$sign_user_id,2,1,$room_id,0,3);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '出价失败', 'data' => null];
}
2025-11-26 11:36:08 +08:00
//增加房间火热值hot_value
$gift_totalaa = $sign_value * get_system_config_value('coin_charm_exp');
db::name('vs_room')->where(['id' => $room_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update();
//获取出价最高用户
2025-11-28 15:06:29 +08:00
$sign_user = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->order('sign_value desc')->field('id,user_id,sign_value')->find();
2025-12-01 12:27:15 +08:00
2025-11-26 11:36:08 +08:00
//其他的出价退回到用户的钱包
$refund = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->select();
if($refund){
foreach ($refund as $k => $v){
if($v['id'] != $sign_user['id']){
//给用户退回签约金额记录行为日志
$result2[$k] = model('api/GiveGift') -> change_user_cion_or_earnings_log($v['user_id'],$v['sign_value'],$room_id,1,51,'签约失败退款');
if(!$result2[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试,', 'data' => null];
}
$result3[$k] = db::name('vs_user_sign_auction')->where('id',$v['id'])->update(['type' => 2,'refundtime' => time()]);
if(!$result3[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试。', 'data' => null];
}
}
}
}
//提交数据
db::commit();
2025-11-27 18:00:27 +08:00
//处理麦位
$this->pit_number($room_id,$sign_user['user_id'],1);
2025-11-26 11:36:08 +08:00
//给前端推送数据
$FromUserInfo = db::name('user')->where('id',$sign_user['user_id'])->field('id as user_id,nickname,avatar,sex')->find();
$FromUserInfo['icon'][0] = model('api/UserData')->user_wealth_icon($sign_user['user_id']);//财富图标
$FromUserInfo['icon'][1] = model('api/UserData')->user_charm_icon($sign_user['user_id']);//魅力图标
//判断是否是歌手 如果是 返回等级图标
$isSinnger = db::name('vs_singer')->where(['user_id' => $sign_user['user_id'],'status' => 1])->value('level');
if($isSinnger){
$FromUserInfo['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger,'deletetime' => 0])->value('image');//等级图标
}
2025-12-01 12:27:15 +08:00
//组个列表
$sign_market_value = get_system_config_value('sign_market_value');
$sign_coin_list = [];
$first_value = $sign_user['sign_value'] + $sign_market_value; // 第一个值是身价加上sign_market_value
for ($i = 0; $i < 8; $i++) {
$sign_coin_list[] = (string)($first_value + $i); // 每个值在第一个值的基础上加i0到7
}
2025-11-26 11:36:08 +08:00
$text['text'] = '签约出价最高用户';
$text['FromUserInfo'] = $FromUserInfo;
$text['sign_value'] = $sign_user['sign_value'];
2025-11-27 15:51:58 +08:00
$text['sign_id'] = $sign_time;
2025-12-01 12:27:15 +08:00
$text['sign_coin_list'] = $sign_coin_list;
2025-11-26 11:36:08 +08:00
model('api/Chat')->sendMsg(1091,$room_id,$text);
return ['code' => 1, 'msg' => '成功','data' => null];
}
/*
* 签约结束
* @param int $user_id 用户id
* @param int $room_id 房间id
* @param int $sign_time 签约场次
* @param int $sign_user_id 签约麦的用户id
*/
2025-11-27 16:32:41 +08:00
public function end_sign($user_id,$room_id,$sign_time,$sign_user_id,$type = 1){
if($type == 1){
//权限判断主持及以上才可操作
$owner = db::name('vs_room')->where(['id' => $room_id, 'user_id' => $user_id])->field('id')->find();
$host = db::name('vs_room_host')->where(['room_id' => $room_id, 'user_id' => $user_id,'delete_time' => null])->find();
if(!$owner && !$host){
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
}
2025-11-26 11:36:08 +08:00
}
2025-11-27 16:32:41 +08:00
2025-11-26 11:36:08 +08:00
//根据场次判断是否结束
2025-11-27 15:51:58 +08:00
$sign = db::name('vs_room_sign')->where( ['id' => $sign_time])->find();
2025-11-27 16:32:41 +08:00
if($sign['sign_type'] != 1){
2025-11-27 15:51:58 +08:00
return ['code' => 0, 'msg' => '该场次签约已结束', 'data' => null];
2025-11-26 11:36:08 +08:00
}
//获取签约出价最高的
$max_sign_user = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time])->order('sign_value desc')->find();
2025-11-28 11:24:08 +08:00
if($max_sign_user){
$before_sign_user = null;
$is_sign = null;
//查询签约用户的身份 是否是第一次被签 是否当前有签
$is_first_sign = db::name('vs_user_sign')->where('sign_user_id',$sign_user_id)->count();
if($is_first_sign < 1){
//第一次被签平台抽成
$sign_app_ratio = get_system_config_value('first_sign_app_ratio');
$sign_user_type = 0;
$sign_times = get_system_config_value('first_sign_times');
}else{
//不是第一次被签平台抽成
$sign_app_ratio = get_system_config_value('sign_app_ratio');
//查找该用户是否在约
$sign_user_type = 1;
$is_sign = db::name('vs_user_sign')->where(['sign_user_id' => $sign_user_id,'end_time' => ['>',time()]])->find();
if($is_sign){
$sign_user_type = 2;
2025-11-28 16:52:02 +08:00
$before_sign_user = $is_sign['parent_user_id'];
2025-11-28 11:24:08 +08:00
}
$sign_times = get_system_config_value('sign_times');
}
//开启事务
db::startTrans();
//修改他的状态
$result = db::name('vs_user_sign_auction')->where(['id' => $max_sign_user['id']])->update(['type' => 1,'signtime' => time()]);
2025-11-28 18:04:39 +08:00
if(!$result){
2025-11-26 17:20:30 +08:00
db::rollback();
2025-11-28 11:24:08 +08:00
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
2025-11-28 18:04:39 +08:00
//签约
2025-12-01 16:48:05 +08:00
//根据被签约的用户类型计算给响应用户的金额
//减去平台抽成 剩余的给相应的人
$sign_user_cion = $max_sign_user['sign_value'] * (100 - $sign_app_ratio) / 100;//金币数
//计算收益
$shouyizs = coin_earning($sign_user_cion,100);
//签过没过期
if($sign_user_type == 2){
//本次签的还是上次的师傅
if($before_sign_user == $max_sign_user['user_id']){
$resultt = db::name('vs_user_sign')
->where(['id' => $is_sign['id']])
->update(['end_time' => time() + $sign_times*24*60*60,'sign_user_type' => $sign_user_type]);
if(!$resultt){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}else{
$result5 = db::name('vs_user_sign')->where(['id' => $is_sign['id']])
2025-12-02 11:31:51 +08:00
->update(['end_time' => time(),'type' => 4]);
2025-12-01 16:48:05 +08:00
if(!$result5){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
$data = [
'parent_user_id' => $max_sign_user['user_id'],
'sign_user_id' => $max_sign_user['sign_user_id'],
'sign_user_type' => $sign_user_type,
'sign_times' => $sign_times*24*60*60,
'end_time' => time() + $sign_times*24*60*60,
'createtime' => time(),
];
$result11 = db::name('vs_user_sign')->insert($data);
if(!$result11){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}
//签过没过期 给上任签约者
$result4 = model('api/GiveGift') -> change_user_cion_or_earnings_log($before_sign_user,$shouyizs,$room_id,2,54,'解约补偿');
if(!$result4){
2025-11-28 18:04:39 +08:00
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}else{
$data = [
'parent_user_id' => $max_sign_user['user_id'],
'sign_user_id' => $max_sign_user['sign_user_id'],
'sign_user_type' => $sign_user_type,
'sign_times' => $sign_times*24*60*60,
'end_time' => time() + $sign_times*24*60*60,
'createtime' => time(),
];
$result1 = db::name('vs_user_sign')->insert($data);
if(!$result1){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
2025-12-01 16:48:05 +08:00
if($sign_user_type == 0){
//首次签约 给被签约的人
$result4 = model('api/GiveGift') -> change_user_cion_or_earnings_log($max_sign_user['sign_user_id'],$shouyizs,$room_id,2,52,'被首次签约成功收入');
if(!$result4){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}elseif ($sign_user_type == 1){
//签过 给被签约的人分七天给他
// 数据插入 循环插入7条数据 day 取值是今天开始连续七天 的每一天的值 到天
for ($i = 0; $i < 7; $i++){
$data1 = [
'user_id' => $max_sign_user['sign_user_id'],
'value' => round($shouyizs/7, 4),
'day' => date('Y-m-d', strtotime("+$i days")), // 从今天开始连续七天的日期
'times' => $i+1,
'createtime' => time()
];
// 插入数据库
$result[$i] = db::name('vs_user_sign_task')->insert($data1);
if(!$result[$i]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}
}
2025-11-28 18:04:39 +08:00
}
2025-11-28 11:24:08 +08:00
//查看当前出价用户是否创建家族
2025-12-03 11:40:26 +08:00
$is_create_familys = db::name('vs_family')->where(['user_id' => $max_sign_user['user_id'],'type' => 1])->find();
if(!$is_create_familys){
$rres = model('Family')->createFamily($max_sign_user['user_id']);
}
2025-11-28 11:24:08 +08:00
$is_create_family = db::name('vs_family')->where(['user_id' => $max_sign_user['user_id'],'type' => 1])->find();
if($is_create_family){
2025-11-28 16:56:59 +08:00
//是否已在家族中
$is_in_family = db::name('vs_family')
->where(['pid' => $max_sign_user['user_id'],'user_id' => $max_sign_user['sign_user_id'],'type' => 0,'deletetime' => 0])->find();
if(!$is_in_family){
//拉进家族和群聊
$data2 = [
'name' => $is_create_family['name'],
'pid' => $max_sign_user['user_id'],
'user_id' => $max_sign_user['sign_user_id'],
'createtime' => time(),
];
$result22 = db::name('vs_family')->insert($data2);
if(!$result22){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试!!', 'data' => null];
}
//拉入群聊
model('Tencent')->add_group_member('f'.$is_create_family['id'], $max_sign_user['sign_user_id']);
2025-11-28 11:24:08 +08:00
}
2025-11-26 17:20:30 +08:00
}
2025-11-26 11:36:08 +08:00
2025-11-28 11:24:08 +08:00
//其他的出价退回到用户的钱包 这个是为了防止上面并发产生的没退款用户
$refund = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->select();
if($refund){
foreach ($refund as $k => $v){
if($v['id'] != $max_sign_user['id']){
//给用户退回签约金额记录行为日志
$result2[$k] = model('api/GiveGift') -> change_user_cion_or_earnings_log($v['user_id'],$v['sign_value'],$room_id,1,51,'签约失败退款');
if(!$result2[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
$result3[$k] = db::name('vs_user_sign_auction')->where('id',$v['id'])->update(['type' => 2,'refundtime' => time()]);
if(!$result3[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
2025-11-26 11:36:08 +08:00
}
2025-11-28 11:24:08 +08:00
}
}
//修改房间信息
$res1 = db::name('vs_room')->where('id',$room_id)->update([
'sign_type' => 0,
'updatetime' => time()
]);
//修改房间签约信息
$res2 = db::name('vs_room_sign')->where(['id' => $sign_time])
->update([
'sign_type' => 0,
'end_time' => time()
]);
if(!$res1 || !$res2){
2025-11-26 11:36:08 +08:00
db::rollback();
2025-11-28 11:24:08 +08:00
return ['code' => 0, 'msg' => '网络错误,请重试.!', 'data' => null];
2025-11-26 11:36:08 +08:00
}
2025-12-01 12:27:15 +08:00
//用户财富等级更新
$user_level = model('Level')->user_level_data_update($max_sign_user['user_id'],$max_sign_user['sign_value'],1,$room_id);
if(!$user_level){
Db::rollback();
return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null];
}
2025-12-01 16:48:05 +08:00
//获取用户签约开始的身价
$market_value = $sign['market_value'];
2025-12-01 12:27:15 +08:00
$sign_values = $max_sign_user['sign_value'] - $market_value;
//更新用户的身价并且添加记录 此时增长的身价是出价 这个出价就是身价溢价
$dd = model('api/MarketValue')->change($sign_user_id,$sign_values,3);
if($dd['code'] != 1){
Db::rollback();
return ['code' => 0, 'msg' => $dd['msg'], 'data' => null];
}
2025-11-28 11:24:08 +08:00
db::commit();
//给前端推送
$FromUserInfo = db::name('user')->where('id',$max_sign_user['user_id'])->field('id as user_id,nickname,avatar,sex')->find();
$FromUserInfo['icon'][0] = model('api/UserData')->user_wealth_icon($max_sign_user['user_id']);//财富图标
$FromUserInfo['icon'][1] = model('api/UserData')->user_charm_icon($max_sign_user['user_id']);//魅力图标
//判断是否是歌手 如果是 返回等级图标
$isSinnger = db::name('vs_singer')->where(['user_id' => $max_sign_user['user_id'],'status' => 1])->value('level');
if($isSinnger){
$FromUserInfo['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger,'deletetime' => 0])->value('image');//等级图标
2025-11-27 11:48:53 +08:00
}
2025-11-28 11:24:08 +08:00
$ToUserInfo = db::name('user')->where('id',$max_sign_user['sign_user_id'])->field('id as user_id,nickname,avatar,sex')->find();
$ToUserInfo['icon'][0] = model('api/UserData')->user_wealth_icon($max_sign_user['sign_user_id']);//财富图标
$ToUserInfo['icon'][1] = model('api/UserData')->user_charm_icon($max_sign_user['sign_user_id']);//魅力图标
//判断是否是歌手 如果是 返回等级图标
$isSinnger = db::name('vs_singer')->where(['user_id' => $max_sign_user['sign_user_id'],'status' => 1])->value('level');
if($isSinnger){
$ToUserInfo['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger,'deletetime' => 0])->value('image');//等级图标
}
$text['text'] = '签约出价最高用户';
$text['FromUserInfo'] = $FromUserInfo;
$text['ToUserInfo'] = $ToUserInfo;
$text['sign_value'] = $max_sign_user['sign_value'];
model('api/Chat')->sendMsg(1092,$room_id,$text);
}else{
//修改房间信息
2025-12-02 11:31:51 +08:00
db::name('vs_room')->where('id',$room_id)->update([
2025-11-27 16:32:41 +08:00
'sign_type' => 0,
2025-11-28 11:24:08 +08:00
'updatetime' => time()
2025-11-27 15:51:58 +08:00
]);
2025-11-28 11:24:08 +08:00
//修改房间签约信息
2025-12-02 11:31:51 +08:00
db::name('vs_room_sign')->where(['id' => $sign_time])
2025-11-28 11:24:08 +08:00
->update([
'sign_type' => 0,
'end_time' => time()
]);
$text['text'] = '流拍';
$text['FromUserInfo'] = null;
$text['ToUserInfo'] = null;
$text['sign_value'] = 0;
2025-11-28 11:27:05 +08:00
model('api/Chat')->sendMsg(1092,$room_id,$text);
2025-11-26 11:36:08 +08:00
}
2025-11-27 18:00:27 +08:00
//处理麦位
$this->pit_number($room_id,0,0);
2025-11-26 11:36:08 +08:00
return ['code' => 1, 'msg' => '操作成功', 'data' => null];
}
2025-11-27 11:48:53 +08:00
2025-11-27 18:00:27 +08:00
/*
* 麦位处理
*/
public function pit_number($room_id,$user_id = 0,$type = 0){
if($type == 1){//上麦或者换麦
//获取房间2号位上的用户
2025-12-03 12:44:11 +08:00
$on_pit2_user = db::name('vs_room_pit')
2025-11-27 18:00:27 +08:00
->where(['room_id' => $room_id,'pit_number' => 2])->field('before_pit_number,user_id')->find();
2025-12-03 12:44:11 +08:00
if($on_pit2_user['user_id'] == $user_id){
2025-12-01 16:59:32 +08:00
return true;
}
2025-11-27 18:34:07 +08:00
2025-11-27 18:00:27 +08:00
//处理2号位
2025-12-03 12:44:11 +08:00
if($on_pit2_user && $on_pit2_user['user_id']){
2025-11-27 18:34:07 +08:00
//2号位有其他用户需要处理该用户
//获取2号位用户之前的位置上是否有用户
2025-11-27 18:00:27 +08:00
$before_pit_number = db::name('vs_room_pit')
2025-12-03 12:44:11 +08:00
->where(['room_id' => $room_id,'pit_number' => $on_pit2_user['before_pit_number']])->value('user_id');
2025-11-27 18:00:27 +08:00
2025-12-03 12:44:11 +08:00
if($before_pit_number || $on_pit2_user['before_pit_number'] == 0){
//之前位置有人或者之前麦位为空,直接下麦
2025-12-03 17:29:32 +08:00
model('api/RoomPit')->DownPit($on_pit2_user['user_id'], $room_id, 2,1);
2025-11-27 18:34:07 +08:00
} else {
//之前位置无人,换麦
2025-12-03 12:44:11 +08:00
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $on_pit2_user['before_pit_number']])
->update(['user_id' => $on_pit2_user['user_id']]);
2025-11-27 18:00:27 +08:00
2025-11-27 18:34:07 +08:00
//推送换麦消息
2025-12-03 12:44:11 +08:00
$this->sendPitChangeMessage($on_pit2_user['user_id'], $room_id, 2, $on_pit2_user['before_pit_number']);
2025-11-27 18:00:27 +08:00
}
2025-11-27 18:34:07 +08:00
}
//处理当前用户上2号位
if($user_id){
//查询当前用户是否已在麦上
$user_pit_info = db::name('vs_room_pit')
->where(['room_id' => $room_id, 'user_id' => $user_id])
->field('pit_number')->find();
2025-12-03 12:44:11 +08:00
if($user_pit_info && $user_pit_info['pit_number']){//用户已在麦上
//移除原麦位上的自己信息
2025-11-27 18:34:07 +08:00
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => $user_pit_info['pit_number']])
2025-12-02 15:59:48 +08:00
->update(['user_id' => 0]);
2025-12-03 12:44:11 +08:00
//换到2号位记录原麦位信息
2025-12-02 15:59:48 +08:00
db::name('vs_room_pit')->where(['room_id' => $room_id, 'pit_number' => 2])
->update(['user_id' => $user_id,'before_pit_number' => $user_pit_info['pit_number']]);
2025-11-27 18:34:07 +08:00
//推送换麦消息
$this->sendPitChangeMessage($user_id, $room_id, $user_pit_info['pit_number'], 2);
} else {
//用户不在麦上直接上2号麦
2025-11-27 18:00:27 +08:00
model('api/RoomPit')->OnPit($user_id, $room_id, 2);
}
}
2025-11-27 18:34:07 +08:00
} else {
//下麦 - 在麦位上的用户全部下麦
$on_pit_users = db::name('vs_room_pit')
2025-12-01 16:59:32 +08:00
->where(['room_id' => $room_id, 'user_id' => ['>', 0], 'pit_number' => ['<', 3]])
2025-11-27 18:34:07 +08:00
->select();
2025-11-27 18:00:27 +08:00
2025-11-27 18:34:07 +08:00
if($on_pit_users){
foreach ($on_pit_users as $pit_user){
2025-12-03 17:06:36 +08:00
model('RoomPit')->DownPit($pit_user['user_id'], $room_id, $pit_user['pit_number'],1);
2025-11-27 18:00:27 +08:00
}
}
}
return true;
}
2025-11-27 18:34:07 +08:00
/*
* 发送麦位变更消息
*/
private function sendPitChangeMessage($user_id, $room_id, $from_pit, $to_pit){
2025-12-03 17:40:33 +08:00
$userInfo = db::name('user')->where('id', $user_id)->field('id as user_id,nickname,avatar,sex,is_online')->find();
2025-11-27 18:34:07 +08:00
$userInfo['icon'][0] = model('UserData')->user_wealth_icon($user_id);//财富图标
$userInfo['icon'][1] = model('UserData')->user_charm_icon($user_id);//魅力图标
$userInfo['dress'] = model('Decorate')->user_decorate_detail($user_id, 1);
$userInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $user_id, 'room_id' => $room_id])->value('charm');
$nobility = model('api/Nobility')->getUserNobilityInfo($user_id);
$userInfo['nobility_info'] = $nobility;
$userInfo['mic_cycle'] = model('api/Decorate')->user_decorate_detail($user_id, 3);
$userInfo['nobility_image'] = $nobility['play_image'];
$userInfo['nickname_color'] = $nobility['nick_name_color'];
2025-11-28 17:02:51 +08:00
if($to_pit == 1){
$pit_text = '签约麦';
}elseif($to_pit == 2){
$pit_text = '师父麦';
}elseif ($to_pit == 3 || $to_pit == 4 || $to_pit == 5) {
$pit_text = '老板麦';
}elseif($to_pit == 9){
$pit_text = '主持麦';
}elseif ($to_pit == 10) {
$pit_text = '嘉宾麦';
}else{
$pit_text = $to_pit . '号麦';
}
$text['text'] = $userInfo['nickname'].' 换到'.$pit_text;
2025-11-27 18:34:07 +08:00
$text['FromUserInfo'] = $userInfo;
$text['from_pit_number'] = $from_pit;
$text['to_pit_number'] = $to_pit;
model('Chat')->sendMsg(1039, $room_id, $text);
}
2025-11-27 18:00:27 +08:00
2025-11-27 15:51:58 +08:00
/*
* 签约延时
* @param $user_id 用户id
* @param $room_id 房间id
* @param $sign_id 签约场次id
*/
public function sign_delay($user_id,$room_id,$sign_id){
//权限判断主持及以上才可操作
$owner = db::name('vs_room')->where(['id' => $room_id, 'user_id' => $user_id])->field('id')->find();
$host = db::name('vs_room_host')->where(['room_id' => $room_id, 'user_id' => $user_id,'delete_time' => null])->find();
if(!$owner && !$host){
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
}
$sign_info = db::name('vs_room_sign')->where(['id' => $sign_id])->find();
2025-11-28 11:29:11 +08:00
if(!$sign_info || (!empty($sign_info) && $sign_info['sign_type'] != 1)){
2025-11-27 15:51:58 +08:00
return ['code' => 0, 'msg' => '本场签约结束', 'data' => null];
}
$res = db::name('vs_room_sign')->where(['id' => $sign_id])
->update([
'end_time' => $sign_info['end_time'] + 300,//延时5分钟
]);
if(!$res){
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
//给前端推送
$text['text'] = '签约延时';
$text['end_time'] = $sign_info['end_time'] + 300;
model('api/Chat')->sendMsg(1093,$room_id,$text);
return ['code' => 1, 'msg' => '操作成功', 'data' => null];
}
2025-11-27 11:48:53 +08:00
/*
* 收礼检查是否有被签约和在合约期内 给上级返佣
* @param $user_id 用户id
* @param $gift_id 礼物id
* @param $gift_num 礼物数量
* @param $gift_price 礼物价格
* @param $room_id 房间id
*/
public function check_sign_gift($user_id,$gift_id,$gift_num,$gift_price,$room_id){
//获取用户签约信息
$sign_info = db::name('vs_user_sign')->where(['sign_user_id' => $user_id,'end_time' => ['>',time()]])->find();
if(!$sign_info){
return true;
}
$give_sign_ratio = get_system_config_value('give_sign_ratio');
2025-12-03 15:42:44 +08:00
$earning = $gift_price * $give_sign_ratio / 100;
$earnings = coin_earning($earning,100);
2025-11-27 11:48:53 +08:00
$data = [
'user_id' => $sign_info['parent_user_id'],
'sign_user_id' => $user_id,
'gift_id' => $gift_id,
'gift_num' => $gift_num,
'earnings' => $earnings,
'createtime' => time()
];
$result = db::name('vs_user_sign_earnings')->insert($data);
if($result){
$result4 = model('api/GiveGift') -> change_user_cion_or_earnings_log($sign_info['parent_user_id'],$earnings,$room_id,2,55,'签约用户收礼返佣');
if(!$result4){
return true;
}
}
return true;
}
/*
* 免费续签
* @param $user_id 用户id
* @param $sign_user_id 签约麦的用户id
*/
public function free_re_sign($user_id,$sign_user_id){
$first_sign_info = db::name('vs_user_sign')
->where(['sign_user_id' => $sign_user_id])->count();
if($first_sign_info > 1){
return ['code' => 0, 'msg' => '该用户已不满足免费续签条件', 'data' => null];
}
$sign_info = db::name('vs_user_sign')
2025-12-01 14:43:48 +08:00
->where(['parent_user_id' => $user_id,'sign_user_id' => $sign_user_id,'end_time' => ['>',time()]])->find();
2025-11-27 11:48:53 +08:00
if(!$sign_info){
return ['code' => 0, 'msg' => '您没有签约该用户或该用户已解约', 'data' => null];
}
if($sign_info['type'] >= 3){
return ['code' => 0, 'msg' => '免费续签次数已用完', 'data' => null];
}
$end_time = $sign_info['end_time'] + 86400 * get_system_config_value('free_re_sign_day');
$res = db::name('vs_user_sign')->where(['id' => $sign_info['id']])->update(['type' => $sign_info['type']+1,'end_time' => $end_time]);
if(!$res){
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
return ['code' => 1, 'msg' => '操作成功', 'data' => null];
}
/*
* 续签
* @param $user_id 用户id
* @param $sign_user_id 签约麦的用户id
*/
public function re_sign($user_id,$sign_user_id){
$sign_info = db::name('vs_user_sign')
2025-12-01 14:43:48 +08:00
->where(['parent_user_id' => $user_id,'sign_user_id' => $sign_user_id,'end_time' => ['>',time()]])->find();
2025-11-27 11:48:53 +08:00
if(!$sign_info){
return ['code' => 0, 'msg' => '您没有签约该用户或该用户已解约', 'data' => null];
}
//获取被签约用户当前身价
$market_value = db::name('user')->where('id',$sign_user_id)->value('market_value');
//获取系统配置的签约身价百分比
$sign_market_value = get_system_config_value('sign_user_ratio');
//获取系统配置非首签签约时长
$sign_times = get_system_config_value('sign_times');
2025-12-01 15:14:56 +08:00
$change_coin = ceil($market_value * $sign_market_value / 100);
2025-11-27 11:48:53 +08:00
//获取签约者的金币
$coin = db::name('user_wallet')->where('user_id',$user_id)->value('coin');
2025-12-01 15:14:56 +08:00
if($coin < $change_coin){
2025-11-27 11:48:53 +08:00
return ['code' => 0, 'msg' => '您的金币不足', 'data' => null];
}
$end_time = $sign_info['end_time'] + 86400 * $sign_times;
//开启事务
db::startTrans();
2025-12-01 14:55:08 +08:00
$res = db::name('vs_user_sign')->where(['id' => $sign_info['id']])->update(['end_time' => $end_time]);
2025-11-27 11:48:53 +08:00
if(!$res){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
2025-12-01 15:14:56 +08:00
$res2 = model('api/GiveGift') -> change_user_cion_or_earnings_log($user_id,$change_coin,0,1,56,'续约');
2025-11-27 11:48:53 +08:00
if(!$res2){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
db::commit();
return ['code' => 1, 'msg' => '操作成功', 'data' => null];
}
2025-11-26 11:36:08 +08:00
}