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_time = db::name('vs_room')->where('id',$room_id)->value('sign_time') + 1; $result = db::name('vs_room')->where('id',$room_id)->update([ 'sign_type' => 1, 'sign_time' => $sign_time, 'updatetime' => time() ]); if($result){ //给前端推送数据 $text['text'] = '开始签约'; $text['sign_time'] = $sign_time; model('api/Chat')->sendMsg(1090,$room_id,$text); return ['code' => 1, 'msg' => '成功','data' => $sign_time]; }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]; } //开启事务 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]; } //用户财富等级更新 $user_level = model('Level')->user_level_data_update($user_id,$sign_value,1,$room_id); if(!$user_level){ 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]; } //记录房间流水及明细 //收礼记录行为日志 $give_gift = model('api/GiveGift') -> change_user_give_gift_log($user_id,0,$sign_value,0,0,2,1,$room_id,0); if(!$give_gift){ Db::rollback(); return ['code' => 0, 'msg' => '出价失败', 'data' => null]; } //增加房间火热值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(); //获取出价最高用户 $sign_user = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->order('sign_value desc')->field('user_id,sign_value')->find(); //其他的出价退回到用户的钱包 $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(); //给前端推送数据 $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');//等级图标 } $text['text'] = '签约出价最高用户'; $text['FromUserInfo'] = $FromUserInfo; $text['sign_value'] = $sign_user['sign_value']; $text['sign_time'] = $sign_time; 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 */ public function end_sign($user_id,$room_id,$sign_time,$sign_user_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 = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time])->select(); if($sign){ foreach ($sign as $k => $v){ if($v['type'] == 1){ return ['code' => 0, 'msg' => '该场次签约已结束', 'data' => null]; } } } //查询签约用户的身份 是否是第一次被签 是否当前有签 $is_first_sign = db::name('vs_user_sign')->where('sign_user_id',$sign_user_id)->count(); $before_sign_user = null; if($is_first_sign < 1){ //第一次被签平台抽成 $sign_app_ratio = get_system_config_value('first_sign_app_ratio'); $sign_user_type = 0; }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])->select(); if($is_sign){ foreach ($is_sign as $k => $v){ if($v['end_time'] >= time()){ $sign_user_type = 2; $before_sign_user = $v['user_id']; } } } } //获取签约出价最高的 $max_sign_user = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time])->order('sign_value desc')->find(); //开启事务 db::startTrans(); //修改他的状态 $result = db::name('vs_user_sign_auction')->where(['id' => $max_sign_user['id']])->update(['type' => 1,'signtime' => time()]); //给fa_vs_user_sign 添加信息 $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' => get_system_config_value('sign_times')*24*60*60, 'end_time' => time() + get_system_config_value('sign_times')*24*60*60, 'createtime' => time(), ]; $result1 = db::name('vs_user_sign')->insert($data); if(!$result || !$result1){ db::rollback(); return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null]; } //其他的出价退回到用户的钱包 这个是为了防止上面并发产生的没退款用户 $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]; } } } } //根据被签约的用户类型计算给响应用户的金额 //减去平台抽成 剩余的给相应的人 $sign_user_cion = $max_sign_user['sign_value'] * (100 - $sign_app_ratio) / 100;//金币数 //计算收益 $shouyizs = coin_earning($sign_user_cion,100 - $sign_app_ratio); 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++){ $data = [ 'user_id' => $max_sign_user['sign_user_id'], 'value' => round($shouyizs/7, 4), 'day' => date('Y-m-d', strtotime("+$i days")), // 从今天开始连续七天的日期 'createtime' => time() ]; // 插入数据库 $result[$i] = db::name('vs_user_sign_task')->insert($data); if(!$result[$i]){ db::rollback(); return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null]; } } }elseif ($sign_user_type == 2){ //签过没过期 给上任签约者 $result4 = model('api/GiveGift') -> change_user_cion_or_earnings_log($before_sign_user,$shouyizs,$room_id,2,52,'被首次签约成功收入'); if(!$result4){ db::rollback(); return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null]; } } 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');//等级图标 } $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); return ['code' => 1, 'msg' => '操作成功', 'data' => null]; } }