', 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()]); } } }