This commit is contained in:
2025-08-14 17:19:26 +08:00
parent 30abda5ba7
commit 281248fd04
245 changed files with 21051 additions and 61 deletions

447
app/api/model/Course.php Normal file
View File

@@ -0,0 +1,447 @@
<?php
namespace app\api\model;
use app\common\library\DatabaseRoute;
use app\common\model\Common;
use ba\Random;
use think\cache\driver\Redis;
use think\facade\Cache;
use think\facade\Db;
use think\facade\Log;
use think\Model;
class Course extends Model
{
public static function selectCourse($data)
{
if(empty($data['page']) || empty($data['limit'])) {
return returnErrorData('参数不完整');
}
// 先查看有没有缓存
$cache = Cache::get('index_data_' . $data['page']);
if($cache) {
$cache = json_decode($cache, true);
if(!empty($data['sort'])) {
$cache['list'] = shuffleMultiArray($cache['list']);
$cache['list'] = array_values($cache['list']);
}
return returnSuccessData($cache);
}
$page = ($data['page'] - 1) * $data['limit'];
$db = $data_db = Db::connect(config('database.search_library'))->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('database.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('database.db_map');
foreach ($sale as $k => $v) {
if(in_array($v, config('database.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('database.search_library'));
$db_name = $dd_b->name('course');
$bean = $db_name->where(['course_id' => $courseId])->find();
$dd_b->close();
if(!$bean) {
return returnErrorData('短剧不存在');
}
$courseCollect = CourseCollect::Watchhistory($user['user_id'], $courseId);
Db::connect()->close();
// 是否追剧
$collect = CourseCollect::isfollowthedrama($user['user_id'], $courseId);
Db::connect()->close();
$userInfo = TbUser::selectUserByIdNew($user);
if (!empty($userInfo['member']) && $userInfo['member'] == 2) {
$isVip = true;
}else{
$isVip = false;
}
// 查询用户是否购买了整集
$courseUser = CourseCollect::selectCourseUser($user['user_id'], $courseId);
Db::connect()->close();
// 每天购买超过上限,获得免费时间段资格
$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'];
}
}
Db::connect()->close();
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])->column('course_details_id');
$det_db->close();
// Log::write('123');
$detailsId = array_flip(array_flip($detailsId)); // 去重
}
// return returnSuccessData(123);
// 处理剧集列表
$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();
// $isGood_db->close();
// $s['isGood'] = empty($isGood) || $isGood == 0 ? 0 : 1;
// }
}
// return returnSuccessData(999);
// 如果没有当前播放集,默认第一集
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::write("请求剧集异常: " . $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('database.z_library'))->name('course');
// 4. 执行数据库更新
$db_name->where(['course_id' => $course['course_id']])->update([
'view_counts' => $viewCounts,
'week_view' => $weekView
]);
Db::connect()->close();
}
}