433 lines
17 KiB
PHP
433 lines
17 KiB
PHP
<?php
|
||
|
||
namespace app\api\model;
|
||
|
||
use app\common\library\DatabaseRoute;
|
||
use app\common\model\Common;
|
||
use extend\ba\Random;
|
||
use think\cache\driver\Redis;
|
||
use support\think\Cache;
|
||
use think\facade\Db;
|
||
use support\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('think-orm.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('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
|
||
]);
|
||
}
|
||
|
||
|
||
|
||
} |