connectUserId != $user_id) { $database = get_db_connect($this->table, $user_id); $this->setTable($database['table']); $this->connect($database); $this->connectUserId = $user_id; } return $this; } /** * 返回用户今天的签到信息 * @return array|false|\PDOStatement|string|Model */ public function userSignToday() { //检查是否已签到 $todayDate = Date('Ymd',time()); $obj = $this->where(['uid'=>$this->connectUserId,'createdate'=>$todayDate])->find(); return $obj; } /** * 用户签到(连续) * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息 */ public function UserSignContinuous(){ try{ if(!$this->connectUserId){ throw new \Exception('获取用户ID失败'); } //检查是否已签到 $todayDate = Date('Ymd',time()); if($obj = $this->where(['uid'=>$this->connectUserId,'createdate'=>$todayDate])->find()){ return [true, $this->getSignedRecommendBookTemplate(), $obj->kandian, $obj->days]; } list($status,$message,$continue_days, $kandian) = $this->writeSignLogContinuous(); if(!$status){ throw new \Exception($message); } return [true,$this->getSignRecommendBookTemplateContinuous($continue_days, $kandian), $kandian,$continue_days]; }catch (\Exception $e){ LogService::exception($e); return [false,$e->getMessage()]; } } /** * 写入用户签到信息到数据库 * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息 */ public function writeSignLogContinuous(){ try{ if (!$this->userInfo) { $this->userInfo = model('User')->getUserInfo($this->connectUserId); } $userInfo = $this->userInfo; $redis = Redis::instance(); $signData = $this->getYesterdaySignData(); if ($signData) { if ($signData->days > 7) { $mod = abs($signData->days % 7); if ($mod === 0) { $signData->days = 7; } else { $signData->days = $mod; } } if ($signData->days == 7) { $continue_days = 1; } else { $continue_days = $signData->days + 1; } } else { $continue_days = 1; } $kandian = $this->calMoneyByDays($continue_days); $sign_data = ['uid' => $this->connectUserId, 'kandian' => intval($kandian), 'days' => $continue_days, 'createdate' => Date('Ymd', time()), 'createtime' => time()]; if(!$this->insert($sign_data)){ throw new \Exception('签到失败,写入签到数据失败'); } //写入Recharge表 $recharge_data = [ 'user_id'=>$this->connectUserId, 'type'=>5, 'free_kandian'=>$kandian, 'remain_free_kandian' => $kandian, 'free_endtime'=>intval(config('site.kandian_free_day'))*86400 + time(), 'createtime' => time(), 'updatetime' => time(), 'dd' => ArrayHelper::getValue($userInfo, 'is_black') == 0 ? 0 : 1, ]; if(!$recharge_id = model('Recharge')->setConnect($this->connectUserId)->insertGetId($recharge_data)){ $this->where(['createdate'=>Date('Ymd',time()),'uid'=>$this->connectUserId])->delete(); throw new \Exception('签到失败,写入签到数据失败'); } //签到赠送的免费书币存到redis $zkey = 'ZR:'.$this->connectUserId; $redis->del($zkey); return [true,'OK', $continue_days, $kandian]; }catch (\Exception $e){ return [false,$e->getMessage()]; } } /** * 获取签到自动回复 * @param $continue_days 连续签到天数 * @param $kandian 签到赠送的看点数 * @return string */ public function getSignRecommendBookTemplateContinuous($continue_days, $kandian){ //$kandian = Config::get('site.kandian_sign'); $continue_days = ($continue_days % 7) == 0 ? 7 : ($continue_days % 7); if (!$this->userInfo) { $this->userInfo = model('User')->getUserInfo($this->connectUserId); } if($this->userInfo){ $user = $this->userInfo; $adminConfig = model('AdminConfig')->getAdminInfoAll($user['channel_id']); //获取阅读历史 OR 推荐书籍 $readlog = array(); $recommandBook = array(); $soruceReadLog = model('UserRecentlyRead')->setConnect($this->connectUserId)->getRecentlyRead(0, 5, $this->connectUserId, true); $soruceReadLog = $this->filterDelBook($soruceReadLog['data'],'state'); if (count($soruceReadLog) > 0) { $readlog = array_slice( $soruceReadLog, 0,5); } else { $user['sex'] = ($user['sex'] == '0') ? 1 : $user['sex']; $channelId = AdminService::instance()->getAdminExtendModel()->getChannelId($adminConfig['admin_id']); $isWater = WaterBookService::instance()->showBook($channelId,$user['id']); $recommandBook = model('SignRecommand')->getBooksBySex($user['sex'],3,$isWater); $recommandBook = $this->filterDelBook($recommandBook); $recommandBook = array_slice($recommandBook,0,3); } //发送消息 $replay = new ReplayTemplate($adminConfig['admin_id']); return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,已连续签到{$continue_days}天,获得{$kandian}书币,连续签到7天合计获得350书币~",$readlog,$recommandBook, $adminConfig['admin_id'], $this->userInfo); //return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,您已连续签到{$continue_days}天,赠送{$kandian}书币,连续签到每次多送5书币,多签多送,最高赠送65书币~",$readlog,$recommandBook, $adminConfig['admin_id']); //return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~",$readlog,$recommandBook); } //return "今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~"; return "今日签到成功,您已连续签到{$continue_days}天,赠送{$kandian}书币,连续签到每次多送5书币,多签多送,最高赠送65书币~"; } /** * 用户签到 * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息 */ public function UserSign(){ try{ if(!$this->connectUserId){ throw new \Exception('获取用户ID失败'); } if (!$this->userInfo) { $this->userInfo = UserService::instance()->getUserModel()->getUserInfo($this->connectUserId); } //检查是否已签到 $todayDate = Date('Ymd',time()); if($this->where(['uid'=>$this->connectUserId,'createdate'=>$todayDate])->find()){ return [true,$this->getSignedRecommendBookTemplate()]; } list($status,$message,$continue_days, $kandian) = $this->writeSignLogContinuous(); if(!$status){ throw new \Exception($message); } return [true,$this->getSignRecommendBookTemplateContinuous($continue_days, $kandian), $kandian,$continue_days]; }catch (\Exception $e){ LogService::exception($e); return [false,$e->getMessage()]; } } /** * 写入用户签到信息到数据库 * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息 */ public function writeSignLog(){ try{ if (!$this->userInfo) { $this->userInfo = model('User')->getUserInfo($this->connectUserId); } $userInfo = $this->userInfo; $redis = Redis::instance(); //写入签到数据 $kandian = Config::get('site.kandian_sign'); $sign_data = ['uid' => $this->connectUserId, 'kandian' => intval($kandian), 'createdate' => Date('Ymd', time()), 'createtime' => time()]; if(!$this->insert($sign_data)){ throw new \Exception('签到失败,写入签到数据失败'); } //写入Recharge表 $recharge_data = [ 'user_id'=>$this->connectUserId, 'type'=>5, 'free_kandian'=>$kandian, 'remain_free_kandian' => $kandian, 'free_endtime'=>intval(config('site.kandian_free_day'))*86400 + time(), 'createtime' => time(), 'updatetime' => time(), 'dd' => ArrayHelper::getValue($userInfo, 'is_black') == 0 ? 0 : 1, ]; if(!$recharge_id = model('Recharge')->setConnect($this->connectUserId)->insertGetId($recharge_data)){ $this->where(['createdate'=>Date('Ymd',time()),'uid'=>$this->connectUserId])->delete(); throw new \Exception('签到失败,写入签到数据失败'); } //签到赠送的免费书币存到redis $zkey = 'ZR:'.$this->connectUserId; $redis->del($zkey); return [true, 'OK']; }catch (\Exception $e){ return [false,$e->getMessage()]; } } /** * 获取签到自动回复 * @return string */ public function getSignRecommendBookTemplate(){ $kandian = Config::get('site.kandian_sign'); $user = model('User')->getUserInfo($this->connectUserId); if($user){ $adminConfig = model('AdminConfig')->getAdminInfoAll($user['channel_id']); //获取阅读历史 OR 推荐书籍 $readlog = array(); $recommandBook = array(); $soruceReadLog = model('UserRecentlyRead')->setConnect($this->connectUserId)->getRecentlyRead(0, 10, $this->connectUserId, true); $soruceReadLog = $this->filterDelBook($soruceReadLog['data'],'state'); if (count($soruceReadLog) > 0) { $readlog = array_slice( $soruceReadLog, 0,5); } else { $user['sex'] = ($user['sex'] == '0') ? 1 : $user['sex']; $channelId = AdminService::instance()->getAdminExtendModel()->getChannelId($adminConfig['admin_id']); $isWater = WaterBookService::instance()->showBook($channelId,$user['id']); $recommandBook = model('SignRecommand')->getBooksBySex($user['sex'],10,$isWater); $recommandBook = $this->filterDelBook($recommandBook); $recommandBook = array_slice($recommandBook,0,3); } //发送消息 $replay = new ReplayTemplate($adminConfig['admin_id']); return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~",$readlog,$recommandBook, $adminConfig['admin_id'], $user); } return "今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~"; } /** * 过滤下架的书籍 * @param $books * @param string $state */ public function filterDelBook( $books, $state='' ) { try{ LogService::info('filter书籍详情001'.json_encode($books)); if (empty($books)){ return []; } if (!$state){ //如果数组中没有下架状态 $bookIds = array_column($books,'book_id'); $booksInfo = model('Book')->getBooksInfo($bookIds); foreach ($books as $key=> $book){ if ( !isset($booksInfo[$book['book_id']]) || (isset($booksInfo[$book['book_id']]['state']) && $booksInfo[$book['book_id']]['state'] != 1) ){ unset($books[$key]); continue; } } }else{ foreach ($books as $key=>$book){ if ( isset($book['state']) && $book['state'] != 1){ unset($books[$key]); continue; } } } return $books; }catch (\Throwable $throwable){ LogService::error('过滤删除书籍'.$throwable->getMessage()); } } /** * 获取已签到的自动回复 * @return string */ public function getSignedRecommendBookTemplate(){ $user = model('User')->getUserInfo($this->connectUserId); $output = ''; if($user){ $adminConfig = model('AdminConfig')->getAdminInfoAll($user['channel_id']); $user['sex'] = ($user['sex'] == '0') ? 1 : $user['sex']; $channelId = AdminService::instance()->getAdminExtendModel()->getChannelId($adminConfig['admin_id']); $isWater = WaterBookService::instance()->showBook($channelId,$user['id']); $recommandBook = model('SignedRecommand')->getBooksBySex($user['sex'],10,$isWater); $recommandBook = $this->filterDelBook($recommandBook); $recommandBook = array_slice($recommandBook,0,3); LogService::info('已经签到的书籍'.json_encode($recommandBook)); //发送消息 $replay = new ReplayTemplate($adminConfig['admin_id']); $output .= $replay->getSignReplayTemplate("@{$user['nickname']},今天您已经签到过啦,请明天继续签到得书币哦~",null,$recommandBook, $adminConfig['admin_id'], $user); }else{ $output .='今天您已经签到过啦,请明天继续签到得书币哦~'; } return $output; } /** * 获取最后一条签到数据 * @return array|false|\PDOStatement|string|Model */ public function getLastSignData() { $data = $this->where('uid',$this->connectUserId)->order('id','desc')->find(); return $data; } /** * 获取昨日签到数据 * * @return array|false|\PDOStatement|string|Model */ public function getYesterdaySignData() { $data = $this->where('uid', $this->connectUserId)->where('createdate', date('Ymd', time() - 86400))->find(); return $data; } /** * 判断是否是连续的两天 * @param $old_day 时间戳 * @return bool */ public function isContinueSign($old_day) { $oldtime = strtotime(date('Y-m-d', $old_day)); $newtime = strtotime(date('Y-m-d', time())); if (($newtime - $oldtime) <= 24 * 60 * 60) { return true; } return false; } /** * @param $days 连续签到天数 * @return int 返回应该增加多少书币 */ public function calMoneyByDays($days) { switch ($days){ case 1: $money = 35; break; case 2: $money = 40; break; case 3: $money = 45; break; case 4: $money = 50; break; case 5: $money = 55; break; case 6: $money = 60; break; default: $money = 65; } return $money; } }