webman_duanju/app/api/model/Course.php

433 lines
17 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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
]);
}
}