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

2054 lines
96 KiB
PHP
Raw Permalink Normal View History

2025-08-11 10:22:05 +08:00
<?php
namespace app\api\model;
use think\Model;
use think\db;
class Box extends Model
{
//开奖池
public function open_box($uid, $rid, $type, $open_num){
$config = get_system_config();
//宝箱是否关闭
if($config['open_box_status'] != 1){
return ['code' => 201, 'msg' => '功能关闭中', 'data' => null];
}
$user_info = db::name('user')->find($uid);
$device = $config['open_person_box_device'];
$device = trim($device,',');
$device_list = explode(',',$device);
$uid_data = $config['open_person_box_uid'];
$uid_data = trim($uid_data,',');
$uid_list = explode(',',$uid_data);
if($user_info['is_tester'] == 2){//测试号
$data = $this->open_common_box($uid,$rid,$type,$open_num);
return $data;
}else if(in_array($user_info['last_login_device'],$device_list)){//进入个池的设备号
$data = $this->open_person_box($uid,$rid,$type,$open_num);
return $data;
}else if(in_array($uid,$uid_list)){//进入个池的uid
$data = $this->open_person_box($uid,$rid,$type,$open_num);
return $data;
}else{//公池及公池对应的个池
if($type == 3){//鬼修
$data = $this->open_common_box($uid,$rid,$type,$open_num);
return $data;
}else if($type == 1){//修魔池 open_person_common_box
$data = $this->open_person_common_box($uid,$rid,$type,$open_num);
return $data;
}else{//修真池
$data = $this->open_person_common_box($uid,$rid,$type,$open_num);
return $data;
}
}
}
//公池
public function open_common_box($uid, $rid, $type, $open_num)
{
$open_num = input('open_num', 0);
if (!in_array($open_num, [1, 10, 100])) {
return ['code' => 201, 'msg' => '开奖次数参数非法', 'data' => null];
}
$config = get_system_config();
$map = [];
$map['rid'] = $rid;
$map['is_delete'] = 1;
$room_info = db::name('room')->field('rid')->where($map)->find();
if (empty($room_info)) {
return ['code' => 201, 'msg' => '房间信息不存在', 'data' => null];
}
$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 == 1) {//地阶魔法
// $gold_tid = [1,3,5,7,9,11,13];
// $map = [];
// $map[] = ['tid','in',$gold_tid];
// $box_type_lists = db::name('box_type')->where($map)->order('consume desc')->select();
// foreach ($box_type_lists as $a => $b) {
// if($user_info['gold_consume'] >= $b['consume']){
// $tid = $b['tid'];
// break;
// }
// }
$tid = $user_info['gold_box'];
} else if($type == 2) {//天阶魔法
// $drill_tid = [2,4,6,8,10,12,14];
// $map = [];
// $map[] = ['tid','in',$drill_tid];
// $box_type_lists = db::name('box_type')->where($map)->order('consume desc')->select();
// foreach ($box_type_lists as $a => $b) {
// if($user_info['drill_consume'] >= $b['consume']){
// $tid = $b['tid'];
// break;
// }
// }
$tid = $user_info['drill_box'];
} else {
$silver_tid = [33,34,35];
$map = [];
$map[] = ['tid','in',$silver_tid];
$box_type_lists = db::name('box_type')->where($map)->order('consume desc')->select();
foreach ($box_type_lists as $a => $b) {
if($user_info['silver_consume'] >= $b['consume']){
$tid = $b['tid'];
break;
}
}
}
//判断是否是虚拟用户
if($user_info['is_tester']==2){
if($type == 1){
$tid = 15;
}else if($type == 2){
$tid = 16;
}else{
$tid = 36;
}
}
//该奖池是否配置礼物
$map = [];
$map[] = ['tid', '=', $tid];
$is_box_config = db('box_config')->where($map)->select();
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];
}
$user_pay_amount = $open_num * $box_type_data[$tid]['open_price'];
$keyname = "box:list:tid:".$tid;
if ($keyname == "box:list:tid:") {
return ['code' => 201, 'msg' => '开奖类型非法参数', 'data' => null];
}
// 启动事务
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)->find();
//插入用户必中
$need_open_num = $open_num;
if (!empty($box_give_gift_info)) {
$data = [];
$data['bl_id'] = 0;
$data['gid'] = $box_give_gift_info['gid'];
$user_gift_id_list[] = $data;
$need_open_num--; //待取礼物总数-1
}
//获取待核销必中礼物数据
$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 asc')->column('id', 'gid'); //每种礼物只核销第一个
//获取待开奖池礼物
for ($i = 0; $i < $need_open_num; $i++) {
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
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]);
$data = [];
$data['bl_id'] = $bl_id;
$data['gid'] = $gid;
$user_gift_id_redis_list[] = $data;
//更新对应数据
//补偿表 更新
$map = [];
$map[] = ['id', '=', $id];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['deduction_status', '=', 1];
$data = [];
$data['deduction_bl_id'] = $bl_id;
$data['deduction_status'] = 2;
$data['deduction_time'] = time();
$data['update_time'] = time();
$reslut = db::name('box_give_gift')->where($map)->order('id asc')->limit(1)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//开宝箱记录表更新
$map = [];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['num', '=', 1];
$map[] = ['bl_id', '=', 0];
$data = [];
$data['bl_id'] = $bl_id;
$data['update_time'] = time();
$reslut = db::name('user_box_log')->where($map)->order('aid asc')->limit(1)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//重新从队列获取一个礼物信息
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
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;
$user_gift_id_redis_list[] = $data;
$user_gift_id_list[] = $data;
}
}
if (count($user_gift_id_list) != $open_num) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '奖池数量不足', 'data' => null];
}
//取出所有礼物数据
$gift_list = db::name('gift')->field('gid,gift_name,gift_price,base_image,play_image,gift_type')->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;
}
//整理用户抽中礼物数量
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);
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);
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'];
}
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);
return ['code' => 201, 'msg' => $reslut['msg'], 'data' => null];
}
$surplus_user_money = $user_info['integral'] - $user_pay_amount;
}else{
$surplus_user_money = $user_info['integral'];
}
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);
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);
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;
$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);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
//添加用户开宝箱统计数据
$time = strtotime(date("Y-m-d"));
$box_type = 0;
$map = [];
$map[] = ['uid', '=', $user_info['uid']];
if ($user_info['is_tester'] == 2) {
if ($type == 1) {
$map[] = ['box_type', '=', 3];
$box_type = 3;
}else if($type == 2){
$map[] = ['box_type', '=', 4];
$box_type = 4;
}else{
$map[] = ['box_type', '=', 8];
$box_type = 8;
}
} else {
if($type == 3){
$map[] = ['box_type', '=', 7];
$box_type = 7;
}else{
$map[] = ['box_type', '=', $type];
$box_type = $type;
}
}
$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);
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);
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);
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);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
//用户消费累计
if($user_info['is_tester'] != 2){
$map = [];
$map[] = ['uid', '=', $user_info['uid']];
if ($type == 1) {
$date = [];
$date['gold_box_consume'] = $user_info['gold_box_consume'] + $user_pay_amount;
$gold_box_consume = $date['gold_box_consume'];
//当前宝箱类型
$where = [];
$tids = 13;
if($tid != 13){
$tids = $tid + 2;
$gold_box_consume = $user_info['gold_consume'] + $user_pay_amount;
}
$where[] = ['tid', '=', $tids];
$box_data = db::name('box_type')->where($where)->find();
if($gold_box_consume >= $box_data['consume']){
$date['gold_box_consume'] = 0;
$box_type_rate = db::name('box_type')->where(['tid'=>$tid])->value('rate');
if($rate < $box_type_rate){
if($tid == 1){
$date['gold_box'] = 19;
}else if($tid == 3){
$date['gold_box'] = 21;
}else if($tid == 5){
$date['gold_box'] = 23;
}else if($tid == 7){
$date['gold_box'] = 25;
}else if($tid == 9){
$date['gold_box'] = 27;
}else if($tid == 11){
$date['gold_box'] = 29;
}else if($tid == 13){
$date['gold_box'] = 31;
}
}else{
$date['gold_box'] = $tids;
}
}
$reslut = db::name('user')->where($map)->inc('gold_consume', $user_pay_amount)->update($date);
} else if($type == 2){
$date = [];
$date['drill_box_consume'] = $user_info['drill_box_consume'] + $user_pay_amount;
$drill_box_consume = $date['drill_box_consume'];
//当前宝箱类型
$where = [];
$tids = 14;
if($tid != 14){
$tids = $tid + 2;
$drill_box_consume = $user_info['drill_consume'] + $user_pay_amount;
}
$where[] = ['tid', '=', $tids];
$box_data = db::name('box_type')->where($where)->find();
if($drill_box_consume >= $box_data['consume']){
$date['drill_box_consume'] = 0;
$box_type_rate = db::name('box_type')->where(['tid'=>$tid])->value('rate');
if($rate < $box_type_rate){
if($tid == 2){
$date['drill_box'] = 20;
}else if($tid == 4){
$date['drill_box'] = 22;
}else if($tid == 6){
$date['drill_box'] = 24;
}else if($tid == 8){
$date['drill_box'] = 26;
}else if($tid == 10){
$date['drill_box'] = 28;
}else if($tid == 12){
$date['drill_box'] = 30;
}else if($tid == 14){
$date['drill_box'] = 32;
}
}else{
$date['drill_box'] = $tids;
}
}
$reslut = db::name('user')->where($map)->inc('drill_consume', $user_pay_amount)->update($date);
} else {
$reslut = db::name('user')->where($map)->inc('silver_consume', $user_pay_amount)->update();
}
if(!$reslut){
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
}
// 提交事务
Db::commit();
//推送礼物信息
$push_all_gift_data = [];
$push_group_gift_data = [];
$push_all_gift_data['user_info']['uid'] = $user_info['uid'];
$push_all_gift_data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
$push_group_gift_data['user_info']['uid'] = $user_info['uid'];
$push_group_gift_data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
foreach ($user_win_gift_data as $k => &$v) {
//是否大礼物展示
$v['surprise'] = 0;
if($v['gift_price'] > $config['big_gift_price']){
$v['surprise'] = 1;
}
unset($v['bl_id']);
$v['type_name'] = $box_type_data[$tid]['show_name'];
$v['box_type'] = $tid;
if ($v['is_public_server'] == 1) {
$push_all_gift_data['gift_list'][] = $v;
}
if ($v['is_public_screen'] == 1) {
$push_group_gift_data['gift_list'][] = $v;
}
}
if (!empty($push_all_gift_data['gift_list'])) {
$push_data = [];
$push_data['code'] = 304;
$push_data['msg'] = "开宝箱全服播报数据";
$push_data['data'] = $push_all_gift_data;
model('api/WebSocketPush')->send_to_all($push_data);
}else if (!empty($push_group_gift_data['gift_list'])) {
$push_data = [];
$push_data['code'] = 303;
$push_data['msg'] = "开宝箱房间播报数据";
$push_data['data'] = $push_group_gift_data;
model('api/WebSocketPush')->send_to_group($rid, $push_data);
}
$data = [];
$data['win_gift_list'] = array_values($user_win_gift_data);
$data['user_win_gift_total_value'] = $user_win_gift_total_value;
$data['user_money'] = $surplus_user_money;
return ['code' => 200, 'msg' => '开启成功', 'data' => $data];
//推送礼物
} catch (\Exception $e) {
// 回滚事务
dump($e);
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
Db::rollback();
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_box_list($tid)
{
$map = [];
if($tid == 1){
$map[] = ['tid', 'in',[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,38,40]];
}else if($tid == 2){
$map[] = ['tid', 'in',[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,39,41]];
}else{
$map[] = ['tid', 'in',[33,34,35,36,37]];
}
// $map[] = ['tid', '=', $tid];
$box_config_gid_arr = db::name('box_config')->where($map)->column('gid');
$map = [];
$map[] = ['gid', 'in', $box_config_gid_arr];
$gift_list = db::name('gift')->where($map)->field('gid,gift_name,gift_price,base_image,play_image')->order('gift_price asc')->cache(600)->select();
foreach ($gift_list as $k => &$v) {
$v['base_image'] = localpath_to_netpath($v['base_image']);
$v['play_image'] = localpath_to_netpath($v['play_image']);
}
return ['code' => 200, 'msg' => '获取成功', 'data' => $gift_list];
}
//获取开宝箱手气榜
public function get_box_user_sqb_rank($rid, $box_type, $page, $page_limit)
{
$page_limit = $page_limit < 30 ? $page_limit : 30;
$page = intval(($page-1)*$page_limit);
if (!empty($rid)) {
$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];
}
}
$sqb_limit_gift_price = get_system_config('sqb_limit_gift_price');
$map = [];
if (!empty($rid)) {
$map[] = ['rid', '=', $rid];
}
// if($box_type==1){
$map[] = ['tid', 'in',[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]];
// }else{
// $map[] = ['tid', 'in',[3,4]];
// }
$map[] = ['gift_price', '>', $sqb_limit_gift_price];
$user_box_log_list = db::name('user_box_log')->field('uid,gid,rid,tid,num,total_open_num,gift_price,total_price,add_time')->where($map)->limit($page, $page_limit)->order('aid desc')->select();
// dump($user_box_log_list);exit;
$map = [];
$gift_list = db::name('gift')->cache(60)->where($map)->select();
$gift_data = [];
foreach ($gift_list as $k => $v) {
$gift_data[$v['gid']]['gift_name'] = $v['gift_name'];
$gift_data[$v['gid']]['base_image'] = localpath_to_netpath($v['base_image']);
}
$uid_list = array_column($user_box_log_list, 'uid');
$map = [];
$map[] = ['uid', 'in', $uid_list];
$user_list = db::name('user')->field('uid,head_pic,base64_nick_name')->where($map)->select();
$user_list_data = [];
foreach ($user_list as $k => $v) {
$user_list_data[$v['uid']]['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8');
$user_list_data[$v['uid']]['head_pic'] = localpath_to_netpath($v['head_pic']);
}
$box_type_data = db::name('box_type')->cache(60)->column('show_name', 'tid');
foreach ($user_box_log_list as $k => &$v) {
$v['nick_name'] = $user_list_data[$v['uid']]['nick_name'];
$v['head_pic'] = $user_list_data[$v['uid']]['head_pic'];
$v['gift_name'] = $gift_data[$v['gid']]['gift_name'];
$v['base_image'] = $gift_data[$v['gid']]['base_image'];
$v['box_type_name'] = $box_type_data[$v['tid']];
}
return ['code' => 200, 'msg' => '获取成功', 'data' => $user_box_log_list];
}
//获取用户开出礼物列表
public function get_user_box_gift_list($uid, $box_type, $page, $page_limit)
{
$page = intval($page);
$page_limit = $page_limit < 30 ? $page_limit : 30;
$map = [];
// $map['a.uid'] = $uid;
$map[]=['a.uid','=',$uid];
// if($box_type==1){
$map[] = ['a.tid', 'in',[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37]];
// }else{
// $map[] = ['a.tid', 'in',[3,4]];
// }
$model = Db::name('user_box_log')->alias('a')->join('yy_gift b', 'a.gid = b.gid');
$model = $model->where($map);
$list = $model->field('a.num,b.gid,b.gift_name,b.base_image,a.add_time')->order('a.aid desc')->page($page, $page_limit)->select();
foreach ($list as $k => &$v) {
$v['base_image'] = localpath_to_netpath($v['base_image']);
}
return ['code' => 200, 'msg' => '获取成功', 'data' => $list];
}
//获取宝箱公告
public function get_box_note()
{
$box_note = get_system_config('box_note');
return ['code' => 200, 'msg' => '获取成功', 'data' => $box_note];
}
//宝箱单价
public function box_type_price(){
$data = [];
$map = [];
$map[] = ['tid','=','1'];
$data['gold_price'] = db::name('box_type')->where($map)->value('open_price');
$map = [];
$map[] = ['tid','=','2'];
$data['drill_price'] = db::name('box_type')->where($map)->value('open_price');
$map = [];
$map[] = ['tid','=','33'];
$data['silver_price'] = db::name('box_type')->where($map)->value('open_price');
return ['code' => 200, 'msg'=> '获取成功','data'=>$data];
}
//个人奖池
public function open_person_box($uid, $rid, $type, $open_num)
{
$open_num = input('open_num', 0);
if (!in_array($open_num, [1, 10, 100])) {
return ['code' => 201, 'msg' => '开奖次数参数非法', 'data' => null];
}
$config = get_system_config();
$gold_price = $config['box_unit_price'];
$drill_price = $config['box_drill_price'];
$silver_price = $config['box_silver_price'];
$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();
if ($type == 1) {
$user_pay_amount = $open_num * $gold_price;
$tid = 17;
} else if ($type == 2) {
$user_pay_amount = $open_num * $drill_price;
$tid = 18;
} else {
$user_pay_amount = $open_num * $silver_price;
$tid = 37;
}
$user_info = db::name('user')->find($uid); //获取用户信息
if(!$user_info){
return ['code' => 201, 'msg' => '用户信息错误', 'data' => null];
}
//个池数据是否充足
$redis = connectionRedis();
$gift_price_data = db::name('gift')->column('gift_price', 'gid'); //礼物价值
$map = [];
$map[] = ['tid', '=', $tid];
$box_config_lists = Db::name('box_config')->where($map)->select();
if(empty($box_config_lists)){
return ['code' => 201, 'msg' => '', 'data' => null];
}
$keyname = "box:list:tid:" . $tid . ':uid:' . $uid;
$list_len = 0;
// $del = $redis->del($keyname);
$list_len = $redis->llen($keyname);
// $list_lens = $redis->lrange($keyname,0,-1);
// dump($list_lens);
// dump($list_len);exit;
if($list_len < 1000){
$insert_data = [];
$total_gift_value = 0;
//获取0次开出的礼物
$where = [];
$where[] = ['tid', '=', $tid];
$where[] = ['open_num_obtain', '=', 0];
$box_config_zero_lists = db::name('box_config')->where($where)->select();
foreach ($box_config_zero_lists as $a => $b) {
//更新添加次数
for ($q = 0; $q < $b['num']; $q++) {
$insert_data[] = $b['gid'];
}
if (empty($gift_price_data[$b['gid']]) && $gift_price_data[$b['gid']] != 0) {
return ['code' => 201, 'msg' => '礼物id:' . $b['gid'] . '不存在', 'data' => ''];
}
$total_gift_value += $gift_price_data[$b['gid']] * $b['num'];
}
shuffle($insert_data);
//获取0次以上开出的礼物
$where = [];
$where[] = ['tid', '=', $tid];
$where[] = ['open_num_obtain', '>', 0];
$box_config_unzero_lists = db::name('box_config')->where($where)->order('open_num_obtain asc')->select();
foreach ($box_config_unzero_lists as $c => $d){
$da = [];
for ($i = 0; $i < $d['num']; $i++) {
$da[] = $d['gid'];
}
$total_gift_value += $gift_price_data[$d['gid']] * $d['num'];
$data_count = count($insert_data);
$box_open_num = $data_count - $d['open_num_obtain'];
$box_array = array_slice($insert_data,0,$d['open_num_obtain']);
$box_array_1 = array_slice($insert_data,-$box_open_num,$box_open_num);
$insert_data = array_merge($box_array_1,$da);
shuffle($insert_data);
$insert_data = array_merge($box_array,$insert_data);
}
$map = [];
$map[] = ['tid', '=', $tid];
$map[] = ['uid', '=', $uid];
$box_person_log = db::name('box_person_log')->where($map)->field('bl_id,total_num,total_gift_value')->find();
//插入期日志表
if(!empty($box_person_log)){
$bl_id = $box_person_log['bl_id'];
$data = [];
$data['total_num'] = count($insert_data) + $box_person_log['total_num'];
$data['total_gift_value'] = $total_gift_value + $box_person_log['total_gift_value'];
$data['update_time'] = time();
$reslut = db::name('box_person_log')->where(['bl_id'=>$box_person_log['bl_id']])->inc('term',1)->update($data);
if(!$reslut){
return ['code' => 201, 'msg' => '', 'data' => null];
}
}else{
$data = [];
$data['tid'] = $tid;
$data['uid'] = $uid;
$data['total_num'] = count($insert_data);
$data['total_gift_value'] = $total_gift_value;
$data['config_text'] = json_encode($box_config_lists);
$data['add_time'] = time();
$data['update_time'] = time();
$bl_id = db::name('box_person_log')->insertGetId($data);
if(!$bl_id){
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
foreach ($insert_data as $p => $q) {
$insert_data[$p] = $bl_id . '-' . $insert_data[$p];
}
// shuffle($insert_data);
array_unshift($insert_data, $keyname);
call_user_func_array([$redis, 'rPush'], $insert_data);
}
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)->find();
//插入用户必中
$need_open_num = $open_num;
if (!empty($box_give_gift_info)) {
$data = [];
$data['bl_id'] = 0;
$data['gid'] = $box_give_gift_info['gid'];
$user_gift_id_list[] = $data;
$need_open_num--; //待取礼物总数-1
}
//获取待核销必中礼物数据
$map = [];
$map[] = ['uid', '=', $uid];
$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 asc')->column('id', 'gid'); //每种礼物只核销第一个
//获取待开奖池礼物
for ($i = 0; $i < $need_open_num; $i++) {
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_list);
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]);
$data = [];
$data['bl_id'] = $bl_id;
$data['gid'] = $gid;
$user_gift_id_redis_list[] = $data;
//更新对应数据
//补偿表 更新
$map = [];
$map[] = ['id', '=', $id];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['deduction_status', '=', 1];
$data = [];
$data['deduction_bl_id'] = $bl_id;
$data['deduction_status'] = 2;
$data['deduction_time'] = time();
$data['update_time'] = time();
$reslut = db::name('box_give_gift')->where($map)->order('id asc')->limit(1)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//开宝箱记录表更新
$map = [];
$map[] = ['uid', '=', $uid];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['num', '=', 1];
$map[] = ['bl_id', '=', 0];
$data = [];
$data['bl_id'] = $bl_id;
$data['update_time'] = time();
$reslut = db::name('user_box_log')->where($map)->order('aid asc')->limit(1)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试', 'data' => null];
}
//重新从队列获取一个礼物信息
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
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;
$user_gift_id_list[] = $data;
}
}
if (count($user_gift_id_list) != $open_num) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '奖池数量不足', 'data' => null];
}
//取出所有礼物数据
$gift_list = db::name('gift')->field('gid,gift_name,gift_price,base_image,play_image,gift_type')->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;
}
//整理用户抽中礼物数量
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);
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);
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'];
$user_win_gift_total_value += $gift_list_data[$v['gid']]['gift_price'];
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'];
}
}
//扣除账户积分
$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);
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_person_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);
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);
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
//添加用户开宝箱日志
$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;
$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);
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
//添加用户开宝箱数据统计
$time = strtotime(date("Y-m-d"));
$map = [];
$map[] = ['uid', '=', $user_info['uid']];
if($type == 1){
$box_type = 5;
} else if($type == 2){
$box_type = 6;
} else {
$box_type = 9;
}
$map[] = ['box_type', '=', $box_type];
$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);
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['box_type'] = $box_type;
$data['out_amount'] = $user_pay_amount;
$data['in_amount'] = $user_win_gift_total_value;
$data['profit'] = $profit;
$data['rate'] = $rate;
$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);
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);
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);
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
Db::commit();
//推送礼物信息
$push_all_gift_data = [];
$push_group_gift_data = [];
$push_all_gift_data['user_info']['uid'] = $user_info['uid'];
$push_all_gift_data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
$push_group_gift_data['user_info']['uid'] = $user_info['uid'];
$push_group_gift_data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
foreach ($user_win_gift_data as $k => &$v) {
$v['surprise'] = 0;
if($v['gift_price'] > $config['big_gift_price']){
$v['surprise'] = 1;
}
unset($v['id']);
if($type == 1){
$v['type_name'] = db::name('box_type')->where('tid',1)->value('show_name');
}else{
$v['type_name'] = db::name('box_type')->where('tid',2)->value('show_name');
}
$v['box_type'] = $type;
if ($v['is_public_server'] == 1) {
$push_all_gift_data['gift_list'][] = $v;
}
if ($v['is_public_screen'] == 1) {
$push_group_gift_data['gift_list'][] = $v;
}
}
if (!empty($push_all_gift_data['gift_list'])) {
$push_data = [];
$push_data['code'] = 304;
$push_data['msg'] = "开宝箱全服播报数据";
$push_data['data'] = $push_all_gift_data;
model('api/WebSocketPush')->send_to_all($push_data);
}else if (!empty($push_group_gift_data['gift_list'])) {
$push_data = [];
$push_data['code'] = 303;
$push_data['msg'] = "开宝箱房间播报数据";
$push_data['data'] = $push_group_gift_data;
model('api/WebSocketPush')->send_to_group($rid, $push_data);
}
$data = [];
$data['win_gift_list'] = array_values($user_win_gift_data);
$data['user_win_gift_total_value'] = $user_win_gift_total_value;
$data['user_money'] = $surplus_user_money;
return ['code' => 200, 'msg' => '开奖成功', 'data' => $data];
} catch (\Exception $e) {
//回滚事务
// dump($e);
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
Db::rollback();
return ['code' => 201, 'msg' => '开奖失败', 'data' => null];
}
}
//公池对应的个人奖池
public function open_person_common_box($uid, $rid, $type, $open_num)
{
$open_num = input('open_num', 0);
if (!in_array($open_num, [1, 10, 100])) {
return ['code' => 201, 'msg' => '开奖次数参数非法', 'data' => null];
}
$config = get_system_config();
$gold_price = $config['box_unit_price'];
$drill_price = $config['box_drill_price'];
$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();
$user_info = db::name('user')->find($uid); //获取用户信息
if(!$user_info){
return ['code' => 201, 'msg' => '用户信息错误', 'data' => null];
}
if ($type == 1) {
$user_pay_amount = $open_num * $gold_price;
$tid = $tids = $user_info['gold_box'];
if($tid == 17){
$tid = 19;
}
if($tid == 19){
$accumulate_tid = 38;
}else{
$accumulate_tid = 40;
}
} else {
$user_pay_amount = $open_num * $drill_price;
$tid = $tids = $user_info['drill_box'];
if($tid == 18){
$tid = 20;
}
if($tid == 20){
$accumulate_tid = 39;
}else{
$accumulate_tid = 41;
}
}
//个池数据是否充足
$redis = connectionRedis();
$gift_price_data = db::name('gift')->column('gift_price', 'gid'); //礼物价值
$map = [];
$map[] = ['tid', '=', $tid];
$box_config_lists = Db::name('box_config')->where($map)->select();
if(empty($box_config_lists)){
return ['code' => 201, 'msg' => '', 'data' => null];
}
$keyname = "box:list:type:" . $type . ':uid:' . $uid;
$list_len = 0;
$list_len = $redis->llen($keyname);
// $redis->blpop($keyname, 2);
// $list_lens = $redis->lrange($keyname,0,-1);
// $redis->del($keyname);
// dump($list_lens);exit;
if($list_len < 120){
$insert_data = [];
$total_gift_value = 0;
if($type == 1){
if($tid != 31){
$tids += 2;
}
}else{
if($tid != 32){
$tids += 2;
}
}
//获取0次开出的礼物
$where = [];
$where[] = ['tid', '=', $tids];
$box_config_zero_list = db::name('box_config')->where($where)->select();
$where[] = ['open_num_obtain', '=', 0];
$box_config_zero_lists = db::name('box_config')->where($where)->select();
if(empty($box_config_zero_lists)){
return ['code' => 201, 'msg' => '4', 'data' => null];
}
foreach ($box_config_zero_lists as $a => $b) {
//更新添加次数
for ($q = 0; $q < $b['num']; $q++) {
$insert_data[] = $b['gid'];
}
if (empty($gift_price_data[$b['gid']]) && $gift_price_data[$b['gid']] != 0) {
return ['code' => 201, 'msg' => '礼物id:' . $b['gid'] . '不存在', 'data' => ''];
}
$total_gift_value += $gift_price_data[$b['gid']] * $b['num'];
}
shuffle($insert_data);
//获取0次以上开出的礼物
$where = [];
$where[] = ['tid', '=', $tids];
$where[] = ['open_num_obtain', '>', 0];
$box_config_unzero_lists = db::name('box_config')->where($where)->order('open_num_obtain asc')->select();
foreach ($box_config_unzero_lists as $c => $d){
$da = [];
for ($i = 0; $i < $d['num']; $i++) {
$da[] = $d['gid'];
}
$total_gift_value += $gift_price_data[$d['gid']] * $d['num'];
$data_count = count($insert_data);
$box_open_num = $data_count - $d['open_num_obtain'];
$box_array = array_slice($insert_data,0,$d['open_num_obtain']);
$box_array_1 = array_slice($insert_data,-$box_open_num,$box_open_num);
$insert_data = array_merge($box_array_1,$da);
shuffle($insert_data);
$insert_data = array_merge($box_array,$insert_data);
}
$map = [];
$map[] = ['tid', '=', $tids];
$map[] = ['uid', '=', $uid];
$map[] = ['del_status', '=', 1];
$box_person_log = db::name('box_person_log')->where($map)->field('bl_id,total_num,total_gift_value')->find();
//插入期日志表
if(!empty($box_person_log)){
$bl_id = $box_person_log['bl_id'];
$data = [];
$data['total_num'] = count($insert_data) + $box_person_log['total_num'];
$data['total_gift_value'] = $total_gift_value + $box_person_log['total_gift_value'];
$data['update_time'] = time();
$reslut = db::name('box_person_log')->where(['bl_id'=>$box_person_log['bl_id']])->inc('term',1)->update($data);
if(!$reslut){
return ['code' => 201, 'msg' => '3', 'data' => null];
}
}else{
$data = [];
$data['tid'] = $tids;
$data['uid'] = $uid;
$data['total_num'] = count($insert_data);
$data['total_gift_value'] = $total_gift_value;
$data['config_text'] = json_encode($box_config_zero_list);
$data['add_time'] = time();
$data['update_time'] = time();
$bl_id = db::name('box_person_log')->insertGetId($data);
if(!$bl_id){
return ['code' => 201, 'msg' => '2', 'data' => null];
}
}
$map = [];
$map[] = ['uid', '=', $uid];
$user_update = 1;
if($type == 1){
if($tid != 31){
$data = [];
$data['gold_box'] = $tids;
$user_update = db::name('user')->where($map)->update($data);
}
}else{
if($tid != 32){
$data = [];
$data['drill_box'] = $tids;
$user_update = db::name('user')->where($map)->update($data);
}
}
if(!$user_update){
return ['code' => 201, 'msg' => '1', 'data' => null];
}
foreach ($insert_data as $p => $q) {
$insert_data[$p] = $bl_id . '-' . $insert_data[$p];
}
// shuffle($insert_data);
array_unshift($insert_data, $keyname);
call_user_func_array([$redis, 'rPush'], $insert_data);
}
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)->find();
//插入用户必中
$need_open_num = $open_num;
if (!empty($box_give_gift_info)) { //补个池礼物
$data = [];
$data['bl_id'] = 0;
$data['gid'] = $box_give_gift_info['gid'];
$user_gift_id_list[] = $data;
$need_open_num--; //待取礼物总数-1
}else{ //补积攒池礼物
$map = [];
$map[] = ['uid', '=', $uid];
$map[] = ['tid', '=', $accumulate_tid];
$map[] = ['give_status', '=', 1];
$accumulate_box_gift_info = db::name('box_give_gift')->where($map)->find();
if(!empty($accumulate_box_gift_info)){
$data = [];
$data['bl_id'] = -1;
$data['gid'] = $accumulate_box_gift_info['gid'];
$user_gift_id_list[] = $data;
$need_open_num--;
//核销该必中礼物数据
$map = [];
$map[] = ['id', '=', $accumulate_box_gift_info['id']];
$da = [];
$da['give_status'] = 2;
$da['give_time'] = time();
$da['deduction_status'] = 2;
$da['deduction_time'] = time();
$da['update_time'] = time();
$reslut = db::name('box_give_gift')->where($map)->update($da);
if(!$reslut){
return ['code' => 201, 'msg' => '', 'data' => null];
}
//减少积攒池金额
$map = [];
$map[] = ['gid', '=', $accumulate_box_gift_info['gid']];
$give_gift_price = db::name('gift')->where($map)->value('gift_price');
$map = [];
$map[] = ['tid', '=', $accumulate_tid];
$reslut = db::name('box_type')->where($map)->setDec('consume',$give_gift_price);
if(!$reslut){
return ['code' => 201, 'msg' => '', 'data' => null];
}
$map[] = ['gid', '=', $accumulate_box_gift_info['gid']];
$reslut = db::name('box_config')->where($map)->setDec('accumulate_price',$give_gift_price);
if(!$reslut){
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
}
//获取待核销必中礼物数据
$map = [];
$map[] = ['uid', '=', $uid];
$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 asc')->column('id', 'gid'); //每种礼物只核销第一个
//积攒池礼物
$map = [];
$map[] = ['tid', '=', $accumulate_tid];
$accumulate_list = db::name('box_config')->where($map)->select();//->field('accumulate_price,accumulate_rate')
foreach ($accumulate_list as $x => $y){
if($need_open_num > 0){
$accumulate = [];
$accumulate[] = ['gid', '=', $y['gid']];
$y['gift_price'] = db::name('gift')->where($accumulate)->value('gift_price');
if($y['gift_price'] <= $y['accumulate_price']){
$data = [];
$data['bl_id'] = -1;
$data['gid'] = $y['gid'];
$user_gift_id_list[] = $data;
$need_open_num--;
//减少积攒池金额
$map = [];
$map[] = ['tid', '=', $accumulate_tid];
$reslut = db::name('box_type')->where($map)->setDec('consume',$y['gift_price']);
if(!$reslut){
return ['code' => 201, 'msg' => '', 'data' => null];
}
$map[] = ['gid', '=', $y['gid']];
$reslut = db::name('box_config')->where($map)->setDec('accumulate_price',$y['gift_price']);
if(!$reslut){
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
}
}
//获取待开奖池礼物
for ($i = 0; $i < $need_open_num; $i++) {
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
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]);
$data = [];
$data['bl_id'] = $bl_id;
$data['gid'] = $gid;
$user_gift_id_redis_list[] = $data;
//更新对应数据
//补偿表 更新
$map = [];
$map[] = ['id', '=', $id];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['deduction_status', '=', 1];
$data = [];
$data['deduction_bl_id'] = $bl_id;
$data['deduction_status'] = 2;
$data['deduction_time'] = time();
$data['update_time'] = time();
$reslut = db::name('box_give_gift')->where($map)->order('id asc')->limit(1)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试1', 'data' => null];
}
//开宝箱记录表更新
$map = [];
$map[] = ['uid', '=', $uid];
$map[] = ['tid', '=', $tid];
$map[] = ['gid', '=', $gid];
$map[] = ['num', '=', 1];
$map[] = ['bl_id', '=', 0];
$data = [];
$data['bl_id'] = $bl_id;
$data['update_time'] = time();
$reslut = db::name('user_box_log')->where($map)->order('aid asc')->limit(1)->update($data);
if (!$reslut) {
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '请重试2', 'data' => null];
}
//重新从队列获取一个礼物信息
$gift_data = $redis->blpop($keyname, 2); //1s 超时
if (empty($gift_data)) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
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;
$user_gift_id_redis_list[] = $data;
$user_gift_id_list[] = $data;
}
}
if (count($user_gift_id_list) != $open_num) {
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '奖池数量不足', 'data' => null];
}
//取出所有礼物数据
$gift_list = db::name('gift')->field('gid,gift_name,gift_price,base_image,play_image,gift_type')->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;
}
//整理用户抽中礼物数量
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);
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);
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'];
if($v['bl_id'] == -1){
$user_win_gift_data[$v['gid']]['is_public_screen'] = $box_config_list_data[$v['gid']][$accumulate_tid]['is_public_screen'];
$user_win_gift_data[$v['gid']]['is_public_server'] = $box_config_list_data[$v['gid']][$accumulate_tid]['is_public_server'];
}else if($v['bl_id'] == 0){
$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'];
}else{
$map = [];
$map[] = ['bl_id', '=', $v['bl_id']];
$bl_tid = db::name('box_person_log')->where($map)->value('tid');
$user_win_gift_data[$v['gid']]['is_public_screen'] = $box_config_list_data[$v['gid']][$bl_tid]['is_public_screen'];
$user_win_gift_data[$v['gid']]['is_public_server'] = $box_config_list_data[$v['gid']][$bl_tid]['is_public_server'];
}
// $user_win_gift_total_value += $gift_list_data[$v['gid']]['gift_price'];
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'];
}
//扣除账户积分
$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);
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_person_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);
return ['code' => 201, 'msg' => '请重试1', '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);
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
//添加用户开宝箱日志
$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) {
if($k == 0 || $k == -1){
$map = [];
$map[] = ['tid', '=', $tid];
$map[] = ['uid', '=', $uid];
$map[] = ['del_status', '=', 1];
$k = db::name('box_person_log')->where($map)->value('bl_id');
}
//计入积攒池金额
$map = [];
$map[] = ['bl_id', '=', $k];
$box_tid = db::name('box_person_log')->where($map)->value('tid');
$gold_box_tid = [21,23,25,27,29,31];
$drill_box_tid = [22,24,26,28,30,32];
if($box_tid == 19){
$accumulate_box_tid = 38;
}else if($box_tid == 20){
$accumulate_box_tid = 39;
}else if(in_array($box_tid, $gold_box_tid)){
$accumulate_box_tid = 40;
}else if(in_array($box_tid, $drill_box_tid)){
$accumulate_box_tid = 41;
}else{
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '', 'data' => null];
}
$map = [];
$map[] = ['tid', '=', $accumulate_box_tid];
$accumulate_rate = db::name('box_type')->where($map)->value('rate');
//用户砸蛋日志
$accumulate_price = 0;
$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;
if($n['bl_id'] == 0){
$data['tid'] = $tid;
}else if($n['bl_id'] == -1){
$data['tid'] = $accumulate_tid;
}else{
$data['tid'] = db::name('box_person_log')->where(['bl_id'=>$n['bl_id']])->value('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;
$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);
return ['code' => 201, 'msg' => '', 'data' => null];
}
//计入积攒池金额
$accumulate_price = $user_pay_amount * $accumulate_rate;
$map = [];
$map[] = ['tid', '=', $accumulate_box_tid];
$da = [];
$da['update_time'] = time();
$reslut = db::name('box_type')->where($map)->inc('consume', $accumulate_price)->update($da);
if(!$reslut){
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '', 'data' => null];
}
//积攒池金额分发该奖池中的各个礼物
$accumulate_box_config = db::name('box_config')->where($map)->select();
foreach ($accumulate_box_config as $i => $j){
$where = [];
$where[] = ['bid', '=', $j['bid']];
$dat = [];
$dat['update_time'] = time();
$accumulate_gift_price = $accumulate_price * $j['accumulate_rate'];
$reslut = db::name('box_config')->where($where)->inc('accumulate_price', $accumulate_gift_price)->update($dat);
if(!$reslut){
Db::rollback();
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
}
//添加用户开宝箱数据统计
$time = strtotime(date("Y-m-d"));
$map = [];
$map[] = ['uid', '=', $user_info['uid']];
if($type == 1){
$box_type = 1;
} else {
$box_type = 2;
}
$map[] = ['box_type', '=', $box_type];
$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);
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['box_type'] = $box_type;
$data['out_amount'] = $user_pay_amount;
$data['in_amount'] = $user_win_gift_total_value;
$data['profit'] = $profit;
$data['rate'] = $rate;
$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);
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);
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);
return ['code' => 201, 'msg' => '', 'data' => null];
}
}
Db::commit();
//推送礼物信息
$push_all_gift_data = [];
$push_group_gift_data = [];
$push_all_gift_data['user_info']['uid'] = $user_info['uid'];
$push_all_gift_data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
$push_group_gift_data['user_info']['uid'] = $user_info['uid'];
$push_group_gift_data['user_info']['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
foreach ($user_win_gift_data as $k => &$v) {
$v['surprise'] = 0;
if($v['gift_price'] > $config['big_gift_price']){
$v['surprise'] = 1;
}
unset($v['id']);
if($type == 1){
$v['type_name'] = db::name('box_type')->where('tid',1)->value('show_name');
}else{
$v['type_name'] = db::name('box_type')->where('tid',2)->value('show_name');
}
$v['box_type'] = $type;
if ($v['is_public_server'] == 1) {
$push_all_gift_data['gift_list'][] = $v;
}
if ($v['is_public_screen'] == 1) {
$push_group_gift_data['gift_list'][] = $v;
}
}
if (!empty($push_all_gift_data['gift_list'])) {
$push_data = [];
$push_data['code'] = 304;
$push_data['msg'] = "开宝箱全服播报数据";
$push_data['data'] = $push_all_gift_data;
model('api/WebSocketPush')->send_to_all($push_data);
}else if (!empty($push_group_gift_data['gift_list'])) {
$push_data = [];
$push_data['code'] = 303;
$push_data['msg'] = "开宝箱房间播报数据";
$push_data['data'] = $push_group_gift_data;
model('api/WebSocketPush')->send_to_group($rid, $push_data);
}
$data = [];
$data['win_gift_list'] = array_values($user_win_gift_data);
$data['user_win_gift_total_value'] = $user_win_gift_total_value;
$data['user_money'] = $surplus_user_money;
return ['code' => 200, 'msg' => '开奖成功', 'data' => $data];
} catch (\Exception $e) {
//回滚事务
dump($e);
$this->redis_gift_data_rollback($redis, $keyname, $user_gift_id_redis_list);
Db::rollback();
return ['code' => 201, 'msg' => '开奖失败', 'data' => null];
}
}
}