From 8dbbe1e2b3c7337a504b55209b5819226b162090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8D=8E=E6=B8=85?= <18691022700@163.com> Date: Wed, 26 Nov 2025 11:36:08 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E7=BA=A6=E6=88=BF=E7=9B=B8=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/api/controller/Sign.php | 68 ++++++ application/api/model/Chat.php | 8 + application/api/model/GiveGift.php | 7 +- application/api/model/MarketValue.php | 61 +++++ application/api/model/Sign.php | 291 ++++++++++++++++++++++++ application/api/model/UserWallet.php | 7 +- application/common/model/UserWallet.php | 11 + 7 files changed, 447 insertions(+), 6 deletions(-) create mode 100644 application/api/controller/Sign.php create mode 100644 application/api/model/MarketValue.php create mode 100644 application/api/model/Sign.php diff --git a/application/api/controller/Sign.php b/application/api/controller/Sign.php new file mode 100644 index 0000000..76046f3 --- /dev/null +++ b/application/api/controller/Sign.php @@ -0,0 +1,68 @@ +where('id', $user_id)->value('market_value'); + $sign_market_value = get_system_config_value('sign_market_value'); + //组个列表 + $sign_coin_list = []; + $first_value = $market_value + $sign_market_value; // 第一个值是身价加上sign_market_value + for ($i = 0; $i < 8; $i++) { + $sign_coin_list[] = $first_value + $i; // 每个值在第一个值的基础上加i(0到7) + } + return ['code' => 1, 'msg' => '成功', 'data' => $sign_coin_list]; + } + + + //签约开始 + public function start_sign() + { + $room_id = input('room_id', 0); + if ($room_id <= 0) { + return ['code' => 0, 'msg' => '参数错误']; + } + $reslut = model('Sign')->start_sign($this->uid, $room_id); + return V($reslut['code'], $reslut['msg'], $reslut['data']); + } + + + //签约出价 + public function sign_coin() + { + $user_id = input('user_id', 0); + $sign_value = input('sign_value', 0); + $room_id = input('room_id', 0); + $sign_time = input('sign_time', 0); + if ($sign_value <= 0 || $user_id <= 0 || $room_id <= 0) { + return ['code' => 0, 'msg' => '参数错误']; + } + $reslut = model('Sign')->sign_coin($this->uid, $room_id, $user_id, $sign_value,$sign_time); + + return V($reslut['code'], $reslut['msg'], $reslut['data']); + } + + + //签约结束 + public function end_sign() + { + $sign_time = input('sign_time', 0); + $room_id = input('room_id', 0); + $user_id = input('user_id', 0); + if ($sign_time <= 0 || $room_id <= 0) { + return ['code' => 0, 'msg' => '参数错误']; + } + $reslut = model('Sign')->end_sign($this->uid, $room_id, $sign_time,$user_id); + return V($reslut['code'], $reslut['msg'], $reslut['data']); + } + +} \ No newline at end of file diff --git a/application/api/model/Chat.php b/application/api/model/Chat.php index b01b347..c646ff0 100644 --- a/application/api/model/Chat.php +++ b/application/api/model/Chat.php @@ -136,6 +136,14 @@ class Chat extends Model // CP进入房间触发特效 // CPRoomEffect = 1080, + //签约房推送信息 + //开始签约 + // SignRoomStart = 1090, + //签约房签约出价最高用户 + // SignRoomSignUser = 1091, + //签约房间结束 + // SignRoomEnd = 1092, + diff --git a/application/api/model/GiveGift.php b/application/api/model/GiveGift.php index 2717e3a..f0a958b 100644 --- a/application/api/model/GiveGift.php +++ b/application/api/model/GiveGift.php @@ -908,6 +908,7 @@ class GiveGift extends Model // 1.系统调节 2.充值 3.提现 4.金币转增(送出) 5.每日任务奖励 6.充值返利 7.购买装扮 // 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换 // 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益 20.抢头条 21.公会长收益,22.提现驳回或提现失败返还,23.财富等级奖励金币领取,24.删除关系扣金币, + //50-签约,51-签约失败退回,52-首次被签约收入 if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20])){ $room_ids = 0; }else{ @@ -932,9 +933,9 @@ class GiveGift extends Model //根据类型判断是操作金币还是钻石得增加或减少 if($money_type == 1){//1金币 //增加用户金币类型 - $in_types = [2,5,6,8,13,14,15,16]; + $in_types = [2,5,6,8,13,14,15,16,51]; //减少用户金币类型 - $out_types = [4,7,10,17,20]; + $out_types = [4,7,10,17,20,50]; if(in_array($change_type,$in_types)){ //增加用户金币 $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$money); @@ -950,7 +951,7 @@ class GiveGift extends Model } }elseif ($money_type == 2){//2钻石 //增加用户钻石类型 - $in_types = [9,11,12,18,19,21]; + $in_types = [9,11,12,18,19,21,52]; //减少用户钻石类型 $out_types = [3,14]; if(in_array($change_type,$in_types)){ diff --git a/application/api/model/MarketValue.php b/application/api/model/MarketValue.php new file mode 100644 index 0000000..e6f902f --- /dev/null +++ b/application/api/model/MarketValue.php @@ -0,0 +1,61 @@ + 0, 'msg' => '参数错误']; + } + $before = db::name('user')->where('id',$user_id)->value('market_value'); + if($type == 0){ + $result = db::name('user')->where('id',$user_id)->setInc('market_value',$change_value); + if($result){ + //记录一条日志 + db::name('vs_user_market_value_log')->insert([ + 'user_id' => $user_id, + 'before' => $before, + 'change_value' => $change_value, + 'afterwards' => $before + $change_value, + 'type' => $type, + 'createtime' => time() + ]); + } + }else{ + //降身价 + $change = $before-$change_value; + if($change <= 1){ + $afterwards = 1; + $result = db::name('user')->where('id',$user_id)->update(['market_value' => 1]); + }else{ + $afterwards = $change; + $result = db::name('user')->where('id',$user_id)->setDec('market_value',$change_value); + } + + if($result){ + //记录一条日志 + db::name('vs_user_market_value_log')->insert([ + 'user_id' => $user_id, + 'before' => $before, + 'change_value' => $change_value, + 'afterwards' => $afterwards, + 'type' => $type, + 'createtime' => time() + ]); + } + } + return ['code' => 1, 'msg' => '成功']; + } +} \ No newline at end of file diff --git a/application/api/model/Sign.php b/application/api/model/Sign.php new file mode 100644 index 0000000..47f7cc6 --- /dev/null +++ b/application/api/model/Sign.php @@ -0,0 +1,291 @@ +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]; + } + +} \ No newline at end of file diff --git a/application/api/model/UserWallet.php b/application/api/model/UserWallet.php index 71992ca..cc6011d 100644 --- a/application/api/model/UserWallet.php +++ b/application/api/model/UserWallet.php @@ -51,15 +51,16 @@ class UserWallet extends Model // 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换 // 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益,20.发布头条扣除余额,21.公会长收益,22.提现驳回或提现失败返还,23.财富等级奖励金币领取,24.删除关系扣金币 //27.小时榜获得,28-新人充值好礼,32-发红包(金币),29-发红包(钻石),30-抢红包(金币),31-抢红包(钻石) 33-红包剩余退回(金币),34-红包剩余退回(钻石) + //50-签约 51-签约失败退回,52-首次被签约收入 if($gift_type == 1){ //1金币,2收益(钻石) if($in_out_type == 1){//1收入 - $in_out_types = [2,5,6,8,13,14,15,16,22,23,26,27,30,28,33]; + $in_out_types = [2,5,6,8,13,14,15,16,22,23,26,27,30,28,33,51]; }elseif($in_out_type == 2){//2支出 - $in_out_types = [4,7,10,17,20,24,25,32]; + $in_out_types = [4,7,10,17,20,24,25,32,50]; } }elseif($gift_type == 2){ //1金币,2收益(钻石) if($in_out_type == 1){//1收入 - $in_out_types = [6,9,11,12,18,19,21,22,31,28,34]; + $in_out_types = [6,9,11,12,18,19,21,22,31,28,34,52]; }elseif($in_out_type == 2){//2支出 $in_out_types = [3,14,29]; } diff --git a/application/common/model/UserWallet.php b/application/common/model/UserWallet.php index fbdc679..a1e870c 100644 --- a/application/common/model/UserWallet.php +++ b/application/common/model/UserWallet.php @@ -92,6 +92,13 @@ class UserWallet extends Model const RED_PACKET_LEFT_DIAMOND = 34; //爵位购买赠送金币(金币) const NOBILITY_PURCHASE_COIN = 35; + //签约支出 + const SIGN = 50; + //签约失败退回 + const SIGN_FAILURE = 51; + //首次被签约收入 + const FIRST_SIGN_INCOME = 52; + //金币支出类型数组 public $coin_consumption_type_array = [ @@ -102,6 +109,7 @@ class UserWallet extends Model self::HEADLINE_REWARD, self::TRANSFER_COIN, self::RED_PACKET_COIN, + self::SIGN, ]; //钻石支出类型数组 public $diamond_consumption_type_array = [ @@ -165,6 +173,9 @@ class UserWallet extends Model self::RED_PACKET_LEFT_COIN => '红包剩余退回(金币)', self::RED_PACKET_LEFT_DIAMOND => '红包剩余退回(钻石)', self::NOBILITY_PURCHASE_COIN => '爵位购买赠送(金币)', + self::SIGN => '签约支出', + self::SIGN_FAILURE => '签约失败退回', + self::FIRST_SIGN_INCOME => '首次被签约收入' ]; if($type){ return $status[$type] ?? '';