name('course'); $db = $db->where(['status' => 1]); $count = $db->count(); $data_db = $data_db->limit($page, $data['limit']); if(!empty($data['sort'])) { if($data['sort'] == 1) { $data_db = $data_db->order('week_pay','desc'); }elseif ($data['sort'] == 2) { $data_db = $data_db->order('week_view','desc'); } }else { $data_db = $data_db->order('create_time','desc'); } $list = $data_db->select()->toArray(); foreach ($list as $k => &$v) { $v['course_id'] = (string)$v['course_id']; // 如果没有剧集了,给下架 $crous_detail_db_count = DatabaseRoute::getDb('course_details', ['course_id' => $v['course_id']])->where(['course_id' => $v['course_id']])->count(); if(!$crous_detail_db_count) { Course::where(['course_id' => $v['course_id']])->update(['status' => 2]); } } $return = [ 'currPage' => 1, 'list' => convertToCamelCase($list), 'pageSize' => $data['limit'], 'totalCount' => $count, 'totalPage' => ceil($count / $data['limit']), ]; if($list) { Cache::set('index_data_' . $data['page'], json_encode($return, true)); } return returnSuccessData($return); } public static function selectByUserId($get, $user_id) { if(empty($get['classify'])) { return returnErrorData('参数不完整'); } $db = Db::connect(DatabaseRoute::getConnection('course_collect', ['user_id' => $user_id])); if($get['classify'] == 1) { // 追剧 $result = $result2 = $db->name('course_collect') ->alias('c1') ->join('course_collect c2', 'c1.course_id = c2.course_id AND c2.user_id = ' . $user_id .' AND c2.classify = ' . $get['classify']) ->where('c1.classify', 3) ->where('c1.user_id', $user_id); $count = $result2->count(); $result = $result->field([ 'c1.course_id' => 'courseId', 'c1.course_details_id' => 'courseDetailsId', 'c1.update_time' => 'updateTime' ]) ->limit(page($get['page'], $get['limit']), $get['limit']) ->select(); }elseif($get['classify'] == 2 || $get['classify'] == 3) { // 点赞 观看历史 $result = $result2 = $db->name('course_collect') ->alias('c1') ->where('c1.classify', $get['classify']) ->where('c1.user_id', $user_id); $count = $result2->count(); $result = $result->field([ 'c1.course_id' => 'courseId', 'c1.course_details_id' => 'courseDetailsId', 'c1.update_time' => 'updateTime' ])->limit(page($get['page'], $get['limit']), $get['limit'])->select(); } $is_arr = self::sacouresdata($result); $db = Db::connect(config('think-orm.search_library')); $course = $db->name('course')->whereIn('course_id', $is_arr['course_id'])->select(); $course_arr = self::sacouresdata($result, $course); // 拿详情 $course_data = self::sacouresjidata($course_arr['course_list']); return returnSuccessData([ 'currPage' => $get['page'], 'pageSize' => $get['limit'], 'totalCount' => $count, 'totalPage' => ceil($count / $get['limit']), 'records' => $course_data, ]); } // 拿短剧详情 public static function sacouresdata($result, $course = []) { $data['course_id'] = []; $data['course_details_id'] = []; $data['course_list'] = []; foreach ($result as $k => $v) { if(empty($course)) { $data['course_id'][] = (string)$v['courseId']; $data['course_details_id'][] = (string)$v['courseDetailsId']; }else { foreach ($course as $courseKey => $courseValue) { if($courseValue['course_id'] == $v['courseId']) { $data['course_list'][] = [ 'courseId' => (string)$courseValue['course_id'], 'courseDetailsId' => (string)$v['courseDetailsId'], 'courseLabel' => $courseValue['course_label'], 'courseLabelIds' => $courseValue['course_label_ids'], 'courseType' => $courseValue['course_type'], 'createTime' => $courseValue['create_time'], 'payNum' => $courseValue['pay_num'], 'title' => $courseValue['title'], 'titleImg' => $courseValue['title_img'], 'updateTime' => $courseValue['update_time'], ]; } } } } return $data; } // 拿剧集详情 public static function sacouresjidata($result) { foreach ($result as $k => $v) { $db_name = DatabaseRoute::getConnection('course_details', ['course_id' => $v['courseId']]); $db = Db::connect($db_name); $course_details = $db->name('course_details')->where(['course_details_id' => $v['courseDetailsId']])->find(); $result[$k]['courseDetailsCount'] = $db->name('course_details')->where(['course_id' => $v['courseId']])->count(); if($course_details) { $result[$k]['courseDetailsName'] = $course_details['course_details_name']; }else { $result[$k]['courseDetailsName'] = ''; } $result[$k]['db_name'] = $db_name; } return $result; } public static function collectVideoSummary($user_id) { $db_name = DatabaseRoute::getDb('course_collect', $user_id)->where('user_id', $user_id) ->field([ 'COUNT(CASE WHEN classify = 1 THEN 1 END)' => 'collectCount', 'COUNT(CASE WHEN classify = 2 THEN 1 END)' => 'likeCount' ]) ->find(); return returnSuccessData($db_name); } /** * 获取推荐视频 */ public static function selectCourseDetailsList($get, $user_id) { if(empty($get['page']) || empty($get['limit']) || empty($get['randomNum'])) { return returnErrorData('参数不完整'); } $sale = config('think-orm.db_map'); foreach ($sale as $k => $v) { if(in_array($v, config('think-orm.unset_db_map'))) { unset($sale[$k]); } } $dbname = $sale[array_rand($sale)]; $db = Db::connect($dbname)->name('course_details'); $where = ['good' => 1, 'is_price' => 2]; $course_detail_count = $db->where($where)->count(); if(!$course_detail_count) { return returnErrorData('暂无视频'); } $page = rand(1, $course_detail_count); $size = 5; $currPage = ceil($page / $size); $res = $db->where($where)->limit($page, $size)->select()->toArray(); if($user_id) { $db_name = DatabaseRoute::getConnection('course_collect', ['user_id' => $user_id]); $user_db = Db::connect($db_name)->name('course_collect'); foreach ($res as $k => $v) { $res[$k]['isCollect'] = $user_db->where(['classify' => 1, 'user_id' => $user_id])->count(); $res[$k]['isGood'] = $user_db->where(['classify' => 2, 'user_id' => $user_id])->count(); } } $res = apiconvertToCamelCase($res); return returnSuccessData([ 'currPage' => $currPage, 'pageSize' => $size, 'list' => $res, 'records' => null, 'totalCount' => $course_detail_count, 'totalPage' => ceil($course_detail_count / $size), ]); } public static function getRedEnvelopeTips($user_id) { $db = DatabaseRoute::getDb('orders', $user_id); $count = $db->where('create_time', '>', date('Y-m-d 00:00:00'))->where(['user_id' => $user_id, 'status' => 1, 'pay_way' => 9])->count(); $totalCount = CommonInfo::where(['type' => 901])->find()->value; $string = '每日前' . $totalCount . '次付款均可获取抽奖机会,抽奖保底抽中付款金额等额红包,红包可直接提现。当前为第' . $count + 1 . '次付款'; return returnSuccessData($string); } // 查看短剧 public static function viewCourse($get) { if(empty($get['courseId']) || empty($get['courseDetailsId']) || empty($get['type'])) { return returnErrorData('参数不完整'); } // 获取短剧详情 $course = Course::where(['course_id' => $get['courseId']])->find(); if(!$course) { return returnErrorData('短剧不存在'); } // 获取短剧集详情 $course_detail_db = DatabaseRoute::getDb('course_details', ['course_id' => $get['courseId']]) ->where(['course_id' => $get['courseId']]) ->where(['course_details_id' => $get['courseDetailsId']]) ->find(); if(!$course_detail_db) { return returnErrorData('短剧集不存在'); } $db = Db::connect(DatabaseRoute::getConnection('course_details', ['course_id' => $get['courseId']], true)); if($get['type'] == 'start') { $db->name('course_details') ->where(['course_id' => $get['courseId']]) ->where(['course_details_id' => $get['courseDetailsId']]) ->inc('view_count') ->update(); }elseif($get['type'] == 'end') { $db->name('course_details') ->where(['course_id' => $get['courseId']]) ->where(['course_details_id' => $get['courseDetailsId']]) ->inc('play_complete_count') ->update(); } return returnSuccessData(); } // 根据id查询短剧集数列表 public static function courseSets($get, $user, $sort = null) { try { if(empty($get['courseId'])) { return returnErrorData('参数不完整'); } $courseId = $get['courseId']; // 获取短剧详情 $dd_b = Db::connect(config('think-orm.search_library')); $db_name = $dd_b->name('course'); $bean = $db_name->where(['course_id' => $courseId])->find(); if(!$bean) { return returnErrorData('短剧不存在'); } $courseCollect = CourseCollect::Watchhistory($user['user_id'], $courseId); // 是否追剧 $collect = CourseCollect::isfollowthedrama($user['user_id'], $courseId); $userInfo = TbUser::selectUserByIdNew($user); if (!empty($userInfo['member']) && $userInfo['member'] == 2) { $isVip = true; }else{ $isVip = false; } // 查询用户是否购买了整集 $courseUser = CourseCollect::selectCourseUser($user['user_id'], $courseId); // 每天购买超过上限,获得免费时间段资格 $freeWatch = CourseCollect::checkFreeWatchPayCount($user['user_id']); $startSort = 0; $endSort = 5; $dn_course_details = DatabaseRoute::getDb('course_details', ['course_id' => $courseId]); if (is_null($sort)) { if (!empty($courseCollect)) { $courseDetails = $dn_course_details->field('sort') ->where('course_details_id', $courseCollect['course_details_id']) ->limit(1) ->find(); $sort = $courseDetails['sort']; } } if ($freeWatch || !empty($courseUser)) { $courseDetailsSetVos = CourseDetails::courseSets($courseId, 2, null); } else { $courseDetailsSetVos = CourseDetails::courseSets($courseId, 1, $bean['wholesale_price']); } // return returnSuccessData(321); // 调整集数范围 if (!is_null($sort) && $sort > 2) { $startSort = $sort - 3; $endSort = $sort + 3; if (count($courseDetailsSetVos) < $endSort) { $startSort = count($courseDetailsSetVos) - 5; $endSort = count($courseDetailsSetVos) + 1; } } // 已购买剧集ID集合 $detailsId = []; if (!$freeWatch) { $det_db = Db::connect(DatabaseRoute::getConnection('course_user', ['user_id' => $user['user_id']])); $detailsId = $det_db->name('course_user')->where(['course_id' => $courseId, 'classify' => 2, 'user_id' => $user['user_id']])->column('course_details_id'); $detailsId = array_flip(array_flip($detailsId)); // 去重 } // 处理剧集列表 $current = null; foreach ($courseDetailsSetVos as &$s) { $s['wholesalePrice'] = (int) $s['wholesalePrice']; // 当前播放集 if (!empty($courseCollect) && $s['courseDetailsId'] == $courseCollect['course_details_id']) { $s['current'] = 1; $current = &$s; } // 非免费用户的权限控制 if ( !$freeWatch && $s['sort'] > 3 && (empty($detailsId) || !in_array($s['courseDetailsId'], $detailsId)) && empty($courseUser) && !$isVip ) { $s['videoUrl'] = null; } // 检查是否已点赞 if ($s['sort'] > $startSort && $s['sort'] < $endSort) { $isGood_db = Db::connect(DatabaseRoute::getConnection('course_collect', ['user_id' => $user['user_id']])); $isGood = $isGood_db->name('course_collect') ->where('course_details_id', $s['courseDetailsId']) ->where('classify', 2) ->limit(1) ->count(); $s['isGood'] = empty($isGood) || $isGood == 0 ? 0 : 1; } } // 如果没有当前播放集,默认第一集 if (empty($current) && !empty($courseDetailsSetVos)) { $courseDetailsSetVos[0]['current'] = 1; $current = &$courseDetailsSetVos[0]; } self::setCourseView($bean); $price = ($freeWatch ? 0 : ($bean['price'] ?? 0)); $price = bccomp($price, '0', 2) <= 0 ? 0 : $price; // 返回结果 $map = [ 'current' => $current, 'price' => $price, 'title' => $bean['title'], 'collect' => empty($collect) || $collect == 0 ? 0 : 1, 'list' => $courseDetailsSetVos ]; return returnSuccessData($map); } catch (\Exception $e) { Log::info("请求剧集异常: " . $e->getMessage() . '/' . $e->getLine() . '/'); return returnErrorData($e->getMessage()); } } public static function setCourseView($course) { // 1. 更新总播放量 if (empty($course['view_counts'])) { $viewCounts = 1; } else { $viewCounts = $course['view_counts'] + 1; } // 2. 检查是否允许更新周播放量(假设ApiAccessLimitUtil为自定义工具类) $allowUpdateWeekView = Common::isAccessAllowed( (string)$course['course_id'], "updateWeekCourseView", 1, 600 ); // 3. 获取并更新周播放量 $weekView = $course['week_view'] ?? 0; if ($allowUpdateWeekView) { // 从Redis获取周播放量(假设redisServiceImpl为自定义服务类) $weekView = Common::getCourseWeekViewCount($course['course_id']); } $db_name = Db::connect(config('think-orm.z_library'))->name('course'); // 4. 执行数据库更新 $db_name->where(['course_id' => $course['course_id']])->update([ 'view_counts' => $viewCounts, 'week_view' => $weekView ]); } }