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

530 lines
23 KiB
PHP

<?php
namespace app\api\model;
use think\Db;
class BlindBox
{
//进行中的活动
public static function get_blind_box_term()
{
try {
// 是否开启
$map = [
['status', '=', 2],
['real_end_time', '>', time()]
];
$blind_box_term = Db::name('blind_box_term')
->alias('b')
->join('blind_box_term_params p', 'b.id = p.term_id AND b.stage = p.stage')
->where($map)
->field('b.*, p.gid, p.multi as now_multi, p.time_long, p.num as min_num,p.reward_gid,p.reward_gid_r')
->order('b.real_end_time desc')
->find();
if (empty($blind_box_term)) {
return ['code' => 201, 'msg' => '未开启', 'data' => null];
}
// 验证和过滤数据
$blind_box_term = array_filter($blind_box_term, function($value) {
return is_scalar($value);
});
$blind_box_term['term_id'] = $blind_box_term['id'];
unset($blind_box_term['id']);
return ['code' => 200, 'msg' => '开启中', 'data' => $blind_box_term];
} catch (\Exception $e) {
// 记录日志
dump($e);
return ['code' => 201, 'msg' => '服务器内部错误', 'data' => null];
}
}
//进度条
public function stage_process_bar($stage, $total_num, $min_num, $max_num)
{
if ($stage == 5) {
$max_config_num = Db::name('config')->where('key_title', 'blind_box_max_amount')
->value('key_value');
$max_nums = $max_config_num;
if ($total_num > $max_nums) {
$now_num = $max_nums - $min_num;
} else {
$now_num = $total_num - $min_num;
}
} else {
$now_num = $total_num - $min_num;
$max_nums = $max_num - $min_num;
}
return [
'min_num' => $now_num,
'max_num' => $max_nums
];
}
//判断是都进入下一阶段
public function check_next_stage($term_id, $stage, $total_num)
{
// dump($total_num);
// 新的阶段
$new_stage_info = [];
if ($stage < 5) {
$map = [];
$map[] = ['a.term_id', '=', $term_id];
$map[] = ['a.stage', '>', $stage];
$map[] = ['a.num', '<', $total_num];
$stage_info = db::name('blind_box_term_params')->alias('a')
->leftJoin('gift b', 'a.reward_gid = b.gid')
->field('a.*,b.base_image,b.gift_name')
->where($map)->order('stage asc')
->limit(1)->find();
if (!empty($stage_info)) {
$now_gift_image = localpath_to_netpath($stage_info['base_image']);
if ($stage_info['stage'] == 5) {
$data = [
'now_gift_image' => $now_gift_image,
'now_multi' => $stage_info['multi'],
'now_num' => $stage_info['num'],
'now_gift_name' => $stage_info['gift_name'],
'next_gift_image' => '',
'next_multi' => 0,
'next_num' => 0,
];
} else {
$map = [];
$map[] = ['a.term_id', '=', $term_id];
$map[] = ['a.stage', '=', $stage_info['stage'] + 1];
$next_info = db::name('blind_box_term_params')->alias('a')
->leftJoin('gift b', 'a.reward_gid = b.gid')
->field('a.*,b.base_image,b.gift_name')
->where($map)->order('stage asc')->find();
$data = [
'now_gift_image' => localpath_to_netpath($stage_info['base_image']),
'now_multi' => $stage_info['multi'],
'now_num' => $stage_info['num'],
'next_gift_image' => localpath_to_netpath($next_info['base_image']),
'next_multi' => $next_info['multi'],
'next_num' => $next_info['num'],
'now_gift_name' => $stage_info['gift_name']
];
}
$data['pattern_id'] = $stage_info['pattern_id'];
$data['gid'] = $stage_info['gid'];
$data['time_long'] = $stage_info['time_long'];
$data['stage'] = $stage_info['stage'];
$data['reward_gid'] = $stage_info['reward_gid'];
$data['reward_gid_r'] = $stage_info['reward_gid_r'];
$data['lock_gift_name'] = Db::name('gift')->where('gid', $stage_info['gid'])->value('gift_name');
$new_stage_info = $data;
}
}
// dump($new_stage_info);
return ['code' => 200, 'msg' => '获取数据成功', 'data' => $new_stage_info];
}
//获取锁定礼物
public function get_lock_gift($term_id, $stage)
{
$map = [];
$map[] = ['term_id', '=', $term_id];
$map[] = ['stage', '=', $stage];
$lock_gid = db::name('blind_box_term_params')->where($map)->order('id desc')->find();
return $lock_gid;
}
//活动初始化
public function blind_box_init($uid, $to_uid, $gid)
{
$blind_box_term = self::get_blind_box_term();
if ($blind_box_term['code'] == 201) {
return ['code' => 200, 'msg' => '未开启', 'data' => ['is_open' => 2]];
}
$to_user_info = Db::name('user')->where('uid', $to_uid)->field('uid,base64_nick_name,head_pic')->find();
if (empty($to_user_info)) {
return ['code' => 201, 'msg' => '用户不存在', 'data' => null];
}
$gift_info = Db::name('gift')->where('gid', $gid)->find();
if (empty($gift_info)) {
return ['code' => 201, 'msg' => '盲盒不存在', 'data' => null];
}
$term_info = $blind_box_term['data'];
$stage = $term_info['stage'];
$pattern_id = $term_info['pattern_id'];
$term_id = $term_info['term_id'];
$map = [];
if ($stage == 5) {
$map[] = ['term_id', '=', $term_id];
$map[] = ['stage', '=', $stage];
$params = Db::name('blind_box_term_params')->where($map)->order('stage asc')->find();
if (empty($params)) {
return ['code' => 201, 'msg' => '未开启', 'data' => null];
}
//奖励礼物信息
$reward_gift_info = Db::name('gift')->where('gid', $params['reward_gid'])->find();
$reward_base_image = '';
if ($reward_gift_info) {
$reward_base_image = $reward_gift_info['base_image'];
}
$max_config_num = Db::name('config')->where('key_title', 'blind_box_max_amount')->value('key_value');
$data = [
'now_gift_image' => localpath_to_netpath($reward_base_image),
'now_multi' => $params['multi'],
'next_gift_image' => '',
'next_multi' => 0,
'now_gift_name' => $reward_gift_info['gift_name'],
];
$min_num = $params['num'];
$max_num = $max_config_num;
$now_lock_gid = $params['gid'];
} else {
$map[] = ['a.term_id', '=', $term_id];
$map[] = ['a.stage', '>=', $stage];
$list = Db::name('blind_box_term_params')->alias('a')
->leftJoin('gift b', 'a.reward_gid = b.gid')
->field('a.*,b.base_image,b.gift_name')
->where($map)
->order('a.stage', 'asc')
->limit(2)->select();
// dump($list);
$data = [
'now_gift_image' => localpath_to_netpath($list[0]['base_image']),
'now_multi' => $list[0]['multi'],
'next_gift_image' => localpath_to_netpath($list[1]['base_image']),
'next_multi' => $list[1]['multi'],
'now_gift_name' => $list[0]['gift_name'],
];
$min_nums = $list[0]['num'];
$max_num = $list[1]['num'];
$max_num = $max_num - $min_nums;
$min_num = $term_info['gift_num'] - $min_nums;
$now_lock_gid = $list[0]['gid'];
}
//锁定礼物图片
$data['is_open'] = 1;
$data['term_id'] = $term_id;
$data['stage'] = $stage;
$data['pattern_id'] = $pattern_id;
$data['min_num'] = $min_num;
$data['max_num'] = $max_num;
$data['end_time'] = $term_info['real_end_time'] - time();
$data['head_pic'] = localpath_to_netpath($to_user_info['head_pic']);
$data['blind_info'] = [
'base_image' => localpath_to_netpath($gift_info['base_image']),
'gift_name' => $gift_info['gift_name'],
'gift_price' => $gift_info['gift_price'],
];
//限定礼物id
$lock_gift_info = Db::name('gift')->where('gid', $now_lock_gid)->find();
$lock_base_image = '';
$lock_gift_name = '';
if ($lock_gift_info) {
$lock_base_image = $lock_gift_info['base_image'];
$lock_gift_name = $lock_gift_info['gift_name'];
}
$lock_user_info = [
'send_head_pic' => '',
'send_uid' => 0,
'send_nick_name' => '',
'receive_head_pic' => '',
'receive_uid' => 0,
'receive_nick_name' => '',
'base_image' => localpath_to_netpath($lock_base_image),
'receive_base_image' => '',
'multi' => $data['now_multi']
];
$data['lock_gift_name'] = $lock_gift_name;
$map = [];
$map[] = ['term_id', '=', $term_id];
// $map[] = ['stage', '=', $stage];
// $map[] = ['gid', '=', $now_lock_gid];
$user_send_box_info = Db::name('user_blind_box_win')->where($map)->order('id','desc')->find();
if ($user_send_box_info) {
$send_uid = $user_send_box_info['uid'];
$receive_uid = $user_send_box_info['receive_uid'];
$uid_arr = [$send_uid, $receive_uid];
$user_list = Db::name('user')->field('uid,base64_nick_name,head_pic')
->where('uid', 'in', $uid_arr)->select();
$user_arr = [];
foreach ($user_list as $v) {
$user_arr[$v['uid']] = [
'head_pic' => localpath_to_netpath($v['head_pic']),
'nick_name' => mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8'),
];
}
$reward_gid = $user_send_box_info['reward_gid'];
$reward_gid_r = $user_send_box_info['reward_gid_r'];
$gift_arr = Db::name('gift')->whereIn('gid', [$reward_gid, $reward_gid_r])
->column('base_image', 'gid');
$lock_user_info = [
'send_head_pic' => $user_arr[$send_uid]['head_pic'] ?? '',
'send_uid' => $user_send_box_info['uid'],
'send_nick_name' => $user_arr[$send_uid]['nick_name'] ?? '',
'receive_head_pic' => $user_arr[$receive_uid]['head_pic'] ?? '',
'receive_uid' => $user_send_box_info['receive_uid'],
'receive_nick_name' => $user_arr[$receive_uid]['nick_name'] ?? '',
'base_image' => isset($gift_arr[$reward_gid]) ? localpath_to_netpath($gift_arr[$reward_gid]) : '',
'receive_base_image' => isset($gift_arr[$reward_gid_r]) ? localpath_to_netpath($gift_arr[$reward_gid_r]) : '',
'multi' => $user_send_box_info['multi']
];
}
$data['lock_user_info'] = $lock_user_info;
$map = [];
$map[] = ['term_id', '=', $term_id];
$map[] = ['uid', '=', $uid];
$map[] = ['receive_uid', '=', $to_uid];
$send_gift_list = Db::name('user_blind_box_log')->alias('a')
->leftJoin('gift b', 'a.gid = b.gid')
->field('b.gift_name,a.gift_num')
->where($map)
->order('id desc')
->limit(100)
->select();
foreach ($send_gift_list as &$v) {
$v['nick_name'] = mb_convert_encoding(base64_decode($to_user_info['base64_nick_name']), 'UTF-8', 'UTF-8');
}
$data['send_gift_list'] = $send_gift_list;
return ['code' => 200, 'msg' => '获取成功', 'data' => $data];
}
//数据录入
public function user_blind_box_log($insert_data)
{
return Db::name('user_blind_box_log')->insertAll($insert_data);
}
//锁定礼物写入
public function user_blind_box_win($insert_data)
{
return Db::name('user_blind_box_win')->insertAll($insert_data);
}
//送礼物日统计
public function user_blind_box_count_day($uid, $gid, $gift_num, $gift_price, $total_gift_price)
{
$day_time = date('Ymd');
$day_time = intval($day_time);
$map = [];
$map[] = ['uid', '=', $uid];
$map[] = ['day_time', '=', $day_time];
$map[] = ['gid', '=', $gid];
$info = Db::name('user_blind_box_count_day')->where($map)->find();
if ($info) {
Db::name('user_blind_box_count_day')->where('id', $info['id'])
->inc('gift_num', $gift_num)
->inc('total_gift_price', $total_gift_price)
->update(['update_time' => time()]);
} else {
$data = [
'uid' => $uid,
'day_time' => $day_time,
'gid' => $gid,
'gift_num' => $gift_num,
'gift_price' => $gift_price,
'total_gift_price' => $total_gift_price,
'add_time' => time(),
'update_time' => time(),
];
Db::name('user_blind_box_count_day')->insert($data);
}
}
//送礼物排行榜
public function get_blind_box_rank($time_type, $page, $page_limit)
{
$day_time = date('Ymd');
$week_start_day = date('Ymd', strtotime("this week"));
$map = [];
$start_time = $day_time;
if ($time_type == 2) {
$start_time = $week_start_day;
}
$map[] = ['day_time', '>=', $start_time];
$list = Db::name('user_blind_box_count_day')->alias('a')
->leftJoin('user b', 'a.uid = b.uid')
->field('a.uid,sum(a.total_gift_price) as total_gift_price,b.base64_nick_name,b.head_pic')
->where($map)
->group('uid')
->order('total_gift_price desc')
->page($page, $page_limit)
->select();
foreach ($list as &$v) {
$v['head_pic'] = localpath_to_netpath($v['head_pic']);
$v['nick_name'] = mb_convert_encoding(base64_decode($v['base64_nick_name']), 'UTF-8', 'UTF-8');
$maps = [];
$maps[] = ['a.day_time', '>=', $start_time];
$maps[] = ['a.uid', '=', $v['uid']];
$gift_list = Db::name('user_blind_box_count_day')->alias('a')
->leftJoin('gift b', 'a.gid = b.gid')
->where($maps)
->field('sum(gift_num) as gift_num,b.base_image')
->group('a.gid')
->order('a.gift_price desc, gift_num desc')
->limit(3)
->select();
foreach ($gift_list as &$vv) {
$vv['base_image'] = localpath_to_netpath($vv['base_image']);
}
$v['gift_list'] = $gift_list;
}
return ['code' => 200, 'msg' => '获取数据成功', 'data' => $list];
}
//开奖记录
public function get_blind_box_win_log($page, $page_limit)
{
$map = [];
$map[] = ['is_win', '=', 1];
$list = Db::name('user_blind_box_win')->alias('a')
->leftJoin('gift b', 'a.reward_gid = b.gid')
->leftJoin('gift c', 'a.reward_gid_r = c.gid')
->field('a.uid,a.receive_uid,a.gid,a.gift_num,a.multi,a.gift_price,b.gift_name,b.base_image,
c.base_image as receive_base_image,a.add_time,c.gift_name as receive_gift_name')
->where($map)
->page($page, $page_limit)
->order('id desc')
->select();
$uid_arr = array_column($list, 'uid');
$receive_arr = array_column($list, 'receive_uid');
$user_arr = Db::name('user')->where('uid', 'in', array_merge($uid_arr, $receive_arr))
->column('base64_nick_name,head_pic', 'uid');
foreach ($list as &$v) {
$v['head_pic'] = localpath_to_netpath($user_arr[$v['uid']]['head_pic']);
$v['nick_name'] = mb_convert_encoding(base64_decode($user_arr[$v['uid']]['base64_nick_name']), 'UTF-8', 'UTF-8');
$v['receive_head_pic'] = localpath_to_netpath($user_arr[$v['receive_uid']]['head_pic']);
$v['receive_nick_name'] = mb_convert_encoding(base64_decode($user_arr[$v['receive_uid']]['base64_nick_name']), 'UTF-8', 'UTF-8');
$v['base_image'] = localpath_to_netpath($v['base_image']);
$v['receive_base_image'] = localpath_to_netpath($v['receive_base_image']);
$v['gift_num'] = $v['multi'];
}
return ['code' => 200, 'msg' => '获取数据成功', 'data' => $list];
}
//玩法介绍
public function get_blind_box_note()
{
$content = Db::name('config')->where('key_title', 'blind_box_note')->value('key_value');
return ['code' => 200, 'msg' => '获取数据成功', 'data' => $content];
}
// //结束一期盲盒活动
// public function close_blind_box()
// {
// $map = [];
// $map[] = ['status', '=', 2];
// $map[] = ['real_end_time', '<', time()];
// $result = Db::name('blind_box_term')->where($map)->update(['status' => 3, 'update_time' => time()]);
// if ($result) {
// $push_data = [];
// $push_data['code'] = 316;
// $push_data['msg'] = '活动结束';
// $push_data['data'] = [];
// model('api/WebSocketPush')->send_to_all($push_data);
// }
// }
// //活动结束奖励
// public function blind_box_reward()
// {
// $map = [];
// $map[] = ['status', '=', 3];
// $info = Db::name('blind_box_term')->where($map)->find();
// if ($info) {
// $term_id = $info['id'];
// $stage = $info['stage'];
// // for ($i = 1; $i <= $stage; $i++) {
// // $map = [];
// // $map[] = ['term_id', '=', $term_id];
// // $map[] = ['stage', '=', $i];
// // $map[] = ['is_win', '=', 2];
// // $win_info = Db::name('user_blind_box_win')->where($map)->order('id', 'desc')->find();
// // if ($win_info) {
// // $remarks = '盲盒巡乐会第' . $term_id . '期第' . $i . '阶段';
// // model('api/UserGiftPack')->change_user_gift_pack($win_info['uid'], $win_info['gid'], $win_info['gift_num'], 5, $remarks);
// // model('api/UserGiftPack')->change_user_gift_pack($win_info['receive_uid'], $win_info['gid'], $win_info['gift_num'], 5, $remarks);
// // Db::name('user_blind_box_win')->where('id', $win_info['id'])->update(['is_win' => 1, 'update_time' => time()]);
// // }
// // }
// $map = [];
// $map[] = ['term_id', '=', $term_id];
// $map[] = ['stage', '=', $stage];
// $map[] = ['is_win', '=', 2];
// $win_info = Db::name('user_blind_box_win')->where($map)->order('id', 'desc')->find();
// if ($win_info) {
// $remarks = '盲盒巡乐会第' . $term_id . '期第' . $stage . '阶段';
// model('api/UserGiftPack')->change_user_gift_pack($win_info['uid'], $win_info['reward_gid'], $win_info['multi'], 5, $remarks);
// model('api/UserGiftPack')->change_user_gift_pack($win_info['receive_uid'], $win_info['reward_gid_r'], $win_info['multi'], 5, $remarks);
// Db::name('user_blind_box_win')->where('id', $win_info['id'])->update(['is_win' => 1, 'update_time' => time()]);
// }
// Db::name('blind_box_term')->where('id', $info['id'])->update(['status' => 4, 'update_time' => time()]);
// }
// }
//结束一期盲盒活动
public function close_blind_box()
{
$map = [];
$map[] = ['status', '=', 2];
$map[] = ['real_end_time', '<', time()];
$result = Db::name('blind_box_term')->where($map)->update(['status' => 3, 'update_time' => time()]);
if ($result) {
$content = '';
$map = [];
$map[] = ['status', '=', 3];
$info = Db::name('blind_box_term')->where($map)->order('id', 'desc')->find();
if($info) {
$term_id = $info['id'];
$stage = $info['stage'];
$map = [];
$map[] = ['term_id', '=', $term_id];
// $map[] = ['stage', '=', $stage];
$map[] = ['is_win', '=', 2];
$win_info = Db::name('user_blind_box_win')->where($map)->order('id', 'desc')->find();
if($win_info) {
$base64_nick_name = Db::name('user')->where('uid', $win_info['uid'])->value('base64_nick_name');
$nick_name = mb_convert_encoding(base64_decode($base64_nick_name), 'UTF-8', 'UTF-8');
$content = '恭喜' . $nick_name . '获得巡乐会最终大奖!';
}
}
$push_data = [];
$push_data['code'] = 316;
$push_data['msg'] = '活动结束';
$push_data['data'] = [
'content' => $content,
];
model('api/WebSocketPush')->send_to_all($push_data);
}
}
//活动结束奖励
public function blind_box_reward()
{
$map = [];
$map[] = ['status', '=', 3];
$info = Db::name('blind_box_term')->where($map)->order('id', 'desc')->find();
if ($info) {
$term_id = $info['id'];
$stage = $info['stage'];
$map = [];
$map[] = ['term_id', '=', $term_id];
// $map[] = ['stage', '=', $stage];
$map[] = ['is_win', '=', 2];
$win_info = Db::name('user_blind_box_win')->where($map)->order('id', 'desc')->find();
if ($win_info) {
$remarks = '盲盒巡乐会第' . $term_id . '期第' . $stage . '阶段';
model('api/UserGiftPack')->change_user_gift_pack($win_info['uid'], $win_info['reward_gid'], $win_info['multi'], 5, $remarks);
model('api/UserGiftPack')->change_user_gift_pack($win_info['receive_uid'], $win_info['reward_gid_r'], $win_info['multi'], 5, $remarks);
Db::name('user_blind_box_win')->where('id', $win_info['id'])->update(['is_win' => 1, 'update_time' => time()]);
}
Db::name('blind_box_term')->where('id', $info['id'])->update(['status' => 4, 'update_time' => time()]);
}
}
}