123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- <?php
- namespace app\common\model;
- use app\api\library\ReplayTemplate;
- use app\common\library\Redis;
- use app\main\service\AdminService;
- use app\common\service\LogService;
- use app\common\service\WaterBookService;
- use app\main\helper\ArrayHelper;
- use app\main\service\UserService;
- use think\Model;
- use think\Cookie;
- use think\Config;
- class Sign extends Model
- {
- // 表名
- protected $table = 'sign';
- // 自动写入时间戳字段
- protected $autoWriteTimestamp = 'int';
- // 定义时间戳字段名
- protected $createTime = 'createtime';
- // 追加属性
- protected $append = [
- ];
- //当前链接的user_id分库
- protected $connectUserId = null;
- protected $userInfo = null;
- /**
- * 设置分库链接数据
- * @param $user_id
- * @return $this
- */
- public function setConnect($user_id)
- {
- if ($this->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;
- }
- }
|