Files
mier-php/application/admin/model/Box.php
2025-08-11 10:22:05 +08:00

1047 lines
43 KiB
PHP

<?php
namespace app\admin\model;
use think\Model;
use think\Db;
class Box extends Model
{
public function get_box_type_list($page = 1, $limit = 20)
{
$map = [];
$map[] = ['del_status', '=', 1];
$list = db::name('box_type')->where($map)->order('tid', 'desc')->page($page, $limit)->select();
$data = [];
$data['count'] = db::name('box_type')->where($map)->count();
$data['list'] = $list;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function get_box_count_type_list(){
$data = [];
$data['list'] = [];
$data['list'][] = array(
'tid' => 1,
'type_name' => '奇镜寻梦'
);
$data['list'][] = array(
'tid' => 2,
'type_name' => '仙踪秘语'
);
$data['list'][] = array(
'tid' => 3,
'type_name' => '琥珀幽林'
);
// $data['list'][] = array(
// 'tid' => 4,
// 'type_name' => '重逢留声机'
// );
// $data['list'][] = array(
// 'tid' => 5,
// 'type_name' => '经典留声机'
// );
// $data['list'][] = array(
// 'tid' => 6,
// 'type_name' => '璀璨留声机'
// );
// $data['list'][] = array(
// 'tid' => 6,
// 'type_name' => '奇镜寻梦(虚拟池)'
// );
// $data['list'][] = array(
// 'tid' => 7,
// 'type_name' => '仙踪秘语(虚拟池)'
// );
// $data['list'][] = array(
// 'tid' => 8,
// 'type_name' => '琥珀幽林(虚拟池)'
// );
$data['list'][] = array(
'tid' => 101,
'type_name' => '初级盲盒'
);
$data['list'][] = array(
'tid' => 102,
'type_name' => '中级盲盒'
);
$data['list'][] = array(
'tid' => 103,
'type_name' => '高级盲盒'
);
// $data['list'][] = array(
// 'tid' => 104,
// 'type_name' => '一元盲盒'
// );
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function get_box_person_type_list(){
$map = [];
$map[] = ['del_status', '=', 1];
$map[] = ['is_person', '=', 2];
$list = db::name('box_type')->where($map)->order('tid', 'desc')->select();
$data = [];
$data['count'] = db::name('box_type')->where($map)->count();
$data['list'] = $list;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function get_box_common_type_list(){
$map = [];
$map[] = ['del_status', '=', 1];
$map[] = ['is_person', '=', 1];
$list = db::name('box_type')->where($map)->order('tid', 'desc')->select();
$data = [];
$data['count'] = db::name('box_type')->where($map)->count();
$data['list'] = $list;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function edit_box_type($data)
{
$validate = validate('box_type');
$reslut = $validate->scene('adminEdit')->check($data);
if ($reslut !== true) {
return ['code' => 201, 'msg' => $validate->getError(), 'data' => null];
}
$reslut = model('box_type')->isUpdate(true)->save($data);
if (!$reslut) {
return ['code' => 201, 'msg' => '编辑失败', 'data' => ''];
} else {
return ['code' => 200, 'msg' => '编辑成功', 'data' => ''];
}
}
public function add_box_type($data)
{
$validate = validate('box_type');
$reslut = $validate->scene('adminAdd')->check($data);
if ($reslut !== true) {
return ['code' => 201, 'msg' => $validate->getError(), 'data' => null];
}
$reslut = model('box_type')->save($data);
if (!$reslut) {
return ['code' => 201, 'msg' => '添加失败', 'data' => ''];
} else {
return ['code' => 200, 'msg' => '添加成功', 'data' => ''];
}
}
//获取房间信息
public function get_box_type_info($tid)
{
$box_type_info = db::name('box_type')->where(['tid' => $tid])->find();
return ['code' => 200, 'msg' => '获取成功', 'data' => $box_type_info];
}
public function get_box_config_list($tid, $gid, $gift_name, $gift_price, $page = 1, $limit = 20)
{
$map = [];
if (!empty($tid)) {
$map[] = ['a.tid', '=', $tid];
}
if(!empty($gift_name)){
$map[] = ['b.gift_name', 'like', '%'.$gift_name.'%'];
}
if(!empty($gid)){
$map[] = ['a.gid', '=', $gid];
}
if(!empty($gift_price)){
$map[] = ['b.gift_price', '>=', $gift_price];
}
$redis = connectionRedis();
$list = db::name('box_config')->alias('a')->join('yy_gift b', 'a.gid = b.gid')->field('a.*, b.gift_name, b.gift_price, b.base_image')->where($map)->order('b.gift_price desc')->page($page, $limit)->select();
foreach ($list as $k => &$v) {
// $gift_info = db::name('gift')->find($v['gid']);
// if (!empty($gift_info)) {
// $v['gift_name'] = $gift_info['gift_name'];
// $v['gift_price'] = $gift_info['gift_price'];
// $v['base_image'] = localpath_to_netpath($gift_info['base_image']);
// } else {
// $v['gift_name'] = '';
// $v['gift_price'] = 0;
// }
$un_redis_list = [];
if(in_array($v['tid'],$un_redis_list)){
$v['unopen_num'] = $v['num'];
}else{
$keyname = "box:list:tid:".$v['tid'];
$redis_data_list = $redis->Lrange($keyname, 0, -1);
$redis_gift_data = [];
foreach ($redis_data_list as $a => $b) {
$gift_data = explode('-', $b);
if (empty($redis_gift_data[$gift_data[1]])) {
$redis_gift_data[$gift_data[1]] = 1;
} else {
$redis_gift_data[$gift_data[1]]++;
}
}
if (empty($redis_gift_data[$v['gid']])) {
$v['unopen_num'] = 0;
} else {
$v['unopen_num'] = $redis_gift_data[$v['gid']];
}
}
$v['base_image'] = localpath_to_netpath($v['base_image']);
$v['type_name'] = db::name('box_type')->where('tid', $v['tid'])->value('type_name');
}
//统计爆率
$total_num = 0;
$total_gift_value = 0;
$total_rate = 0;
$total_out_amount = 0;
$silver_array = [1];
$gold_array = [11];
$drill_array = [21];
//魔法之轮
$platina_array = [];
//许愿瓶
$violet_array = [];
$promise_array = [];
// $platina_array = [];
// $five_array = [];
$blind1 = [101];
$blind2 = [102];
$blind3 = [103];
$blind4 = [];
$blind5 = [];
$blind6 = [];
foreach ($list as $m => $n) {
$total_num += $n['num'];
$total_gift_value += $n['gift_price'] * $n['num'];
if(in_array($n['tid'],$gold_array)){
$total_out_amount += get_system_config('box_unit_price') * $n['num'];
}else if(in_array($n['tid'],$drill_array)){
$total_out_amount += get_system_config('box_drill_price') * $n['num'];
}else if(in_array($n['tid'],$silver_array)){
$total_out_amount += get_system_config('box_silver_price') * $n['num'];
}else if(in_array($n['tid'],$platina_array)){
$total_out_amount += get_system_config('box_platina_price') * $n['num'];
}else if(in_array($n['tid'],$violet_array)){
$total_out_amount += get_system_config('box_violet_price') * $n['num'];
}else if(in_array($n['tid'],$promise_array)){
$total_out_amount += get_system_config('box_promise_price') * $n['num'];
}
else if(in_array($n['tid'],$blind1)) {
$total_out_amount += 10 * $n['num'];
}else if(in_array($n['tid'],$blind2)) {
$total_out_amount += 30 * $n['num'];
}else if(in_array($n['tid'],$blind3)) {
$total_out_amount += 80 * $n['num'];
}else if(in_array($n['tid'],$blind4)) {
$total_out_amount += 10 * $n['num'];
}else if(in_array($n['tid'],$blind5)) {
$total_out_amount += 3880 * $n['num'];
}else if(in_array($n['tid'],$blind6)) {
$total_out_amount += 5880 * $n['num'];
}
}
// $box_unit_price = get_system_config('box_unit_price');
// $total_out_amount = $box_unit_price * $total_num;
if ($total_out_amount == 0) {
$total_rate = round(0, 6);
} else {
$total_rate = round($total_gift_value / $total_out_amount * 100, 6);
}
$total_rate .= "%";
$data = [];
$data['count'] = db::name('box_config')->alias('a')->join('yy_gift b', 'a.gid = b.gid')->field('a.*, b.gift_name, b.gift_price, b.base_image')->where($map)->count();
$data['list'] = $list;
$data['totalData']['total_num'] = $total_num;
$data['totalData']['total_gift_value'] = $total_gift_value;
$data['totalData']['total_out_amount'] = $total_out_amount;
$data['totalData']['total_rate'] = $total_rate;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function add_box_config($tid, $gid, $num, $open_num_obtain, $is_public_screen, $is_public_server)
{
$map = [];
$map[] = ['tid', '=', $tid];
//该类型礼物总数
$box_config_sum = db::name('box_config')->where($map)->sum('num');
$map[] = ['gid', '=', $gid];
$box_config_info = db::name('box_config')->where($map)->find();
if (!empty($box_config_info)) {
return ['code' => 201, 'msg' => '该礼物已添加', 'data' => null];
}
$map = [];
$map[] = ['gid', '=', $gid];
$map[] = ['is_delete', '=', 1];
$gift_info = db::name('gift')->where($map)->find();
if (empty($gift_info)) {
return ['code' => 201, 'msg' => '礼物不存在', 'data' => null];
}
// if($tid != 17 && $tid != 18){
// $open_num_obtain = 0;
// }
if($box_config_info != 0){
if($open_num_obtain > $box_config_info){
return ['code' => 201, 'msg' => '获取条件大于当前奖池一轮总数', 'data' => null];
}
}
$data = [];
$data['tid'] = $tid;
$data['gid'] = $gid;
$data['num'] = $num;
$data['open_num_obtain'] = $open_num_obtain;
$data['is_public_screen'] = $is_public_screen;
$data['is_public_server'] = $is_public_server;
$data['add_time'] = time();
$data['update_time'] = time();
$reslut = db::name('box_config')->where($map)->insert($data);
if (!$reslut) {
return ['code' => 201, 'msg' => '添加失败', 'data' => ''];
}
// model('admin/box')->control_generate_box($tid, 1);
return ['code' => 200, 'msg' => '添加成功', 'data' => $data];
}
public function edit_box_config($bid, $gid, $num, $open_num_obtain, $accumulate_price, $accumulate_rate, $is_public_screen, $is_public_server)
{
$map = [];
$map[] = ['bid', '=', $bid];
$box_config_info = db::name('box_config')->where($map)->find();
if (empty($box_config_info)) {
return ['code' => 201, 'msg' => '信息不存在', 'data' => ''];
}
$gift_info = db::name('gift')->where('gid', $gid)->find();
if (empty($gift_info)) {
return ['code' => 201, 'msg' => '礼物不存在', 'data' => ''];
}
// $open_num_obtain_data = [4,5,10,11];
// if(!in_array($box_config_info['tid'],$open_num_obtain_data)){
// $open_num_obtain = 0;
// }
$box_config_sum = db::name('box_config')->where('tid', $box_config_info['tid'])->sum('num');
if($open_num_obtain > $box_config_sum){
return ['code' => 201, 'msg' => '获取条件大于当前奖池一轮总数', 'data' => null];
}
$data = [];
$data['bid'] = $box_config_info['bid'];
$data['gid'] = $gid;
$data['num'] = $num;
$data['accumulate_price'] = $accumulate_price;
$data['accumulate_rate'] = $accumulate_rate;
$data['open_num_obtain'] = $open_num_obtain;
$data['is_public_screen'] = $is_public_screen;
$data['is_public_server'] = $is_public_server;
$data['update_time'] = time();
$reslut = db::name('box_config')->update($data);
if (!$reslut) {
return ['code' => 201, 'msg' => '更新失败', 'data' => ''];
}
// model('admin/box')->control_generate_box($box_config_info['tid'], 1);
return ['code' => 200, 'msg' => '更新成功', 'data' => ''];
}
public function delete_box_config($bid)
{
$map = [];
$map[] = ['bid', '=', $bid];
$box_config_info = db::name('box_config')->where($map)->find();
if (empty($box_config_info)) {
return ['code' => 201, 'msg' => '信息不存在', 'data' => ''];
}
$reslut = db::name('box_config')->delete($box_config_info['bid']);
if (!$reslut) {
return ['code' => 201, 'msg' => '删除失败', 'data' => ''];
}
//更新队列宝箱信息
// model('admin/box')->control_generate_box($box_config_info['tid'], 1);
return ['code' => 200, 'msg' => '删除成功', 'data' => ''];
}
public function batch_delete_box_config($data){
$bid_list = [];
foreach ($data as $k => $v){
$bid_list[] = $v['bid'];
}
$map = [];
$map[] = ['bid', 'in', $bid_list];
$reslut = db::name('box_config')->where($map)->delete();
if($reslut){
return ['code' => 200, 'msg' => '删除成功', 'data' => ''];
}else{
return ['code' => 201, 'msg' => '删除失败', 'data' => ''];
}
}
public function get_box_config_info($bid)
{
$map = [];
$map[] = ['bid', '=', $bid];
$box_config_info = db::name('box_config')->where($map)->find();
if (empty($box_config_info)) {
return ['code' => 201, 'msg' => '信息不存在', 'data' => ''];
}
return ['code' => 200, 'msg' => '获取成功', 'data' => $box_config_info];
}
public function get_box_log_list($tid, $page = 1, $limit = 20)
{
$map = [];
if (!empty($tid)) {
$map[] = ['tid', '=', $tid];
}
$list = db::name('box_log')->where($map)->order('bl_id', 'desc')->page($page, $limit)->select();
foreach ($list as $k => &$v) {
$v['type_name'] = db::name('box_type')->where('tid', $v['tid'])->value('type_name');
$v['unopen_num'] = $v['total_num'] - $v['open_num'];
$v['unopen_gift_value'] = $v['total_gift_value'] - $v['open_gift_value'];
}
$data = [];
$data['count'] = db::name('box_log')->where($map)->count();
$data['list'] = $list;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function get_user_box_log_list($uid, $bl_id, $gid, $tid, $start, $end, $page = 1, $limit = 20)
{
$map = [];
if (!empty($uid)) {
$map[] = ['uid', '=', $uid];
}
if (!empty($bl_id)) {
$map[] = ['bl_id', '=', $bl_id];
}
if (!empty($gid)) {
$map[] = ['gid', '=', $gid];
}
if (!empty($tid)) {
$map[] = ['tid', '=', $tid];
}
if (!empty($start)) {
$map[] = ['add_time', '>=', strtotime($start)];
}
if (!empty($end)) {
$map[] = ['add_time', '<=', strtotime($end)];
}
$list = db::name('user_box_log')->where($map)->order('aid', 'desc')->page($page, $limit)->select();
foreach ($list as $k => &$v) {
$user_info = db::name('user')->field('uid,user_name,nick_name,base64_nick_name')->where('uid', $v['uid'])->find();
$gift_info = db::name('gift')->find($v['gid']);
$box_type_info = db::name('box_type')->find($v['tid']);
$v['type_name'] = $box_type_info['type_name'];
if (!empty($gift_info)) {
$v['gift_name'] = $gift_info['gift_name'];
$v['gift_price'] = $gift_info['gift_price'];
$v['base_image'] = localpath_to_netpath($gift_info['base_image']);
} else {
$v['gift_name'] = '';
$v['gift_price'] = 0;
}
$v['user_name'] = $user_info['user_name'];
$v['nick_name'] = mb_convert_encoding(base64_decode($user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
}
$data = [];
$data['list'] = $list;
$totalRowData = db::name('user_box_log')->field('count(1) as count,SUM(num) as num,SUM(total_price) as total_price')->where($map)->find();
$data['count'] = $totalRowData['count'];
unset($totalRowData['count']);
//dump($totalRowData);
$data['totalRow'] = $totalRowData;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function get_user_box_count_list($uid, $out_amount, $last_login_device, $profit, $tid, $add_time, $order, $sort, $page = 1, $limit = 20)
{
$map = [];
if (!empty($uid)) {
$map[] = ['a.uid', '=', $uid];
}
if(!empty($out_amount)){
$map[] = ['a.out_amount', '>=', $out_amount];
}
if(!empty($last_login_device)){
$map[] = ['b.last_login_device', 'like', '%'.$last_login_device.'%'];
}
if(!empty($profit)){
$map[] = ['a.profit', '>=', $profit];
}
if(!empty($tid)){
$map[] = ['a.box_type', '=', $tid];
}
if(!empty($add_time)){
$add_time = explode(' - ',$add_time);
$add_time_1 = strtotime($add_time[0]);
$add_time_2 = strtotime($add_time[1]);
$map[] = ['a.add_time','between',[$add_time_1,$add_time_2]];
}
$list = db::name('user_box_count')->alias('a')->join('user b','a.uid = b.uid')->field('a.*,b.user_name,b.base64_nick_name,b.last_login_device')->where($map)->order($order, $sort)->page($page, $limit)->select();
// $box_type_list = [1,2,3,4,5,6,7,8,9,10,11];
foreach ($list as $k => &$v) {
// if($v['box_type'] == 1){
// $v['type_name'] = '奇镜寻梦';
// }else if($v['box_type'] == 2){
// $v['type_name'] = '仙踪秘语';
// }else if($v['box_type'] == 3){
// $v['type_name'] = '琥珀幽林';
// }else if($v['box_type'] == 4){
// $v['type_name'] = '重逢留声机';
// }else if($v['box_type'] == 5){
// $v['type_name'] = '经典留声机';
// }else if($v['box_type'] == 6){
// $v['type_name'] = '璀璨留声机';
// }else if($v['box_type'] == 11){
// $v['type_name'] = '奇镜寻梦(虚拟池)';
// }else if($v['box_type'] == 12){
// $v['type_name'] = '仙踪秘语(虚拟池)';
// }else if($v['box_type'] == 13){
// $v['type_name'] = '琥珀幽林(虚拟池)';
// }else if($v['box_type'] == 14){
// $v['type_name'] = '重逢留声机(虚拟池)';
// }else if($v['box_type'] == 15){
// $v['type_name'] = '经典留声机(虚拟池)';
// }else if($v['box_type'] == 16){
// $v['type_name'] = '璀璨留声机(虚拟池)';
// }else if($v['box_type'] == 101){
// $v['type_name'] = '初级盲盒';
// }else if($v['box_type'] == 102){
// $v['type_name'] = '中级盲盒';
// }else if($v['box_type'] == 103){
// $v['type_name'] = '高级盲盒';
// }else if($v['box_type'] == 104){
// $v['type_name'] = '一元盲盒';
// }
// else{
// $v['type_name'] = '未知';
// }
if($v['box_type'] == 1){
$v['type_name'] = '奇镜寻梦';
}else if($v['box_type'] == 2){
$v['type_name'] = '仙踪秘语';
}else if($v['box_type'] == 3){
$v['type_name'] = '琥珀幽林';
}else if($v['box_type'] == 101){
$v['type_name'] = '初级盲盒';
}else if($v['box_type'] == 102){
$v['type_name'] = '中级盲盒';
}else if($v['box_type'] == 103){
$v['type_name'] = '高级盲盒';
}
else{
$v['type_name'] = '未知';
}
// $user_info = db::name('user')->field('uid,user_name,nick_name,base64_nick_name,last_login_device')->where('uid', $v['uid'])->find();
// $v['user_name'] = $user_info['user_name'];
$v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8');
// $v['last_login_device'] = $user_info['last_login_device'];
}
$data = [];
$data['list'] = $list;
$totalRowData = db::name('user_box_count')->alias('a')->join('user b','a.uid = b.uid')->field('count(1) as count,SUM(a.out_amount) as out_amount,SUM(a.in_amount) as in_amount,SUM(a.profit) as profit')->where($map)->find();
$data['count'] = $totalRowData['count'];
unset($totalRowData['count']);
//dump($totalRowData);
if($totalRowData['out_amount'] == 0){
$totalRowData['rate'] = 0.00000;
}else{
$totalRowData['rate'] = round($totalRowData['in_amount']/$totalRowData['out_amount'],6);
}
$data['totalRow'] = $totalRowData;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
//监控宝箱redis list 剩余宝箱数量 生成
//tid 宝箱类型
//is_reset 0不重置 1重置
public function control_generate_box($tid = 0, $is_reset = 0)
{
set_time_limit(0);
ini_set('memory_limit', '1024M');
$redis = connectionRedis();
$map = [];
if (!empty($tid)) {
$map[] = ['tid', '=', $tid];
}
$map[] = ['open_status', '=', 1];
$map[] = ['del_status', '=', 1];
$gift_price_data = db::name('gift')->column('gift_price', 'gid'); //礼物价值
$box_type_list = db::name('box_type')->where($map)->select();
$list_len = 0;
foreach ($box_type_list as $k => $v) {
$map = [];
$map[] = ['tid', '=', $v['tid']];
$box_config_list = Db::name('box_config')->where($map)->select();
$keyname = "box:list:tid:" . $v['tid'];
if ($is_reset == 1) {
$redis->del($keyname); //如果重置则删除原队列
}
//剩余开奖次数少于5000 则补充下一期奖池
if ($redis->llen($keyname) < 500) {
$insert_data = [];
$total_gift_value = 0;
//获取0次开出的礼物
$where = [];
$where[] = ['tid', '=', $v['tid']];
$where[] = ['open_num_obtain', '=', 0];
$box_config_zero_lists = db::name('box_config')->where($where)->select();
foreach ($box_config_zero_lists as $m => $n){
//更新添加次数
for ($q = 0; $q < $n['num']; $q++) {
$insert_data[] = $n['gid'];
}
if (empty($gift_price_data[$n['gid']]) && $gift_price_data[$n['gid']] != 0) {
return ['code' => 201, 'msg' => '礼物id:' . $n['gid'] . '不存在', 'data' => ''];
}
$total_gift_value += $gift_price_data[$n['gid']] * $n['num'];
}
shuffle($insert_data);
//获取大于0次开出的礼物
$where = [];
$where[] = ['tid', '=', $v['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);
}
// foreach ($box_config_list as $m => $n) {
// //更新添加次数
// for ($q = 0; $q < $n['num']; $q++) {
// $insert_data[] = $n['gid'];
// }
// if (empty($gift_price_data[$n['gid']]) && $gift_price_data[$n['gid']] != 0) {
// return ['code' => 201, 'msg' => '礼物id:' . $n['gid'] . '不存在', 'data' => ''];
// }
// $total_gift_value += $gift_price_data[$n['gid']] * $n['num'];
// }
if (!empty($box_config_list)) {
//插入期日志表
$data = [];
$data['tid'] = $v['tid'];
$data['total_num'] = count($insert_data);
$data['total_gift_value'] = $total_gift_value;
$data['open_num'] = 0;
$data['open_gift_value'] = 0;
$data['config_text'] = json_encode($box_config_list);
$data['add_time'] = time();
$data['update_time'] = time();
$bl_id = db::name('box_log')->insertGetId($data);
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);
}
}
$list_len = $redis->llen($keyname);
//echo date('Y-m-d H:i:s') . " " . $keyname . "宝箱剩余数量:$list_len" . "\r\n";
}
return ['code' => 200, 'msg' => '生成成功', 'data' => "剩余数量: $list_len"];
}
//监控宝箱redis list 剩余宝箱数量 生成
//tid 宝箱类型
//is_reset 0不重置 1重置
public function control_generate_boxs($tid = 0, $is_reset = 0)
{
set_time_limit(0);
ini_set('memory_limit', '1024M');
$redis = connectionRedis();
$map = [];
if (!empty($tid)) {
$map[] = ['tid', '=', $tid];
}
$map[] = ['tid', 'in', [13,14,15]];
$gift_price_data = db::name('gift')->column('gift_price', 'gid'); //礼物价值
$box_type_list = db::name('box_type')->where($map)->select();
$list_len = 0;
$keyname = "box:list:tid:13";
if ($is_reset == 1) {
$redis->del($keyname); //如果重置则删除原队列
}
//剩余开奖次数少于1000 则补充下一期奖池
if($redis->llen($keyname) < 1000){
foreach ($box_type_list as $k => $v) {
$map = [];
$map[] = ['tid', '=', $v['tid']];
$box_config_list = Db::name('box_config')->where($map)->select();
$insert_data = [];
$total_gift_value = 0;
//获取0次开出的礼物
$where = [];
$where[] = ['tid', '=', $v['tid']];
$where[] = ['open_num_obtain', '=', 0];
$box_config_zero_lists = db::name('box_config')->where($where)->select();
foreach ($box_config_zero_lists as $m => $n){
//更新添加次数
for ($q = 0; $q < $n['num']; $q++) {
$insert_data[] = $n['gid'];
}
if (empty($gift_price_data[$n['gid']]) && $gift_price_data[$n['gid']] != 0) {
return ['code' => 201, 'msg' => '礼物id:' . $n['gid'] . '不存在', 'data' => ''];
}
$total_gift_value += $gift_price_data[$n['gid']] * $n['num'];
}
shuffle($insert_data);
//获取大于0次开出的礼物
$where = [];
$where[] = ['tid', '=', $v['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);
}
if (!empty($box_config_list)) {
//插入期日志表
$data = [];
$data['tid'] = $v['tid'];
$data['total_num'] = count($insert_data);
$data['total_gift_value'] = $total_gift_value;
$data['open_num'] = 0;
$data['open_gift_value'] = 0;
$data['config_text'] = json_encode($box_config_list);
$data['add_time'] = time();
$data['update_time'] = time();
$bl_id = db::name('box_log')->insertGetId($data);
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);
}
$list_len = $redis->llen($keyname);
//echo date('Y-m-d H:i:s') . " " . $keyname . "宝箱剩余数量:$list_len" . "\r\n";
}
}
return ['code' => 200, 'msg' => '生成成功', 'data' => "剩余数量: $list_len"];
}
public function get_box_person_log_list($tid, $uid, $page, $limit) {
$map = [];
if(!empty($uid)){
$map[] = ['uid', '=', $uid];
}
if(!empty($tid)){
$map[] = ['tid', '=', $tid];
}else{
$tid_list = [17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,37];
$map[] = ['tid', 'in', $tid_list];
}
$map[] = ['del_status', '=', 1];
$list = db::name('box_person_log')->where($map)->page($page, $limit)->select();
foreach ($list as $k => &$v) {
$v['unopen_gift_value'] = $v['total_gift_value'] - $v['open_gift_value'];
$v['unopen_num'] = $v['total_num'] - $v['open_num'];
$v['type_name'] = db::name('box_type')->where('tid', $v['tid'])->value('type_name');
$v['user_name'] = db::name('user')->where('uid', $v['uid'])->value('base64_nick_name');
$v['user_name'] = mb_convert_encoding(base64_decode($v['user_name']), 'UTF-8', 'UTF-8');
}
$data = [];
$data['count'] = db::name('box_person_log')->where($map)->count();
$data['list'] = $list;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
//清空积攒金额
public function accumulate_del(){
$accumulate_box = [38,39,40,41];
$map = [];
$map[] = ['tid', 'in', $accumulate_box];
$data = [];
$data['accumulate_price'] = 0;
$da = [];
$da['consume'] = 0;
Db::startTrans();
try {
$reslut = db::name('box_type')->where($map)->update($da);
if(!$reslut){
Db::rollback();
return ['code' => 201, 'msg' => '清空失败', 'data' => null];
}
$resluts = db::name('box_config')->where($map)->update($data);
if(!$resluts){
Db::rollback();
return ['code' => 201, 'msg' => '清空失败', 'data' => null];
}
// 提交事务
Db::commit();
} catch (\Exception $e) {
// 回滚事务
// dump($e);
Db::rollback();
return ['code' => 201, 'msg' => '清空失败', 'data' => null];
}
}
public function user_clear_box($tid){
set_time_limit(0);
ini_set('memory_limit', '1024M');
$redis = connectionRedis();
$map = [];
if (!empty($tid)) {
$map[] = ['tid', '=', $tid];
}
$map[] = ['open_status', '=', 2];
$map[] = ['del_status', '=', 1];
$box_type_list = db::name('box_type')->where($map)->select();
$user_list = db::name('user')->where('1=1')->select();
foreach ($box_type_list as $k => $v){
foreach ($user_list as $a => $b){
$key_name = "box:list:tid:".$v['tid'].":uid:".$b['uid'];
$redis->del($key_name);
}
}
$map = [];
$map[] = ['del_status','=',1];
$data = [];
$data['del_status'] = 2;
$data['update_time'] = time();
db::name('box_person_log')->where($map)->update($data);
return ['code' => 200, 'msg' => '重置成功', 'data' => null];
}
public function control_accumulate_box(){
$redis = connectionRedis();
$user = db::name('user')->where('login_status',1)->select();
foreach ($user as $k => $v){
$key_name = "box:list:tid:5:uid:".$v['uid'];
$redis->del($key_name);
}
return ['code' => 200, 'msg' => '重置成功', 'data' => null];
}
public function control_user_box(){
$redis = connectionRedis();
$user = db::name('user')->where('login_status',1)->select();
foreach ($user as $k => $v){
$key_name = "box:list:tid:4:uid:".$v['uid'];
$redis->del($key_name);
}
return ['code' => 200, 'msg' => '重置成功', 'data' => null];
}
public function get_room_box_count_list($uid, $out_amount, $tid, $add_time, $order, $sort, $page = 1, $limit = 20)
{
$map = [];
if (!empty($uid)) {
$map[] = ['b.room_number', '=', $uid];
}
if(!empty($out_amount)){
$map[] = ['a.out_amount', '>=', $out_amount];
}
if(!empty($tid)){
$map[] = ['a.box_type', '=', $tid];
}
if(!empty($add_time)){
$add_time = explode(' - ',$add_time);
$add_time_1 = strtotime($add_time[0]);
$add_time_2 = strtotime($add_time[1]);
$map[] = ['a.add_time','between',[$add_time_1,$add_time_2]];
}
$list = db::name('room_box_count')->alias('a')->join('yy_room b','a.rid = b.rid')->field('a.*,b.base64_room_name,b.room_number,b.room_owner_uid')->where($map)->order($order, $sort)->page($page, $limit)->select();
// $box_type_list = [1,2,3,4,5,6,7,8,9,10,11];
foreach ($list as $k => &$v) {
// if($v['box_type'] == 1){
// $v['type_name'] = '奇镜寻梦';
// }else if($v['box_type'] == 2){
// $v['type_name'] = '仙踪秘语';
// }else if($v['box_type'] == 3){
// $v['type_name'] = '琥珀幽林';
// }else if($v['box_type'] == 4){
// $v['type_name'] = '重逢留声机';
// }else if($v['box_type'] == 5){
// $v['type_name'] = '经典留声机';
// }else if($v['box_type'] == 6){
// $v['type_name'] = '璀璨留声机';
// }else if($v['box_type'] == 11){
// $v['type_name'] = '奇镜寻梦(虚拟池)';
// }else if($v['box_type'] == 12){
// $v['type_name'] = '仙踪秘语(虚拟池)';
// }else if($v['box_type'] == 13){
// $v['type_name'] = '琥珀幽林(虚拟池)';
// }else if($v['box_type'] == 14){
// $v['type_name'] = '重逢留声机(虚拟池)';
// }else if($v['box_type'] == 15){
// $v['type_name'] = '经典留声机(虚拟池)';
// }else if($v['box_type'] == 16){
// $v['type_name'] = '璀璨留声机(虚拟池)';
// }else if($v['box_type'] == 101){
// $v['type_name'] = '初级盲盒';
// }else if($v['box_type'] == 102){
// $v['type_name'] = '中级盲盒';
// }else if($v['box_type'] == 103){
// $v['type_name'] = '高级盲盒';
// }else if($v['box_type'] == 104){
// $v['type_name'] = '一元盲盒';
// }
// else{
// $v['type_name'] = '未知';
// }
if($v['box_type'] == 1){
$v['type_name'] = '奇镜寻梦';
}else if($v['box_type'] == 2){
$v['type_name'] = '仙踪秘语';
}else if($v['box_type'] == 3){
$v['type_name'] = '琥珀幽林';
}else if($v['box_type'] == 101){
$v['type_name'] = '初级盲盒';
}else if($v['box_type'] == 102){
$v['type_name'] = '中级盲盒';
}else if($v['box_type'] == 103){
$v['type_name'] = '高级盲盒';
}
else{
$v['type_name'] = '未知';
}
// $user_info = db::name('user')->field('uid,user_name,nick_name,base64_nick_name,last_login_device')->where('uid', $v['uid'])->find();
// $v['user_name'] = $user_info['user_name'];
$user_name = db::name('user')->where('uid',$v['room_owner_uid'])->value('base64_nick_name');
$v['user_name'] = mb_convert_encoding(base64_decode($user_name), 'UTF-8', 'UTF-8');
$v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_room_name']), 'UTF-8', 'UTF-8');
// $v['last_login_device'] = $user_info['last_login_device'];
}
$data = [];
$data['list'] = $list;
$totalRowData = db::name('room_box_count')->alias('a')->join('yy_room b','a.rid = b.rid')->field('count(1) as count,SUM(a.out_amount) as out_amount,SUM(a.in_amount) as in_amount,SUM(a.profit) as profit')->where($map)->find();
$data['count'] = $totalRowData['count'];
unset($totalRowData['count']);
//dump($totalRowData);
if($totalRowData['out_amount'] == 0){
$totalRowData['rate'] = 0.00000;
}else{
$totalRowData['rate'] = round($totalRowData['in_amount']/$totalRowData['out_amount'],6);
}
$data['totalRow'] = $totalRowData;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
public function get_room_box_counts_list($uid, $out_amount, $order, $sort, $page = 1, $limit = 20)
{
$map = [];
if (!empty($uid)) {
$map[] = ['b.room_number', '=', $uid];
}
if(!empty($out_amount)){
$map[] = ['a.out_amount', '>=', $out_amount];
}
$list = db::name('room_box_count')->alias('a')->join('yy_room b','a.rid = b.rid')->field('a.sid,SUM(a.out_amount) as out_amount, SUM(a.in_amount) as in_amount, SUM(a.profit) as profit, b.base64_room_name,b.room_number,b.room_owner_uid')->where($map)->group('a.rid')->order($order, $sort)->page($page, $limit)->select();
foreach ($list as $k => &$v) {
// $user_info = db::name('user')->field('uid,user_name,nick_name,base64_nick_name,last_login_device')->where('uid', $v['uid'])->find();
// $v['user_name'] = $user_info['user_name'];
$v['rate'] = round($v['in_amount']/$v['out_amount'],6);
$user_name = db::name('user')->where('uid',$v['room_owner_uid'])->value('base64_nick_name');
$v['user_name'] = mb_convert_encoding(base64_decode($user_name), 'UTF-8', 'UTF-8');
$v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_room_name']), 'UTF-8', 'UTF-8');
// $v['last_login_device'] = $user_info['last_login_device'];
}
$data = [];
$data['list'] = $list;
$totalRowData = db::name('room_box_count')->alias('a')->join('yy_room b','a.rid = b.rid')->field('SUM(a.out_amount) as out_amount,SUM(a.in_amount) as in_amount,SUM(a.profit) as profit')->where($map)->find();
$data['count'] = db::name('room_box_count')->where($map)->alias('a')->join('yy_room b', 'a.rid = b.rid')->field('a.sid')->group('a.rid')->count();
unset($totalRowData['count']);
//dump($totalRowData);
if($totalRowData['out_amount'] == 0){
$totalRowData['rate'] = 0.00000;
}else{
$totalRowData['rate'] = round($totalRowData['in_amount']/$totalRowData['out_amount'],6);
}
$data['totalRow'] = $totalRowData;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
}