Files
yusheng-php/application/api/model/GiveGift.php
2025-10-25 18:21:56 +08:00

1477 lines
75 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 think\Loader;
use think\Log;
use think\Model;
use think\Session;
use think\Db;
class GiveGift extends Model
{
// 开启自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
private $redis;
public function __construct($data = [])
{
parent::__construct($data);
$this->redis = \think\Cache::store('redis')->handler();
}
/*
* 送礼物
* @param int $uid 用户id
* @param int $from_id 来源id
* @param str $to_uid 接收礼物用户id字符串逗号分隔
* @param int $gid 礼物id
* @param int $num 礼物数量
* @param int $from_type 来源 1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼
* @param int $type 金币购买 1金币购买 2送背包礼物
* @param int $pit_number 坑位编号
* @return array
* 用户,在房间中,给谁,送了什么礼物,多少个,来源
*/
public function give_gift($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = [])
{
if(isset($ext['is_draw_gift']) && $ext['is_draw_gift'] == 1) {
$return_pan = $this->give_gift_to_pan($uid, $to_uid, $gid, $num, $from_type, $type, $from_id, $pit_number, $change_type, $ext);
return $return_pan;
}
//送的礼物信息
$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];
}
if(!$to_uid){
return ['code' => 0, 'msg' => '请选择收礼人', 'data' => null];
}
$toarray = explode(',',$to_uid);
if(in_array($uid,$toarray)){
return ['code' => 0, 'msg' => '收礼人不能包含自己', 'data' => null];
}
if (ceil($num) != $num) {
return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null];
}
if ($num < 1) {
return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null];
}
$user_info = Db::name('user')->where(['id'=>$uid,'status'=>1])->find();
if(empty($user_info)){
return ['code' => 301, 'msg' => '当前用户登录失效', 'data' => null];
}
//获取送礼用户昵称
$FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find();
$FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($uid);//财富图标
$FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($uid);//魅力图标
$FromUserInfo['chat_bubble'] = model('Decorate')->user_decorate_detail($uid,9);//聊天气泡
//送给一人礼物的总价格(扣除用户的数额)
$gift_price = $gift_info['gift_price'] * $num;
//送礼 开启事务
Db::startTrans();
$roomId = 0;
if($from_type == 2 || $from_type == 3 || $from_type == 6){
$roomId = $from_id;
}
//金币购买送礼 1金币购买 2送背包礼物
if ($type == 1) {
if(!isset($ext['is_draw_gift']) || $ext['is_draw_gift'] != 1){// 非盲盒转盘
//送给所有人的总价格
$all_gift_price = $gift_info['gift_price'] * $num * count($toarray);
//判断是否有足够的金币
$user_waller = db::name('user_wallet')->where(['user_id'=>$uid])->find();
if ($user_waller['coin'] < $all_gift_price) {
return ['code' => 0, 'msg' => '用户金币不足', 'data' => null];
}
//扣除用户金币并记录日志
$wallet_update = $this -> change_user_cion_or_earnings_log($uid,$all_gift_price,$from_id,1,10,'用户金币购买礼物');
if(!$wallet_update){
Db::rollback();
return ['code' => 0, 'msg' => '扣除用户金币失败', 'data' => null];
}
//用户财富等级更新
$user_level = model('Level')->user_level_data_update($uid,$all_gift_price,1,$roomId);
if(!$user_level){
Db::rollback();
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($toarray)) {
return ['code' => 0, 'msg' => '用户背包礼物不足', 'data' => null];
}
//扣除背包礼物并记录日志
if($from_type == 1 || $from_type == 2 || $from_type == 3 || $from_type == 6){//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务
$packType = 3;//1系统赠送2礼包获得3礼物赠送4系统扣除5动态打赏
$remark = '聊天或房间礼物赠送';
}elseif ($from_type == 4){
$packType = 5;
$remark = '动态打赏';
}else{
$packType = -1;
}
$gift_pack = $this -> change_user_gift_pack_log($packType,$uid,$gid,$num * count($toarray),$remark);
if(!$gift_pack){
Db::rollback();
return ['code' => 0, 'msg' => '扣除用户背包礼物失败', 'data' => null];
}
}
//循环送礼
$gift_total = 0;
$give_gift = 0;
$gift_user_data = [];
foreach ($toarray as $k => $to_id){
$gift_user_data[]['user_id'] = $to_id;
$gift_box1 = [];
$gift_box = [];
//查询礼物是否是盲盒
$gift_info_label = Db::name('vs_gift')->where(['gid'=>$gid])
->field('label')->find();
if($gift_info_label['label'] == 2){//趣味礼物(盲盒)
$gift_price_box = 0;
if(isset($ext['is_draw_gift']) && $ext['is_draw_gift'] == 1){
//收礼记录行为日志
$give_gift = $this -> change_user_give_gift_log($uid,$ext['gift_id'],$ext['all_gift_price'],$ext['count'],$to_id,$from_type,$type,$from_id,$pit_number,2);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败', 'data' => null];
}
$gift_price_box = $ext['all_gift_price'];
$gift_box[0]['gift_id'] = $ext['gift_id'];
$gift_box[0]['gift_price'] = $ext['all_gift_price'];
$gift_box[0]['give_gift_id'] = $give_gift;
}else{
for($i = 0; $i < $num; $i++){
$gift_box1[$i] = $this -> open_box($gid,$uid,$to_id,$from_id);
if($gift_box1[$i]['code'] != 1){
Db::rollback();
return ['code' => 0, 'msg' => '盲盒配置有误请联系管理员'.$gift_box1[$i]['msg'], 'data' => null];
}
$gift_box[$i] = $gift_box1[$i]['data'];
//记录一下收礼记录
$give_gift = $this -> change_user_give_gift_log($uid,$gift_box[$i]['gift_id'],$gift_box[$i]['gift_price'],1,$to_id,$from_type,$type,$from_id,$pit_number,2);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败', 'data' => null];
}
$gift_box[$i]['give_gift_id'] = $give_gift;
$gift_price_box += $gift_box[$i]['gift_price'];
Log::record("盲盒礼物".json_encode($gift_box1),"info");
}
}
$gift_total += $gift_price_box;
$gift_price = $gift_price_box;
}else{
$gift_total += $gift_price;
//收礼记录行为日志
$give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '送礼失败', 'data' => null];
}
}
$gift_user_data[$k]['gift_price'] = $gift_price;
//计算收礼人得益
$receiver_earnings = $this -> receiver_earnings($to_id,$gift_price,$from_type);
if($receiver_earnings <= 0){
Db::rollback();
return ['code' => 0, 'msg' => '收礼人收益配置有误', 'data' => null];
}
//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼
if($from_type == 1 || $from_type == 2 || $from_type == 3 ||$from_type == 4 || $from_type == 6){
//增加收益并记录日志
$receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,2,11,'收礼增加收益');
}elseif($from_type == 5){
//增加收益并记录日志
$receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,1,$change_type,'活动增加金币');
}else{
$receiver = false;
}
if(!$receiver){
Db::rollback();
return ['code' => 0, 'msg' => '收礼人收益失败', 'data' => null];
}
//用户魅力等级更新
$user_level = model('Level')->user_level_data_update($to_id,$gift_price,2,$roomId);
if(!$user_level){
Db::rollback();
return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null];
}
$room_owner_earnings = 0;//房主收益
$room_owner_earningsg = 0;//公会会长收益
//是否在房间
if(isset($from_id) && ($from_type == 2 || $from_type == 6)){
if($from_type == 6){ //cp电影房
//房主有收益
if(get_system_config_value('room_cp_room_user_ratio') > 0){
$room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id');
//计算房主收益//room_author_ratio
$room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,699);
if($room_owner_earnings > 0){
//增加收益并记录日志
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '房主收益失败', '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');
//计算会长收益
$room_owner_earningsg = $this -> receiver_earnings($room_guild,$gift_price,698);
//增加收益并记录日志
$room_owner_earningg = $this -> change_user_cion_or_earnings_log($room_guild,$room_owner_earningsg,$from_id,2,21,'工会长收益');
if(!$room_owner_earningg){
Db::rollback();
return ['code' => 0, 'msg' => '工会长收益失败', 'data' => null];
}
}
}
}else{
$room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id');
//计算房主收益//room_author_ratio
$room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,99);//结果是钻石
if($room_owner_earnings > 0){
//主持人收益
//在主持位的主持人
$host_id = Db::name('vs_room_pit')->where(['room_id'=>$from_id,'pit_number'=>9])->value('user_id');
if($host_id){
//计算主持人收益
$host_earnings = $this -> receiver_earnings($host_id,$room_owner_earnings*get_system_config_value('rmb_coin_ratio'),98,$from_id);
if($host_earnings > 0){
//增加主持人收益并记录日志
$host_earnings_earning = $this -> change_user_cion_or_earnings_log($host_id,$host_earnings,$from_id,2,19,'主持人收益');
if(!$host_earnings_earning){
Db::rollback();
return ['code' => 0, 'msg' => '主持人收益失败', 'data' => null];
}
//增加房主收益并记录日志
$room_owner_earningss = $room_owner_earnings - $host_earnings;
if($room_owner_earningss > 0){
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earningss,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '房主收益失败', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '房主收益失败', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
Db::rollback();
return ['code' => 0, 'msg' => '房主收益失败', 'data' => null];
}
}
}
}
if($gift_info_label['label'] == 2){
foreach ($gift_box as $gv) {
//记录送礼利率和各方收益
//收礼人是否加入公会
$configs = get_system_config();
$is_join_guild = Db::name('vs_guild_user')->where(['user_id' => $to_uid, 'status' => 1, 'quit_time' => 0])->field('guild_id')->find();
//收益增加 加入工会的收益
if ($is_join_guild) {
$ratiog = $configs['room_gift_guild_ratio'];
} else {
$ratiog = 0;
}
//未加入工会的收益
$ratiogr = $configs['room_gift_ratio'];
//收礼人最终的收益比例
$ratio = $ratiogr + $ratiog;
//房主收益大于0 就代表有收益 且在房间
if ($room_owner_earningsg > 0) {
$guid_ratio = $configs['room_cp_guild_user_ratio'];
} else {
$guid_ratio = 0;
}
//平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益
$app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio;
$app_earning = coin_earning($gv['gift_price'], $app_ratio);
$receiver_earningss = $this -> receiver_earnings($to_id,$gv['gift_price'],$from_type);
$room_owner_earningss = $this -> receiver_earnings($room_owner,$gv['gift_price'],99);//结果是钻石
$gift_rate = $this->change_give_gift_profit($gv['give_gift_id'], $ratio, $receiver_earningss, $configs['room_author_ratio'], $room_owner_earningss, $app_ratio, $app_earning);
if (!$gift_rate) {
Db::rollback();
return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null];
}
}
}else{
//记录送礼利率和各方收益
//收礼人是否加入公会
$configs = get_system_config();
$is_join_guild = Db::name('vs_guild_user')->where(['user_id' => $to_uid, 'status' => 1, 'quit_time' => 0])->field('guild_id')->find();
//收益增加 加入工会的收益
if ($is_join_guild) {
$ratiog = $configs['room_gift_guild_ratio'];
} else {
$ratiog = 0;
}
//未加入工会的收益
$ratiogr = $configs['room_gift_ratio'];
//收礼人最终的收益比例
$ratio = $ratiogr + $ratiog;
//房主收益大于0 就代表有收益 且在房间
if ($room_owner_earningsg > 0) {
$guid_ratio = $configs['room_cp_guild_user_ratio'];
} else {
$guid_ratio = 0;
}
//平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益
$app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio;
$app_earning = coin_earning($gift_price, $app_ratio);
$gift_rate = $this->change_give_gift_profit($give_gift, $ratio, $receiver_earnings, $configs['room_author_ratio'], $room_owner_earnings, $app_ratio, $app_earning);
if (!$gift_rate) {
Db::rollback();
return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null];
}
}
}
$ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find();
$ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标
$ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标
$ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_id,'room_id' => $from_id])->value('charm');//魅力
if(isset($from_id) && ($from_type == 2 || $from_type == 6)){
//查询房间是否在PK中 是fa_vs_room_pk 表中的 room_id_a还是room_id_b
$room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $from_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', $gift_price * 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' => $from_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', $gift_price * 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(!isset($ext['is_draw_gift']) || $ext['is_draw_gift'] != 1){// 非盲盒转盘 推送
if($gift_info_label['label'] == 2){
//循环开出来的盲盒,相同的礼物只推送一次,消息推送为$FromUserInfo['nickname'] . ' 送给 ' . $ToUserInfo['nickname'].' 趣味礼物 ' .$gift_inf['gift_name'].' x 多少';
if($gift_box){
// 统计相同礼物的数量
$giftCount = [];
foreach ($gift_box as $key=>$gv) {
$gift_info = Db::name('vs_gift')->where(['gid'=>$gv['gift_id']])
->field('gid as gift_id,gift_name,gift_price,file_type,base_image,play_image,gift_type,label,is_public_server')->find();
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,$from_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,$from_id,$effectData);
$roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id');
if($roomtype == 6){
//推送消息
$hot_value = db::name('vs_give_gift')->where('from_id', $from_id)->where('from',6)
->sum('total_price');
$text1 = [
'room_id' => $from_id,
'hot_value' => $hot_value * 10,
'text' => '房间心动值变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1028,$from_id,$text1);
//电影房推送结束时间点
$text2 = [
'room_id' => $from_id,
'end_time' => time() + 60 * 60 * 24 * 7,
'text' => '房间结束时间点'
];
model('Chat')->sendMsg(1042,$from_id,$text2);
}else{
if($gift_inf['is_public_server'] == 1){
//推送礼物横幅
$push = new Push(UID, $from_id);
$room_name = Db::name('vs_room')->where(['id' => $from_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' => $from_id,
'fromUserName' => $FromUserInfo['nickname'],
'toUserName' => $ToUserInfo['nickname'],
'giftName' => $gift_inf['gift_name'],
'roomId' => $from_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,$from_id,$text);
$roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id');
if($roomtype == 6){
//推送消息
$hot_value = db::name('vs_give_gift')->where('from_id', $from_id)->where('from',6)
->sum('total_price');
$text1 = [
'room_id' => $from_id,
'hot_value' => $hot_value * 10,
'text' => '房间心动值变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1028,$from_id,$text1);
}else{
if($gift_info['is_public_server'] == 1){
//推送礼物横幅
$push = new Push($uid, $from_id);
$room_name = Db::name('vs_room')->where(['id' => $from_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' => $from_id,
'fromUserName' => $FromUserInfo['nickname'],
'toUserName' => $ToUserInfo['nickname'],
'giftName' => $gift_info['gift_name'],
'roomId' => $from_id,
'number' => $num,
];
$push->giftBanner($text_list_new);
}
}
}
}
//直播间送礼物 每日任务
model('DailyTasks')->tasks_complete($uid,3);
}
}
//增加房间火热值hot_value
$gift_totalaa = $gift_total * get_system_config_value('coin_charm_exp');
db::name('vs_room')->where(['id' => $from_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update();
$roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id');
if($roomtype == 6){
//推送消息 交友房创建的私密房 倒计时增加
$value = db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)
->value('time_day');
if($value){
db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)
->setInc('time_day', $gift_total);
$text111 = [
'room_id' => $from_id,
'time_day' => db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)->value('time_day'),
'text' => '房间结束时间变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1052,$from_id,$text111);
}
}
Db::commit();
return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data]];
}
/*
* 送礼物-盲盒转盘专用
* @param int $uid 用户id
* @param int $from_id 来源id
* @param str $to_uid 接收礼物用户id字符串逗号分隔
* @param int $gid 礼物id
* @param int $num 礼物数量
* @param int $from_type 来源 1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼
* @param int $type 金币购买 1金币购买 2送背包礼物
* @param int $pit_number 坑位编号
* @return array
* 用户,在房间中,给谁,送了什么礼物,多少个,来源
*/
public function give_gift_to_pan($uid,$to_uid,$gid,$num,$from_type,$type,$from_id = 0,$pit_number = 0,$change_type = 0,$ext = [])
{
//送的礼物信息
$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];
}
if(!$to_uid){
return ['code' => 0, 'msg' => '请选择收礼人', 'data' => null];
}
$toarray = explode(',',$to_uid);
if(in_array($uid,$toarray)){
return ['code' => 0, 'msg' => '收礼人不能包含自己', 'data' => null];
}
if (ceil($num) != $num) {
return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null];
}
if ($num < 1) {
return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null];
}
$user_info = Db::name('user')->where(['id'=>$uid,'status'=>1])->find();
if(empty($user_info)){
return ['code' => 301, 'msg' => '当前用户登录失效', 'data' => null];
}
//获取送礼用户昵称
$FromUserInfo = db::name('user')->where('id',$uid)->field('id as user_id,nickname,avatar,sex')->find();
$FromUserInfo['icon'][0] = model('UserData')->user_wealth_icon($uid);//财富图标
$FromUserInfo['icon'][1] = model('UserData')->user_charm_icon($uid);//魅力图标
$FromUserInfo['chat_bubble'] = model('Decorate')->user_decorate_detail($uid,9);//聊天气泡
//送给一人礼物的总价格(扣除用户的数额)
$gift_price = $gift_info['gift_price'] * $num;
$roomId = 0;
if($from_type == 2 || $from_type == 3 || $from_type == 6){
$roomId = $from_id;
}
//循环送礼
$gift_total = 0;
$give_gift = 0;
$gift_user_data = [];
foreach ($toarray as $k => $to_id){
$gift_user_data[]['user_id'] = $to_id;
$gift_box1 = [];
$gift_box = [];
$gift_total += $gift_price;
//收礼记录行为日志
$give_gift = $this -> change_user_give_gift_log($uid,$gid,$gift_price,$num,$to_id,$from_type,$type,$from_id,$pit_number);
if(!$give_gift){
return ['code' => 0, 'msg' => '送礼失败', 'data' => null];
}
$gift_user_data[$k]['gift_price'] = $gift_price;
//计算收礼人得益
$receiver_earnings = $this -> receiver_earnings($to_id,$gift_price,$from_type);
if($receiver_earnings <= 0){
return ['code' => 0, 'msg' => '收礼人收益配置有误', 'data' => null];
}
//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 5系统任务 6-cp房间送礼
if($from_type == 1 || $from_type == 2 || $from_type == 3 ||$from_type == 4 || $from_type == 6){
//增加收益并记录日志
$receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,2,11,'收礼增加收益');
}elseif($from_type == 5){
//增加收益并记录日志
$receiver = $this -> change_user_cion_or_earnings_log($to_id,$receiver_earnings,$from_id,1,$change_type,'活动增加金币');
}else{
$receiver = false;
}
if(!$receiver){
return ['code' => 0, 'msg' => '收礼人收益失败', 'data' => null];
}
//用户魅力等级更新
$user_level = model('Level')->user_level_data_update($to_id,$gift_price,2,$roomId);
if(!$user_level){
return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null];
}
$room_owner_earnings = 0;//房主收益
$room_owner_earningsg = 0;//公会会长收益
//是否在房间
if(isset($from_id) && ($from_type == 2 || $from_type == 6)){
if($from_type == 6){ //cp电影房
//房主有收益
if(get_system_config_value('room_cp_room_user_ratio') > 0){
$room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id');
//计算房主收益//room_author_ratio
$room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,699);
if($room_owner_earnings > 0){
//增加收益并记录日志
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
return ['code' => 0, 'msg' => '房主收益失败', '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');
//计算会长收益
$room_owner_earningsg = $this -> receiver_earnings($room_guild,$gift_price,698);
//增加收益并记录日志
$room_owner_earningg = $this -> change_user_cion_or_earnings_log($room_guild,$room_owner_earningsg,$from_id,2,21,'工会长收益');
if(!$room_owner_earningg){
return ['code' => 0, 'msg' => '工会长收益失败', 'data' => null];
}
}
}
}else{
$room_owner = Db::name('vs_room')->where(['id'=>$from_id,'apply_status'=>2])->value('user_id');
//计算房主收益//room_author_ratio
$room_owner_earnings = $this -> receiver_earnings($room_owner,$gift_price,99);//结果是钻石
if($room_owner_earnings > 0){
//主持人收益
//在主持位的主持人
$host_id = Db::name('vs_room_pit')->where(['room_id'=>$from_id,'pit_number'=>9])->value('user_id');
if($host_id){
//计算主持人收益
$host_earnings = $this -> receiver_earnings($host_id,$room_owner_earnings*get_system_config_value('rmb_coin_ratio'),98,$from_id);
if($host_earnings > 0){
//增加主持人收益并记录日志
$host_earnings_earning = $this -> change_user_cion_or_earnings_log($host_id,$host_earnings,$from_id,2,19,'主持人收益');
if(!$host_earnings_earning){
return ['code' => 0, 'msg' => '主持人收益失败', 'data' => null];
}
//增加房主收益并记录日志
$room_owner_earningss = $room_owner_earnings - $host_earnings;
if($room_owner_earningss > 0){
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earningss,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
return ['code' => 0, 'msg' => '房主收益失败', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
return ['code' => 0, 'msg' => '房主收益失败', 'data' => null];
}
}
}else{
//增加房主收益并记录日志
$room_owner_earning = $this -> change_user_cion_or_earnings_log($room_owner,$room_owner_earnings,$from_id,2,18,'房主收益');
if(!$room_owner_earning){
return ['code' => 0, 'msg' => '房主收益失败', 'data' => null];
}
}
}
}
if($gift_info['label'] == 2){
foreach ($gift_box as $gv) {
//记录送礼利率和各方收益
//收礼人是否加入公会
$configs = get_system_config();
$is_join_guild = Db::name('vs_guild_user')->where(['user_id' => $to_uid, 'status' => 1, 'quit_time' => 0])->field('guild_id')->find();
//收益增加 加入工会的收益
if ($is_join_guild) {
$ratiog = $configs['room_gift_guild_ratio'];
} else {
$ratiog = 0;
}
//未加入工会的收益
$ratiogr = $configs['room_gift_ratio'];
//收礼人最终的收益比例
$ratio = $ratiogr + $ratiog;
//房主收益大于0 就代表有收益 且在房间
if ($room_owner_earningsg > 0) {
$guid_ratio = $configs['room_cp_guild_user_ratio'];
} else {
$guid_ratio = 0;
}
//平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益
$app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio;
$app_earning = coin_earning($gv['gift_price'], $app_ratio);
$receiver_earningss = $this -> receiver_earnings($to_id,$gv['gift_price'],$from_type);
$room_owner_earningss = $this -> receiver_earnings($room_owner,$gv['gift_price'],99);//结果是钻石
$gift_rate = $this->change_give_gift_profit($gv['give_gift_id'], $ratio, $receiver_earningss, $configs['room_author_ratio'], $room_owner_earningss, $app_ratio, $app_earning);
if (!$gift_rate) {
Db::rollback();
return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null];
}
}
}else{
//记录送礼利率和各方收益
//收礼人是否加入公会
$configs = get_system_config();
$is_join_guild = Db::name('vs_guild_user')->where(['user_id' => $to_uid, 'status' => 1, 'quit_time' => 0])->field('guild_id')->find();
//收益增加 加入工会的收益
if ($is_join_guild) {
$ratiog = $configs['room_gift_guild_ratio'];
} else {
$ratiog = 0;
}
//未加入工会的收益
$ratiogr = $configs['room_gift_ratio'];
//收礼人最终的收益比例
$ratio = $ratiogr + $ratiog;
//房主收益大于0 就代表有收益 且在房间
if ($room_owner_earningsg > 0) {
$guid_ratio = $configs['room_cp_guild_user_ratio'];
} else {
$guid_ratio = 0;
}
//平台收益 = 总金额 - 收礼人收益 - 房主收益 - 工会长收益
$app_ratio = 100 - $ratio - $configs['room_author_ratio'] - $guid_ratio;
$app_earning = coin_earning($gift_price, $app_ratio);
$gift_rate = $this->change_give_gift_profit($give_gift, $ratio, $receiver_earnings, $configs['room_author_ratio'], $room_owner_earnings, $app_ratio, $app_earning);
if (!$gift_rate) {
return ['code' => 0, 'msg' => '礼物记录失败', 'data' => null];
}
}
}
$ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find();
$ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标
$ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标
$ToUserInfo['charm'] = db::name('vs_room_user_charm')->where(['user_id' => $to_id,'room_id' => $from_id])->value('charm');//魅力
if(isset($from_id) && ($from_type == 2 || $from_type == 6)){
//查询房间是否在PK中 是fa_vs_room_pk 表中的 room_id_a还是room_id_b
$room_pk = Db::name('vs_room_pk')->where(['status' => 3, 'room_id_a' => $from_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', $gift_price * 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' => $from_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', $gift_price * 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);
}
}
//直播间送礼物 每日任务
model('DailyTasks')->tasks_complete($uid,3);
}
}
//增加房间火热值hot_value
$gift_totalaa = $gift_total * get_system_config_value('coin_charm_exp');
db::name('vs_room')->where(['id' => $from_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update();
$roomtype = Db::name('vs_room')->where(['id' => $from_id])->value('type_id');
if($roomtype == 6){
//推送消息 交友房创建的私密房 倒计时增加
$value = db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)
->value('time_day');
if($value){
db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)
->setInc('time_day', $gift_total);
$text111 = [
'room_id' => $from_id,
'time_day' => db::name('vs_room_cp_movie')->where('room_id', $from_id)->where('type',1)->value('time_day'),
'text' => '房间结束时间变化'
];
//聊天室推送系统消息
model('Chat')->sendMsg(1052,$from_id,$text111);
}
}
return ['code' => 1, 'msg' => '送礼成功', 'data' => ['gift_total' => $gift_total,'gift_user_data' =>$gift_user_data]];
}
//送礼特效
public function give_gift_effect($to_id,$FromUserInfo,$gift_info,$num,$from_id)
{
//推送礼物特效
$ToUserInfo = Db::name('user')->where(['id' => $to_id])->field('id as user_id,nickname,avatar,sex')->find();
$ToUserInfo['icon'][0] = model('UserData')->user_wealth_icon($to_id);//财富图标
$ToUserInfo['icon'][1] = model('UserData')->user_charm_icon($to_id);//魅力图标
$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,$from_id,$text);
}
//计算收礼人得到的收益
public function receiver_earnings($to_uid,$all_gift_price,$from_type,$room_id = 0)
{
$configs = get_system_config();
if($from_type == 1){//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏 99房主收益 98主持人收益
$ratio = $configs['gift_chat_earning'];
}elseif ($from_type == 2 || $from_type == 3){
//收礼人是否加入公会
$is_join_guild = Db::name('vs_guild_user')->where(['user_id'=>$to_uid,'status'=>1,'quit_time' => 0])->field('guild_id')->find();
//收益增加 加入工会的收益
if($is_join_guild){
$ratiog = $configs['room_gift_guild_ratio'];
}else{
$ratiog = 0;
}
$ratiogr = $configs['room_gift_ratio'];
$ratio = $ratiogr +$ratiog;
}elseif ($from_type == 4){
$ratio = $configs['gift_zone_earnings'];
}elseif ($from_type == 99){
$ratio = $configs['room_author_ratio'];
}elseif ($from_type == 98){
$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;
}
}elseif ($from_type == 6){//Cp电影房
$ratio = $configs['room_cp_user_ratio'];
}elseif ($from_type == 699){
$ratio = $configs['room_cp_room_user_ratio'];
}elseif ($from_type == 698){
$ratio = $configs['room_cp_guild_user_ratio'];
}
//计算收礼人收益
return coin_earning($all_gift_price,$ratio);
}
//操作用户金币和收益并记录日志
public function change_user_cion_or_earnings_log($user_id,$money,$room_id,$money_type,$change_type,$remarks)
{ //change_type
// 1.系统调节 2.充值 3.提现 4.金币转增(送出) 5.每日任务奖励 6.充值返利 7.购买装扮
// 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换
// 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益 20.抢头条 21.公会长收益22.提现驳回或提现失败返还23.财富等级奖励金币领取24.删除关系扣金币,
if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20])){
$room_ids = 0;
}else{
$room_ids = $room_id;
}
$data = [
'user_id' => $user_id,
'change_value' => $money,
'room_id' => $room_ids,
'money_type' => $money_type,
'change_type' => $change_type,
'from_id' => $room_id,
'remarks' => $remarks,
'createtime' => time()
];
$res = Db::name('vs_user_money_log')->insert($data);
if(!$res){
return false;
}
//根据类型判断是操作金币还是钻石得增加或减少
if($money_type == 1){//1金币
//增加用户金币类型
$in_types = [2,5,6,8,13,14,15,16];
//减少用户金币类型
$out_types = [4,7,10,17,20];
if(in_array($change_type,$in_types)){
//增加用户金币
$res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$money);
if(!$res1){
return false;
}
}elseif(in_array($change_type,$out_types)){
//减少用户金币
$res1 = Db::name('user_wallet')->where(['user_id'=>$user_id,'coin'=>['>=',$money]])->setDec('coin',$money);
if(!$res1){
return false;
}
}
}elseif ($money_type == 2){//2钻石
//增加用户钻石类型
$in_types = [9,11,12,18,19,21];
//减少用户钻石类型
$out_types = [3,14];
if(in_array($change_type,$in_types)){
//增加用户
$res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('earnings',$money);
if(!$res1){
return false;
}
}elseif(in_array($change_type,$out_types)){
//减少用户
$res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setDec('earnings',$money);
if(!$res1){
return false;
}
}
}
return true;
}
//记录用户送礼日志
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 = [
'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(),
];
$res = Db::name('vs_give_gift')->insertGetId($data);
if(!$res){
return false;
}
return $res;
}
//记录用户赠送背包礼物日志
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;
}
/*
* 送礼利率收益等具体记录
* `give_gift_id` int(11) NOT NULL DEFAULT '0' COMMENT '送礼记录表ID',
`gift_user_ratio` varchar(255) NOT NULL DEFAULT '0' COMMENT '收礼人 收礼时的收益率(单位%',
`gift_user_earning` decimal(10,0) DEFAULT '0' COMMENT '收礼人的收益',
`room_owner_ratio` varchar(255) DEFAULT '0' COMMENT '房主收益率(单位 %',
`room_owner_earning` decimal(10,0) DEFAULT '0' COMMENT '房主收益',
`app_ratio` varchar(255) DEFAULT '0' COMMENT '平台收益率(单位 %',
`app_earning` decimal(10,0) DEFAULT '0' COMMENT '平台收益',
*/
public function change_give_gift_profit($give_gift_id,$gift_user_ratio,$gift_user_earning,$room_owner_ratio = 0,$room_owner_earning = 0,$app_ratio = 0,$app_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,
'createtime' => time(),
];
$res = Db::name('vs_give_gift_ratio_log')->insert($data);
if(!$res){
return false;
}
return true;
}
/*
* 聊天送礼物 (音信)
* @param int $user_id 用户id
* @param int $gid 礼物id
* @param int $num 礼物数量
* @param int $to_uid 接收礼物用户id
*
* @return array
*
*/
public function chat_give_gift($user_id,$gid,$num,$to_uid,$gift_type=1)
{
$gift_info = Db::name('vs_gift')->where(['gid'=>$gid])->find();
if(empty($gift_info)){
return ['code' => 0, 'msg' => '礼物不存在', 'data' => null];
}
if($user_id == $to_uid){
return ['code' => 0, 'msg' => '不能给自己送礼物', 'data' => null];
}
if (ceil($num) != $num) {
return ['code' => 0, 'msg' => '打赏礼物数量必须为整数', 'data' => null];
}
if ($num < 1) {
return ['code' => 0, 'msg' => '打赏礼物数量必须大于零', 'data' => null];
}
$user_info = Db::name('user')->where(['id'=>$user_id])->find();
if(empty($user_info)){
return ['code' => 0, 'msg' => '送礼用户不存在', 'data' => null];
}
$to_user_info = Db::name('user')->where(['id'=>$to_uid])->find();
if(empty($to_user_info)){
return ['code' => 0, 'msg' => '收礼用户不存在', 'data' => null];
}
//查询收益比例
$all_gift_price = $gift_info['gift_price'] * $num; //总礼物价格
$configs = get_system_config();
$gift_chat_earning = $configs['gift_chat_earning'];//聊天打赏礼物收益比例
$gift_earning = coin_earning($all_gift_price,$gift_chat_earning);
if($gift_type == 1){
//操作送礼人金币
$res = model('common/UserWallet')->change_user_money($user_id, $all_gift_price, model('common/UserWallet')::MONEYTYPECOIN, model('common/UserWallet')::OPERATION_GIFT,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::OPERATION_GIFT),0,$to_uid,0);
if($res['code'] == 1){
//操作收礼人收益
$res = model('common/UserWallet')->change_user_money($to_uid, $gift_earning, model('common/UserWallet')::MONEYTYPEARNINGS, model('common/UserWallet')::GIVE_GIFT_EARNING,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::GIVE_GIFT_EARNING),0,$to_uid,0);
if($res['code'] == 1){
//插入送礼记录
$data = [
'user_id' => $user_id,
'gift_user' => $to_uid,
'gift_id' => $gid,
'number' => $num,
'from_id' => 0,
'total_price' => $all_gift_price,
'type' => 1,
'from' => 1,
'createtime' => time(),
'updatetime' => time()
];
$re = Db::name('vs_give_gift')->insertGetId($data);
if($re){
$app_ratio = 100 - $gift_chat_earning;
$app_earning = coin_earning($all_gift_price,$app_ratio);
$this->change_give_gift_profit($re,$gift_chat_earning,$gift_earning,0,0,$app_ratio,$app_earning);
return ['code' => 1, 'msg' => '送礼成功', 'data' => null];
}else{
return ['code' => 0, 'msg' => '送礼失败', 'data' => null];
}
}
}
}else{//背包礼物
$remarks = "赠送 ".$to_user_info['nickname']." 背包礼物 ";
$res = model('UserGiftPack')->change_user_gift_pack($user_id,$gid,$num * -1,model('UserGiftPack')::GIFT_USE,$remarks);
if($res['code'] == 1){
//操作收礼人收益
$res = model('common/UserWallet')->change_user_money($to_uid, $gift_earning, model('common/UserWallet')::MONEYTYPEARNINGS, model('common/UserWallet')::GIVE_GIFT_EARNING,model('common/UserWallet')::ChangeTypeLable(model('common/UserWallet')::GIVE_GIFT_EARNING),0,$to_uid,0);
//插入送礼记录
$data = [
'user_id' => $user_id,
'gift_user' => $to_uid,
'gift_id' => $gid,
'number' => $num,
'from_id' => 0,
'total_price' => $all_gift_price,
'type' => 2,
'from' => 1,
'createtime' => time(),
'updatetime' => time()
];
$re = Db::name('vs_give_gift')->insertGetId($data);
if($re){
$app_ratio = 100 - $gift_chat_earning;
$app_earning = coin_earning($all_gift_price,$app_ratio);
$this->change_give_gift_profit($re,$gift_chat_earning,$gift_earning,0,0,$app_ratio,$app_earning);
return ['code' => 1, 'msg' => '送礼成功', 'data' => null];
}else{
return ['code' => 0, 'msg' => '送礼失败', 'data' => null];
}
}
}
return ['code' => $res['code'], 'msg' => $res['msg'], 'data' => null];
}
//动态打赏
public function reward_zone($uid,$zid,$gift_id,$num,$is_pack)
{
$zone = Db::name('user_zone')->where('id',$zid)->find();
if(!$zone){
return ['code'=>0,'msg'=>'动态不存在','data'=>null];
}
if($uid == $zone['user_id']){
return ['code'=>0,'msg'=>'不能给自己打赏','data'=>null];
}
//礼物金额
$gift_price = Db::name('vs_gift')->where('gid',$gift_id)->value('gift_price');
//总金额
$total_gift_price = $gift_price * $num;
//数据库配置
$config = get_system_config();
//开启事务
Db::startTrans();
if($is_pack == 2){
//背包礼物
$pack_give_gift = $this->give_pack_gift($uid,$gift_id,$num);
if($pack_give_gift['code'] != 1){
Db::rollback();
return ['code'=>$pack_give_gift['code'],'msg'=>$pack_give_gift['msg'],'data'=>null];
}
}else{
//金币礼物
$coin_give_gift = $this->give_coin_buy_gift($uid,$total_gift_price,$zid);
if($coin_give_gift['code'] != 1){
Db::rollback();
return ['code'=>$coin_give_gift['code'],'msg'=>$coin_give_gift['msg'],'data'=>null];
}
}
//增加用户的收益并记录日志
$earnings = coin_earning($total_gift_price,$config['gift_zone_earnings']);
$user = Db::name('user_wallet')->where('user_id',$zone['user_id'])->setInc('earnings',$earnings);
if(!$user){
Db::rollback();
return ['code'=>0,'msg'=>'打赏礼物失败!!','data'=>null];
}
//记录打赏
$reward_data = [
'user_id'=>$uid,
'zone_id'=>$zid,
'gift_id'=>$gift_id,
'gift_price'=>$gift_price,
'number'=>$num,
'gift_price_total'=> $total_gift_price,
'createtime' => time()
];
$reward_res = Db::name('user_zone_rewards')->insert($reward_data);
if(!$reward_res){
Db::rollback();
return ['code'=>0,'msg'=>'打赏礼物失败!!!','data'=>null];
}
//送礼日志
$give_gift_data = [
'gift_user'=>$zone['user_id'],
'gift_id'=>$gift_id,
'from_id'=>$zid,
'number'=>$num,
'user_id'=>$uid,
'total_price'=>$total_gift_price,
'type'=>$is_pack,
'from'=>4//1聊天送礼物 2房间语聊送礼 3直播送礼 4动态打赏'
];
$give_gift_res = Db::name('vs_give_gift')->insertGetId($give_gift_data);
if(!$give_gift_res){
Db::rollback();
return ['code'=>0,'msg'=>'打赏礼物失败','data'=>null];
}
//用户收益日志
$user_earnings_data = [
'user_id'=>$zone['user_id'],
'from_id'=>$zid,
'change_type'=>11,//收礼增加收益
'money_type'=>2,
'change_value'=>$earnings,
'remarks'=>'动态打赏增加收益',
'createtime'=>time()
];
$user_earnings_res = Db::name('vs_user_money_log')->insert($user_earnings_data);
if(!$user_earnings_res){
Db::rollback();
return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null];
}
$app_ratio = 100 - $config['gift_zone_earnings'];
$app_earning = coin_earning($total_gift_price,$app_ratio);
$this->change_give_gift_profit($give_gift_res,$config['gift_zone_earnings'],$earnings,0,0,$app_ratio,$app_earning);
Db::commit();
return ['code'=>1,'msg'=>'赠送成功','data'=>null];
}
//赠送背包礼物
public function give_pack_gift($uid,$gift_id,$num)
{
//背包礼物数量
$pack_num = Db::name('vs_user_gift_pack')->where('user_id',$uid)->where('gid',$gift_id)->value('num');
if($pack_num < $num){
return ['code'=>0,'msg'=>'背包礼物不足','data'=>null];
}
//扣除背包礼物数量
$resel = Db::name('vs_user_gift_pack')->where('user_id',$uid)->where('gid',$gift_id)->setDec('num',$num);
if(!$resel){
return ['code'=>0,'msg'=>'扣除背包礼物失败','data'=>null];
}
//背包礼物日志
$data = [];
$data['user_id'] = $uid;
$data['type'] = 5;
$data['gid'] = $gift_id;
$data['change_num'] = $num;
$data['remarks'] = '动态打赏背包礼物';
$data['createtime'] = time();
$data['updatetime'] = time();
$reslut = db::name('vs_user_gift_pack_log')->insert($data);
if (!$reslut) {
Db::rollback();
return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null];
}
return ['code'=>1,'msg'=>'扣除背包礼物成功','data'=>null];
}
//赠送金币购买礼物
public function give_coin_buy_gift($uid,$total_gift_price,$zid)
{
//用户金额
$user_coin = Db::name('user_wallet')->where('user_id',$uid)->value('coin');
if($user_coin < $total_gift_price){
return ['code'=>0,'msg'=>'余额不足','data'=>null];
}
//扣除用户金额
$re = Db::name('user_wallet')->where('user_id',$uid)->setDec('coin',$total_gift_price);
if(!$re){
return ['code'=>0,'msg'=>'扣除用户金额失败','data'=>null];
}
//用户资金日志
$user_earnings_data = [
'user_id'=>$uid,
'from_id'=>$zid,
'change_type'=>10,//购买礼物
'money_type'=>1,
'change_value'=>$total_gift_price,
'remarks'=>'动态打赏',
'createtime'=>time()
];
$user_earnings_res = Db::name('vs_user_money_log')->insert($user_earnings_data);
if(!$user_earnings_res){
Db::rollback();
return ['code'=>0,'msg'=>'打赏礼物失败!','data'=>null];
}
return ['code'=>1,'msg'=>'扣除用户金额成功','data'=>null];
}
//动态打赏列表
public function zone_reward_list($uid, $zid, $page, $page_limit){
$list = Db::name('vs_give_gift')->alias('a')
->join('user b','a.user_id = b.id')
->field('a.user_id,sum(a.total_price) total_price,b.nickname,b.avatar,b.user_code')
->where('a.from',4)
->where('a.from_id',$zid)
->order('total_price desc')
->page($page,$page_limit)
->group('a.user_id')
->select();
foreach ($list as &$v){
//用户是否在线
$v['is_online'] = $this->redis->get('user_online_' . $v['user_id']) ? 1: 0;//是否在线 在redis里获取
}
return $list;
}
/*
* 开盲盒
*/
public function open_box($gift_id,$user_id,$gift_user_id,$room_id=0,$gift_bag_id=0){
//获取盲盒配置
$bag_list = db::name("vs_gift_bag")->field('id,name,ext,periods')->where(['activities_id'=>4,'status'=>1])->select();
$gift_bag_id = 0;
foreach ($bag_list as $k=>$v){
$ext = json_decode($v['ext'],true);
if($ext){
if($ext['gift_id'] == $gift_id){
$gift_bag_id = $v['id'];
$periods = $v['periods'];
break;
}
}
}
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_detail = db::name("vs_gift_bag_detail")->where($where)->orderRaw('rand()')->find();
// 优化:基于剩余数量的加权随机选择
$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'] = $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];
}
}