error('PARAM_ERROR'); } $this->book_info = $book_info; $lists = $this->getChapterCatalog($bid, $lists, $book_info); return response()->collection(new ChapterListTransformer, $lists); } public function getCatalogPerPage(Request $request, $bid) { $bid = BookService::decodeBidStatic($bid); $book_info = BookConfigService::getBookById($bid); if (!$book_info) { return response()->error('PARAM_ERROR'); } $this->book_info = $book_info; $page_size = $request->input('page_size', 15); // if ($page_size >= 100) $page_size = 100; if ($page_size >= 20) $page_size = 20; // $page_size = 15; $res = ChapterService::getChapterListsPage($bid, $page_size); $lists = $this->getChapterCatalog($bid, $res, $book_info); return response()->pagination(new ChapterListTransformer, $lists); } private function getChapterCatalog(int $bid, $chapters, $book_info) { // 查询书籍是否限免 $isFree = BookConfigService::judgeBookIsFree($bid); //渠道自定义vip章节 //$vip_sequence = Redis::hget('channel:chapterfee:setting:' . $this->distribution_channel_id, $bid); $vip_sequence = BookService::getVipSequence($bid, $this->distribution_channel_id, $this->send_order_id); list($is_split, $is_change_chapter_name) = BookService::splitContent($bid); $change_chapter_name = 0; if ($is_split && ($book_info->channel_name == '男频' || $is_change_chapter_name)) { $change_chapter_name = 1; } $account = $this->getAccount(); switch ($book_info->charge_type) { case 'BOOK': $price = $this->getPriceNew($book_info, 0, $account); $is_need_charge = $this->isBookNeedCharge($bid, $price); foreach ($chapters as $v) { $v->next_chapter_status = 0; $v->next_price = 0; $v->is_need_charge = $v->is_vip ? $is_need_charge : false; $v->price = $price; // 限免判断 if ($isFree) { $v->is_need_charge = false; $v->price = 0; } if ($vip_sequence) { if ($v->sequence >= $vip_sequence) { $v->is_vip = 1; } else { $v->is_vip = 0; } } //拆章 if ($change_chapter_name) { $v->name = '第' . $v->sequence . '章'; } } break; default: $chapterIds = $this->getChapterIds($chapters); $rules = ['check' => 0, 'paycid' => []]; if (!$isFree && !empty($chapterIds)) { $rules = $this->getHandelData($bid, $chapterIds); } foreach ($chapters as $v) { if ($vip_sequence) { if ($v->sequence >= $vip_sequence) { $v->is_vip = 1; } else { $v->is_vip = 0; } } // 限免判断 if ($isFree) { $v->is_need_charge = false; $v->price = 0; } else { $v->price = $v->is_vip ? $this->getPriceNew($book_info, $v->size, $account) : 0; $v->is_need_charge = $v->is_vip ? $this->isChapterNeedChargeNew($v->id, $rules, $v->price) : false; } // //下一章付费信息 $v->next_chapter_status = 0; $v->next_price = 0; // if($v->is_vip){ // if(in_array($v->next_price,$chapterIds)){ // // }else{ // $next_chapter_order_status = $this->nextChapterOrderStatus($bid,$v->next_cid); // $v->next_chapter_status = $next_chapter_order_status['next_chapter_status']; // $v->next_price = $next_chapter_order_status['next_price']; // } // // } $v->next_chapter_status = $this->isSubscribe($v->id, $rules); $v->next_price = $v->price; //拆章 if ($change_chapter_name) { $v->name = '第' . $v->sequence . '章'; } } break; } return $chapters; } private function getChapterCatalogOld(int $bid, $chapters, $book_info) { // 查询书籍是否限免 $isFree = BookConfigService::judgeBookIsFree($bid); //渠道自定义vip章节 //$vip_sequence = Redis::hget('channel:chapterfee:setting:' . $this->distribution_channel_id, $bid); $vip_sequence = BookService::getVipSequence($bid, $this->distribution_channel_id, $this->send_order_id); list($is_split, $is_change_chapter_name) = BookService::splitContent($bid); $change_chapter_name = 0; if ($is_split && ($book_info->channel_name == '男频' || $is_change_chapter_name)) { $change_chapter_name = 1; } switch ($book_info->charge_type) { case 'BOOK': $price = $this->getPrice($book_info); $is_need_charge = $this->isBookNeedCharge($bid, $price); foreach ($chapters as $v) { $v->next_chapter_status = 0; $v->next_price = 0; $v->is_need_charge = $v->is_vip ? $is_need_charge : false; $v->price = $price; // 限免判断 if ($isFree) { $v->is_need_charge = false; $v->price = 0; } if ($vip_sequence) { if ($v->sequence >= $vip_sequence) { $v->is_vip = 1; } else { $v->is_vip = 0; } } //拆章 if ($change_chapter_name) { $v->name = '第' . $v->sequence . '章'; } } break; default: foreach ($chapters as $v) { if ($vip_sequence) { if ($v->sequence >= $vip_sequence) { $v->is_vip = 1; } else { $v->is_vip = 0; } } // 限免判断 if ($isFree) { $v->is_need_charge = false; $v->price = 0; } else { $v->price = $v->is_vip ? $this->getPrice($book_info, $v->size) : 0; $v->is_need_charge = $v->is_vip ? $this->isChapterNeedCharge($bid, $v->id, $v->price) : false; } //下一章付费信息 $v->next_chapter_status = 0; $v->next_price = 0; if ($v->is_vip) { $next_chapter_order_status = $this->nextChapterOrderStatus($bid, $v->next_cid); $v->next_chapter_status = $next_chapter_order_status['next_chapter_status']; $v->next_price = $next_chapter_order_status['next_price']; } //拆章 if ($change_chapter_name) { $v->name = '第' . $v->sequence . '章'; } } break; } return $chapters; } public function index(Request $request, $bid, $cid) { $send_order_id = $request->header('send_order_id', ''); $package = $request->header('x-package', ''); //每次绑定用户和派单的关系 $this->bindSendOrderId($this->uid, $send_order_id); $oldbid = $bid; $bid = BookService::decodeBidStatic($bid); //获取图书信息 $book_info = BookConfigService::getBookById($bid); if (empty($book_info)) return response()->error('QAPP_SYS_ERROR'); $this->book_info = $book_info; $book_auth = BookConfigService::bookCopyright($bid, $this->distribution_channel_id); if ($book_auth == 2) { return response()->error('QAPP_OFF_SHELF'); } //yuyuedu、xinghe 快应用这两个cp的书屏蔽下 wutong,wutong2,wutong3下所有内容都不放快应用 if (in_array($book_info->cp_source, getHiddenCp($package)) && $book_auth != 1) { return response()->error('QAPP_OFF_SHELF'); } if ($this->distribution_channel_id == 7477 && $bid == 13765) { $book_info->is_on_shelf = 2; } $special = get_special_bid(); if (in_array($this->distribution_channel_id, [9487, 9390]) && in_array($book_info->bid, $special)) { $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])) { if ($book_info->is_on_shelf != 4) { return response()->error('QAPP_OFF_SHELF'); } //补充操作:如果该用户未订阅该下架的书籍则删除其阅读记录(书架不予显示) //判断是否属于包年用户 $year_account = YearOrderService::getRecord($this->uid); if (!$year_account) { //获取书籍充值类型 $charge_type = $book_info->charge_type; if ($charge_type == 'BOOK') { //是否购买过该书,购买过则不删除 $res = BookOrderService::getRecordByuidBid($this->uid, $bid); } elseif ($charge_type == 'CHAPTER') { //是否购买过该书章节,购买过则不删除 $res = ChapterOrderService::checkBookIsOrdered($this->uid, $bid); } else { $res = false; } if (!$res) { ReadRecordService::delReadRecordStatic($this->uid, [$bid]); return response()->error('QAPP_OFF_SHELF'); } } } //wutong,wutong2,wutong3下所有内容都不放快应用 // if(in_array($book_info->cp_source,['wutong','wutong2','wutong3','youyan2'])){ // return response()->error('QAPP_OFF_SHELF'); // } $this->book_info = $book_info; //获取章节信息 $chapter = ChapterService::getChapterNameById($cid, $bid); if (!$chapter) { //短推长 $combination_chapter = $this->chapterNotExists($bid, $cid); if ($combination_chapter) { $chapter = $combination_chapter; $bid = $chapter->bid; $book_info = BookConfigService::getBookById($bid); $oldbid = \Hashids::encode($bid); $this->book_info = $book_info; } else { return response()->error('QAPP_SYS_ERROR'); } } list($is_split, $is_change_chapter_name) = BookService::splitContent($bid); if ($is_split && ($book_info->channel_name == '男频' || $is_change_chapter_name)) { $chapter->name = '第' . $chapter->sequence . '章'; } $is_next_day = date('Y-m-d', strtotime($this->user_info->created_at)) == date('Y-m-d', strtotime('-1 days')); if ($is_next_day) { $job = new UserRententionJob($this->uid, now(), $this->user_info->created_at); dispatch($job)->onConnection('rabbitmq')->onQueue('user_rentention_queue'); } //自定义vip章节 //$vip_sequence = Redis::hget('channel:chapterfee:setting:' . $this->distribution_channel_id, $bid); $vip_sequence = BookService::getVipSequence($bid, $this->distribution_channel_id, $this->send_order_id); if ($vip_sequence) { if ($chapter->sequence >= $vip_sequence) { $chapter->is_vip = 1; } else { $chapter->is_vip = 0; } } if ($chapter->is_vip == 0) { ReadRecordService::addReadLog($this->uid, [ 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $bid, 'cid' => $chapter->id, 'uid' => $this->uid, 'send_order_id' => $this->send_order_id, 'sequence' => $chapter->sequence, ]); ReadRecordService::addReadRecord([ 'uid' => $this->uid, 'bid' => $bid, 'book_name' => $book_info->book_name, 'cid' => $cid, 'chapter_name' => $chapter->name, 'sequence' => $chapter->sequence ]); return response()->item(new ChapterTransformer, $this->getChapter($bid, $chapter->id, $chapter)); } // 书籍是否限免 $free = BookConfigService::judgeBookIsFree($bid); if ($free) { ReadRecordService::addReadLog($this->uid, [ 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $bid, 'cid' => $chapter->id, 'uid' => $this->uid, 'send_order_id' => $this->send_order_id, 'sequence' => $chapter->sequence, ]); ReadRecordService::addReadRecord([ 'uid' => $this->uid, 'bid' => $bid, 'book_name' => $book_info->book_name, 'cid' => $cid, 'chapter_name' => $chapter->name, 'sequence' => $chapter->sequence ]); if ($chapter->is_vip == 1) { $fee = $this->getPrice($book_info, $chapter->size); $now = date('Y-m-d'); Redis::hincrby('qapp:book:free:virtual:' . $free->id, $now, $fee); Redis::sadd('qapp:free:virtual' . $now, $free->id); Redis::sadd('qapp:free:virtual:uids' . $now . $free->id, $this->uid); Redis::sadd('qapp:free:virtual:uids' . $free->id, $this->uid); } return response()->item(new ChapterTransformer, $this->getChapter($bid, $cid, $chapter)); } //已经付费 if ($this->getOrderRecord($bid, $cid)) { ReadRecordService::addReadLog($this->uid, [ 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $bid, 'cid' => $chapter->id, 'uid' => $this->uid, 'send_order_id' => $this->send_order_id, 'sequence' => $chapter->sequence, ]); ReadRecordService::addReadRecord([ 'uid' => $this->uid, 'bid' => $bid, 'book_name' => $book_info->book_name, 'cid' => $cid, 'chapter_name' => $chapter->name, 'sequence' => $chapter->sequence ]); return response()->item(new ChapterTransformer, $this->getChapter($bid, $cid, $chapter)); } //未付费 要提醒 $user_info = $this->user_info; //未付费 余额不足 $fee = $this->getPrice($book_info, $chapter->size); $data = [ 'book_id' => $oldbid, 'book_name' => $book_info->book_name, 'chapter_name' => $chapter->name, 'chapter_id' => $cid, 'pay_type' => $book_info->charge_type, 'fee' => $fee, 'user_balance' => $user_info->balance, 'product_id' => $book_info->product_id, 'uid' => $this->uid, 'distribution_channel_id' => $this->distribution_channel_id, 'is_discount' => 0, 'discount_fee' => '', 'discount' => '' ]; if ($user_info['balance'] < $fee) { if ($book_info->charge_type == 'BOOK') { return response()->error('QAPP_BOOK_INSUFFICIENT_BALANCE', $data); } elseif ($book_info->charge_type == 'CHAPTER') { return response()->error('QAPP_CHAPTER_INSUFFICIENT_BALANCE', $data); } else { return response()->error('QAPP_SYS_ERROR'); } } if (!$this->send_order_id) { if ($book_info->charge_type == 'BOOK') { return response()->error('QAPP_BOOK_BUY', $data); }/*else{ return response()->error('QAPP_CHAPTER_BUY', $data); }*/ } //付费 不提醒 if ($this->balancePay($book_info, $cid, $chapter->size, $chapter->name, 0)) { UserTaskService::addUserTaskQueue($this->uid, BaseTask::read, UserTaskService::judge_trigger); ReadRecordService::addReadLog($this->uid, [ 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $bid, 'cid' => $chapter->id, 'uid' => $this->uid, 'send_order_id' => $this->send_order_id, 'sequence' => $chapter->sequence, ]); ReadRecordService::addReadRecord([ 'uid' => $this->uid, 'bid' => $bid, 'book_name' => $book_info->book_name, 'cid' => $cid, 'chapter_name' => $chapter->name, 'sequence' => $chapter->sequence ]); //限免统计 $free_book = BookConfigService::getByBidNoFilter($bid); if ($free_book) { if (strtotime($free_book->end_time) + 7 * 86400 >= strtotime(date('Y-m-d'))) { if (Redis::Sismember('qapp:free:virtual:uids' . $free_book->id, $this->uid)) { $now = date('Y-m-d'); Redis::hincrby('qapp:book:free:actuality:' . $free_book->id, $now, $fee); Redis::sadd('qapp:free:actuality' . $now, $free_book->id); Redis::sadd('qapp:free:actuality:uids' . $now . $free_book->id, $this->uid); } } } if ($this->uid == 247081369) { $item = itemTransform(new ChapterTransformer, $this->getChapter($bid, $cid, $chapter)); myLog('xueqi')->info($item); } return response()->item(new ChapterTransformer, $this->getChapter($bid, $cid, $chapter)); } else { if ($book_info->charge_type == 'BOOK') { return response()->error('QAPP_BOOK_INSUFFICIENT_BALANCE', $data); } elseif ($book_info->charge_type == 'CHAPTER') { return response()->error('QAPP_CHAPTER_INSUFFICIENT_BALANCE', $data); } else { return response()->error('QAPP_SYS_ERROR'); } } } public function pay(Request $request, $bid, $cid) { $remind = (int)$request->input('remind'); $oldbid = $bid; $bid = BookService::decodeBidStatic($bid); $book_info = BookConfigService::getBookById($bid);; if (empty($book_info)) response()->error('QAPP_SYS_ERROR'); $this->book_info = $book_info; if ($this->distribution_channel_id == 7477 && $bid == 13765) { $book_info->is_on_shelf = 2; } if ($book_info->is_on_shelf == 0 || $book_info->is_on_shelf == 3) { if (!$this->isBookOrdered($bid)) { response()->error('QAPP_OFF_SHELF'); } } //获取章节 $chapter = ChapterService::getChapterNameById($cid, $bid); if (!$chapter) { $combination_chapter = $this->chapterNotExists($bid, $cid); if ($combination_chapter) { $chapter = $combination_chapter; $bid = $chapter->bid; $book_info = BookConfigService::getBookById($bid); $oldbid = \Hashids::encode($bid); $this->book_info = $book_info; } else { return response()->error('QAPP_SYS_ERROR'); } } if ($this->getOrderRecord($bid, $cid)) { ReadRecordService::addReadLog($this->uid, [ 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $bid, 'cid' => $chapter->id, 'uid' => $this->uid, 'send_order_id' => $this->send_order_id, 'sequence' => $chapter->sequence, ]); ReadRecordService::addReadRecord([ 'uid' => $this->uid, 'bid' => $bid, 'book_name' => $book_info->book_name, 'cid' => $cid, 'chapter_name' => $chapter->name, 'sequence' => $chapter->sequence ]); return response()->item(new ChapterTransformer, $this->getChapter($bid, $cid, $chapter)); } if ($this->balancePay($book_info, $cid, $chapter->size, $chapter->name, $remind)) { UserTaskService::addUserTaskQueue($this->uid, BaseTask::read, UserTaskService::judge_trigger); ReadRecordService::addReadLog($this->uid, [ 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $bid, 'cid' => $chapter->id, 'uid' => $this->uid, 'send_order_id' => $this->send_order_id, 'sequence' => $chapter->sequence, ]); ReadRecordService::addReadRecord([ 'uid' => $this->uid, 'bid' => $bid, 'book_name' => $book_info->book_name, 'cid' => $cid, 'chapter_name' => $chapter->name, 'sequence' => $chapter->sequence ]); $free_book = BookConfigService::getByBidNoFilter($bid); if ($free_book) { if (strtotime($free_book->end_time) + 7 * 86400 >= strtotime(date('Y-m-d'))) { if (Redis::Sismember('qapp:free:virtual:uids' . $free_book->id, $this->uid)) { $now = date('Y-m-d'); $fee = $this->getPrice($book_info, $chapter->size); Redis::hincrby('qapp:book:free:actuality:' . $free_book->id, $now, $fee); Redis::sadd('qapp:free:actuality' . $now, $free_book->id); Redis::sadd('qapp:free:actuality:uids' . $now . $free_book->id, $this->uid); } } } return response()->item(new ChapterTransformer, $this->getChapter($bid, $cid, $chapter)); } else { $fee = $this->getPrice($book_info, $chapter->size); $data = [ 'book_id' => $oldbid, 'book_name' => $book_info->book_name, 'chapter_name' => $chapter->name, 'chapter_id' => $cid, 'pay_type' => $book_info->charge_type, 'fee' => $fee, 'user_balance' => $this->user_info['balance'], 'product_id' => $book_info->product_id, 'uid' => $this->uid, 'distribution_channel_id' => $this->distribution_channel_id, 'is_discount' => 0, 'discount_fee' => '', 'discount' => '' ]; if ($book_info->charge_type == 'BOOK') { return response()->error('QAPP_BOOK_INSUFFICIENT_BALANCE', $data); } elseif ($book_info->charge_type == 'CHAPTER') { return response()->error('QAPP_CHAPTER_INSUFFICIENT_BALANCE', $data); } else { return response()->error('QAPP_SYS_ERROR'); } } } /** * 余额支付 * @param $book_info * @param $chapter_id * @param $chapter_size * @return bool */ protected function balancePay($book_info, $chapter_id, $chapter_size, $chapter_name, $is_remind) { $fee = $this->getPrice($book_info, $chapter_size); if ((int)$this->user_info['balance'] >= $fee) { if ($this->bookOrderOrChapterOrder($book_info, $chapter_id, $fee, $chapter_name, $is_remind)) { return true; } return false; } else { return false; } } /** * 获取章节内容 * @param $bid * @param $cid * @return bool|mixed */ protected function getChapter($bid, $cid, $chapter) { $chapter_content = ChapterService::getChapter($bid, $cid); if (!$chapter_content) return false; $chapter->content = trim(str_replace($chapter_content->name, '', $chapter_content->content)); // 格式特殊处理 $qian = array(" ", " ", "\t"); $hou = array("", "", ""); // 去掉所有空格 $chapter->content = str_replace($qian, $hou, $chapter->content); // 2换行变1换行 $chapter->content = str_replace("\n\n", "\n", $chapter->content); $chapter->content = str_replace("\r\n\r\n", "\r\n", $chapter->content); // \Log::info('getChapter_chapter:'.$bid.' cid:'.$cid); // \Log::info($chapter->content); //统计点击率 $key = 'book_click_num_bid_' . $bid; $field = date('Y-m-d'); $old = Redis::hget($key, $field); if (!$old) $old = 0; Redis::hset($key, $field, $old + 1); [$force_add_desk_type,$is_need_query_send_order] = $this->addDesktopType($bid, $chapter->sequence); $chapter->force_add_desk_type = $force_add_desk_type; $force_add_work_wecaht_type = 0; $force_add_work_wecaht_url = ""; if($is_need_query_send_order){ [$force_add_work_wecaht_type, $force_add_work_wecaht_url] = $this->addWorkWechatType($chapter->sequence); } $chapter->force_add_work_wecaht_type = $force_add_work_wecaht_type; $chapter->force_add_work_wecaht_url = $force_add_work_wecaht_url; //统计 $this->stats(); $next_chapter_order_status = $this->nextChapterOrderStatus($bid, $chapter->next_cid); $chapter->next_chapter_status = $next_chapter_order_status['next_chapter_status']; $chapter->next_price = $next_chapter_order_status['next_price']; $chapter->charge_type = $this->book_info->charge_type; $this->userBookCombination($chapter); return $chapter; } private function nextChapterOrderStatus($bid, $cid) { $chapter = ChapterService::getChapterNameById($cid, $bid); if (!$chapter || $chapter->is_vip == 0 || $this->book_info->charge_type == 'BOOK') { return ['next_chapter_status' => 0, 'next_price' => 0]; } $is_paid = $this->getOrderRecord($bid, $cid); if ($is_paid) { return ['next_chapter_status' => 1, 'next_price' => 0]; } $fee = $this->getPrice($this->book_info, $chapter->size); return ['next_chapter_status' => 2, 'next_price' => $fee]; } //短续长 private function userBookCombination($chapter) { if ($chapter->prev_cid && $chapter->next_cid) { return; } if ($chapter->next_cid == 0 && $this->book_info->charge_type == 'BOOK') { $bid = UserBookCombinationConfigService::selectAndSave($this->uid, $this->book_info->bid); if ($bid) { $bookInfo = BookConfigService::getBookById($bid); $chapter->next_cid = $bookInfo->first_cid; } } if ($chapter->prev_cid == 0 && $this->book_info->charge_type == 'CHAPTER') { $bid = UserBookCombinationConfigService::getShortBookFromLongBid($this->uid, $this->book_info->bid); if ($bid) { $bookInfo = BookConfigService::getBookById($bid); $chapter->prev_cid = $bookInfo->last_cid; } } } private function chapterNotExists($bid, $cid) { //1.全局图书组合配置 $combination = BookConfigService::getCombinationInfo($bid); if ($combination) { $chapter = ChapterService::getChapterNameByIdNoCheck($cid); if ($chapter) { return $chapter; } return false; } //2.用户图书组合配置 if ($this->book_info->charge_type == 'CHAPTER') { $user_combination = UserBookCombinationConfigService::getShortBookFromLongBook($this->uid, $bid); } else { $user_combination = UserBookCombinationConfigService::getLongBookFromShortBook($this->uid, $bid); } if ($user_combination) { $chapter = ChapterService::getChapterNameByIdNoCheck($cid); if ($chapter) { return $chapter; } return false; } return false; } /** * 添加订购记录 * @param $book_info * @param $chapter_id * @param $fee * @return bool */ protected function bookOrderOrChapterOrder($book_info, $chapter_id, $fee, $chapter_name, $is_remind) { if ($book_info['charge_type'] == 'BOOK') { $data = [ 'uid' => $this->uid, 'fee' => $fee, 'u' => $this->send_order_id, 'distribution_channel_id' => $this->distribution_channel_id, 'bid' => $book_info->bid, 'book_name' => $book_info->book_name, 'send_order_id' => $this->send_order_id, ]; return BookOrderService::addOrderRecodeAndDecrUserBalance($data, $this->uid); } else { $data = [ 'uid' => $this->uid, 'fee' => $fee, 'cid' => $chapter_id, 'bid' => $book_info->bid, 'distribution_channel_id' => $this->distribution_channel_id, 'book_name' => $book_info->book_name, 'chapter_name' => $chapter_name, 'send_order_id' => $this->send_order_id, 'is_remind' => $is_remind ]; if ($is_remind) { $this->addOrderRemind($book_info->bid); } return ChapterOrderService::addOrderAndDecrUserBalance($data, $this->uid); } } protected function addOrderRemind($bid) { if (ChapterReminderService::checkIsNoReminder($this->uid, $bid)) { return true; } else { ChapterReminderService::add($this->uid, $bid); return true; } } /** * 是否订购提醒 * @param $chapter_id * @return bool */ protected function isOrderRemind($bid) { $is_no_reminder = ChapterReminderService::checkIsNoReminder($this->uid, $bid) ? 1 : 0; return $is_no_reminder == 0; } /** * 用户是否关注 * @param $uid * @return bool */ protected function getSubscribe() { $res = ForceSubscribeService::forceSubscribeUsersByUid(['uid' => $this->uid]); if ($res) return true; return false; } /** * 获取订购记录 * @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; } /** * 计算价格 * @param $book_info * @param $chapter_size * @return float */ private function getPrice($book_info, $chapter_size = 0) { if ($book_info->charge_type == 'BOOK') { if (BookOrderService::isHasBookOrder($this->uid)) { $this->is_first_book_order = 0; return 1399; } else { $this->is_first_book_order = 1; return 899; } } else { // 获取投放后台账号, $account = ''; $account_send_order = $this->getNowSendOrderInfo(); if ($account_send_order) { $account = isset($account_send_order['account']) ? $account_send_order['account'] : ''; } $fee = BookService::getPrice($book_info, $this->distribution_channel_id, $chapter_size, $account); return $fee; } } /** * 计算价格 * @param $book_info * @param $chapter_size * @return float */ private function getPriceNew($book_info, $chapter_size = 0, $account = "") { if ($book_info->charge_type == 'BOOK') { if (BookOrderService::isHasBookOrder($this->uid)) { $this->is_first_book_order = 0; return 1399; } else { $this->is_first_book_order = 1; return 899; } } else { return BookService::getPrice($book_info, $this->distribution_channel_id, $chapter_size, $account); } } /** * 获取投放后台账号, * name: getAccount * @return mixed|string * date 2022/10/20 11:29 */ protected function getAccount() { $account = ''; $account_send_order = $this->getNowSendOrderInfo(); if ($account_send_order) { $account = isset($account_send_order['account']) ? $account_send_order['account'] : ''; } return $account; } /** * 用户添加标签 * @param $book_info */ protected function addTag($book_info) { if (!UserDeepReadTagService::isAddTag($this->uid, $book_info->bid)) { try { UserDeepReadTagService::addTag([ 'uid' => $this->uid, 'bid' => $book_info->bid, 'book_name' => $book_info->book_name, 'category_id' => $book_info->category_id, 'category_name' => $book_info->category_name, 'sex_preference' => $book_info->channel_name ? $book_info->channel_name : '', 'distribution_channel_id' => $this->distribution_channel_id ? $this->distribution_channel_id : '0', 'send_order_id' => $this->send_order_id, ]); } catch (\Exception $e) { } } } protected function isBookOrdered($bid) { $chapter_order = ChapterOrderService::checkBookIsOrdered($this->uid, $bid); if ($chapter_order) return true; $res = BookOrderService::getRecordByuidBid($this->uid, $bid); if ($res) 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 stats() { //阅读器统计 WapVisitStatService::recordReaderUvAndPv($this->uid, $this->distribution_channel_id); } //加桌类型 private function addDesktopType($bid, $sequence) { $deault_force_add_desk_type = 0; $send_order_id = $this->GetBindSendOrderId($this->uid); $is_need_query_order = 0; if ($send_order_id) { $send_order_info = SendOrderService::getById($send_order_id); if (!$send_order_info) return [$deault_force_add_desk_type,$is_need_query_order]; if ($send_order_info->book_id == $bid) { $is_need_query_order = 1; // 派单书籍和观看书籍一致,并设置了强加桌,判断当前章节和设置的强加桌章节 if ($send_order_info->force_add_desk_type == 1 && $send_order_info->force_add_desk_seq) { //在设置的强加桌章节前一章开始 if ($sequence >= ($send_order_info->force_add_desk_seq - 1)) { $force_add_desk_type = $send_order_info->force_add_desk_type; return [$force_add_desk_type,$is_need_query_order]; } } if ($send_order_info->force_add_desk_type == 2) { if ($sequence >= $this->book_info->force_subscribe_chapter_seq && $sequence <= $this->book_info->force_subscribe_chapter_seq + 3) { $force_add_desk_type = $send_order_info->force_add_desk_type; return [$force_add_desk_type,$is_need_query_order]; } } if ($send_order_info->force_add_desk_type == 3) { //弱加桌+强加桌 ,即强加桌章节之前的章节均弱加桌,之后的章节显示强加桌: $need_sequence = $send_order_info->force_add_desk_seq; if (!$need_sequence) { $need_sequence = $this->book_info->force_subscribe_chapter_seq; } if ($sequence >= ($need_sequence - 1)) { //之后的章节显示强加桌 return [1,$is_need_query_order]; } else { ////强加桌章节之前的章节均弱加桌 return [2,$is_need_query_order]; } } return [$deault_force_add_desk_type,$is_need_query_order]; } } //无派单,或者派单书籍与 此次书籍不一致,直接使用 原书籍的默认强关章节 $book_info = BookConfigService::getBookById($bid); if ($book_info && $book_info->force_subscribe_chapter_seq) { if ($sequence >= ($book_info->force_subscribe_chapter_seq - 1)) { return [2,$is_need_query_order]; } } return [$deault_force_add_desk_type,$is_need_query_order]; } private function addWorkWechatType($sequence) { $deault_force_add_desk_type = 0; $work_wechat_url = ""; $send_order_id = $this->GetBindSendOrderId($this->uid); if ($send_order_id) { $send_order_info = QappSendOrder::getSendOrderById($send_order_id); if (!$send_order_info) return [$deault_force_add_desk_type, $work_wechat_url]; if(in_array($send_order_info['force_add_work_wecaht_type'],[1,2]) && $send_order_info['force_add_work_wecaht_seq'] <= ($sequence+1)){ $deault_force_add_desk_type =$send_order_info['force_add_work_wecaht_type']; $work_wechat_url =$send_order_info['force_add_work_wecaht_url']; } } return [$deault_force_add_desk_type, $work_wechat_url]; } /** * [bindSendOrderId description] * @param [type] $uid [description] * @param [type] $send_order_id [description] * @return [type] [description] */ public function bindSendOrderId($uid, $send_order_id) { if ($send_order_id) { $res = Redis::hset('book_read_chapter:' . $uid, 'send_order_id', $send_order_id); } } /** * [bindSendOrderId description] * @param [type] $uid [description] * @param [type] $send_order_id [description] * @return [type] [description] */ public function GetBindSendOrderId($uid) { try { $send_order_id = Redis::hget('book_read_chapter:' . $uid, 'send_order_id'); if ($send_order_id) return (int)$send_order_id; } catch (\Exception $e) { } } private function getChapterIds($chapters): array { $list = []; if ($chapters) { foreach ($chapters as $v) { $list[] = $v->id; } } return $list; } private function getHandelData(int $bid, array $chapterIds): array { $uid = $this->uid; $res = YearOrderService::getRecord($uid); if ($res) { return $handle = ['check' => 0, 'paycid' => []]; } $res = null; //单本订购记录 $res = BookOrderService::getRecordByuidBid($uid, $bid); if ($res) { return $handle = ['check' => 0, 'paycid' => []]; } //章节订购记录 $chapterOrder = new ChapterOrderService(); $res = $chapterOrder->getOrdersByChapterIds($uid, $bid, $chapterIds); return $handle = ['check' => 1, 'paycid' => $res]; } /** * 判断是否需要充值 * name: isChapterNeedChargeNew * @param $cid * @param $rules * @return bool * date 2022/10/20 16:08 */ private function isChapterNeedChargeNew($cid, $rules, $price = 0): bool { if ($rules['check'] != 1) { return false; } if (empty($rules['paycid']) || !in_array($cid, $rules['paycid'])) { $user_info = $this->user_info; return $user_info['balance'] < $price; } else { return false; } } /***** * 是否订阅 * name: isSubscribe * @param $cid * @param $rules * @return int * date 2022/11/02 17:19 */ private function isSubscribe($cid, $rules): int { if ($rules['check'] != 1) { return 1; } if (empty($rules['paycid']) || !in_array($cid, $rules['paycid'])) { return 2; } else { return 1; } } }