getBrandConfigAndState(); if ($conf instanceof Json) { return $conf; } return $this->successResponse($conf); } /** * 检测登录 通过cookie中的SUB字段的内容,调用用户接口检测登录状态 * @throws ClassNotFoundException * @throws ReflectionException * @return mixed */ public function checkLogin() { FacadeLog::info("checkLogin cookies:" . json_encode(Request::post())); $sub = Request::post('cookie'); $uid = 0; $userInfoRes = (new WeiboService($uid))->userinfo($sub); if (empty($userInfoRes) || $userInfoRes['ok'] != 1) { return $this->response(403, $userInfoRes['msg'] ?? '没有登录'); } // 使用客户端信息生成token $token = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_ENCODING'] . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . $_SERVER['HTTP_REFERER'] . get_client_ip(0) . $userInfoRes['data']['uid']); $user = $userInfoRes['data']; $userInfo = Db::table('awards_user_info')->where('uid', $user['uid'])->find(); $count = 0; $isShare = 0; if (empty($userInfo)) { $userAttr = [ 'uid' => $user['uid'], 'portrait' => $user['profile_image_url'], 'nickname' => $user['name'], 'is_share' => 0, 'count' => 1, 'create_at' => time() ]; if (0 == Db::table('awards_user_info')->insert($userAttr)) { return $this->response(5001, '系统错误,请稍后再试~'); } } else { $count = Db::table('awards_user_task_log')->where('uid', $user['uid'])->count('id'); $isShare = $userInfo['is_share']; } // 生成加密用的密钥和向量 $cipher = "aes-256-gcm"; $ivlen = openssl_cipher_iv_length($cipher); $iv = bin2hex(openssl_random_pseudo_bytes($ivlen)); $aesKey = bin2hex(openssl_random_pseudo_bytes(32)); // $user = array_merge($user, [ // 'aes_key' => $aesKey, // 'ase_iv' => $iv, // ]); $cacheUser = [ 'aes_key' => $aesKey, 'ase_iv' => $iv, 'uid' => $user['uid'], ]; $activity = Db::table('awards_activity')->where('begin_at', '<=', time()) ->where('end_at', '>=', time())->find(); $isBeginActivity = 1; if (empty($activity)) { $isBeginActivity = 0; } $userInfo = []; if ($count > 0) { $userInfo = Db::table('awards_user_task_log')->alias('l') ->leftJoin('awards_user_info u', 'l.uid = u.uid') ->field(['u.nickname', 'u.portrait', 'u.uid', 'l.duration', 'l.number']) ->order('l.number', 'desc') ->order('l.duration', 'asc') ->find(); } // 缓存用户信息1天 Cache::set('u:' . $token, json_encode($cacheUser), 86400); return $this->successResponse([ 'user' => $user, 'token' => $token, 'isShare' => $isShare, 'count' => $count, 'isBeginActivity' => $isBeginActivity, 'task' => $userInfo ]); } /** * 是否可以参与游戏 * @throws ClassNotFoundException * @throws ReflectionException * @return mixed */ public function checkRole() { $activity = Db::table('awards_activity')->where('begin_at', '<=', time()) ->where('end_at', '>=', time())->find(); if (empty($activity)) { return $this->response(5002, '活动末开始'); } $userInfo = Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->find(); $count = Db::table('awards_user_task_log')->where('uid', Safe::$user['uid'])->count('id'); return $this->successResponse([ 'isShare' => $userInfo['is_share'], 'count' => $count ]); } /** * 提交任务接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function submitTask() { $activity = Db::table('awards_activity')->where('begin_at', '<=', time()) ->where('end_at', '>=', time())->find(); if (empty($activity)) { return $this->response(5002, '活动末开始'); } // if (empty(Safe::$body)) { // return $this->response(5003, '参数有误'); // } // // if (!isset(Safe::$body['duration']) || Safe::$body['duration'] < 1 || Safe::$body['duration'] > 1000) { // return $this->response(5003, '时长参数有误'); // } // // if (!isset(Safe::$body['number']) || Safe::$body['number'] < 0 || Safe::$body['number'] > 1000) { // return $this->response(5003, '时长参数有误'); // } // $duration = Safe::$body['duration']; // $number = Safe::$body['number']; $duration = Request::post("duration"); $number = Request::post("number"); $date = date('Y-m-d'); $userInfo = Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->find(); if (empty($userInfo)) { return $this->response(403, '没有登录'); } $count = Db::table('awards_user_task_log')->where('uid', Safe::$user['uid'])->count('id'); if ($count >= $userInfo['count']) { return $this->response(5002, '没有参与次数'); } $log = [ 'uid' => Safe::$user['uid'], 'date' => $date, 'duration' => $duration, 'number' => $number, 'create_at' => time() ]; if (0 == Db::table('awards_user_task_log')->insert($log)) { return $this->response(5001, '系统错误,请稍后再试~'); } return $this->successResponse(null, '提交成功'); } /** * 提交发布微博接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function submitShare() { $activity = Db::table('awards_activity')->where('begin_at', '<=', time()) ->where('end_at', '>=', time())->find(); if (empty($activity)) { return $this->response(5002, '活动末开始'); } $userInfo = Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->find(); if (empty($userInfo)) { return $this->response(403, '没有登录'); } if ($userInfo['is_share'] > 0) { return $this->response(601, '已发布'); } // 更新任务状态 $nums = Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->update([ 'is_share' => 1, 'count' => 2, 'share_at' => time() ]); if ($nums) { return $this->successResponse(null, '提交成功'); } else { return $this->response(601, '发布失败'); } } /** * 头号排行接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function topRanking() { $ranking = Db::table('awards_user_task_log')->alias("l") ->leftJoin('awards_user_info u', 'l.uid = u.uid') ->field(['u.nickname', 'u.portrait', 'u.uid', 'l.duration', 'l.number']) ->distinct('uid') ->order('l.number', 'desc') ->order('l.duration', 'asc') ->limit(50) ->select(); $userInfo = Db::table('awards_user_task_log')->alias('l') ->leftJoin('awards_user_info u', 'l.uid = u.uid') ->field(['u.nickname', 'u.portrait', 'u.uid', 'l.duration', 'l.number']) ->order('l.number', 'desc') ->order('l.duration', 'asc') ->find(); $res = [ 'self' => $userInfo, 'ranking' => $ranking ]; return $this->successResponse($res); } /** * 最新排行接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function newRanking() { $ranking = Db::table('awards_user_task_log')->alias("l") ->leftJoin('awards_user_info u', 'l.uid = u.uid') ->field(['u.nickname', 'u.portrait', 'u.uid', 'l.duration', 'l.number']) ->distinct('uid') ->order('l.create_at', 'desc') ->order('l.number', 'desc') ->order('l.duration', 'asc') ->limit(50) ->select(); $userInfo = Db::table('awards_user_task_log')->alias('l') ->leftJoin('awards_user_info u', 'l.uid = u.uid') ->field(['u.nickname', 'u.portrait', 'u.uid', 'l.duration', 'l.number']) ->order('l.number', 'desc') ->order('l.duration', 'asc') ->find(); $res = [ 'self' => $userInfo, 'ranking' => $ranking ]; return $this->successResponse($res); } /** * 提交领取信息接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function submitReceive() { $name = trim(Request::post("name")); $mobile = trim(Request::post("mobile")); $address = trim(Request::post("address")); $giftId = trim(Request::post("giftId")); $type = trim(Request::post("type")); $orders = Db::table('awards_order')->where('uid', Safe::$user['uid'])->where('type', $type)->find(); if (empty($orders)) { return $this->response(5001, '参数有误'); } $userInfo = Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->find(); if (empty($userInfo)) { return $this->response(403, '没有登录'); } if (strlen($name) < 1 || strlen($name) > 50) { return $this->response(5001, '姓名有误'); } if (strlen($mobile) != 11) { return $this->response(5001, '手机号有误'); } if (strlen($address) < 1 || strlen($address) > 1000) { return $this->response(5001, '地址有误'); } // 更新任务状态 $nums = Db::table('awards_order')->where('uid', Safe::$user['uid'])->where('type', $type)->update([ 'name' => $name, 'mobile' => $mobile, 'address' => $address, ]); if ($nums < 1) { return $this->response(5001, '系统错误,请稍后再试~'); } return $this->successResponse(null, '提交成功'); } /** * 获取轮播中奖接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function getRotationAward() { $activity = Db::table('awards_activity')->where('begin_at', '<=', time()) ->where('end_at', '>=', time())->find(); if (empty($activity)) { return $this->response(5002, '活动末开始'); } $orders = Db::table('awards_order')->alias('o') ->leftJoin('awards_user_info u', 'o.uid = u.uid') ->leftJoin('awards_gift g', 'o.gift_id = g.id') ->field(['u.nickname', 'u.portrait', 'u.uid', 'g.name as giftName']) ->order('o.id', 'desc') ->select(); return $this->successResponse($orders); } /** * 排行中奖接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function getRankingWinAward() { $activity = Db::table('awards_activity')->where('begin_at', '<=', time()) ->where('end_at', '>=', time())->find(); if (!empty($activity)) { return $this->response(5002, '活动末结束'); } $ranking = Db::table('awards_user_task_log')->alias("l") ->leftJoin('awards_user_info u', 'l.uid = u.uid') ->field(['u.nickname', 'u.portrait', 'u.uid', 'l.duration', 'l.number']) ->distinct('l.uid') ->order('l.number', 'desc') ->order('l.duration', 'asc') ->limit(50) ->select(); $isWinAward = 0; $rank = 0; foreach ($ranking as $key => $val) { if ($val['uid'] == Safe::$user['uid']) { $isWinAward = 1; $rank = $key +1; break; } } $giftId = 0; // 如果中奖 插入用户中奖信息 if ($isWinAward == 1) { $gifts = Db::table('awards_gift')->where('type', 2)->select(); foreach ($gifts as $val) { if ($rank >= $val['min_rank'] && $rank <= $val['max_rank']) { $giftId = $val['id']; $orders = Db::table('awards_order')->where('uid', Safe::$user['uid'])->where('type', 2)->find(); if (empty($orders)) { $order = [ 'uid' => Safe::$user['uid'], 'gift_id' => $giftId, 'type' => 2, 'create_at' => time(), ]; Db::table('awards_order')->insert($order); } break; } } } return $this->successResponse([ 'isWinAward' => $isWinAward, 'giftId' => $giftId ]); } /** * 抽奖接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function getLuckDraw() { $userInfo = Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->find(); if ($userInfo >= 30) { return $this->response(5002, '抽奖次数已达上线~'); } $orders = Db::table('awards_order')->where('uid', Safe::$user['uid'])->where('type', 1)->find(); $isWinAward = 0; if ($orders) { return $this->successResponse([ 'isWinAward' => $isWinAward, 'giftId' => 0 ]); } $gifts = Db::table('awards_gift')->where('type', 1)->select(); $logCount = Db::table('awards_user_task_log')->distinct('uid')->count('id'); $limit = 5000; $userRate = rand(0, $limit); $giftId = 0; foreach ($gifts as $gift) { $orderCount = Db::table('awards_order')->where('type', 1)->where('gift_id', $gift['id'])->count('id'); if ($orderCount >= $gift['count']) { continue; } // 如果参与活动人数 5000人内 有人中奖过,那么不在计算。 $total = $logCount + 1; if ($orderCount == floor($total/$limit)) { $isWinAward = 0; $giftId = 0; break; } for ($i=0;$i<$gift['count'];$i++) { $giftRage = rand(0, $limit); if ($userRate == $giftRage) { $isWinAward = 1; $giftId = $gift['id']; break; } } // 如果参与活动人数 5000人内 还没有人中奖那最后一人必中。 if ($orderCount < floor($total/$limit) && $isWinAward ==0 && ($total%$limit) == 0) { $isWinAward = 1; $giftId = $gift['id']; break; } } // 如果中奖 插入用户中奖信息 if ($isWinAward == 1) { $order = [ 'uid' => Safe::$user['uid'], 'gift_id' => $giftId, 'type' => 1, 'create_at' => time(), ]; if (0 == Db::table('awards_order')->insert($order)) { return $this->response(5001, '系统错误,请稍后再试~'); } } return $this->successResponse([ 'isWinAward' => $isWinAward, 'giftId' => $giftId ]); } /** * 奖品记录接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function getAwardLog() { $awards = Db::table('awards_order')->alias('o') ->leftJoin('awards_gift g', 'o.gift_id = g.id') ->field(['g.name as giftName', 'o.*']) ->where('o.uid', Safe::$user['uid']) ->select(); $res = []; foreach ($awards as $val) { $type = '抽奖'; if ($val['type'] == 2) { $type = '排名奖'; } $isReceive = 1; if (empty($val['name']) && empty($val['address']) && empty($val['mobile'])) { $isReceive = 0; } $res[] = [ 'giftId' => $val['gift_id'], 'giftName' => $val['giftName'], 'typeLabel' => $type, 'type' => $val['type'], 'createAt' => date('y-m-d h:i:s', $val['create_at']), 'address' => $val['address'], 'name' => $val['name'], 'mobile' => $val['mobile'], 'isReceive' => $isReceive ]; } return $this->successResponse($res); } public function clearGameData() { // 更新用户参与状态 Db::table('awards_user_info')->where('uid', Safe::$user['uid'])->update([ 'is_share' => 0, 'share_at' => 0, 'count' => 1, ]); Db::table('awards_user_task_log')->where('uid', Safe::$user['uid'])->delete(); Db::table('awards_order')->where('uid', Safe::$user['uid'])->delete(); return $this->successResponse(null, '清除成功'); } /** * 品牌任务关注接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws ReflectionException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function follow() { // 先获取品牌任务配置及状态 $conf = $this->getBrandConfigAndState(); if ($conf instanceof Json) { return $conf; } // 已经关注过了 if ($conf['state']['follow_state'] == 1) { return $this->successResponse([ 'result' => 2, 'brand' => $conf, ], '您已经关注过了'); } // 调用接口关注 $weiboRes = (new WeiboService(Safe::$user['uid']))->add($conf['config']['follow']['id']); if (empty($weiboRes) || $weiboRes['code'] != 10000) { return $this->response(600, $weiboRes['msg'] ?? '关注失败~'); } $date = date('Y-m-d'); $redisKey = $this->getTaskStateRedisKey(intval(Safe::$user['uid'])); // 如果已经完成了另外两项,则标记品牌任务已经完成 $finishState = $conf['state']['finish_state']; if ($conf['state']['view_state'] == 1 && $conf['state']['forward_state'] == 1) { $finishState = 1; } // 更新任务状态 $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update([ 'follow_state' => 1, 'finish_state' => $finishState, ]); if ($nums) { $conf['state']['follow_state'] = 1; $conf['state']['finish_state'] = $finishState; Cache::set($redisKey, json_encode($conf['state']), 86400); return $this->successResponse([ 'result' => 1, 'brand' => $conf, ], '关注成功'); } else { return $this->response(601, '更新任务状态失败'); } } /** * 品牌任务转发博文接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws ReflectionException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function forward() { // 先获取品牌任务配置及状态 $conf = $this->getBrandConfigAndState(); if ($conf instanceof Json) { return $conf; } // 已经转发过了 if ($conf['state']['forward_state'] == 1) { return $this->successResponse([ 'result' => 2, 'brand' => $conf, ], '您已经转发过了'); } // 调用微博接口转发 $weiboRes = (new WeiboService(Safe::$user['uid']))->repost($conf['config']['forward']['id'], $conf['config']['forward']['content'] ?? ''); if (empty($weiboRes) || $weiboRes['code'] != 10000) { return $this->response(600, $weiboRes['msg'] ?? '转发失败~'); } $date = date('Y-m-d'); $redisKey = $this->getTaskStateRedisKey(intval(Safe::$user['uid'])); // 如果已经完成了另外两项,则标记品牌任务已经完成 $finishState = $conf['state']['finish_state']; if ($conf['state']['view_state'] == 1 && $conf['state']['follow_state'] == 1) { $finishState = 1; } // 更新任务状态 $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update([ 'forward_state' => 1, 'finish_state' => $finishState, ]); if ($nums) { $conf['state']['forward_state'] = 1; $conf['state']['finish_state'] = $finishState; Cache::set($redisKey, json_encode($conf['state']), 86400); return $this->successResponse([ 'result' => 1, 'brand' => $conf, ], '转发成功'); } else { return $this->response(601, '更新任务状态失败'); } } /** * 获取活动规则 * @throws FuncNotFoundException * @throws ReflectionException * @throws InvalidArgumentException * @throws ClassNotFoundException * @return mixed */ public function getRule() { $config = SystemService::instance()->getData('activity:rule'); return $this->successResponse($config); } /** * 聚合页配置信息 * @throws FuncNotFoundException * @throws ReflectionException * @throws InvalidArgumentException * @throws ClassNotFoundException * @return mixed */ public function groupPageConfig() { return $this->successResponse(['config' => SystemService::instance()->getData('group:page:config')]); } // public function index() // { // $this->redirect('video'); // } /** * 聚合页通知获取 * 查询最近20条通知 * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function notices() { $rows = SystemNotice::limit(20)->order('id', 'desc')->select(); return $this->successResponse([ "lists" => $rows, ]); } /** * 首次弹窗 * 发放邀请函微博 * @return Json */ public function sendInviteWeibo() { $config = SystemService::instance()->getData('group:page:config'); $sendRes = (new WeiboService(Safe::$user['uid']))->status($config['firstDialog']['content']); if (empty($sendRes) || $sendRes['code'] != 10000) { return $this->response(403, $sendRes['msg'] ?? '发布失败'); } Cache::set('u:f:' . Safe::$user['uid'], 1, 15552000); return $this->successResponse(null, '发布成功!'); } /** * 首次弹窗用户未选择发送邀请函 * 标记已经首次弹窗过了 * @return mixed */ public function setFirst() { Cache::set('u:f:' . Safe::$user['uid'], 1, 15552000); return $this->successResponse(null, '操作成功!'); } /** * 标记用户已经浏览过主页了,用户点了去浏览时调用 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws ReflectionException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function setViewed() { // 先获取品牌任务配置及状态 $conf = $this->getBrandConfigAndState(); if ($conf instanceof Json) { return $conf; } if ($conf['state']['view_state'] == 1) { return $this->successResponse([ 'result' => 2, 'brand' => $conf, ], '您已经浏览过了'); } $date = date('Y-m-d'); $redisKey = $this->getTaskStateRedisKey(intval(Safe::$user['uid'])); // 如果已经完成了另外两项,则标记品牌任务已经完成 $finishState = $conf['state']['finish_state']; if ($conf['state']['forward_state'] == 1 && $conf['state']['follow_state'] == 1) { $finishState = 1; } $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update([ 'view_state' => 1, 'finish_state' => $finishState, ]); if ($nums) { $conf['state']['view_state'] = 1; $conf['state']['finish_state'] = $finishState; Cache::set($redisKey, json_encode($conf['state']), 86400); return $this->successResponse([ 'result' => 1, 'brand' => $conf, ], '浏览成功'); } else { return $this->response(601, '更新任务状态失败'); } } /** * 用户完成端外分享时调用接口加票 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws ReflectionException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function shareFinishAddVotes() { // 先获取品牌任务配置及状态 $conf = $this->getBrandConfigAndState(); if ($conf instanceof Json) { return $conf; } if ($conf['state']['share_add_votes'] == 1) { return $this->successResponse([ 'result' => 2, 'brand' => $conf, ], '您今日已经领取过投票机会了~'); } // 调用接口给用户发券(加票) $weiboRes = (new WeiboService(Safe::$user['uid']))->setcoupons($conf['config']['share']['votes']); if (empty($weiboRes) || $weiboRes['code'] != 10000) { return $this->response(600, $weiboRes['msg'] ?? '加票失败~'); } // 标记状态 $date = date('Y-m-d'); $redisKey = $this->getTaskStateRedisKey(intval(Safe::$user['uid'])); $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update([ 'share_add_votes' => 1, ]); if ($nums) { $conf['state']['share_add_votes'] = 1; Cache::set($redisKey, json_encode($conf['state']), 86400); return $this->successResponse([ 'result' => 1, 'brand' => $conf, ], '加票成功'); } else { return $this->response(601, '更新任务状态失败'); } } /** * 完成品牌任务后领取加票机会接口 * @throws FuncNotFoundException * @throws ClassNotFoundException * @throws ReflectionException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return mixed */ public function taskFinishAddVotes() { // 先获取品牌任务配置及状态 $conf = $this->getBrandConfigAndState(); if ($conf instanceof Json) { return $conf; } if ($conf['state']['finish_add_votes'] == 1) { return $this->successResponse([ 'result' => 2, 'brand' => $conf, ], '您今日已经领取过投票机会了~'); } // 未完成品牌任务 领取失败 if ($conf['state']['finish_state'] == 0) { return $this->response(603, '请先完成品牌任务,再来领取加票', [ 'result' => 0, 'brand' => $conf, ]); } // 调用微博接口 给用户发券(加票) $weiboRes = (new WeiboService(Safe::$user['uid']))->setcoupons($conf['config']['task']['votes']); if (empty($weiboRes) || $weiboRes['code'] != 10000) { return $this->response(600, $weiboRes['msg'] ?? '加票失败~'); } // 标记加票成功 $date = date('Y-m-d'); $redisKey = $this->getTaskStateRedisKey(intval(Safe::$user['uid'])); $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update([ 'finish_add_votes' => 1, ]); if ($nums) { $conf['state']['finish_add_votes'] = 1; Cache::set($redisKey, json_encode($conf['state']), 86400); return $this->successResponse([ 'result' => 1, 'brand' => $conf, ], '加票成功'); } else { return $this->response(601, '更新任务状态失败'); } } /** * 获取品牌任务配置及状态 * @throws FuncNotFoundException * @throws ReflectionException * @throws InvalidArgumentException * @throws ClassNotFoundException * @throws DbException * @throws ModelNotFoundException * @throws DataNotFoundException * @return \think\response\Json|array */ protected function getBrandConfigAndState() { $config = SystemService::instance()->getData('brand:task:config'); $date = date('Y-m-d'); $dateForRedis = date('Ymd'); if (empty(Safe::$user['uid'])) { $state = [ // 品牌任务完成状态 'finish_state' => 0, // 关注子任务状态 'follow_state' => 0, // 转发子任务状态 'forward_state' => 0, // 查看浏览主页任务状态 'view_state' => 0, // 品牌任务完成后是否加票 'finish_add_votes' => 0, // 分享完成后是否加票 'share_add_votes' => 0, 'uid' => 0, 'date' => $date, ]; } else { $redisKey = "t:{$dateForRedis}:" . Safe::$user['uid']; $state = Cache::get($redisKey); if (empty($state)) { // 缓存失败 查数据库 $state = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->find(); if (empty($state)) { // 当天第一次,初始化数据 $state = [ // 品牌任务完成状态 'finish_state' => 0, // 关注子任务状态 'follow_state' => 0, // 转发子任务状态 'forward_state' => 0, // 查看浏览主页任务状态 'view_state' => 0, // 品牌任务完成后是否加票 'finish_add_votes' => 0, // 分享完成后是否加票 'share_add_votes' => 0, 'uid' => Safe::$user['uid'], 'date' => $date, ]; if (0 == Db::table('awards_user_task')->insert($state)) { return $this->response(5001, '系统错误,请稍后再试~'); } } Cache::set($redisKey, json_encode($state), 86400); } else { $state = json_decode($state, true); } // 如果未关注状态,查询下已经实际已经关注了 if ($state['follow_state'] == 0) { $weiboRes = (new WeiboService(Safe::$user['uid']))->friends($config['follow']['id']); if (isset($weiboRes['data'][$config['follow']['id']]) && $weiboRes['data'][$config['follow']['id']] == 1) { $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update(['follow_state' => 1]); if ($nums) { $state['follow_state'] = 1; Cache::set($redisKey, json_encode($state), 86400); } } } } // 校准状态,可能存在异常情况关注,转发,浏览都完成了,但是总的品牌任务状态没标记成已完成 if ($state['follow_state'] == 1 && $state['forward_state'] == 1 && $state['view_state'] == 1 && $state['finish_state'] != 1) { $nums = Db::table('awards_user_task')->where('uid', Safe::$user['uid'])->where('date', $date)->update(['finish_state' => 1]); if ($nums) { $state['finish_state'] = 1; Cache::set($redisKey, json_encode($state), 86400); } } return [ 'config' => $config, 'state' => $state, ]; } /** * 获取品牌任务redis 缓存键 * @param int $uid * @return string */ protected function getTaskStateRedisKey(int $uid): string { $dateForRedis = date('Ymd'); return "t:{$dateForRedis}:" . $uid; } /** * @param $code * @param $msg * @param $data * @return Json */ protected function response($code, $msg, $data = null) { return json( [ 'code' => $code, 'message' => $msg, 'data' => $data, 'trackID' => Log::$logID, ], 200 ); } /** * @param $data * @param $msg * @return mixed */ protected function successResponse($data, $msg = '操作成功') { return $this->response(0, $msg, $data); } }