Files
mier-php/application/api/model/GiftBlind.php

900 lines
44 KiB
PHP
Raw Permalink Normal View History

2025-08-11 10:22:05 +08:00
<?php
namespace app\api\model;
use think\Db;
use think\Model;
use think\facade\Log;
class GiftBlind extends Model
{
private function file_unlock($fh) {
flock($fh, LOCK_UN);
fclose($fh);
}
//盲盒礼物
public function open_blind_box_to_multi($uid, $rid, $type, $open_num, $recived_uid, $is_on_micro = 1)
{
// dump($open_num);die;
if($open_num > 10) {
return ['code' => 201, 'msg' => '全麦盲盒赠送不能超过10个', 'data' => null];
}
if (ceil($open_num) != $open_num) {
return ['code' => 201, 'msg' => '开奖次数参数非法', 'data' => null];
}
$config = get_system_config();
$map = [];
$map['rid'] = $rid;
$map['is_delete'] = 1;
$room_info = db::name('room')->where($map)->find();
if (empty($room_info)) {
return ['code' => 201, 'msg' => '房间信息不存在', 'data' => null];
}
//房主id
$room_owner_uid = $room_info['room_owner_uid'];
$room_owner_info = db::name('user')->where('uid', $room_info['room_owner_uid'])->find();
//该房间是否加入公会
$guild_id = 0;
$map = [];
$map[] = ['uid', '=', $room_info['room_owner_uid']];
$map[] = ['status', '=', 1];
$map[] = ['is_delete', '=', 1];
$guild_info = db::name('user_guild')->where($map)->find();
if($guild_info){
$guild_id = $guild_info['guild_id'];
}
if(count($recived_uid) > 1){
// return ['code' => 201, 'msg' => '打赏礼物对象不能为多个', 'data' => null];
}
$recived_uid_arr = $recived_uid;
if(in_array($uid, $recived_uid_arr)) {
// return ['code' => 201, 'msg' => '不能给自己打赏', 'data' => null];
}
$map = [];
$map[] = ['uid', 'in', $recived_uid_arr];
$recived_user_info = db::name('user')->field('uid,is_tester,money,integral,nick_name,base64_nick_name,head_pic')
->where($map)->select();
if (empty($recived_user_info)) {
return ['code' => 201, 'msg' => '打赏礼物对象不能为空', 'data' => null];
}
if(count($recived_uid_arr) != count($recived_user_info)) {
return ['code' => 201, 'msg' => '打赏礼物对象不能为空', 'data' => null];
}
$received_num = count($recived_uid_arr);
// dump($recived_uid);exit;
$redis = connectionRedis();
$user_gift_id_list = []; //用户抽中礼物id集合
$user_gift_id_redis_list = []; //用户抽中redis礼物id集合
$user_win_gift_data = []; //抽中礼物列表
$box_log_data = []; //抽中礼物期数数据
$box_type_data = []; //宝箱类型配置信息
$user_pay_amount = 0; //用户支付总额
$user_win_gift_total_value = 0; //抽中礼物总价值
$surplus_user_money = 0; //用户剩余资金
$now_time = time();
$tid = '';
$user_info = db::name('user')->find($uid); //获取用户信息
if(!$user_info){
return ['code' => 201, 'msg' => '用户信息不存在', 'data' => null];
}
//用户消费所对应的宝箱类型
if ($type == 32) {//琉璃魔盒
$tid = 101;
// $gift_level_type = db::name('gift')->where('gid',31)->value('level_type');
} else if($type == 33) {//琥珀魔盒
$tid = 102;
// $gift_level_type = db::name('gift')->where('gid',32)->value('level_type');
} else if($type == 34) {//钻石魔盒
$tid = 103;
// $gift_level_type = db::name('gift')->where('gid',33)->value('level_type');
}
//判断是否是虚拟用户
if($user_info['is_tester']==2){
return ['code' => 201, 'msg' => '虚拟用户无法购买', 'data' => null];
}
// dump($tid);exit;
//该奖池是否配置礼物
$map = [];
$map[] = ['tid', '=', $tid];
$is_box_config = db('box_config')->where($map)->select();
// dump($is_box_config);die;
if(!$is_box_config){
return ['code' => 201, 'msg' => '盲盒数量不足', 'data' => null];
}
//获取宝箱类型配置信息
$box_type_list = db::name('box_type')->field('tid,open_price,open_status,show_name')->cache(10)->select();
foreach ($box_type_list as $k => &$v) {
$box_type_data[$v['tid']] = $v;
}
if (empty($box_type_data[$tid])) {
return ['code' => 201, 'msg' => '开奖类型非法参数', 'data' => null];
}
if ($box_type_data[$tid]['open_status'] != 1) {
return ['code' => 201, 'msg' => '该开奖类型暂时已关闭', 'data' => null];
}
$unique_key = $tid;
$path = './lock/lock_blind_box' . $unique_key . '.txt';
$fh = fopen($path, 'w');
flock($fh, LOCK_EX);
$need_open_num = $open_num * $received_num;
$user_pay_amount = $need_open_num * $box_type_data[$tid]['open_price'];
$keyname = "box:list:tid:".$tid;
$len = $redis->llen($keyname);
if ($keyname == "box:list:tid:") {
return ['code' => 201, 'msg' => '开奖类型非法参数', 'data' => null];
}
if($len < $need_open_num) {
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//补礼物用户id
$give_user_id_arr = [];
// 启动事务
Db::startTrans();
try {
//获取用户必中信息 (每次补发一个)
$map = [];
$map[] = ['uid', '=', $uid];
$map[] = ['tid', '=', $tid];
$map[] = ['give_status', '=', 1];
$box_give_gift_info = db::name('box_give_gift')->where($map)->order('id','asc')->find();
if($box_give_gift_info) {
$key = mt_rand(0, (count($recived_uid_arr) - 1));
$data = [
'uid' => $recived_uid_arr[$key],
'bl_id' => 0,
'gid' => $val['gid'],
];
$user_gift_id_list[] = $data;
$give_user_id_arr[$val['id']] = $data['uid'];
}
$give_user_id_arrs = $give_user_id_arr;
//补发礼物领取id
$give_box_gift_id = [];
//获取待核销必中礼物数据
$map = [];
$map[] = ['tid', '=', $tid];
$map[] = ['give_status', '=', 2];
$map[] = ['deduction_status', '=', 1];
$box_un_deduction_give_gift_list = db::name('box_give_gift')->where($map)->order('id desc')->column('id', 'gid'); //每种礼物只核销第一个
//待核销数据id
$un_deduction_give_gift_id = [];
//更新开奖记录条件
$update_user_box_log = [];
for($i = 0; $i < $open_num; $i++) {
foreach($recived_uid_arr as $val) {
if(in_array($val, $give_user_id_arrs)) {
$keys = array_search($val, $give_user_id_arrs);
$give_box_gift_id[] = $keys;
unset($give_user_id_arrs[$keys]);
} else {
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '', 'data' => null];
} else {
//获取是否有待核销必中
$gift_data_data = explode('-', $gift_data[1]);
$bl_id = $gift_data_data[0];
$gid = $gift_data_data[1];
if (!empty($box_un_deduction_give_gift_list[$gid])) {
$id = $box_un_deduction_give_gift_list[$gid];
unset($box_un_deduction_give_gift_list[$gid]);
$un_deduction_give_gift_id[] = $id;
$data = [];
$data['bl_id'] = $bl_id;
$data['gid'] = $gid;
$data['uid'] = $val;
$user_gift_id_redis_list[] = $data;
//开宝箱记录表更新
$update_user_box_log_item = [];
$map = [];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['num', '=', 1];
$map[] = ['bl_id', '=', 0];
$update_user_box_log_item['map'] = $map;
$data = [];
$data['bl_id'] = $bl_id;
$data['update_time'] = time();
$update_user_box_log_item['data'] = $data;
$update_user_box_log[] = $update_user_box_log_item;
//重新从队列获取一个礼物信息
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '盲盒数量不足', 'data' => null];
}
$gift_data_data = explode('-', $gift_data[1]);
$bl_id = $gift_data_data[0];
$gid = $gift_data_data[1];
}
$data = [];
$data['bl_id'] = $bl_id;
$data['gid'] = $gid;
$data['uid'] = $val;
$user_gift_id_redis_list[] = $data;
$user_gift_id_list[] = $data;
}
}
}
}
if (count($user_gift_id_list) != (count($recived_uid_arr) * $open_num)) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '盲盒数量不足', 'data' => null];
}
//取出所有礼物数据
$gift_list = db::name('gift')->field('gid,gift_name,gift_price,base_image,play_image,gift_type,is_special')->cache(10)->select();
$gift_list_data = [];
foreach ($gift_list as $k => &$v) {
$v['base_image'] = localpath_to_netpath($v['base_image']);
$v['play_image'] = localpath_to_netpath($v['play_image']);
$gift_list_data[$v['gid']] = $v;
}
//获取宝箱礼物配置信息
$box_config_list = db::name('box_config')->field('gid,tid,is_public_screen,is_public_server')->cache(10)->select();
$box_config_list_data = [];
foreach ($box_config_list as $k => $v) {
$box_config_list_data[$v['gid']][$v['tid']] = $v;
}
//用户获取礼物价值
$user_win_gift_price_by_uid = [];
//整理用户抽中礼物数量
foreach ($user_gift_id_list as $k => $v) {
if (empty($gift_list_data[$v['gid']])) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '礼物信息不存在', 'data' => null];
}
if (empty($box_config_list_data[$v['gid']])) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '宝箱礼物信息不存在', 'data' => null];
}
if (empty($user_win_gift_data[$v['gid']])) {
$user_win_gift_data[$v['gid']] = $gift_list_data[$v['gid']];
$user_win_gift_data[$v['gid']]['open_num'] = 1;
} else {
$user_win_gift_data[$v['gid']]['open_num']++;
}
$user_win_gift_data[$v['gid']]['bl_id'] = $v['bl_id'];
$user_win_gift_data[$v['gid']]['is_public_screen'] = $box_config_list_data[$v['gid']][$tid]['is_public_screen'];
$user_win_gift_data[$v['gid']]['is_public_server'] = $box_config_list_data[$v['gid']][$tid]['is_public_server'];
if (empty($box_log_data[$v['bl_id']])) {
$box_log_data[$v['bl_id']]['open_num'] = 1;
$box_log_data[$v['bl_id']]['open_gift_value'] = $gift_list_data[$v['gid']]['gift_price'];
} else {
$box_log_data[$v['bl_id']]['open_num']++;
$box_log_data[$v['bl_id']]['open_gift_value'] += $gift_list_data[$v['gid']]['gift_price'];
}
$user_win_gift_total_value += $gift_list_data[$v['gid']]['gift_price'];
$unique_key = $v['uid'] . '_' . $v['gid'];
if(!isset($user_win_gift_price_by_uid[$unique_key]['num'])) {
$user_win_gift_price_by_uid[$unique_key]['num'] = 1;
$user_win_gift_price_by_uid[$unique_key]['gift_price'] = $gift_list_data[$v['gid']]['gift_price'];
$user_win_gift_price_by_uid[$unique_key]['uid'] = $v['uid'];
$user_win_gift_price_by_uid[$unique_key]['gid'] = $v['gid'];
// $user_win_gift_price_by_uid[$unique_key]['is_special'] = $gift_list_data[$v['gid']]['is_special'];
$user_win_gift_price_by_uid[$unique_key]['gift_name'] = $gift_list_data[$v['gid']]['gift_name'];
$user_win_gift_price_by_uid[$unique_key]['base_image'] = $gift_list_data[$v['gid']]['base_image'];
$user_win_gift_price_by_uid[$unique_key]['play_image'] = $gift_list_data[$v['gid']]['play_image'];
$user_win_gift_price_by_uid[$unique_key]['gift_type'] = $gift_list_data[$v['gid']]['gift_type'];
$user_win_gift_price_by_uid[$unique_key]['is_public_screen'] = $box_config_list_data[$v['gid']][$tid]['is_public_screen'];
$user_win_gift_price_by_uid[$unique_key]['is_public_server'] = $box_config_list_data[$v['gid']][$tid]['is_public_server'];
} else {
$user_win_gift_price_by_uid[$unique_key]['num']++;
}
}
if($user_info['is_tester'] == 1){
//扣除账户积分
$reslut = model('admin/User')->change_user_money_by_user_info($user_info, -$user_pay_amount, 2, 16, "开盲盒送礼物", $user_info['uid'], 0);
if ($reslut['code'] != 200) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
$surplus_user_money = $user_info['integral'] - $user_pay_amount;
}
foreach ($box_log_data as $k => $v) {
if ($k != 0) {
$map = [];
$map[] = ['bl_id', '=', $k];
$reslut = db::name('box_log')->where($map)->inc('open_num', $v['open_num'])->inc('open_gift_value', $v['open_gift_value'])->update();
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
}
//用户必中礼物状态更新
if (!empty($box_give_gift_info)) {
$map = [];
$map[] = ['id', '=', $box_give_gift_info['id']];
$data = [];
$data['give_time'] = $now_time;
$data['give_status'] = 2;
$data['update_time'] = $now_time;
$reslut = db::name('box_give_gift')->where($map)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
//添加用户开宝箱日志 可能存在2期奖情况 特殊处理
$user_box_data_by_bl_id = [];
foreach ($user_gift_id_list as $k => $v) {
if (empty($user_box_data_by_bl_id[$v['bl_id']][$v['gid']])) {
$user_box_data_by_bl_id[$v['bl_id']][$v['gid']]['bl_id'] = $v['bl_id'];
$user_box_data_by_bl_id[$v['bl_id']][$v['gid']]['gid'] = $v['gid'];
$user_box_data_by_bl_id[$v['bl_id']][$v['gid']]['open_num'] = 1;
} else {
$user_box_data_by_bl_id[$v['bl_id']][$v['gid']]['open_num']++;
}
}
foreach ($user_box_data_by_bl_id as $k => $v) {
$insert_user_box_data = [];
foreach ($v as $m => $n) {
$gift_info = $gift_list_data[$n['gid']];
$data = [];
$data['uid'] = $user_info['uid'];
$data['rid'] = $rid;
$data['tid'] = $tid;
$data['bl_id'] = $n['bl_id'];
$data['gid'] = $n['gid'];
$data['num'] = $n['open_num'];
$data['gift_price'] = $gift_info['gift_price'];
$data['total_price'] = $n['open_num'] * $gift_info['gift_price'];
$data['total_open_num'] = $open_num;
$data['add_time'] = $now_time;
$data['update_time'] = $now_time;
// $data['last_login_device'] = $user_info['last_login_device'];
$insert_user_box_data[] = $data;
}
$reslut = db::name('user_box_log')->insertAll($insert_user_box_data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
//添加用户开宝箱统计数据
$time = strtotime(date("Y-m-d"));
$box_type = 0;
$map = [];
$map[] = ['uid', '=', $user_info['uid']];
$map[] = ['box_type', '=', $tid];
$box_type = $tid;
$map[] = ['add_time', '>', $time];
$user_box_count_info = db::name('user_box_count')->where($map)->find();
if (!empty($user_box_count_info)) {
$rate = 0; //支收比
$rate = round(($user_win_gift_total_value + $user_box_count_info['in_amount']) / ($user_box_count_info['out_amount'] + $user_pay_amount), 4);
$map = [];
$map[] = ['sid', '=', $user_box_count_info['sid']];
// $map[] = ['uid', '=', $user_info['uid']];
// $map[] = ['box_type', '=', $box_type];
$data = [];
$data['rate'] = $rate;
$data['update_time'] = $now_time;
$profit = $user_win_gift_total_value - $user_pay_amount;
$reslut = db::name('user_box_count')->where($map)->inc('out_amount', $user_pay_amount)->inc('in_amount', $user_win_gift_total_value)->inc('profit', $profit)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
} else {
$rate = round($user_win_gift_total_value / $user_pay_amount, 4);
$profit = $user_win_gift_total_value - $user_pay_amount;
$data = [];
$data['uid'] = $user_info['uid'];
$data['out_amount'] = $user_pay_amount;
$data['in_amount'] = $user_win_gift_total_value;
$data['profit'] = $profit;
$data['rate'] = $rate;
$data['box_type'] = $box_type;
$data['add_time'] = $now_time;
$data['update_time'] = $now_time;
$reslut = db::name('user_box_count')->insert($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
//礼物放入背包
$insert_user_gift_pack_log_data = [];
foreach ($user_win_gift_data as $k => $v) {
$map = [];
$map[] = ['uid', '=', $user_info['uid']];
$map[] = ['gid', '=', $v['gid']];
$data = [];
$data['gid'] = $v['gid'];
$data['update_time'] = $now_time;
$reslut = db::name('user_gift_pack')->where($map)->inc('num', $v['open_num'])->inc('total_num', $v['open_num'])->update($data);
if (!$reslut) {
$data = [];
$data['uid'] = $user_info['uid'];
$data['gid'] = $v['gid'];
$data['total_num'] = $v['open_num'];
$data['num'] = $v['open_num'];
$data['is_tester'] = $user_info['is_tester'];
$data['add_time'] = $now_time;
$data['update_time'] = $now_time;
$reslut = db::name('user_gift_pack')->insert($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
$data = [];
$data['uid'] = $user_info['uid'];
$data['type'] = 2;
$data['bl_id'] = $v['bl_id'];
$data['gid'] = $v['gid'];
$data['gift_price'] = $gift_list_data[$v['gid']]['gift_price'];
$data['change_num'] = $v['open_num'];
$data['total_gift_price'] = $gift_list_data[$v['gid']]['gift_price'] * $v['open_num'];
$data['after_num'] = 0;
$data['is_tester'] = $user_info['is_tester'];
$data['remarks'] = "开盲盒获得";
$data['add_time'] = $now_time;
$data['update_time'] = $now_time;
$insert_user_gift_pack_log_data[] = $data;
}
if (!empty($insert_user_gift_pack_log_data)) {
$reslut = db::name('user_gift_pack_log')->insertAll($insert_user_gift_pack_log_data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
// dump($user_win_gift_data);exit;
//礼物信息 $user_win_gift_data 扣除背包礼物
$gift_total_price = 0;
foreach($user_win_gift_data as $a => $b){
//扣除背包礼物
$reslut = model('UserGiftPack')->change_user_gift_pack($uid, $b['gid'], -$b['open_num'], 3, '开盲盒,背包打赏礼物');
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
$gift_total_price += $b['open_num'] * $b['gift_price'];
}
//赠送礼物增加财富值 贡献值
$reslut = model('User')->change_user_contribution_value($uid, $gift_total_price);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试1', 'data' => null];
}
//赠送者增加房间魅力值
$reslut = model('User')->change_user_room_contribution_value($uid, $rid, $gift_total_price);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试4', 'data' => null];
}
//增加房间热度值
$when = [];
$when[] = ['rid', '=', $rid];
db::name('room')->where($when)->setInc('hot_value', $gift_total_price);
// db::name('room')->where($when)->setInc('today_hot_value', $gift_total_price);
//礼物是否参加PK计算
//判断该礼物是否参加PK
$map = [];
$map[] = ['rid', '=', $rid];
$map[] = ['is_close', '=', 1];
$map[] = ['over_time', '>', time()];
$room_pk_info = db::name('room_pk')->where($map)->find();
$total_total_gift_price = 0;
foreach ($user_win_gift_price_by_uid as $k => $v) {
$this_gift_total_price = $v['gift_price'] * $v['num'];
$total_total_gift_price += $this_gift_total_price;
$this_room_owner_profit = $this_gift_total_price * $room_owner_info['room_owner_commission']; //房主厅主收益
$this_receiver_profit = $this_gift_total_price * 0.7;//接收人收益
$this_platform_profit = $this_gift_total_price - $this_room_owner_profit - $this_receiver_profit;//平台收益
$data = [];
$data['uid'] = $uid;
$data['rid'] = $rid;
$data['guild_id'] = $guild_id;
$data['room_uid'] = $room_info['room_owner_uid'];
$data['receive_uid'] = $v['uid'];
$data['gid'] = $v['gid'];
$data['gift_name'] = $v['gift_name'];
$data['gift_price'] = $v['gift_price'];
$data['gift_num'] = $v['num'];
$data['gift_total_price'] = $this_gift_total_price;
$data['platform_profit'] = $this_platform_profit;
$data['receiver_profit'] = $this_receiver_profit;
$data['room_owner_profit'] = $this_room_owner_profit;
$data['gift_from_type'] = 2; //背包
$data['is_tester'] = $user_info['is_tester'];
// $data['micro_id'] = $micro_id;
// $data['room_user_profit'] = $room_user_profit;
$data['gift_level_type'] = 0;
$data['add_time'] = $now_time;
$data['update_time'] = $now_time;
// $data['room_type_tid'] = $room_type_tid;
$sid = db::name('user_send_gift')->insertGetId($data);
if (empty($sid)) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => "请重试3", 'data' => null];
}
//增加厅主收益记录
if ($this_room_owner_profit > 0) {
// $change_value = $this_room_owner_profit / $config['exchange_rate'];
$change_value = $this_room_owner_profit;
$reslut = model('admin/User')->change_user_money_by_uid($room_info['room_owner_uid'], $change_value, 1, 7, "打赏厅主流水收益", $uid, $sid, $rid);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
//增加用户厅主收益统计
$reslut = model('User')->change_user_room_profit($room_info['room_owner_uid'],$rid, $change_value);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
}
//礼物接收者收益
if ($this_receiver_profit > 0) {
// $change_value = $this_receiver_profit / $config['exchange_rate'];
$change_value = $this_receiver_profit;
$reslut = model('admin/User')->change_user_money_by_uid($v['uid'], $change_value, 1, 6, "礼物收入", $uid, $sid, $rid);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
}
// if($uid == $room_owner_uid && $v['uid'] == $room_owner_uid) {
// //增加厅主收益记录
// if ($this_room_owner_profit > 0) {
// // $change_value = $room_owner_profit / $config['exchange_rate'];
// $change_value = round($this_room_owner_profit, 2);
// $reslut = model('admin/User')->change_user_money_by_uid($room_info['room_owner_uid'], $change_value, 2, 41, "自刷礼物获得钻石(房主)", $uid, $sid, $rid);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// //增加用户厅主收益统计
// $reslut = model('User')->change_user_room_profit_integral($room_info['room_owner_uid'],$rid, $change_value);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// }
// } else {
// //增加厅主收益记录
// if ($this_room_owner_profit > 0) {
// $change_value = $this_room_owner_profit / $config['exchange_rate'];
// $reslut = model('admin/User')->change_user_money_by_uid($room_info['room_owner_uid'], $change_value, 1, 7, "打赏厅主流水收益", $uid, $sid, $rid);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// //增加用户厅主收益统计
// $reslut = model('User')->change_user_room_profit($room_info['room_owner_uid'],$rid, $change_value);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// }
// }
// if($uid == $v['uid']) {
// if ($this_receiver_profit > 0) {
// // $change_value = $receiver_profit / $config['exchange_rate'];
// $change_value = round($this_receiver_profit, 2);
// $reslut = model('admin/User')->change_user_money_by_uid($v['uid'], $change_value, 2, 42, "自刷礼物获得钻石", $uid, $sid, $rid);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// }
// } else {
// //礼物接收者收益
// if ($this_receiver_profit > 0) {
// $change_value = $this_receiver_profit / $config['exchange_rate'];
// $reslut = model('admin/User')->change_user_money_by_uid($v['uid'], $change_value, 1, 6, "礼物收入", $uid, $sid, $rid);
// if ($reslut['code'] == 201) {
// Db::rollback();
// return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
// }
// }
// }
//收礼物增加魅力值
$reslut = model('User')->change_user_charm_value($v['uid'], $this_gift_total_price);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试4', 'data' => null];
}
//接受者增加房间魅力值
$reslut = model('User')->change_user_room_charm_value($v['uid'], $rid, $this_gift_total_price);
if ($reslut['code'] == 201) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
$this->file_unlock($fh);
return ['code' => 201, 'msg' => '请重试4', 'data' => null];
}
}
//公会流水
if($guild_id > 0 && $total_total_gift_price > 0) {
$result = model('GuildWeekAmount')->add_data($guild_id, $total_total_gift_price, $room_info['room_owner_uid']);
if($result['code'] == 201) {
Db::rollback();
return ['code' => 201, 'msg' => '请重试5', 'data' => null];
}
}
// $user_list = [];
$user_list = [];
foreach($recived_user_info as $val) {
$user_list[$val['uid']] = $val;
}
// dump($user_list);die;
// 提交事务
Db::commit();
$this->file_unlock($fh);
if($is_on_micro == 1) {
model('Room')->push_room_micro_data($rid); //推送最新房间麦位信息
}
//新增
$charm_user_id = $recived_uid_arr;
$charm_user_id[] = $uid;
//推送赠送礼物信息
$room_push_data = [];
$server_push_data = [];
// dump($user_list);die;
$send_user_info = [
'uid' => $uid,
'nick_name' => mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8'),
'head_pic' => localpath_to_netpath($user_info['head_pic']),
];
$box_name = db::name('box_type')->where('tid',$tid)->value('show_name');
foreach($user_win_gift_price_by_uid as $key => $val) {
$key_arr = explode('_', $key);
$ls_data = [];
$ls_data['send_user_info'] = $send_user_info;
$receive_uid = $key_arr[0];
$box_gid = $key_arr[1];
$ls_data['recived_user_info']['uid'] = $val['uid'];
$ls_data['recived_user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_list[$val['uid']]['base64_nick_name']), 'UTF-8', 'UTF-8');
$ls_data['recived_user_info']['head_pic'] = localpath_to_netpath($user_list[$val['uid']]['head_pic']);
$ls_data['gift_name'] = $val['gift_name'];
$ls_data['play_image'] = $val['play_image'];
$ls_data['base_image'] = $val['base_image'];
$ls_data['gift_type'] = $val['gift_type'];
$ls_data['gift_price'] = $val['gift_price'];
$ls_data['blind_box_image'] = localpath_to_netpath($val['base_image']);
$ls_data['num'] = $val['num'];
$ls_data['is_public_screen'] = $val['is_public_screen'];
$ls_data['is_public_server'] = $val['is_public_server'];
$ls_data['is_blind_box'] = 1;
$ls_data['is_blind_gift'] = 1;
$ls_data['blind_box_name'] = $box_name;
$ls_data['is_special_gift'] = $val['is_special'];
$ls_data['rid'] = 0;
if($ls_data['is_special_gift'] == 1) {
$ls_data['rid'] = $rid;
}
if ($ls_data['is_public_server'] == 1) {
$server_push_data[] = $ls_data;
}
$room_push_data[] = $ls_data;
}
if (!empty($server_push_data)) {
$pust_data = [];
$pust_data['code'] = 306;
$pust_data['msg'] = '打赏礼物';
// $pust_data['data'] = $server_push_data;
$pust_data['data']['room_info']['rid'] = $room_info['rid'];
$pust_data['data']['room_info']['room_name'] = mb_convert_encoding(base64_decode($room_info['base64_room_name']), 'UTF-8', 'UTF-8');
$pust_data['data']['gift_list'] = $server_push_data;
model('api/WebSocketPush')->send_to_all($pust_data);
}
if (!empty($room_push_data)) {
$pust_data = [];
$pust_data['code'] = 302;
$pust_data['msg'] = '打赏礼物';
$pust_data['data'] = $room_push_data;
model('api/WebSocketPush')->send_to_group($room_info['rid'], $pust_data);
}
return ['code' => 200, 'msg' => "打赏成功", 'data' => $room_push_data];
} catch (\Exception $e) {
// 回滚事务
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
Db::rollback();
$this->file_unlock($fh);
dump($e);
return ['code' => 201, 'msg' => '开启失败', 'data' => null];
}
}
//返还用户抽中礼物到奖池
private function redis_gift_data_rollback($redis, $keyname, $user_gift_id_list)
{
$insert_data = [];
foreach ($user_gift_id_list as $k => $v) {
$insert_data[] = $v['bl_id'] . '-' . $v['gid'];
}
if (!empty($insert_data)) {
array_unshift($insert_data, $keyname);
//右侧取 右侧插入
call_user_func_array([$redis, 'lPush'], $insert_data);
}
return ['code' => 200, 'msg' => '返还成功', 'data' => null];
}
//喵咪盲盒礼物
public function get_cate_blind_box_gift()
{
$gid_arr = [203, 204, 205];
$gift_image_list = Db::name('gift')->whereIn('gid', $gid_arr)->column('base_image', 'gid');
$box_open_price = Db::name('box_type')->whereIn('tid', [104, 105, 106])->column('open_price', 'tid');
$blind_box_gift_list = Db::name('box_config')->alias('a')
->join('yy_gift b', 'a.gid = b.gid')
->field('a.tid,b.gift_name,b.base_image,b.gift_price')
->where('a.tid', 'in', [104,105,106])
->order('b.gift_price', 'asc')
->select();
// dump($blind_box_gift_list);die;
$one_cate_blind_box_gift = $two_cate_blind_box_gift = $three_cate_blind_box_gift = [];
foreach($blind_box_gift_list as $val){
$temp = $val;
$temp['base_image'] = localpath_to_netpath($val['base_image']);
unset($temp['tid']);
if($val['tid'] == 106) {
$one_cate_blind_box_gift[] = $temp;
}
if($val['tid'] == 105) {
$two_cate_blind_box_gift[] = $temp;
}
if($val['tid'] == 104) {
$three_cate_blind_box_gift[] = $temp;
}
}
$one_cate_blind_box = [
'open_price' => $box_open_price[106],
'base_image' => localpath_to_netpath($gift_image_list[205]),
'max_gift' => $this->get_max_gift($one_cate_blind_box_gift),
'gift_list' => $one_cate_blind_box_gift,
];
$two_cate_blind_box = [
'open_price' => $box_open_price[105],
'base_image' => localpath_to_netpath($gift_image_list[204]),
'max_gift' => $this->get_max_gift($two_cate_blind_box_gift),
'gift_list' => $two_cate_blind_box_gift,
];
$three_cate_blind_box = [
'open_price' => $box_open_price[104],
'base_image' => localpath_to_netpath($gift_image_list[203]),
'max_gift' => $this->get_max_gift($three_cate_blind_box_gift),
'gift_list' => $three_cate_blind_box_gift,
];
$data = [
'one_cate_blind_box' => $one_cate_blind_box,
'two_cate_blind_box' => $two_cate_blind_box,
'three_cate_blind_box' => $three_cate_blind_box,
];
return ['code' => 200, 'msg' => '获取数据成功', 'data' => $data];
}
//获取最大礼物信息
private function get_max_gift($gift_list)
{
$big_gift_info = ['gift_name' => '', 'gift_price' => 0];
if($gift_list) {
$big_gift_info['gift_name'] = $gift_list[count($gift_list) -1]['gift_name'];
$big_gift_info['gift_price'] = $gift_list[count($gift_list) -1]['gift_price'];
}
return $big_gift_info;
}
//获取盲盒礼物
public function get_cate_blind_box_gift_by_gid($gid)
{
$tid = 0;
if($gid == 203) {
$tid = 104;
}elseif($gid == 204) {
$tid = 105;
}elseif($gid == 205) {
$tid = 106;
}
$blind_box_gift_list = Db::name('box_config')->alias('a')
->join('yy_gift b', 'a.gid = b.gid')
->field('b.base_image')
->where('a.tid', '=', $tid)
->order('b.gift_price', 'asc')
->select();
foreach ($blind_box_gift_list as &$val){
$val['base_image'] = localpath_to_netpath($val['base_image']);
}
return ['code' => 200, 'msg' => '获取数据成功', 'data' => $blind_box_gift_list];
}
}