GussNovelService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Elton
  5. * Date: 2019/9/7
  6. * Time: 11:39
  7. */
  8. namespace app\common\service;
  9. use app\common\library\Redis;
  10. use think\Cache;
  11. class GussNovelService
  12. {
  13. private static $self;
  14. public static function instance()
  15. {
  16. if(self::$self == null){
  17. self::$self = new self();
  18. }
  19. return self::$self;
  20. }
  21. public function getNovelEndRecommendModel(){
  22. return model('NovelEndRecommend');
  23. }
  24. /**
  25. * 猜猜你喜欢,获取书籍
  26. * @param string $sex 性别 0=未知,1=男性,2=女性
  27. * @param int $num 书籍数量
  28. * @return array|false|mixed|\PDOStatement|string|\think\Collection
  29. * @throws \think\db\exception\DataNotFoundException
  30. * @throws \think\db\exception\ModelNotFoundException
  31. * @throws \think\exception\DbException
  32. */
  33. public function getLikedNovels($sex = '1', $num = 4,$isWater=false)
  34. {
  35. $novelsFileCacheKey = $isWater ? 'NFCK:W:' . $sex : 'NFCK:' . $sex;
  36. if ($novels = Cache::get($novelsFileCacheKey)) {
  37. if ($novels === 1) {
  38. LogService::info('novels_file缓存命中,内容空');
  39. return [];
  40. } else {
  41. LogService::info('novels_file缓存命中');
  42. return $novels;
  43. }
  44. }
  45. $novels = $this->getNovelEndRecommendModel()->getBooksBySex($sex,$isWater);
  46. // 今日阅读数
  47. $bookNumKey = 'B-N';
  48. // 获取测书书库中书籍ids
  49. $novelsBookIds = [];
  50. $data = [];
  51. if ( !empty( $novels ) ) {
  52. $novelsBookIds = array_column( $novels, 'book_id' );
  53. $books = model('Book')->getBooksInfo( $novelsBookIds );
  54. $booksInfo = [];
  55. if( !empty($books) ){
  56. foreach ($books as $k => $v){
  57. // 如果书籍已经入库,则不显示
  58. if($v['state'] != -1){
  59. $booksInfo[$v['id']] = $v;
  60. }
  61. }
  62. }
  63. foreach ($novels as $key=>$book) {
  64. //没有bookInfo 的去掉
  65. if ( !isset( $booksInfo[$book['book_id']] ) ){
  66. continue;
  67. }
  68. $bookInfo = $booksInfo[$book['book_id']];
  69. $book = array_merge($book, $bookInfo);
  70. $data[] = $book;
  71. }
  72. }
  73. // B-N + read_num
  74. // 根据阈值去重, 书籍点击率大于推荐书籍阈值,剔除
  75. // if ($novels) {
  76. // foreach ($novels as $key=>$book) {
  77. // // 排重
  78. // if($book_id == $book['book_id']){
  79. // unset($novels[$key]);
  80. // }
  81. // if(($book['read_num'] + $book['bn_num']) >= $book['click_threshold']){
  82. // unset($novels[$key]);
  83. // }
  84. // }
  85. // }
  86. if ($data) {
  87. //wudd 跟阅读记录过滤互斥书籍
  88. // $data = BookRelationService::instance()->filterLikeBookRelation($data, $num);
  89. $data = array_slice($data, 0, $num);
  90. }
  91. if ($data && !empty($data)) {
  92. LogService::info('novels_redis缓存命中');
  93. cache::set($novelsFileCacheKey, $data, 600);
  94. } else {
  95. LogService::info('novels_redis缓存命中,内容空');
  96. cache::set($novelsFileCacheKey, 1, 600);
  97. }
  98. return $data;
  99. }
  100. /**
  101. * 将数组中的某个值作为KEY
  102. * @param $arr
  103. * @param $keyname
  104. * @return array
  105. */
  106. private function _convertArr($arr, $keyname)
  107. {
  108. $res = [];
  109. if ($arr && is_array($arr)) {
  110. foreach ($arr as $key => $item) {
  111. $res[$item[$keyname]] = $item;
  112. }
  113. }
  114. return $res;
  115. }
  116. }