Files
yusheng-php/application/api/model/SendGift.php
2026-01-06 17:40:13 +08:00

1055 lines
53 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 app\common\controller\Push;
use app\common\library\GiftQueue;
use app\common\library\Snowflake;
use think\Log;
use think\Model;
use think\Db;
class SendGift extends Model
{
/*
* 送礼物 送礼用户收礼用户组礼物ID数量礼物类型房间ID
* @param int $uid 用户id
* @param str $to_uid 接收礼物用户组 (逗号分隔 id字符串
* @param int $gid 礼物id
* @param int $num 礼物数量
* @param int $type 金币购买 1金币购买 2送背包礼物
* @param int $room_id
* @param int $gift_bag_id 背包礼物类型7-初级8-中级9-高级
* @param int $heart_id 助力ID
* @return array
*/
public function send_gift($uid, $to_uid, $gid, $num, $type, $room_id, $gift_bag_id = 0, $heart_id = 0)
{
$toarray = explode(',',$to_uid);
if(in_array($uid,$toarray)){
return ['code' => 0, 'msg' => '收礼人不能包含自己', 'data' => null];
}
if(count($toarray) <= 1){
$res = $this->single_send_gift($uid,$to_uid,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id);
}else{
$res = $this->send_gift_to_users($uid,$toarray,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id);
}
return $res;
}
//送一个人的礼物
public function single_send_gift($uid,$to_uid,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id)
{
//送的礼物信息
$gift_info = Db::name('vs_gift')->where(['gid'=>$gid])
->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find();
if(empty($gift_info)){
return ['code' => 0, 'msg' => '礼物已下架,请重新选择!', 'data' => null];
}
$mobile = Db::name('user')->where(['id'=>$to_uid])->value('mobile');
$is_real = db::name('user_auth')->where('mobile' , $mobile)->value('is_real');
if($is_real != 1){
return ['code' => 0, 'msg' => '该用户未实名,暂不支持收礼', 'data' => null];
}
$room_type = model('Room')->get_room_type($room_id);
//获取送礼用户信息
$FromUserInfo = model('User')->get_user_base_info($uid);
//送给一人礼物的总价格
$gift_price = $gift_info['gift_price'] * $num;
//送礼人的金币
$user_coin = db::name('user_wallet_coin')->where(['user_id'=>$uid])->value('coin');
//送礼 开启事务
Db::startTrans();
//金币购买送礼 1金币购买 2送背包礼物
if($type == 1){
//送给所有人的总价格
$all_gift_price = $gift_price;
//判断是否有足够的金币
if ($user_coin < $all_gift_price) {
return ['code' => 0, 'msg' => '金币不足,请充值购买!', 'data' => null];
}
//扣除用户金币并记录日志
$wallet_update = model('api/UserWallet')->change_user_cion_log($uid,$all_gift_price,$room_id,10,'购买礼物');
if(!$wallet_update){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-1', 'data' => null];
}
}else{
//背包礼物是否充足
$user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find();
if (empty($user_gift_pack)) {
return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null];
}
if ($user_gift_pack['num'] < $num) {
return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null];
}
//扣除背包礼物并记录日志
$gift_pack = $this -> change_user_gift_pack_log(3,$uid,$gid,$num,'房间送礼');
if(!$gift_pack){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-2', 'data' => null];
}
}
$receive_gift_total = 0;//收礼人收到的礼物总值
$give_gift = 0;//送礼记录表ID雪花ID
$gift_box = [];//开出的盲盒
//查询礼物是否是盲盒
if($gift_info['label'] == 2){//趣味礼物(盲盒)
for($i = 0; $i < $num; $i++){
//开盲盒
$gift_box1[$i] = $this -> open_box($gid,$uid,$to_uid,$room_id,$gift_bag_id);
if($gift_box1[$i]['code'] != 1){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-3', 'data' => null];
}
$gift_box[$i] = $gift_box1[$i]['data'];
//开出的礼物价值
$receive_gift_total += $gift_box[$i]['gift_price'];
//记录一下收礼记录
$give_gift = $this -> change_user_give_gift_log($uid,$gift_box[$i]['gift_id'],$gift_box[$i]['gift_price'],1,$to_uid,2,$type,$room_id,0,2);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败,请重试!!', 'data' => null];
}
Log::record("送礼开出盲盒礼物信息:".json_encode($gift_box1),"info");
}
}else{
//收礼记录行为日志
$give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_uid,2,$type,$room_id);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败,请重试!', 'data' => null];
}
}
//计算收礼人得益 //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益
$receiver_earnings = model('GiveGift') -> receiver_earnings($to_uid,$receive_gift_total,2);
if($receiver_earnings > 0){
//增加收益并记录日志
$receiver = model('api/UserWallet')->change_user_earnings_log($to_uid,$receiver_earnings,$room_id,11,'收礼增加收益');
if(!$receiver){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-4', 'data' => null];
}
}
//用户魅力等级更新
$user_level = model('Level')->user_level_data_update($to_uid,$receive_gift_total,2,$room_id);
if(!$user_level){
Db::rollback();
return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null];
}
$room_owner_earnings = 0;//房主收益
$guild_earnings = 0;//公会会长收益
$guid_ratio = 0;//公会长收益率
$receive_ratio = get_system_config_value('room_gift_ratio');//房间收礼人收益
if($room_type == 6){ //cp电影房
//房主有收益 room_cp_room_user_ratio
if(get_system_config_value('room_cp_room_user_ratio') > 0){
$room_owner = Db::name('vs_room')->where(['id'=>$room_id,'apply_status'=>2])->value('user_id');
//计算房主收益//room_author_ratio //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 699-cp房房主收益
$room_owner_earnings = model('GiveGift') -> receiver_earnings($room_owner,$receive_gift_total,699);
if($room_owner_earnings > 0){
//增加收益并记录日志
$room_owner_earning = model('api/UserWallet')
->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'私密房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-5', 'data' => null];
}
}
}
//公会长收益
if(get_system_config_value('room_cp_guild_user_ratio') > 0){
$guild_id = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1])->value('guild_id');
if($guild_id){
$room_guild = Db::name('vs_guild')->where(['id'=>$guild_id])->value('user_id');
//计算会长收益 //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益 699-cp房房主收益 698 - cp房里面收益 公会长收益
$guild_earnings = model('GiveGift') -> receiver_earnings($room_guild,$receive_gift_total,698);
if($guild_earnings > 0){
//增加收益并记录日志
$guild_earnings_in = model('api/UserWallet')
->change_user_earnings_log($room_guild,$guild_earnings,$room_id,21,'私密房工会长收益');
if(!$guild_earnings_in){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-6', 'data' => null];
}
}
}
}
}else{
$room_owner = Db::name('vs_room')->where(['id'=>$room_id,'apply_status'=>2])->value('user_id');
//计算房主收益//room_author_ratio
$room_owner_earnings = model('GiveGift') -> receiver_earnings($room_owner,$receive_gift_total,99);//结果是钻石
if($room_owner_earnings > 0){
//在主持位的主持人
$host_id = Db::name('vs_room_pit')->where(['room_id'=>$room_id,'pit_number'=>9])->value('user_id');
if($host_id){
//计算主持人收益
$ratio = db::name('vs_room_host')->where(['room_id'=>$room_id,'user_id'=>$to_uid,'delete_time'=>null,'type'=>1])->value('ratio');
if(!$ratio){
$ratio = 0;
}
$host_earnings = round($room_owner_earnings * $ratio / 100,4);
if($host_earnings > 0){
//增加主持人收益并记录日志
$host_earnings_earning = model('api/UserWallet')->change_user_earnings_log($host_id,$host_earnings,$room_id,19,'主持人收益');
if(!$host_earnings_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-7', 'data' => null];
}
//增加房主收益并记录日志
$room_owner_earningss = $room_owner_earnings - $host_earnings;
if($room_owner_earningss > 0){
$room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earningss,$room_id,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-8', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-9', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-10', 'data' => null];
}
}
}
//收礼人是否加入公会
$is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id,settlement_ratio')->find();
if($is_join_guild){
//公会长收益 房间收礼人收益+房间收礼人加入公会后增加收益
$max_settlement_ratio = get_system_config_value('room_gift_ratio') + get_system_config_value('room_gift_guild_ratio');
$receive_ratio = $is_join_guild['settlement_ratio'] ?? 0;//加入公会后 公会长设置的收益
$guid_ratio = $max_settlement_ratio - $receive_ratio;
if($guid_ratio > 0){
//公会长收益
$guild_earnings = coin_earning($receive_gift_total,$guid_ratio);
if($guild_earnings > 0){
$guild_user = db::name('vs_guild')->where(['id' => $is_join_guild['guild_id']])->value('user_id');
$guild_earnings_in = model('api/UserWallet')
->change_user_earnings_log($guild_user,$guild_earnings,$room_id,21,'工会长收益');
if(!$guild_earnings_in){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-11', 'data' => null];
}
}
}
}
}
//记录送礼利率和各方收益
//平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益
$room_owner_ratio = get_system_config_value('room_author_ratio');
$app_ratio = 100 - $receive_ratio - $room_owner_ratio - $guid_ratio;
$app_earning = coin_earning($gift_price, $app_ratio);
$gift_rate = $this->change_give_gift_profit($give_gift, $receive_ratio, $receiver_earnings, $room_owner_ratio, $room_owner_earnings, $app_ratio, $app_earning,$guid_ratio,$guild_earnings);
if(!$gift_rate){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-12', 'data' => null];
}
//增加房间火热值hot_value
$gift_totalaa = $receive_gift_total * 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();
Db::commit();
//各种需要的及时推送
$room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $room_id])->field('pk_id')->find();
if (!empty($room_pk)) {
// 当前 room_id 是 room_id_a 修改create_value_a
$rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $receive_gift_total * 10);
$roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find();
//推送变化
$text = [
'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id
'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值
'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id
'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值
'text' => ''
];
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text);
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text);
} else {
// 当前 room_id 不是 room_id_a可能是 room_id_b 或者不存在
$room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $room_id])->field('pk_id')->find();
if (!empty($room_pk_b)) {
// 当前 room_id 是 room_id_b
$roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $receive_gift_total * 10);
$roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find();
//推送变化
$text = [
'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id
'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值
'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id
'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值
'text' => ''
];
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text);
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text);
}
}
if($room_type == 6){
//推送消息 交友房创建的私密房 倒计时增加
$value = db::name('vs_room_cp_movie')->where('room_id', $room_id)->where('type',1)
->value('time_day');
if($value){
db::name('vs_room_cp_movie')->where('room_id', $room_id)->where('type',1)
->setInc('time_day', $receive_gift_total);//1金币加1秒
$text111 = [
'room_id' => $room_id,
'time_day' => db::name('vs_room_cp_movie')->where('room_id', $room_id)->where('type',1)->value('time_day'),
'text' => '房间结束时间变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1052,$room_id,$text111);
}
}
$ToUserInfo = model('User')->get_user_base_info($to_uid);
$ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_uid,'room_id' => $room_id])->value('charm');//魅力
//推送其他时刻需要的信息 其他放到异步回调里
if($gift_info['label'] == 2){
//循环开出来的盲盒,相同的礼物只推送一次,消息推送为$FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' .$gift_inf['gift_name'].' x 多少';
if($gift_box){
// 统计相同礼物的数量
$giftCount = [];
foreach ($gift_box as $key=>$gv) {
if (isset($giftCount[$gv['gift_id']])) {
$giftCount[$gv['gift_id']]['count']++;
} else {
$giftCount[$gv['gift_id']] = [
'gift_info' => $gift_info,
'count' => 1
];
}
$gift_box[$key]['gift_name'] = $gift_info['gift_name'];
}
// 构建文字消息内容
$giftTextList = [];
foreach ($giftCount as $giftData) {
$gift_inf = $giftData['gift_info'];
$count = $giftData['count'];
$giftTextList[] = $gift_inf['gift_name'].' X'.$count;
}
// 推送文字消息 (格式: 张三 送给 李四 趣味礼物 礼物名1 X2礼物2 X4)
$textMessage = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' . implode('', $giftTextList);
$textData = [
'FromUserInfo' => $FromUserInfo,
'ToUserInfo' => $ToUserInfo,
'GiftInfos' => array_values($gift_box),
'GiftNum' => $num,
'text' => $textMessage
];
// 聊天室推送文字消息
model('Chat')->sendMsg(1038,$room_id,$textData);
// 循环推送每个礼物的特效消息
foreach ($giftCount as $giftId => $giftData) {
$gift_inf = $giftData['gift_info'];
$count = $giftData['count'];
// 推送礼物特效消息
$effectData = [
'FromUserInfo' => $FromUserInfo,
'ToUserInfo' => $ToUserInfo,
'GiftInfo' => $gift_inf,
'gift_num' => $count,
'text' => null
];
// 聊天室推送礼物特效消息
model('Chat')->sendMsg(1005,$room_id,$effectData);
if($room_type == 6){
//推送消息
$hot_value = db::name('vs_room')->where('id', $room_id)->value('hot_value');
$text1 = [
'room_id' => $room_id,
'hot_value' => $hot_value,
'text' => '房间心动值变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1028,$room_id,$text1);
}else{
if($gift_inf['is_public_server'] == 1){
//推送礼物横幅
$push = new Push(UID, $room_id);
$room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name');
$bannerText = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_inf['gift_name'] . 'X' . $count;
$text_list_new[] = [
'text' => $bannerText,
'gift_picture' => $gift_inf['base_image'],
'room_id' => $room_id,
'fromUserName' => $FromUserInfo['nickname'],
'toUserName' => $ToUserInfo['nickname'],
'giftName' => $gift_inf['gift_name'],
'roomId' => $room_id,
'number' => $count,
];
$push->giftBanner($text_list_new);
}
}
}
}
}else{
$text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num;
$text = [
'FromUserInfo' => $FromUserInfo,
'ToUserInfo' => $ToUserInfo,
'GiftInfo' => $gift_info,
'gift_num' => $num,
'text' => $text
];
//聊天室推送系统消息
model('Chat')->sendMsg(1005,$room_id,$text);
if($room_type == 6){
//推送消息
$hot_value = db::name('vs_room')->where('id', $room_id)->value('hot_value');
$text1 = [
'room_id' => $room_id,
'hot_value' => $hot_value,
'text' => '房间心动值变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1028,$room_id,$text1);
}else{
if($gift_info['is_public_server'] == 1){
//推送礼物横幅
$push = new Push($uid, $room_id);
$room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name');
$text = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_info['gift_name'] . 'X' . $num;
$text_list_new[] = [
'text' => $text,
'gift_picture' => $gift_info['base_image'],
'room_id' => $room_id,
'fromUserName' => $FromUserInfo['nickname'],
'toUserName' => $ToUserInfo['nickname'],
'giftName' => $gift_info['gift_name'],
'roomId' => $room_id,
'number' => $num,
];
$push->giftBanner($text_list_new);
}
}
}
$textt = '';
$textt1 = '';
//cp检测且处理升级事宜
$cp_type = model('api/UserCp')->checkGift($uid, $gid, $to_uid, $room_id, $num,$receive_gift_total);//0-不处理1-表明心意2-组成Cp
if($cp_type == 1){
$textt1 = "亲爱的用户,您好!\n".$FromUserInfo['nickname'] . ' 的 【' .$gift_info['gift_name'].' 】 已送达,这是他的心动信号。回赠一个,即可锁定这份缘分!';
$textt = '';
}elseif ($cp_type == 2){
//接受方弹起的 信息
$textt1 = "恭喜你!". $FromUserInfo['nickname'] ."也向您回赠了【" .$gift_info['gift_name']."】,并接受了你的心动信号。\n从现在起你们正式成为彼此的专属CP共同开启一段甜蜜的旅程。\n【心动空间】已为你们敞开大门这里将记录你们在一起的点滴见证所有心动与陪伴。快去心动空间开启你们的CP升级之旅吧";
$textt = '【心动空间】已为你们敞开大门这里将记录你们在一起的点滴见证所有心动与陪伴。快去心动空间开启你们的CP升级之旅吧';//发送方弹起的信息
}
$gift_user_data = [];//收礼人信息和收到的金币 交友和参与拍卖使用
if($cp_type != 0){
$gift_user_data[] = [
'user_id' => $to_uid,
'gift_price' => $receive_gift_total,
];
}
if($room_type == 7){
$reslut = [
'data' => ['gift_total' => $receive_gift_total,'gift_user_data' =>$gift_user_data,]
];
model('api/Friend')->room_give_gift($uid, $to_uid,$room_id,$reslut,$heart_id);
}
//gift_total:收礼人收礼金币总和交友和参与拍卖使用cp_typecp交友使用gift_user_datacp交友使用
return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $receive_gift_total,'gift_user_data' =>$gift_user_data,'cp_type' => ['cp_type' => $cp_type,'text' => $textt,'text1' => $textt1,'gift_id' => $gid]]];
}
//送多人礼物
public function send_gift_to_users($uid,$to_array,$gid,$num,$type,$room_id,$gift_bag_id,$heart_id){
//送的礼物信息
$gift_info = Db::name('vs_gift')->where(['gid'=>$gid])
->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find();
if(empty($gift_info)){
return ['code' => 0, 'msg' => '礼物已下架,请重新选择!', 'data' => null];
}
//循环查询用户是否实名
foreach ($to_array as $key => $value){
$mobile = Db::name('user')->where(['id'=>$value])->value('mobile');
$is_real = db::name('user_auth')->where('mobile' , $mobile)->field('id,is_real')->find();
if($is_real){
if($is_real['is_real'] != 1){
return ['code' => 0, 'msg' => '收礼用户中有未实名,暂不支持收礼', 'data' => null];
}
}else{
return ['code' => 0, 'msg' => '收礼用户中有未实名,暂不支持收礼', 'data' => null];
}
}
$room_type = model('Room')->get_room_type($room_id);
$room_owner = Db::name('vs_room')->where(['id'=>$room_id,'apply_status'=>2])->value('user_id');
//获取送礼用户信息
$FromUserInfo = model('User')->get_user_base_info($uid);
//送给一人礼物的总价格
$gift_price = $gift_info['gift_price'] * $num;
//送礼人的金币
$user_coin = db::name('user_wallet_coin')->where(['user_id'=>$uid])->value('coin');
//金币购买送礼 1金币购买 2送背包礼物
if($type == 1){
//送给所有人的总价格
$all_gift_price = $gift_price * count($to_array);
//判断是否有足够的金币
if ($user_coin < $all_gift_price) {
return ['code' => 0, 'msg' => '金币不足,请充值购买!', 'data' => null];
}
}else{
//背包礼物是否充足
$user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find();
if (empty($user_gift_pack)) {
return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null];
}
if ($user_gift_pack['num'] < $num * count($to_array)) {
return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null];
}
}
$give_gift = 0;//送礼记录表ID雪花ID
$gift_box = [];//开出的盲盒
$room_hotvalue = 0;//房间热度(所有收礼人的礼物总值)
$gift_user_data = [];//收礼人收礼金币总和,交友和参与拍卖使用;
foreach ($to_array as $k => $to_uid){
$gift_user_data[]['user_id'] = $to_uid;
$receive_gift_total = 0;//收礼人收到的礼物总值
//送礼 开启事务
Db::startTrans();
if($type == 1) {
//扣除用户金币并记录日志
$wallet_update = model('api/UserWallet')->change_user_cion_log($uid, $gift_price, $room_id, 10, '购买礼物');
if (!$wallet_update) {
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-1', 'data' => null];
}
}else{
//扣除背包礼物并记录日志
$gift_pack = $this -> change_user_gift_pack_log(3,$uid,$gid,$num,'房间送礼');
if(!$gift_pack){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-2', 'data' => null];
}
}
//查询礼物是否是盲盒
if($gift_info['label'] == 2){//趣味礼物(盲盒)
for($i = 0; $i < $num; $i++){
//开盲盒
$gift_box1[$i] = $this -> open_box($gid,$uid,$to_uid,$room_id,$gift_bag_id);
if($gift_box1[$i]['code'] != 1){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-3', 'data' => null];
}
$gift_box[$i] = $gift_box1[$i]['data'];
//开出的礼物价值
$receive_gift_total += $gift_box[$i]['gift_price'];
//记录一下收礼记录
$give_gift = $this -> change_user_give_gift_log($uid,$gift_box[$i]['gift_id'],$gift_box[$i]['gift_price'],1,$to_uid,2,$type,$room_id,0,2);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败,请重试!!', 'data' => null];
}
Log::record("送礼开出盲盒礼物信息:".json_encode($gift_box1),"info");
}
}else{
$receive_gift_total = $gift_price;
//收礼记录行为日志
$give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_uid,2,$type,$room_id);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败,请重试!', 'data' => null];
}
}
$gift_user_data[$k]['gift_price'] = $receive_gift_total;
//计算收礼人得益 //1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益
$receiver_earnings = model('GiveGift') -> receiver_earnings($to_uid,$receive_gift_total,2);
if($receiver_earnings > 0){
//增加收益并记录日志
$receiver = model('api/UserWallet')->change_user_earnings_log($to_uid,$receiver_earnings,$room_id,11,'收礼增加收益');
if(!$receiver){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-4', 'data' => null];
}
}
//用户魅力等级更新
$user_level = model('Level')->user_level_data_update($to_uid,$receive_gift_total,2,$room_id);
if(!$user_level){
Db::rollback();
return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null];
}
$room_owner_earnings = 0;//房主收益
$guild_earnings = 0;//公会会长收益
$guid_ratio = 0;//公会长收益率
$receive_ratio = get_system_config_value('room_gift_ratio');//房间收礼人收益
//计算房主收益//room_author_ratio
$room_owner_earnings = model('GiveGift') -> receiver_earnings($room_owner,$receive_gift_total,99);//结果是钻石
if($room_owner_earnings > 0){
//在主持位的主持人
$host_id = Db::name('vs_room_pit')->where(['room_id'=>$room_id,'pit_number'=>9])->value('user_id');
if($host_id){
//计算主持人收益
$ratio = db::name('vs_room_host')->where(['room_id'=>$room_id,'user_id'=>$to_uid,'delete_time'=>null,'type'=>1])->value('ratio');
if(!$ratio){
$ratio = 0;
}
$host_earnings = round($room_owner_earnings * $ratio / 100,4);
if($host_earnings > 0){
//增加主持人收益并记录日志
$host_earnings_earning = model('api/UserWallet')->change_user_earnings_log($host_id,$host_earnings,$room_id,19,'主持人收益');
if(!$host_earnings_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-7', 'data' => null];
}
//增加房主收益并记录日志
$room_owner_earningss = $room_owner_earnings - $host_earnings;
if($room_owner_earningss > 0){
$room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earningss,$room_id,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-8', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-9', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = model('api/UserWallet')->change_user_earnings_log($room_owner,$room_owner_earnings,$room_id,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-10', 'data' => null];
}
}
}
//收礼人是否加入公会
$is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id,settlement_ratio')->find();
if($is_join_guild){
//公会长收益 房间收礼人收益+房间收礼人加入公会后增加收益
$max_settlement_ratio = get_system_config_value('room_gift_ratio') + get_system_config_value('room_gift_guild_ratio');
$receive_ratio = $is_join_guild['settlement_ratio'] ?? 0;//加入公会后 公会长设置的收益
$guid_ratio = $max_settlement_ratio - $receive_ratio;
if($guid_ratio > 0){
//公会长收益
$guild_earnings = coin_earning($receive_gift_total,$guid_ratio);
if($guild_earnings > 0){
$guild_user = db::name('vs_guild')->where(['id' => $is_join_guild['guild_id']])->value('user_id');
$guild_earnings_in = model('api/UserWallet')
->change_user_earnings_log($guild_user,$guild_earnings,$room_id,21,'工会长收益');
if(!$guild_earnings_in){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-11', 'data' => null];
}
}
}
}
//记录送礼利率和各方收益
//平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益
$room_owner_ratio = get_system_config_value('room_author_ratio');
$app_ratio = 100 - $receive_ratio - $room_owner_ratio - $guid_ratio;
$app_earning = coin_earning($gift_price, $app_ratio);
$gift_rate = $this->change_give_gift_profit($give_gift, $receive_ratio, $receiver_earnings, $room_owner_ratio, $room_owner_earnings, $app_ratio, $app_earning,$guid_ratio,$guild_earnings);
if(!$gift_rate){
Db::rollback();
return ['code' => 0, 'msg' => '网络错误-12', 'data' => null];
}
$room_hotvalue += $receive_gift_total;
Db::commit();
//各种需要的及时推送
$room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $room_id])->field('pk_id')->find();
if (!empty($room_pk)) {
// 当前 room_id 是 room_id_a 修改create_value_a
$rooma = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->setInc('create_value_a', $receive_gift_total * 10);
$roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk['pk_id'])->find();
//推送变化
$text = [
'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id
'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值
'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id
'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值
'text' => ''
];
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text);
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text);
} else {
// 当前 room_id 不是 room_id_a可能是 room_id_b 或者不存在
$room_pk_b = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_b' => $room_id])->field('pk_id')->find();
if (!empty($room_pk_b)) {
// 当前 room_id 是 room_id_b
$roomb = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->setInc('receive_value_b', $receive_gift_total * 10);
$roomPKinfo = Db::name('vs_room_pk')->where('pk_id', $room_pk_b['pk_id'])->find();
//推送变化
$text = [
'room_id_a' => $roomPKinfo['room_id_a'],//发起者房间id
'create_value_a' => $roomPKinfo['create_value_a'],//发起者房间值
'room_id_b' => $roomPKinfo['room_id_b'],//接受者房间id
'receive_value_b' => $roomPKinfo['receive_value_b'],//接受者房间值
'text' => ''
];
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_a'],$text);
model('Chat')->sendMsg(1015,$roomPKinfo['room_id_b'],$text);
}
}
$ToUserInfo = model('User')->get_user_base_info($to_uid);
$ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_uid,'room_id' => $room_id])->value('charm');//魅力
//推送其他时刻需要的信息 其他放到异步回调里
if($gift_info['label'] == 2){
//循环开出来的盲盒,相同的礼物只推送一次,消息推送为$FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' .$gift_inf['gift_name'].' x 多少';
if($gift_box){
// 统计相同礼物的数量
$giftCount = [];
foreach ($gift_box as $key=>$gv) {
if (isset($giftCount[$gv['gift_id']])) {
$giftCount[$gv['gift_id']]['count']++;
} else {
$giftCount[$gv['gift_id']] = [
'gift_info' => $gift_info,
'count' => 1
];
}
$gift_box[$key]['gift_name'] = $gift_info['gift_name'];
}
// 构建文字消息内容
$giftTextList = [];
foreach ($giftCount as $giftData) {
$gift_inf = $giftData['gift_info'];
$count = $giftData['count'];
$giftTextList[] = $gift_inf['gift_name'].' X'.$count;
}
// 推送文字消息 (格式: 张三 送给 李四 趣味礼物 礼物名1 X2礼物2 X4)
$textMessage = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' . implode('', $giftTextList);
$textData = [
'FromUserInfo' => $FromUserInfo,
'ToUserInfo' => $ToUserInfo,
'GiftInfos' => array_values($gift_box),
'GiftNum' => $num,
'text' => $textMessage
];
// 聊天室推送文字消息
model('Chat')->sendMsg(1038,$room_id,$textData);
// 循环推送每个礼物的特效消息
foreach ($giftCount as $giftId => $giftData) {
$gift_inf = $giftData['gift_info'];
$count = $giftData['count'];
// 推送礼物特效消息
$effectData = [
'FromUserInfo' => $FromUserInfo,
'ToUserInfo' => $ToUserInfo,
'GiftInfo' => $gift_inf,
'gift_num' => $count,
'text' => null
];
// 聊天室推送礼物特效消息
model('Chat')->sendMsg(1005,$room_id,$effectData);
if($gift_inf['is_public_server'] == 1){
//推送礼物横幅
$push = new Push(UID, $room_id);
$room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name');
$bannerText = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_inf['gift_name'] . 'X' . $count;
$text_list_new[] = [
'text' => $bannerText,
'gift_picture' => $gift_inf['base_image'],
'room_id' => $room_id,
'fromUserName' => $FromUserInfo['nickname'],
'toUserName' => $ToUserInfo['nickname'],
'giftName' => $gift_inf['gift_name'],
'roomId' => $room_id,
'number' => $count,
];
$push->giftBanner($text_list_new);
}
}
}
}else{
$text = $FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 礼物 ' .$gift_info['gift_name'].' x ' .$num;
$text = [
'FromUserInfo' => $FromUserInfo,
'ToUserInfo' => $ToUserInfo,
'GiftInfo' => $gift_info,
'gift_num' => $num,
'text' => $text
];
//聊天室推送系统消息
model('Chat')->sendMsg(1005,$room_id,$text);
if($gift_info['is_public_server'] == 1){
//推送礼物横幅
$push = new Push($uid, $room_id);
$room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name');
$text = $FromUserInfo['nickname'] . '在' . $room_name . '房间送给了' . $ToUserInfo['nickname'] . $gift_info['gift_name'] . 'X' . $num;
$text_list_new[] = [
'text' => $text,
'gift_picture' => $gift_info['base_image'],
'room_id' => $room_id,
'fromUserName' => $FromUserInfo['nickname'],
'toUserName' => $ToUserInfo['nickname'],
'giftName' => $gift_info['gift_name'],
'roomId' => $room_id,
'number' => $num,
];
$push->giftBanner($text_list_new);
}
}
}
//增加房间火热值hot_value
$gift_totalaa = $room_hotvalue * 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();
if($room_type == 7){
$reslut = [
'data' => ['gift_total' => $gift_totalaa,'gift_user_data' =>$gift_user_data,]
];
model('api/Friend')->room_give_gift($uid, $to_array,$room_id,$reslut,$heart_id);
}
//gift_total:收礼人收礼金币总和交友和参与拍卖使用cp_typecp交友使用gift_user_datacp交友使用
return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $room_hotvalue,'gift_user_data' =>null,'cp_type' => null]];
}
//记录用户赠送背包礼物日志
public function change_user_gift_pack_log($packType,$uid,$gid,$num,$remark)
{
$user_gift_pack = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->find();
$user_gift_packs['num'] = $user_gift_pack['num'] - $num;
$user_gift_packs['updatetime'] = time();
$gift_pack_update = db::name('vs_user_gift_pack')->where(['user_id'=>$uid,'gid'=>$gid])->update($user_gift_packs);
if(!$gift_pack_update){
return false;
}
$data = [
'user_id' => $uid,
'gid' => $gid,
'change_num' => $num,
'type' => $packType,
'remarks' => $remark,
'createtime' => time(),
];
$res = Db::name('vs_user_gift_pack_log')->insert($data);
if(!$res){
return false;
}
return true;
}
/*
* 开盲盒
*/
public function open_box($gift_id,$user_id,$gift_user_id,$room_id,$gift_bag_id){
//获取盲盒配置
if($gift_bag_id){
$bag_gift = db::name("vs_gift")->where(['gid'=>$gift_id])->find();// 获取盲盒信息
//随机获取一个礼物
$where = [
'gift_bag_id' => $gift_bag_id,
'quantity' => ['>',0],
'remaining_number' => ['>',0]
];
// 优化:基于剩余数量的加权随机选择
$gift_bag_details = db::name("vs_gift_bag_detail")->where($where)->select();
if (empty($gift_bag_details)) {
return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []];
}
// 实现加权随机算法:剩余数量越多,被抽中的概率越大
$total_remaining = 0;
foreach ($gift_bag_details as $gift) {
$total_remaining += $gift['remaining_number'];
}
$rand_value = mt_rand(1, $total_remaining);
$current_sum = 0;
$gift_bag_detail = null;
foreach ($gift_bag_details as $gift) {
if($gift['remaining_number'] <= 0){
continue;
}
$current_sum += $gift['remaining_number'];
if ($rand_value <= $current_sum) {
$gift_bag_detail = $gift;
break;
}
}
if($gift_bag_detail){
//获取开出礼物的信息
$gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find();
//处理礼包发放记录表
$data = [];
$data['user_id'] = $user_id;
$data['gift_user_id'] = $gift_user_id;
$data['gift_bag_id'] = $gift_bag_id;
$data['gift_id'] = $gift_bag_detail['foreign_id'];
$data['periods'] = 0;//$periods;
$data['room_id'] = $room_id;
$data['gift_price'] = $gift['gift_price'];
$data['bag_price'] = $bag_gift['gift_price'];
$data['createtime'] = time();
$result = db::name("vs_gift_bag_receive_log")->insert($data);
if(!$result){
return ['code' => 0, 'msg' => '失败,', 'data' => []];
}
//减去盲盒包礼物数量
$ret = db::name("vs_gift_bag_detail")->where('id',$gift_bag_detail['id'])->setDec('remaining_number');
if(!$ret){
return ['code' => 0, 'msg' => '失败.', 'data' => []];
}
//判断剩余数量是否为0 为0重置进入下一期
$gift_bag_num = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->sum('remaining_number');
if($gift_bag_num <= 0){
db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods');
db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]);
}
}else{
return ['code' => 0, 'msg' => '失败!', 'data' => []];
}
}else{
return ['code' => 0, 'msg' => '失败!!', 'data' => []];
}
$result_data = [
'gift_id'=>$gift_bag_detail['foreign_id'],
'gift_price'=>$gift['gift_price'],
'is_public_screen'=>$gift['is_public_screen'],
];
return ['code' => 1, 'msg' => '成功', 'data' => $result_data];
}
//记录用户送礼日志
public function change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number = 0,$gitf_type =1)
{
$data = [
'id' => Snowflake::generate(),// 生成雪花ID
'user_id' => $uid,
'gift_id' => $gid,
'gift_type' => $gitf_type,
'number' => $num,
'gift_user' => $to_id,
'pit_number' => $pit_number,
'from_id' => $from_id,//来源ID房间ID或动态ID
'total_price' => $gift_price,
'from' => $from_type,//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 6Cp电影房
'type' => $type,//1金币购买 2送背包礼物
'createtime' => time(),
];
GiftQueue::push($data);
return $data['id'];
}
/*
* 送礼利率收益等具体记录
* @param $give_gift_id 送礼记录表ID
* @param $gift_user_ratio 收礼人 收礼时的收益率(单位%
* @param $gift_user_earning 收礼人的收益
* @param $room_owner_ratio 房主收益率(单位 %
* @param $room_owner_earning 房主收益
* @param $app_ratio 平台收益率(单位 %
* @param $app_earning 平台收益
* @param $guid_ratio 公会收益率(单位 %
* @param $guild_earning 公会收益
* @return bool
*/
public function change_give_gift_profit($give_gift_id,$gift_user_ratio,$gift_user_earning = 0,$room_owner_ratio = 0,$room_owner_earning = 0,$app_ratio = 0,$app_earning = 0,$guid_ratio=0,$guild_earning=0)
{
$data = [
'give_gift_id' => $give_gift_id,
'gift_user_ratio' => $gift_user_ratio,
'gift_user_earning' => $gift_user_earning,
'room_owner_ratio' => $room_owner_ratio,
'room_owner_earning' => $room_owner_earning,
'app_ratio' => $app_ratio,
'app_earning' => $app_earning,
'guid_ratio' => $guid_ratio,
'guid_ratio_earning' => $guild_earning,
'createtime' => time(),
];
$res = Db::name('vs_give_gift_ratio_log')->insert($data);
if(!$res){
return false;
}
return true;
}
}