123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907 |
- <?php
- namespace App\Http\Controllers\Channel\Book;
- use App\Http\Controllers\Channel\BaseController;
- use App\Http\Controllers\Channel\Book\Transformers\BookTransformer;
- use App\Http\Controllers\Channel\Book\Transformers\BookV2Transformer;
- use App\Http\Controllers\Channel\Book\Transformers\ChapterListTransformer;
- use App\Modules\Book\Services\BookCategoryService;
- use App\Modules\Book\Services\BookConfigService;
- use App\Modules\Book\Services\BookSpecialChannelService;
- use App\Modules\Book\Services\BookSubscribleChapterService;
- use App\Modules\Book\Services\ChapterService;
- use App\Modules\Book\Services\SuperiorHistoryBookService;
- use App\Modules\Book\Services\SuperiorNewBookService;
- use App\Modules\Channel\Services\ChannelService;
- use App\Modules\SendOrder\Services\SendOrderService;
- use App\Modules\Channel\Services\CompanySpecialBookService;
- use App\Modules\Channel\Services\ChannelUserService;
- use App\Modules\Channel\Services\CompanyService;
- use App\Modules\Book\Models\BookOrderStatistical;
- use Hashids;
- use Illuminate\Http\Request;
- use Log;
- use Storage;
- use Illuminate\Support\Facades\Cache;
- use Redis;
- use DB;
- class BooksController extends BaseController
- {
- /**
- * @apiDefine Book 图书模块
- */
- /**
- * @apiVersion 1.0.0
- * @apiDescription 按bid获取图书详情
- * @api {get} book/getBookInfo 获取图书详情
- * @apiGroup Book
- * @apiParam {Number} bid 图书id
- * @apiName getBookInfo
- * @apiSuccess {int} code 状态码
- * @apiSuccess {String} msg 信息
- * @apiSuccess {object} data 结果集
- * @apiSuccess {Int} data.book_id bid
- * @apiSuccess {String} data.book_name 书名
- * @apiSuccess {String} data.book_summary 简介
- * @apiSuccess {String} data.book_author 作者
- * @apiSuccess {String} data.cover_url 封面
- * @apiSuccess {Int} data.book_word_count 字数
- * @apiSuccess {Int} data.book_chapter_total 章节数
- * @apiSuccess {Int} data.book_category_id 分类
- * @apiSuccess {String} data.book_category 分类名
- * @apiSuccess {Int} data.book_end_status 是否完结
- * @apiSuccess {String} data.book_published_time 发布时间
- * @apiSuccess {String} data.copyright 版权信息
- * @apiSuccess {Int} data.force_subscribe_chapter_seq 强制关注的章节序号
- * @apiSuccess {String} data.update_time 更新时间
- * @apiSuccess {Int} data.is_on_shelf 是否上架
- * @apiSuccess {Int} data.book_price 是否上架
- * @apiSuccess {String} data.charge_type 收费类型
- * @apiSuccess {String} data.keyword 关键词
- * @apiSuccess {String} data.recommend_index 推荐指数
- * @apiSuccess {String} data.is_show_index_content 是否显示推荐指数文本
- * @apiSuccess {Int} data.click_count 点击数
- * @apiSuccessExample {json} Success-Response:
- * {
- * "code": 0,
- * "msg": "",
- * "data": {
- * "book_id": 5,
- * "book_name": "肌缘巧合",
- * "book_summary": " 他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",
- * "book_author": "妖火",
- * "cover_url": "http://www.leyuee.com/cover/0/8.jpg",
- * "book_word_count": 0,
- * "book_chapter_total": 0,
- * "book_category_id": null,
- * "book_category": "爆笑,宠文,潜规则",
- * "book_end_status": 8,
- * "book_published_time": null,
- * "copyright": null,
- * "charge_type": null,
- * "force_subscribe_chapter_seq": 0,
- * "update_time": null,
- * "is_on_shelf": 0,
- * "book_price": null,
- * "keyword": "关键词",
- * "recommend_index":2,
- * "is_show_index_content":0,
- * "click_count":0
- * }
- * }
- */
- function getBookInfo(Request $request)
- {
- $bid = $request->has('bid') ? $request->input('bid') : '';
- if (empty($bid)) return response()->error("PARAM_EMPTY");
- $bid = Hashids::decode($bid)[0];
- $hidden_book = env('HIDE_BOOKS');
- if ($hidden_book) {
- $hidden_book_array = explode(',', $hidden_book);
- if (in_array($bid, $hidden_book_array)) {
- //return response()->error("PARAM_ERROR");
- }
- }
- $data = BookConfigService::getBookById($bid);
- $subscribe_chapter_seq = BookSubscribleChapterService::getSubcribleChapter($bid, $this->getChannelId());
- if ($subscribe_chapter_seq && $subscribe_chapter_seq->subscribe_chapter_id > 0) {
- $data->force_subscribe_chapter_seq = $subscribe_chapter_seq->subscribe_chapter_id;
- }
- $chapter = ChapterService::getChapterInfoByBidAndSeq($bid, $data->force_subscribe_chapter_seq);
- if ($chapter) {
- $data->force_subscribe_cid = $chapter->id;
- $data->force_subscribe_chapter_name = $chapter->name;
- }
- return response()->item(new BookTransformer(), $data);
- }
- /**
- * @apiVersion 1.0.0
- * @apiDescription 获取图书目录
- * @api {get} book/getBookDirectory 获取图书目录
- * @apiGroup Book
- * @apiName getBookDirectory
- * @apiParam {Int} bid 书本id
- * @apiParam {Int} page 页数
- * @apiParam {Int} pageSize 分页大小(默认15)
- * @apiSuccess {int} code 状态码
- * @apiSuccess {String} msg 信息
- * @apiSuccess {object} data 结果集
- * @apiSuccess {Array} data.list 分页结果集
- * @apiSuccess {Int} data.list.bid bid
- * @apiSuccess {Int} data.list.chapter_id 章节id
- * @apiSuccess {String} data.list.chapter_name 章节名称
- * @apiSuccess {Int} data.list.chapter_sequence 序号
- * @apiSuccess {Int} data.list.chapter_is_vip 是否vip
- * @apiSuccess {Int} data.list.chapter_size 章节大小
- * @apiSuccess {Int} data.list.prev_cid 上一章节id
- * @apiSuccess {Int} data.list.next_cid 下一章节
- * @apiSuccess {Int} data.list.dafault_subscribe 是否默认强关章节
- * @apiSuccess {Int} data.list.channel_subscribe 是否用户自定义强关章节
- * @apiSuccess {String} data.list.recent_update_at 更新时间
- * @apiSuccess {Int} data.list.is_recommend 是否是推荐章节
- * @apiSuccess {String} data.list.recommend_text 推荐内容
- * @apiSuccess {String} data.list.is_need_subscirbe 是否强制关注
- * @apiSuccess {object} data.meta 分页信息
- * @apiSuccess {Int} data.meta.total 总条数
- * @apiSuccess {Int} data.meta.per_page 每页条数
- * @apiSuccess {Int} data.meta.current_page 当前页
- * @apiSuccess {Int} data.meta.last_page 最后页
- * @apiSuccess {String} data.meta.next_page_url 下一页
- * @apiSuccess {String} data.meta.prev_page_url 上一页
- * @apiSuccessExample {json} Success-Response:
- * {
- * "code": 0,
- * "msg": "",
- * "data":
- * "pagination":[
- * {
- * "bid": 5,
- * "chapter_id": 5,
- * "chapter_name": "第1240章 不是我",
- * "chapter_sequence": 1239,
- * "chapter_is_vip": 1,
- * "chapter_size": 2422,
- * "prev_cid": 0,
- * "is_recommend": 1,
- * "recommend_text": "",
- * "next_cid": 0,
- * "recent_update_at": 2017-11-20 15:01:56,
- * "is_need_subscirbe": 1,
- * },
- * {
- * "bid": 5,
- * "chapter_id": 5,
- * "chapter_name": "第1240章 不是我",
- * "chapter_sequence": 1239,
- * "chapter_is_vip": 1,
- * "chapter_size": 2422,
- * "is_recommend": 1,
- * "recommend_text": "",
- * "prev_cid": 0,
- * "next_cid": 0,
- * "recent_update_at": 2017-11-20 15:01:56,
- * "is_need_subscirbe": 1,
- * },
- * ]
- * "meta":{
- * "total": 1253,
- * "per_page": 15,
- * "current_page": 1,
- * "last_page": 84,
- * "next_page_url": "http://myapi.cn/api/books/1/chapter?page=2",
- * "prev_page_url": ""
- * }
- * }
- */
- function getBookDirectory(Request $request)
- {
- $bid = $request->has('bid') ? $request->input('bid') : '';
- if (empty($bid)) return response()->error("PARAM_EMPTY");
- $bid = Hashids::decode($bid)[0];
- $pageSize = $request->has('pageSize') ? (int)$request->input('pageSize') : 15;
- $data = ChapterService::getChapterListsPage($bid, $pageSize);
- $book = BookConfigService::getBookById($bid);//force_subscribe_chapter_seq
- $subscribe_chapter_seq = BookSubscribleChapterService::getSubcribleChapter($bid, $this->getChannelId());
- $default_subscribe = $book->force_subscribe_chapter_seq;
- $channel_subscribe = 0;
- if ($subscribe_chapter_seq && $subscribe_chapter_seq->subscribe_chapter_id > 0) {
- $channel_subscribe = $subscribe_chapter_seq->subscribe_chapter_id;
- $book->force_subscribe_chapter_seq = $subscribe_chapter_seq->subscribe_chapter_id;
- }
- foreach ($data as &$item) {
- $item->dafault_subscribe = 0;
- $item->channel_subscribe = 0;
- if ($item->sequence == $default_subscribe) {
- $item->dafault_subscribe = 1;
- }
- if ($channel_subscribe && $item->sequence == $channel_subscribe) {
- $item->channel_subscribe = 1;
- }
- if ($item->sequence >= ($book->force_subscribe_chapter_seq)) {
- $item->is_need_subscirbe = 1;
- } else {
- $item->is_need_subscirbe = 0;
- }
- if ($item->id == $book->recommend_cid) {
- $item->is_recommend = 1;
- if (Storage::exists('RecommendChapterPositionWord.txt')) {
- $item->recommend_text = Storage::get('RecommendChapterPositionWord.txt');
- } else {
- $item->recommend_text = '建议此章节生成推广文案(原文转化率好)';
- }
- }
- }
- return response()->pagination(new ChapterListTransformer(), $data);
- }
- /**
- * @apiVersion 1.0.0
- * @apiDescription 获取分类
- * @api {get} book/getBookCategories 获取分类
- * @apiGroup Book
- * @apiName getBookCategories
- * @apiSuccess {int} code 状态码
- * @apiSuccess {String} msg 信息
- * @apiSuccess {object} data 结果集
- * @apiSuccessExample {json} Success-Response:
- * {
- * "code": 0,
- * "msg": "",
- * "data": [
- * {
- * "id": 1,
- * "name": "男频",
- * "children": [
- * {
- * "id": 7,
- * "name": "灵异鬼怪"
- * },
- * {
- * "id": 8,
- * "name": "历史穿越"
- * },
- * {
- * "id": 30,
- * "name": "青春爱情"
- * }
- * ]
- * },
- * {
- * "id": 2,
- * "name": "女频",
- * "children": [
- * {
- * "id": 26,
- * "name": "豪门总裁"
- * },
- * {
- * "id": 35,
- * "name": "民国爱情"
- * }
- * ]
- * }
- * ]
- * }
- */
- function getBookCategories(Request $request)
- {
- $res = BookCategoryService::getSecondCategories();
- $male = [];
- $female = [];
- foreach ($res as $v) {
- if ($v->channel_name == '男频') {
- $male[] = ['id' => $v->id, 'name' => $v->category_name];
- }
- if ($v->channel_name == '女频') {
- $female[] = ['id' => $v->id, 'name' => $v->category_name];
- }
- }
- $data = [
- ['id' => 1, 'name' => '男频', 'children' => $male],
- ['id' => 2, 'name' => '女频', 'children' => $female],
- ];
- //$data = BookCategoryService::getSecondCategories();
- return response()->success($data);
- }
- function getBookCategoriesV2(Request $request)
- {
- //$res = BookCategoryService::getSecondCategories();
- $female = [['id'=>13,'name'=>'豪门虐情'], ['id'=> 14,'name'=>'婚恋生活'] ,['id'=>18,'name'=>'穿越重生'], ['id'=>22,'name'=>'女生灵异']];
- $male = [
- ['id'=>4,'name'=>'都市艳遇'],
- ['id'=>5,'name'=>'兵王保镖'],
- ['id'=>8,'name'=>'风云职场'],
- ['id'=>12,'name'=>'悬疑灵异']
- ];
- $data = [
- ['id' => 1, 'name' => '男频', 'children' => $male],
- ['id' => 2, 'name' => '女频', 'children' => $female],
- ];
- //$data = BookCategoryService::getSecondCategories();
- return response()->success($data);
- }
- /**
- * @apiVersion 1.0.0
- * @apiDescription 根据分类id和关键词获取并按照推荐指数排序
- * @api {get} book/getPromotionBookList 获取图书列表
- * @apiParam {String} key
- * @apiParam {Int} category_id 分类id
- * @apiParam {String} order_field 排序字段(推荐指数:recommend_index|点击数:click_count)
- * @apiParam {String} order_seq 排序顺序(顺序:asc|逆序:desc)
- * @apiParam {Int} is_on_shelf 上架与否(0|1)
- * @apiParam {Int }pageSize 分页大小
- * @apiGroup Book
- * @apiName getPromotionBookList
- * @apiSuccess {int} code 状态码
- * @apiSuccess {String} msg 信息
- * @apiSuccess {object} data 结果集
- * @apiSuccess {Array} data.list 结果数据集
- * @apiSuccess {Int} data.list.book_id bid
- * @apiSuccess {String} data.list.book_name 书名
- * @apiSuccess {String} data.list.book_summary 简介
- * @apiSuccess {String} data.list.book_author 作者
- * @apiSuccess {String} data.list.cover_url 封面
- * @apiSuccess {Int} data.list.book_word_count 字数
- * @apiSuccess {Int} data.list.book_chapter_total 章节数
- * @apiSuccess {Int} data.list.book_category_id 分类
- * @apiSuccess {String} data.list.book_category 分类名
- * @apiSuccess {String} data.list.book_end_status 是否完结
- * @apiSuccess {String} data.list.promotion_count 推广次数
- * @apiSuccess {String} data.list.book_published_time 发布时间
- * @apiSuccess {String} data.list.copyright 版权信息
- * @apiSuccess {Int} data.list.force_subscribe_chapter_seq 强制关注的章节序号
- * @apiSuccess {String} data.list.update_time 更新时间
- * @apiSuccess {Int} data.list.is_on_shelf 是否上架
- * @apiSuccess {String} data.list.book_price 价格
- * @apiSuccess {String} data.list.recommend_index 推荐指数
- * @apiSuccess {Int} data.list.charge_type 收费类型(BOOK: 按本收费,CHAPTER: 按章收费)
- * @apiSuccess {Int} data.list.keyword 关键词
- * @apiSuccess {Int} data.list.is_show_index_content 是否显示推荐指数文本
- * @apiSuccess {Int} data.list.click_count 点击数
- * @apiSuccess {object} data.meta 分页信息
- * @apiSuccess {Int} data.meta.total 总条数
- * @apiSuccess {Int} data.meta.per_page 每页条数
- * @apiSuccess {Int} data.meta.current_page 当前页
- * @apiSuccess {Int} data.meta.sex_preference 性别偏好
- * @apiSuccess {Int} data.meta.last_page 最后页
- * @apiSuccess {String} data.meta.next_page_url 下一页
- * @apiSuccess {String} data.meta.prev_page_url 上一页
- * @apiSuccessExample {json} Success-Response:
- * {
- * "code": 0,
- * "msg": "",
- * "data": {
- * "list": [
- * {
- * "book_id": 5,
- * "book_name": "肌缘巧合",
- * "book_summary": " 他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",
- * "book_author": "妖火",
- * "cover_url": "http://www.leyuee.com/cover/0/8.jpg",
- * "book_word_count": 0,
- * "book_chapter_total": 0,
- * "book_category_id": null,
- * "book_category": "爆笑,宠文,潜规则",
- * "book_end_status": 8,
- * "promotion_count": 12,
- * "sex_preference":"女频",
- * "book_published_time": null,
- * "copyright": null,
- * "charge_type": null,
- * "force_subscribe_chapter_seq": 0,
- * "update_time": null,
- * "is_on_shelf": 1,
- * "book_price": null,
- * "keyword": "温馨,虐心,清水",
- * "recommend_index":2,
- * "is_show_index_content":0,
- * "click_count":0
- * },
- * ],
- * "meta": {
- * "total": 18,
- * "per_page": 15,
- * "current_page": 1,
- * "last_page": 2,
- * "next_page_url": "http://myapi.cn/api/hotrank/books?page=2",
- * "prev_page_url": ""
- * }
- * }
- * }
- */
- public function getPromotionBookList(Request $request)
- {
- $channel_id = $this->getChannelId();
- $channel_user = ChannelService::getUserIdById($channel_id);
- $channel_user_id = $channel_user->channel_user_id;
- $channel_user_info = ChannelUserService::getById($channel_user_id);
- // $is_important_channel = ChannelUserService::getImpotantById($channel_user_id)->is_important;
- // if (1 == $is_important_channel) {
- // $where['is_on_shelf'] = [2, 1];
- // } else {
- // $where['is_on_shelf'] = [2];
- // }
- $bids = [];
- if ($channel_user_info && !empty($channel_user_info->company_id)) {
- $bids = CompanySpecialBookService::getBidByCompany($channel_user_info->company_id);
- }
- $hidden_book = env('HIDE_BOOKS');
- if ($hidden_book) {
- $hidden_book_array = explode(',', $hidden_book);
- $where['hidden_books'] = $hidden_book_array;
- if ($bids) {
- $bids = array_diff($bids, $hidden_book_array);
- }
- }
- //$bids = BookSpecialChannelService::getBids($channel_user_id);
- $where['is_on_shelf'] = [2];
- $category_id = $request->input('category_id');
- if ($request->has('key') && trim($request->input('key'))) $where['key'] = trim($request->input('key'));
- if ($category_id) {
- if ($category_id == 1) {
- $where['channel_name'] = '男频';
- } elseif ($category_id == 2) {
- $where['channel_name'] = '女频';
- } else {
- $where['category_id'] = $category_id;
- }
- }
- $order_field = $request->input('order_field');
- $order_seq = $request->input('order_seq', 'desc');
- if ($order_field) {
- $order = ['book_configs.recommend_index', $order_seq];
- } else {
- $order = ['book_configs.id', $order_seq];
- }
- $data = BookConfigService::getPromotionBooks($where, $bids, $order);
- if (!empty($data)) {
- foreach ($data as $item) {
- $item->promotion_count = SendOrderService::getPromotionCountByBid($item->bid, $channel_id);
- }
- }
- return response()->pagination(new BookTransformer(), $data);
- }
- /**
- * @apiVersion 1.0.0
- * @apiDescription 小说推广
- * @api {get} book/getPromotionBookListV2 小说推广
- * @apiParam {String} [key] 关键词
- * @apiParam {Int} [category_id] 类型
- * @apiParam {String} [order_field] 排序字段 (全站指数,)
- * @apiParam {String} [order_type] 顺序(asc)or倒叙(desc) 默认倒叙
- * @apiParam {Int} [sex] 1:女频,2:男频
- * @apiParam {Int} [status] 0:连载,1:完结
- * @apiParam {String} [recommend_index] 编辑评分 (A,B,C...)
- * @apiParam {Int} [onshelf] 上架时间 (一周:7,一月:30,..:90)
- * @apiParam {Int} [size] 字数 (200万以上:1,100-200:2,3,4,5:长篇,6,短篇)
- * @apiParam {Int} [own_score] 自主评级 (A,B,)
- * @apiGroup Book
- * @apiName getPromotionBookListV2
- * @apiSuccess {int} code 状态码
- * @apiSuccess {String} msg 信息
- * @apiSuccess {object} data 结果集C
- * @apiSuccess {Array} data.list 结果数据集
- * @apiSuccess {Int} data.list.book_id bid
- * @apiSuccess {String} data.list.book_name 书名
- * @apiSuccess {String} data.list.cover_url 封面
- * @apiSuccess {String} data.list.book_category 类型
- * @apiSuccess {String} data.list.book_end_status 完结状态
- * @apiSuccess {String} data.list.recommend_index 编辑评级
- * @apiSuccess {String} data.list.sex_preference 性别
- * @apiSuccess {String} data.list.total_send_order_sum 全站派单指数
- * @apiSuccess {String} data.list.week_send_order_sum 7天派单指数
- * @apiSuccess {String} data.list.read_deep 深度阅读
- * @apiSuccess {String} data.list.channel_send_order_sum 我的派单
- * @apiSuccess {String} data.list.own_score 自主评级
- * @apiSuccess {String} data.list.word_size 字数
- * @apiSuccess {String} data.list.chapter_type 长篇or短片
- * @apiSuccess {String} data.list.on_shelf_time 上架时间
- * @apiSuccess {object} data.meta 分页信息
- * @apiSuccess {Int} data.meta.total 总条数
- * @apiSuccess {Int} data.meta.per_page 每页条数
- * @apiSuccess {Int} data.meta.current_page 当前页
- * @apiSuccess {Int} data.meta.sex_preference 性别偏好
- * @apiSuccess {Int} data.meta.last_page 最后页
- * @apiSuccess {String} data.meta.next_page_url 下一页
- * @apiSuccess {String} data.meta.prev_page_url 上一页
- * @apiSuccessExample {json} Success-Response:
- * {
- * "code": 0,
- * "msg": "",
- * "data": {
- * "list": [
- * {
- * "book_id": 5,
- * "book_name": "肌缘巧合",
- * },
- * ],
- * "meta": {
- * "total": 18,
- * "per_page": 15,
- * "current_page": 1,
- * "last_page": 2,
- * "next_page_url": "http://myapi.cn/api/hotrank/books?page=2",
- * "prev_page_url": ""
- * }
- * }
- * }
- */
- public function getPromotionBookListV2(Request $request)
- {
- $data = [];
- $where = [];
- $orwhere = [];
- $channel_id = $this->getChannelId();
- $data['distribution_channel_id'] = $channel_id;
- $channel_user = ChannelService::getUserIdById($channel_id);
- $channel_user_id = $channel_user->channel_user_id;
- $channel_user_info = ChannelUserService::getById($channel_user_id);
- //获取重点渠道的额外书单
- $bids = [];
- if ($channel_user_info && !empty($channel_user_info->company_id)) {
- $bids = CompanySpecialBookService::getBidByCompany($channel_user_info->company_id);
- }
- //隐藏的图书,搜不到,但不影响阅读
- $hidden_book = env('HIDE_BOOKS');
- $whereIn = [];
- if ($hidden_book) {
- $hidden_book_array = explode(',', $hidden_book);
- $whereIn = $hidden_book_array;
- if ($bids) {
- $bids = array_diff($bids, $hidden_book_array);
- }
- }
- //性别
- $sex = $request->get('sex', 0);
- if ($sex && in_array($sex, [1, 2])) {
- $sex_str = ['', '男频', '女频'];
- $where[] = ['book_categories.channel_name', '=', $sex_str[$sex]];
- //$orwhere[] = ['book_categories.channel_name', '=', $sex_str[$sex]];
- }
- //自主评级
- $own_score = $request->get('own_score');
- if ($own_score && in_array($own_score, range('A', 'Z'))) {
- $where[] = ['book_channel_scores.score', '=', $own_score];
- //$orwhere[] = ['book_channel_scores.score', '=', $own_score];
- }
- //编辑评分
- $score = $request->get('recommend_index');
- if ($score && in_array($score, ['A', 'B', 'C', 'S', 'D', 'SS', 'A+']) && !$own_score) {
- $score_number = ['SS' => [100, 110], 'S' => [95, 99], 'A+' => [90, 94], 'A' => [85, 89], 'B' => [80, 84], 'C' => [70, 79], 'D' => [0, 69]];
- $where[] = ['book_configs.recommend_index', '>=', $score_number[$score][0]];
- //$orwhere[] = ['book_configs.recommend_index', '>=', $score_number[$score][0]];
- $where[] = ['book_configs.recommend_index', '<=', $score_number[$score][1]];
- //$orwhere[] = ['book_configs.recommend_index', '<=', $score_number[$score][1]];
- }
- //上架时间
- $onshelf = $request->get('onshelf');
- if ($onshelf && in_array($onshelf, [7, 30, 90])) {
- $where[] = ['book_configs.created_at', '>=', date('Y-m-d H:i:s', time() - $onshelf * 86400)];
- //$orwhere[] = ['book_configs.created_at', '>=', date('Y-m-d H:i:s', time() - $onshelf * 86400)];
- }
- //分类
- $category_id = $request->get('category_id');
- if ($category_id) {
- $where[] = ['books.category_id', '=', $category_id];
- //$orwhere[] = ['books.category_id', '=', $category_id];
- }
- //字数
- $size = $request->get('size');
- if ($size && in_array($size, [1, 2, 3, 4, 5, 6])) {
- $size_arr = [[], [200, -1], [100, 200], [20, 100], [0, 20], [20, -1], [0, 20]];
- $where[] = ['books.size', '>=', $size_arr[$size][0] * 10000];
- //$orwhere[] = ['books.size', '>=', $size_arr[$size][0] * 10000];
- if ($size_arr[$size][1] != -1) {
- $where[] = ['books.size', '<=', $size_arr[$size][1] * 10000];
- // $orwhere[] = ['books.size', '<=', $size_arr[$size][1] * 10000];
- }
- }
- //状态
- $status = $request->get('status', -1);
- if (in_array($status, [0, 1])) {
- $where[] = ['books.status', '=', $status];
- //$orwhere[] = ['books.status', '=', $status];
- }
- $key = $request->get('key','');
- if ($key) {
- $key = trim($key);
- //$where[] = ['book_configs.book_name', 'like', '%' . $key . '%'];
- //$orwhere[] = ['book_configs.book_name', 'like', '%' . $key . '%'];
- }
- //$superior_orwhere = [];
- /*$where[] = ['book_configs.is_on_shelf', '=', 2];
- //$is_on_shelf =2;
- if ($bids) {
- $orwhere[] = ['book_configs.is_on_shelf', '=', 1];
- //$superior_orwhere[] = ['book_configs.is_on_shelf', '=', 1];
- //$orwhere[] = ['book_configs.bid','in','('.implode(',',$bids).')'];
- } else {
- $orwhere = [];
- }*/
- //优质书库
- $Superior = $request->input('superior',0);
- //\Log::info('superior:'.$Superior);
- //$Superior = $request->input('superior',0);
- $whereDeedIn = [];
- $superior_lib = '';
- //排序
- $order_field = $request->get('order_field','');
- $order_type = $request->get('order_type', 'desc');
- //$data['order_field'] = 'book_configs.recommend_index';
- // $data['order_type'] = 'desc';
- if ($order_field && in_array($order_field, ['order_index','recommend_index', 'total_send_order_sum', 'week_send_order_sum', 'read_deep', 'channel_send_order_sum', 'own_score'])) {
- $data['order_field'] = $order_field;
- if (!in_array($order_type, ['asc', 'desc'])) {
- $order_type = 'desc';
- }
- $data['order_type'] = $order_type;
- }
- if($Superior==1){
- $history_lib = SuperiorHistoryBookService::getSupriorBidList();
- //array_merge($whereIn,$his);
- $whereDeedIn=count($history_lib)>0?$history_lib:[0];
- $superior_lib = 'superior_history_book';
- $data['order_field'] = 'order_index';
- //$superior_orwhere[] = ['book_configs.bid', 'in', $whereDeedIn];
- }
- if($Superior==2){
- $new_lib = SuperiorNewBookService::getSupriorBidList();
- //array_merge($whereIn,$his);
- $whereDeedIn=count($new_lib)>0?$new_lib:['-1'];
- $superior_lib = 'superior_new_book';
- $data['order_field'] = 'superior_new_book.order_index';
- $data['order_type'] = 'desc';
- //$superior_orwhere[] = ['book_configs.bid', 'in', $whereDeedIn];
- }
- if($Superior==3){
- $where[]=['book_configs.is_current_week_promotion','=',1];
- $data['order_field'] = 'recommend_index';
- $data['order_type'] = 'desc';
- }
- if($Superior ==1) $data['order_type'] = 'asc';
- $result = BookConfigService::getPromotionBooksV2($where, $whereIn, $data, $bids, $whereDeedIn,$superior_lib,$key);
- if ($result) {
- $total_send_order = (int)DB::table('send_orders')->max('id');
- $week_send_order = (int)DB::table('send_orders')->where('created_at', '>=', date('Y-m-d', strtotime('-7 day')))->count();
- foreach ($result as &$v) {
- if ($total_send_order > 0) {
- $rate = (round($v->total_send_order_sum / $total_send_order, 4)) * 10000;
- $v->total_send_order_sum = $this->sendOrderIndex($rate);
- }
- $v->week_send_order_bid = $v->week_send_order_sum;
- if ($week_send_order > 0) {
- $rate = (round($v->week_send_order_sum / $week_send_order, 4)) * 10000;
- $v->week_send_order_sum = $this->sendOrderIndex($rate);
- }
- $v->week_send_order = $week_send_order;
- }
- }
- return response()->pagination(new BookV2Transformer(), $result);
- }
- private function sendOrderIndex($rate)
- {
- if ($rate < 1) {
- return 60;
- }
- if ($rate >= 200) {
- return 100;
- } elseif ($rate >= 100) {
- return 98;
- } elseif ($rate >= 60) {
- return 96;
- } else {
- if ($rate >= 10) {
- return 96 - ceil((60 - $rate) / 10) * 2;
- } else {
- return 96 - 12 - ceil((10 - $rate)) * 2;
- }
- }
- }
- /**
- * @apiVersion 1.0.0
- * @apiDescription 排行榜
- * @api {get} book/getRanks 排行榜
- * @apiParam {String} type 类型{new:新书榜,sale_total:销售总榜,sale_half_month:半月榜,recommend:编辑推荐}
- * @apiGroup Book
- * @apiName getRanks
- * @apiSuccess {int} code 状态码
- * @apiSuccess {String} msg 信息
- * @apiSuccess {object} data 结果集
- * @apiSuccess {Int} data.book_id bid
- * @apiSuccess {String} data.book_name 书名
- * @apiSuccess {String} data.book_summary 简介
- * @apiSuccess {String} data.book_author 作者
- * @apiSuccess {String} data.cover_url 封面
- * @apiSuccess {Int} data.book_word_count 字数
- * @apiSuccess {Int} data.book_chapter_total 章节数
- * @apiSuccess {Int} data.book_category_id 分类
- * @apiSuccess {String} data.book_category 分类名
- * @apiSuccess {String} data.book_end_status 是否完结
- * @apiSuccess {String} data.promotion_count 推广次数
- * @apiSuccess {String} data.book_published_time 发布时间
- * @apiSuccess {String} data.copyright 版权信息
- * @apiSuccess {Int} data.force_subscribe_chapter_seq 强制关注的章节序号
- * @apiSuccess {String} data.update_time 更新时间
- * @apiSuccess {Int} data.is_on_shelf 是否上架
- * @apiSuccess {String} data.book_price 价格
- * @apiSuccess {String} data.recommend_index 推荐指数
- * @apiSuccess {Int} data.charge_type 收费类型(BOOK: 按本收费,CHAPTER: 按章收费)
- * @apiSuccess {Int} data.keyword 关键词
- * @apiSuccess {Int} data.is_show_index_content 是否显示推荐指数文本
- * @apiSuccess {Int} data.click_count 点击数
- * @apiSuccessExample {json} Success-Response:
- * {
- * "code": 0,
- * "msg": "",
- * "data": {
- * [
- * {
- * "book_id": 5,
- * "book_name": "肌缘巧合",
- * "book_summary": " 他是权势倾天,纵横商界的王者,却偏偏钟情于她,一宠成瘾。“女人,我要你......只要你能满足我,别墅、游轮、支票,你随便挑。”她羞涩的半低着头:“我只想要你。”他挑眉,“你野心不小啊!”她妩媚一笑,解开他的领带,“难道你不愿意!”他宠她爱她,给她所有想要的。只是有一天她终于忍不住暴走,“靠,你有没有节制呀?我要离婚。”",
- * "book_author": "妖火",
- * "cover_url": "http://www.leyuee.com/cover/0/8.jpg",
- * "book_word_count": 0,
- * "book_chapter_total": 0,
- * "book_category_id": null,
- * "book_category": "爆笑,宠文,潜规则",
- * "book_end_status": 8,
- * "promotion_count": 12,
- * "sex_preference":"女频",
- * "book_published_time": null,
- * "copyright": null,
- * "charge_type": null,
- * "force_subscribe_chapter_seq": 0,
- * "update_time": null,
- * "is_on_shelf": 1,
- * "book_price": null,
- * "keyword": "温馨,虐心,清水",
- * "recommend_index":2,
- * "is_show_index_content":0,
- * "click_count":0
- * },
- * ]
- * }
- * }
- */
- function getRanks(Request $request)
- {
- $type = $request->input('type');
- if (!$type) {
- return response()->error("PARAM_EMPTY");
- }
- $flush = $request->input('flush');
- $book = [];
- $channel_user_id = $this->getChannelUserId();
- $channel_user_info = ChannelUserService::getById($channel_user_id);
- $company = CompanyService::getCompany($channel_user_info->company_id);
- $on_shelf = [2];
- $important = 'unimportant';
- $important_books = null;
- if ($company && $company->is_important == 1) {
- $bids = [];
- $bids = CompanySpecialBookService::getBidByCompany($channel_user_info->company_id);
- //隐藏的图书,搜不到,但不影响阅读
- $hidden_book = env('HIDE_BOOKS');
- if ($hidden_book) {
- $hidden_book_array = explode(',', $hidden_book);
- if ($bids) {
- $bids = array_diff($bids, $hidden_book_array);
- }
- }
- if ($bids) {
- $important_books = BookConfigService::getBooksByIds($bids, ['book_configs.created_at', 'desc']);
- }
- $important = 'important';
- }
- $key = 'channel_book_rank_' . $type . '_' . $important;
- if ($flush == 1) {
- Cache::forget($key);
- }
- $cache = Cache::get($key, []);
- if ($cache) {
- $cache = json_decode($cache);
- return response()->collection(new BookTransformer(), $cache);
- }
- switch ($type) {
- case 'new':
- $order = [['book_configs.created_at', 'desc'], ['book_configs.recommend_index', 'desc']];
- $book = BookConfigService::getBooksNoPage([], $order, $on_shelf, 20);
- $book = $this->sortBooks($important_books, $book);
- break;
- case 'sale_total';
- $start = date('Y-m') . '-01';
- $end = date('Y-m-d');
- $bids = BookOrderStatistical::getTopSaleBooks($start, $end, $on_shelf, 20);
- $id = [];
- foreach ($bids as $v) {
- $id[] = $v->bid;
- }
- if ($id) {
- $book = BookConfigService::getBooksByIds($id);
- }
- break;
- case 'sale_half_month':
- $start = date('Y-m-d', strtotime('-14 day'));
- $end = date('Y-m-d');
- $bids = BookOrderStatistical::getTopSaleBooks($start, $end, $on_shelf, 10);
- $id = [];
- foreach ($bids as $v) {
- $id[] = $v->bid;
- }
- if ($id) {
- $book = BookConfigService::getBooksByIds($id);
- }
- break;
- case 'recommend':
- $id_arr = env('CHANNEL_RECOMMEND_BIDS', '');
- $redis_field = 'unimportant';
- if ($important == 'important') {
- $redis_field = 'important';
- $id_arr = env('CHANNEL_RECOMMEND_IMPORTANT_BIDS', '');
- }
- $ids = Redis::hget('channel_recomm_books', $redis_field);
- if ($ids) $id_arr = $ids;
- if ($id_arr) {
- $book = BookConfigService::getBooksByIds(explode(',', $id_arr));
- }
- break;
- }
- if ($book) {
- Cache::put($key, json_encode($book), 60);
- }
- return response()->collection(new BookTransformer(), $book);
- }
- private function sortBooks($book1, $book2)
- {
- if (!$book1)
- return $book2;
- $book1 = $book1->filter(function ($value) {
- return $value->is_on_shelf = 1;
- });
- return $book2->concat($book1)->sortByDesc('created_at')->slice(0, 20);
- }
- }
|