error('QAPP_SYS_ERROR'); } //yuyuedu、xinghe 快应用这两个cp的书屏蔽下 if(in_array($book_info->cp_source,getHiddenCp())){ return response()->error('QAPP_SYS_ERROR'); } if($this->distribution_channel_id == 7477 && $bid == 13765){ $book_info->is_on_shelf = 2; } if($bid == 58886){ $book_info->is_on_shelf = 0; } if (!in_array($book_info->is_on_shelf, [1,2])) { return response()->error('QAPP_OFF_SHELF'); } $is_on_shelf = UserShelfBooksService::getUserShelfBooksListByUidAndBid($this->uid, $bid); $book_info['is_on_user_shelf'] = 0; if ($is_on_shelf) { $book_info['is_on_user_shelf'] = 1; } $last_chapter = ChapterService::getChapterNameById($book_info['last_cid'], $bid); $book_info->last_chapter = $last_chapter['name']; list($is_split,$is_change_chapter_name) = BookService::splitContent($bid); if($is_split && ($book_info->channel_name == '男频' || $is_change_chapter_name) ){ $book_info->last_chapter = '第'.$book_info->chapter_count.'章'; } $book_info['last_chapter_is_vip'] = $last_chapter['is_vip']; $book_info['is_need_charge'] = $this->isNeedCharge($bid, $last_chapter, $book_info); $record = ReadRecordService::getBookReadRecordStatic($this->uid, $bid); if ($record) { $book_info['record_chapter_id'] = $record['record_chapter_id']; $book_info['record_chapter_name'] = $record['record_chapter_name']; } return response()->item(new BookTransformer(), $book_info); } /** * 获取订购记录 * @param $book_info * @param $chapter_id * @return bool */ protected function getOrderRecord($bid, $chapter_id) { //包年记录 $uid = $this->uid; $res = YearOrderService::getRecord($uid); if ($res) return true; $res = null; //单本订购记录 $res = BookOrderService::getRecordByuidBid($uid, $bid); if ($res) return true; $res = null; //章节订购记录 $chapterOrder = new ChapterOrderService(); if ($chapterOrder->checkIsOrdered($uid, $bid, $chapter_id)) return true; return false; } /** * 判断是否需要充值 */ private function isBookNeedCharge(int $bid, float $price) { $book_order = $this->getOrderRecord($bid, 0); if ($book_order) { return false; } else { $user_info = $this->user_info; return $user_info['balance'] < $price; } } /** * 判断章节是否需要充值 */ private function isChapterNeedCharge(int $bid, int $cid, float $price) { $book_order = $this->getOrderRecord($bid, $cid); if ($book_order) { return false; } else { $user_info = $this->user_info; return $user_info['balance'] < $price; } } /** * 判断是否需要充值 */ private function isNeedCharge(int $bid, $last_chapter, $book_info) { $is_free = BookConfigService::judgeBookIsFree($bid); if ($is_free) { return false; } switch ($book_info->charge_type) { case 'BOOK': $price = $this->getPrice($book_info); return $this->isBookNeedCharge($bid, $price); default: $price = isset($last_chapter->is_vip) ? $this->getPrice($book_info, $last_chapter->size) : 0; return isset($last_chapter->is_vip) ? $this->isChapterNeedCharge($bid, $last_chapter->id, $price) : false; } } /** * 计算价格 * @param $book_info * @param $chapter_size * @return float */ protected function getPrice($book_info, $chapter_size = 0) { if ($book_info->charge_type == 'BOOK') return $book_info->price * 100; return ceil($chapter_size / 100); } /** * 首页 */ public function getBookLists(Request $request, $sex) { // 获取基本数据 $package = $request->header('x-package', ''); $brand = $request->header('x-nbrand', ''); $codeVersion = $request->header('x-codeversion', ''); $isAuth = check_qapp_auth($package ,0); // 根据包名、平台、版本号判断是否审核 if (Utils::checkIsAudit($package, $brand, $codeVersion) || $isAuth == false) { $result = BookAuditService::getHomeBooksData($sex, $package,$isAuth); return response()->success($result); } $user = (new QappUserService)->getGolableUser(); if($package == "com.beidao.kuaiying.yueai" && $sex == "male" && isset($user->uid) && !empty($user->uid) && $user->send_order_id > 0){ $orderRecord = ChapterOrderService::hasUserRecord($user->uid); if($orderRecord){ $result = BookAuditService::getYueaiHomeBooksData($sex, $package,$isAuth,1); return response()->success($result); } } if ($sex == 'male') { $channel = 1; $reco_banner_type = ['MALE', 'PUBLIC']; } else { $reco_banner_type = ['FEMALE', 'PUBLIC']; $channel = 2; } if($isAuth){ $books = (new RecoBannerService)->getByType($reco_banner_type, 2); $books->transform(function ($item) { $result = $this->getBidCidFromUrl($item->redirect_url); $item->bid = $result['bid']; $item->cid = $result['cid']; if ($result['cid']) { $item->redirect_url = "views/Reader"; } else { $item->redirect_url = "views/Detail"; } return $item; }); }else{ $home = config('home.ycsd'); $banner = $home['reco_banner']; $books = $banner[$sex]; } //新判断: 根据包名来获取对应所需的bid $qapp_package = QappPackage::getPackageByPackage($package); if($qapp_package){ $package_id = $qapp_package->id; }else{ $package_id = 0; } \Log::info('un_send_order_book:package_id1:'.$package_id.' $package:'.$package); if(isset($user->uid) && !empty($user->uid)){ if(!$this->send_order_id || $this->send_order_id == 0 ){ \Log::info('un_send_order_book:uid:'.$this->uid.' $package:'.$package); $result = $this->getCheckBids($channel,$books,$package_id,$package); if(isset($result[1]['books']) && count((array)$result[1]['books']) > 1){ return response()->success($result); } $result = $this->getCheckBids($channel,$books,0,$package); return response()->success($result); }else{ $package_id = 0; } \Log::info('un_send_order_book:package_id2:'.$package_id.' $package:'.$package); }else{ $package_id = 0; } \Log::info('un_send_order_book:package_id3:'.$package_id.' $package:'.$package); $result = $this->getCheckBids($channel,$books,$package_id,$package); return response()->success($result); } /** * 根据包名 * @param $channel * @param $books * @param $package_id * @return array */ private function getCheckBids($channel,$books,$package_id,$package) { $isAuthor = check_qapp_auth($package_id,1); $hotBids = $this->getCheckBooks(QappRecommendService::getRecommendByPacketId($channel, 'hot',$package_id),$channel,$package,$isAuthor); $liveBids = $this->getCheckBooks(QappRecommendService::getRecommendByPacketId($channel, 'live',$package_id),$channel,$package,$isAuthor); $recomBids = $this->getCheckBooks(QappRecommendService::getRecommendByPacketId($channel, 'recom',$package_id),$channel,$package,$isAuthor); $newBids = $this->getCheckBooks(QappRecommendService::getRecommendByPacketId($channel, 'new_recom',$package_id),$channel,$package,$isAuthor); return array_filter([ ['type' => 'reco_banner', 'lable' => '首页banner', 'books' => $books], ['type' => 'hot', 'lable' => '热门书单', 'books' => collectionTransform(new BookTransformer, BookConfigService::getBooksByIds($hotBids))], ['type' => 'zhibo', 'lable' => '神书直播', 'books' => collectionTransform(new BookTransformer, BookConfigService::getBooksByIds($liveBids))], ['type' => 'recom', 'lable' => '小编精选', 'books' => collectionTransform(new BookTransformer, BookConfigService::getBooksByIds($recomBids))], ['type' => 'new_recom', 'lable' => '人气新书', 'books' => collectionTransform(new BookTransformer, BookConfigService::getBooksByIds($newBids))] ]); } /** * 检测并补充不满足条件的书籍id * @param $bid_list * @param $channel : 频道 * @param $package : 频道 * @return array */ private function getCheckBooks($bid_list,$channel,$package,$is_author) { $hidden_cp = getHiddenCp(); if($package !== 'com.beidao.kuaiying.zsy'){ $hidden_cp = array_merge($hidden_cp,['lianshang']); } //获取书本数量 $count = count($bid_list); if (!$is_author){ $where = [ ['book_configs.charge_type','!=','BOOK'], ['book_configs.cp_source','=','ycsd'], ]; }else{ $where = [ ['book_configs.charge_type','!=','BOOK'], ]; } //获取当前有效书本数量 $book_count = BookConfig::join('books', 'book_configs.bid', '=', 'books.id') ->leftjoin('book_categories', 'books.category_id', 'book_categories.id') ->whereIn('book_configs.bid',$bid_list) ->where('book_configs.is_on_shelf',2) ->where('book_configs.charge_type','!=','BOOK') ->whereNotIn('book_configs.cp_source',$hidden_cp) ->where($where) ->where('book_categories.pid',$channel) ->count(); if($count == $book_count){ return $bid_list; } //获取需要补充的书籍数量 $supplement_count = (($count - $book_count) > 0) ? $count - $book_count : 0; if($supplement_count <= 0){ return $bid_list; } //获取书籍交集bid,过滤掉不符合要求的书 $bids = BookConfig::join('books', 'book_configs.bid', '=', 'books.id') ->leftjoin('book_categories', 'books.category_id', 'book_categories.id') ->whereIn('book_configs.bid',$bid_list) ->where('book_configs.is_on_shelf',2) ->where($where) ->whereNotIn('book_configs.cp_source',$hidden_cp) ->where('book_categories.pid',$channel) ->pluck('book_configs.bid')->all(); $bid_list = array_intersect($bid_list,$bids); //获取随机的有效的书籍bid $rand_bid = BookConfig::join('books', 'book_configs.bid', '=', 'books.id') ->leftjoin('book_categories', 'books.category_id', 'book_categories.id') ->where('book_configs.is_on_shelf',2) // ->where('book_configs.charge_type','!=','BOOK') ->where($where) ->whereNotIn('book_configs.cp_source',$hidden_cp) ->where('book_categories.pid',$channel) ->inRandomOrder() ->limit($supplement_count) ->get()->pluck('bid')->toArray(); return array_filter(array_merge($bid_list,$rand_bid)); } private function getBidCidFromUrl(string $url) { if (preg_match('/\?bid=(\w+)\S+cid=(\w+)/', $url, $matches) || preg_match('/\?id=(\w+)/', $url, $matches)) { return [ 'bid' => $matches[1], 'cid' => isset($matches[2]) ? $matches[2] : 0, ]; } else { return [ 'bid' => '', 'cid' => 0, ]; } } public function library(Request $request) { $where = []; $order = []; $where['is_on_shelf'] = [2]; $category_id = $request->input('category_id'); if ($category_id) { if ($category_id == 1) { $where['channel_name'] = '男频'; } elseif ($category_id == 2) { $where['channel_name'] = '女频'; } else { $where['category_id'] = $category_id; } } $key = $request->input('key'); $uid = $request->input('uid', 0); if ($key && $uid && is_numeric($uid)) { BookConfigService::saveUserSearchLog($key, $uid); } $where['key'] = $key; $order_field = $request->input('order_field'); $order_seq = $request->input('order_seq'); if ($order_field != '' && in_array($order_field, ['recommend_index', 'click_count', 'update', 'size', 'create'])) { if ($order_field == 'update') { $order = ['book_configs.updated_at', 'desc']; } elseif ($order_field == 'create') { $order = ['book_configs.created_at', 'desc']; } else { $order = [$order_field, 'desc']; } if ($order_seq == 'asc') { $order = [$order_field, 'asc']; } if ($order_seq == 'desc') { $order = [$order_field, 'desc']; } } // 审核状态默认值 $package = $request->header('x-package', ''); $brand = $request->header('x-nbrand', ''); $codeVersion = $request->header('x-codeversion', ''); if ($order_field === 'recommend_index' && Utils::checkIsAudit($package, $brand, $codeVersion)) { $order = ['book_configs.bid', 'desc']; } // 是否只使用原创书殿的书 $isAuth = check_qapp_auth($package ,0); if (!$isAuth){ $where['cp_source'] = "ycsd"; } $status = $request->input('status'); if ($status != '') { $where['status'] = $status; } // 搜索关键词的情况下,屏蔽书籍完本状态 if ($key && isset($where['status'])) { unset($where['status']); } $page_size = $request->input('page_size', 15); $where['channel_id'] = ($package === 'com.beidao.kuaiying.zsy') ? 7477 : 0; $books = BookConfigService::getBooks($where, $order, $page_size); return response()->pagination(new BookTransformer, $books); } public function hotWords(Request $request) { $result = BookConfigService::findBookKeywords(); return response()->pagination(new KeywordTransformer, $result); } public function similarRecom(Request $request) { $package = $request->header('x-package', ''); $category_id = $request->input('category_id'); $bid = $request->input('bid'); $package = $request->header('x-package', ''); if (empty($bid) || (empty($category_id) && $category_id != 0)) { return response()->error('PARAM_ERROR'); } $isAuth = check_qapp_auth($package ,0); $bid = BookService::decodeBidStatic($bid); $where = ['category_id' => $category_id, 'is_on_shelf' => [2]]; if (!$isAuth){ $where['cp_source'] = "ycsd"; } $where['channel_id'] = ($package === 'com.beidao.kuaiying.zsy') ? 7477 : 0; $books = BookConfigService::getBooks($where, [], 4); $data = []; foreach ($books as $v) { if ($v->bid != $bid && count($data) < 3) { $data[] = $v; } } return response()->collection(new BookTransformer(), $data); } public function readOverRecommend(Request $request) { $bid = $request->input('bid'); if (empty($bid)) { return response()->error('PARAM_ERROR'); } $bid = BookService::decodeBidStatic($bid); $book_info = BookConfigService::getBookById($bid); $res = BookConfigService::getRecommendBooks($bid, $book_info->channel_name); $urge_status = 0; if ($book_info->status == 0 && !BookUrgeUpdateService::isHadUrged($this->uid, $bid)) { $urge_status = 1; } $recommend_result = collectionTransform(new BookTransformer(), $res); $book_status = [ 'status' => $book_info->status, 'urge_status' => $urge_status ]; $data = [ 'recommend_result' => $recommend_result, 'book_status' => $book_status ]; return response()->success($data); } public function rank(Request $request) { // 1:男频,2:女频 $sex = (int)$request->input('sex'); if (!in_array($sex, [1, 2], true)) { return response()->error('PARAM_ERROR'); } // 默认 $bids = [11529, 11941, 12720, 11990, 11988, 11976, 11977, 4183, 12717, 11833, 7287,14297,12716,14312,14000,13577,16712,13002,12717,15103,13928,14793, 12708,13286]; if ($sex === 2) { $bids = [8469, 11660, 9117, 7891, 12281, 12470, 8167, 11661, 11670, 8476, 8557, 11662, 11680, 11926, 12462, 7836, 11681, 11664, 11928, 8631]; } /** * pid:1为男频 2为女频 SELECT CONCAT( books.id, ',' ) FROM books LEFT JOIN book_configs ON books.id = book_configs.bid WHERE book_configs.is_on_shelf = 2 AND books.category_id IN ( SELECT id FROM book_categories WHERE pid = 2 ) ORDER BY book_configs.recommend_index DESC LIMIT 10; */ // 根据包名、平台、版本号判断是否审核 $package = $request->header('x-package', ''); $brand = $request->header('x-nbrand', ''); $codeVersion = $request->header('x-codeversion', ''); if (Utils::checkIsAudit($package, $brand, $codeVersion)) { $bids = [2266, 3838, 9700, 10175, 10301, 3422, 1166, 4546, 9163, 2509, 7287,14297,12716,14312,14000,13577,16712,13002,12717,15103,13928, 14793,12708,13286,13336,13275,13073,15121,13929,12693,13254,3526, 10313,3483,13278,14004,4098,10378,14072,21376,21139,21757,19449]; if ($sex === 2) { $bids = [159, 2439, 6276, 10074, 5409, 9379, 10323, 9078, 3603, 487]; } } $isAuth = check_qapp_auth($package,0); if (!$isAuth){ $rank = config('home.rank'); $bids = $rank['male']; if ($sex === 2) { $bids = $rank['female'];; } } $channel_id = ($package === 'com.beidao.kuaiying.zsy') ? 7477 : 0; $books = collectionTransform(new BookTransformer, BookConfigService::getBookLists(compact('bids','channel_id'))); return response()->success($books); } /** * 推荐书 */ public function recommen() { $reco_banner_type = ['FEMALE', 'PUBLIC']; $books = (new RecoBannerService)->getByType($reco_banner_type, 2); $books->transform(function ($item) { $result = $this->getBidCidFromUrl($item->redirect_url); $item->bid = $result['bid']; $item->cid = $result['cid']; if ($result['cid']) { $item->redirect_url = "views/Reader"; } else { $item->redirect_url = "views/Detail"; } return $item; }); return response()->success($books); } /** * 阅爱小说任务轮播图 */ public function recommenYueAi() { $data = config('home.yueai'); $books = $data['task_banner']; foreach ($books as &$value){ $value['bid'] =Hashids::encode($value['bid']); $value['redirect_url '] = empty($value['cid']) ? "views/Detail" : "views/Reader"; } unset($value); return response()->success($books); } /** * 限免 */ public function free(int $sex) { $result = BookConfigService::findFreeBooks($sex); return response()->success($result); } public function yueaiBackRecom(Request $request) { $package = $request->header('x-package', ''); if (empty($package) || $package != 'com.beidao.kuaiying.yueai') { return response()->error('PARAM_ERROR'); } $user = (new QappUserService)->getGolableUser(); if(isset($user->uid) && !empty($user->uid) && $user->send_order_id > 0){ $orderRecord = ChapterOrderService::hasUserRecord($user->uid); if($orderRecord){ $bid = [58238,60534,63220,14500,13254,63221,63548,14022,59334,58888,63417,61701]; $bid = array_random($bid,4); $books = BookConfigService::getBooksByIds($bid,[],false); return response()->collection(new BookTransformer(), $books); } } $where = ['is_on_shelf' => [2]]; $where['channel_id'] = ($package === 'com.beidao.kuaiying.zsy') ? 7477 : 0; $books = BookConfigService::getBooks($where, [], 4); return response()->collection(new BookTransformer(), $books); } public function shelfRecom(Request $request) { $category_id = $request->input('category_id'); $bid = $request->input('bid'); $package = $request->header('x-package', ''); if (empty($package) || $package != 'com.beidao.kuaiying.yueai') { return response()->success([]); } $user = (new QappUserService)->getGolableUser(); if(isset($user->uid) && !empty($user->uid) && $user->send_order_id > 0){ $orderRecord = ChapterOrderService::hasUserRecord($user->uid); if($orderRecord){ $bid = [58238,60534,63220,14500,13254,63221,63548,14022,59334,58888,63417,61701]; $bid = array_random($bid,4); $books = BookConfigService::getBooksByIds($bid,[],false); return response()->collection(new BookTransformer(), $books); } } $where = ['is_on_shelf' => [2]]; $where['channel_id'] = ($package === 'com.beidao.kuaiying.zsy') ? 7477 : 0; $books = BookConfigService::getBooks($where, [], 4); return response()->collection(new BookTransformer(), $books); } }