love_php/app/Http/Controllers/Server/Admin/CourseController.php
2026-04-02 09:20:51 +08:00

1401 lines
63 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\Http\Controllers\Server\Admin;
use App\Models\MerchantUsers;
use App\Models\Server\MarketService;
use App\Models\Server\MEarningRule;
use App\Models\Server\MerchantService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\Coupon;
use App\Models\Course\Course;
use App\Models\Course\CourseClass;
use App\Models\Course\CourseClassification;
use App\Models\Course\CourseComments;
use App\Models\Course\CourseVideo;
use App\Models\Course\UserCourses;
use App\Models\Live\Anchor;
use App\Models\Server\MEarning;
use App\Models\Server\MerchantAccount;
use App\Models\Server\MerchantUser;
use App\Models\Server\TouristOrder;
use App\Models\User;
use App\Models\UserCoupon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
class CourseController extends Controller
{
//课程模块
/**
* 创建课程
* @param Request $request
* @return JsonResponse|string
*/
public function addPlatCourse(Request $request)
{
try {
$anchor = Anchor::where('m_id', $request->account_id)->first();
DB::beginTransaction();
$course = new Course();
$await_checkoutTextArray = [];
if ($request->aliyun_video_id) {
$result = \AliyunService::getPlayInfo($request->aliyun_video_id);
if (empty($result)) throw new \Exception("获取播放地址失败", 1);
$course->publicity_video = $result['PlayInfoList']['PlayInfo'][0]['PlayURL'];
}
if (empty($request->title)) return $this->failure('请输入课程标题');
$course->title = $request->title;
$await_checkoutTextArray[] = $request->title;
$course->slug = $request->slug;
$course->ppt_name = $request->ppt_name?:null;
$course->ppt_url = $request->ppt_url?:null;
if (empty($request->thumb)) return $this->failure('请选择课程封面');
$course->thumb = $request->thumb;
//内容安全-图片
$result = \CommonUtilsService::imageContentCecurity([$request->thumb]);
if ($result && isset($result['result']) && $result['result']) {
return $this->failure('图片' . $result['result'] . ',请换一张照片');
}
$charge = $request->input('charge', 0);
if (!is_numeric($charge) || $charge < 0) return $this->failure('请输入正确课程价格');
$course->charge = $request->charge;
$await_checkoutTextArray[] = $request->charge;
$course->short_description = $request->short_description ? $request->short_description : '';
$await_checkoutTextArray[] = $request->short_description;
$course->merchant_id = $request->account_id;
if ($request->has('lock'))
$course->lock = $request->lock;
$course->original_desc = $request->original_desc ? $request->original_desc : '';
$await_checkoutTextArray[] = $request->original_desc;
$course->render_desc = $request->render_desc ? $request->render_desc : '';
$await_checkoutTextArray[] = $request->render_desc;
$course->seo_keywords = $request->seo_keywords ? $request->seo_keywords : '';
$await_checkoutTextArray[] = $request->seo_keywords;
$course->seo_description = $request->seo_description ? $request->seo_description : '';
$await_checkoutTextArray[] = $request->seo_description;
$course->discount_price = $request->discount_price;
$await_checkoutTextArray[] = $request->discount_price;
//敏感词汇过滤
$result = \CommonUtilsService::checkoutTextArrayV3($await_checkoutTextArray);
if ($result['code'] == 1) {
return $this->failure($result['cause']);
}
$course->start_time_discount = $request->start_time_discount;
$course->end_time_discount = $request->end_time_discount;
$now_date = date('Y-m-d H:i:s');
if ($request->end_time_discount) {
if ($course->end_time_discount <= $now_date) {
return $this->failure('优惠结束时间应大于当前时间');
}
}
if ($request->charge && $request->discount_price) {
if ($request->discount_price >= $request->charge) {
return $this->failure('课程优惠价格应小于原价');
}
}
if (empty($request->published_at)) return $this->failure('请选择课程上线时间');
$course->published_at = $request->published_at;
$course->is_show = $request->input('is_show', -1);
// $course->is_show = -1;
$course->is_rec = $request->is_rec ? $request->is_rec : 0;
$course->type = 'business';
$course->open_id = $anchor->openid;
$course->merchant_id = $request->account_id;
// $anchor = Anchor::where('openid',$open_id)->first();
if ($anchor) {
$course->teacher_name = $anchor->name;
}
$course->vip_free = $request->vip_free ?? 0;
$course->save();
//分类名称
if($request->names && !empty($request->names)){
foreach ($request->names as $key => $name) {
$class = CourseClass::firstOrCreate(['name'=>$name],['is_show'=>1]);
CourseClassification::create([
'm_id'=>$request->account_id,
'course_id'=>$course->id,
'class_id'=>$class->id,
]);
}
}
if ($request->has('ratio') && $request->ratio >= 0) {
if ($request->ratio > 1.0) {
return $this->failure('利润分成比例不能大于100%');
}
$rule = MEarningRule::where('m_id', $request->account_id)
->where('name', 'course')
->where('type_id', 0)
->first();
$MEarningRule = new MEarningRule();
$MEarningRule->forzen_time = $rule?$rule->forzen_time : 1;
$MEarningRule->m_id = $request->account_id;
$MEarningRule->name = 'course';
$MEarningRule->ratio = $request->ratio;
$MEarningRule->type_id = $course->id;
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
$MEarningRule->save();
}
//保存后删除草稿箱内容
if (Cache::has('drafts_course_merchant_id_' . $request->account_id)) {
Cache::forget('drafts_course_merchant_id_' . $request->account_id);
}
$merchant_service = new MerchantService();
$merchant_service->merchant_id = $request->account_id;
$merchant_service->type = 'course';
$merchant_service->status = $request->input('is_show', -1);
$merchant_service->service_type = 0 ;
$merchant_service->type_id = $course->id;
$merchant_service->is_top = 0;
$merchant_service->sort = 0;
$merchant_service->save();
DB::commit();
return $this->success('ok', ['id' => $course->id]);
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
return $this->failure('添加失败');
}
}
/**
* 修改课程信息
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function updatePlatCourse(Request $request, $course_id)
{
try {
$course = Course::where('id',$course_id)
->first();
$await_checkoutTextArray = [];
$is_show = $request->input('is_show');
$is_top = $request->input('is_top');
$now_date = date('Y-m-d H:i:s');
$my_merchant_service = MerchantService::where('type_id', $course_id)->where('type', 'course')
->where('merchant_id', $request->account_id)->first();
if (!$my_merchant_service) {
return $this->failure('课程不存在');
}
if ($request->flow && json_encode($request->flow) != $my_merchant_service->flow) {
$my_merchant_service->flow = json_encode($request->flow);
$my_merchant_service->save();
}
if (isset($is_show)) {
if ($my_merchant_service->service_type == 1) {
if ($course->is_show != 1 && $is_show == 1) {
$my_merchant_service->status = -1;
$my_merchant_service->save();
return $this->failure('该服务已被提供商下架');
}
}
$my_merchant_service->status = $is_show;
$my_merchant_service->save();
}
if (isset($is_top)) {
if ($my_merchant_service->service_type == 1) {
$my_merchant_service->is_top = $is_top;
if($is_top == 1){
$my_merchant_service->top_time = date('Y-m-d H:i:s');
}else{
$my_merchant_service->top_time = null;
}
$my_merchant_service->save();
}
}
if (isset($request->is_top)) {
$my_merchant_service->is_top = $request->is_top;
$my_merchant_service->top_time = date('Y-m-d H:i:s');
$my_merchant_service->save();
}
if ($request->has('ratio') && $request->ratio >= 0) {
if ($request->ratio > 1.0) {
return $this->failure('利润分成不可以大于100%');
}
$rule = MEarningRule::where('m_id', $request->account_id)->where('type_id', 0)->where('name', 'course')->first();
$MEarningRule = MEarningRule::where('m_id', $request->account_id)->where('type_id', $course_id)
->where('name', 'course')
->first();
if ($MEarningRule === null) {
$MEarningRule = new MEarningRule();
$MEarningRule->m_id = $request->account_id;
$MEarningRule->name = 'course';
$MEarningRule->forzen_time = $rule?$rule->forzen_time : 1;
$MEarningRule->ratio = number_format($request->ratio, 2);
$MEarningRule->type_id = $course_id;
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
$MEarningRule->save();
} else {
$MEarningRule->name = 'course';
$MEarningRule->forzen_time = $rule?$rule->forzen_time : 1;
$MEarningRule->ratio = number_format($request->ratio, 2);
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
$MEarningRule->save();
}
}
if ($my_merchant_service->service_type == 1) {
return $this->success('ok');
}
if($request->names && !empty($request->names)){
//当前课程所属分类
$has_class_ids = CourseClassification::where('course_id',$course_id)->pluck('class_id')->toArray();
$has_class_names = CourseClass::whereIn('id',$has_class_ids)->pluck('name')->toArray();
$sub_class_names = array_diff($has_class_names,$request->names);//要移除的分类名称
$add_class_names = array_diff($request->names,$has_class_names);//要增加的分类名称
if(!empty($sub_class_names)){
foreach ($sub_class_names as $key => $sub_class_name) {
$sub_class_id = CourseClass::where('name',$sub_class_name)->value('id');
CourseClassification::where('course_id',$course_id)->where('class_id',$sub_class_id)->delete();
}
}
if(!empty($add_class_names)){
foreach ($add_class_names as $key => $add_class_name) {
$class = CourseClass::firstOrCreate(['name'=>$add_class_name]);
CourseClassification::create([
'm_id'=>$request->account_id,
'class_id'=>$class->id,
'course_id'=>$course_id,
'is_show'=>1,
]);
}
}
}elseif($request->has('names') && empty($request->names)){
CourseClassification::where('m_id',$request->account_id)->where('course_id',$course_id)->delete();
}
if ($request->title && $course->title != $request->title) {
$course->title = $request->title;
$await_checkoutTextArray[] = $request->title;
}
if ($request->start_time_discount && $course->start_time_discount != $request->start_time_discount) {
$course->start_time_discount = $request->start_time_discount;
}
if ($request->end_time_discount && $course->end_time_discount != $request->end_time_discount) {
if ($request->end_time_discount <= $now_date) {
return $this->failure('优惠结束时间应大于当前时间');
}
$course->end_time_discount = $request->end_time_discount;
}
if ($request->discount_price && $course->discount_price != $request->discount_price) {
if ($request->discount_price >= $course->charge) {
return $this->failure('优惠价格应小于原价');
}
$course->discount_price = $request->discount_price;
}
if ($request->team_id && $course->team_id != $request->team_id) {
$course->team_id = $request->team_id;
}
if ($request->slug && $course->slug != $request->slug) {
$course->slug = $request->slug;
}
if($request->ppt_url && $course->ppt_url != $request->ppt_url){
$course->ppt_url = $request->ppt_url;
}
if($request->ppt_name && $course->ppt_name != $request->ppt_name){
$course->ppt_name = $request->ppt_name;
}
if ($request->thumb && $course->thumb != $request->thumb) {
$course->thumb = $request->thumb;
$result = \CommonUtilsService::imageContentCecurity([$request->thumb]);
if ($result && isset($result['result']) && $result['result']) {
return $this->failure('图片' . $result['result'] . ',请换一张照片');
}
}
$charge = $request->input('charge', 0);
if (!is_numeric($charge) || $charge < 0) return $this->failure('请输入正确课程价格');
if (is_numeric($request->charge) && $course->charge != $request->charge && $request->charge >= 0) {
$course->charge = $request->charge;
$await_checkoutTextArray[] = $request->charge;
}
if ($request->short_description && $course->short_description != $request->short_description) {
$course->short_description = $request->short_description;
$await_checkoutTextArray[] = $request->short_description;
}
if ($request->original_desc && $course->original_desc != $request->original_desc) {
$course->original_desc = $request->original_desc;
$await_checkoutTextArray[] = $request->original_desc;
}
if ($request->render_desc && $course->render_desc != $request->render_desc) {
$course->render_desc = $request->render_desc;
$await_checkoutTextArray[] = $request->render_desc;
}
if ($request->seo_keywords && $course->seo_keywords != $request->seo_keywords) {
$course->seo_keywords = $request->seo_keywords;
$await_checkoutTextArray[] = $request->seo_keywords;
}
if ($request->seo_description && $course->seo_description != $request->seo_description) {
$course->seo_description = $request->seo_description;
$await_checkoutTextArray[] = $request->seo_description;
}
if ($request->published_at && $course->published_at != $request->published_at) {
$course->published_at = $request->published_at;
}
if ($request->is_show && $course->is_show != $request->is_show) {
$course->is_show = $request->is_show;
}
if (is_numeric($request->category_id) && $course->category_id != $request->category_id) {
$course->category_id = $request->category_id;
}
if ($request->seo_description && $course->seo_description != $request->seo_description) {
$course->seo_description = $request->seo_description;
$await_checkoutTextArray[] = $request->seo_description;
}
//敏感词汇过滤
$result = \CommonUtilsService::checkoutTextArrayV3($await_checkoutTextArray);
if ($result['code'] == 1) {
return $this->failure($result['cause']);
}
if (is_numeric($request->is_rec) && $course->is_rec != $request->is_rec) {
$course->is_rec = $request->is_rec;
}
if ($request->play_url != $course->publicity_video) {
$course->publicity_video = $request->play_url;
}
// if($request->aliyun_video_id){ //宣传视频
// $result = \AliyunService::getPlayInfo($request->aliyun_video_id);
// if (empty($result)) throw new \Exception("获取播放地址失败", 1);
// $play_url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL'];
// $course->publicity_video = $play_url;
// }
// if($request->has('is_top')){
// $course->is_top = $request->is_top;
// }
if ($request->has('is_top')) {//置顶
$course->is_top = $request->is_top;
$course->top_time = $request->is_top ? date('Y-m-d H:i:s') : null;
}
if ($request->has('lock')) {
$course->lock = $request->lock;
}
if($request->has('vip_free')){
$course->vip_free = $request->vip_free;
}
if ($request->has('ratio') && $request->ratio >= 0) {
if ($request->ratio > 1.0) {
return $this->failure('利润分成不可以大于1');
}
$rule = MEarningRule::where('m_id', $request->account_id)->where('type_id', 0)->where('name', 'course')->first();
$MEarningRule = MEarningRule::where('m_id', $request->account_id)->where('type_id', $course_id)
->where('name', 'course')
->first();
if (empty($MEarningRule)) {
$MEarningRule = new MEarningRule();
$MEarningRule->forzen_time = $rule?$rule->forzen_time: 1;
$MEarningRule->m_id = $request->account_id;
$MEarningRule->name = 'course';
$MEarningRule->ratio = $request->ratio;
$MEarningRule->type_id = $course_id;
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
$MEarningRule->save();
} elseif ($MEarningRule['ratio'] != $request->ratio) {
$MEarningRule->forzen_time = $rule?$rule->forzen_time: 1;
$MEarningRule->ratio = $request->ratio;
$MEarningRule->first_sharer = $rule?$rule->first_sharer:0.3;
$MEarningRule->last_sharer = $rule?$rule->last_sharer:0.5;
$MEarningRule->other_sharer = $rule?$rule->other_sharer:0.2;
$MEarningRule->save();
}
}
$course->save();
return $this->success('ok', $course);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('修改失败');
}
}
/**
* 我的课程列表
* @param Request $request
* @return JsonResponse|string
*/
public function myCouseList(Request $request)
{
try {
$keyword = $request->keyword;
$status = $request->status ?? 2;
$my_market_services_ids = MarketService::where('merchant_id', $request->account_id)
->where('type', 'course')
->pluck('type_id')
->toArray();
$courses = Course::join('merchant_services',function ($join) use($request){
$join->on('courses.id','=','merchant_services.type_id')
->where('merchant_services.merchant_id',$request->account_id)
->where('merchant_services.type','course')
->whereNull('merchant_services.deleted_at');
},null,null,'right');
//if ($request->account_id != 88) {
$courses = $courses->where('courses.type', 'business');
//}
if ($status != 2) {
if ($status == 0)//课程列表使用1-1 表示是否显示
$status = -1;
$courses = $courses->where('courses.is_show', $status);
}
if ($keyword) {
$keyword = trim($keyword);
$courses = $courses->where('courses.title', 'like', '%' . $keyword . '%');
}
$courses = $courses->where('merchant_services.merchant_id',$request->account_id)
->select('courses.id','merchant_services.type_id','courses.thumb','courses.title',
'courses.created_at','courses.published_at','merchant_services.is_top','courses.charge',
'merchant_services.service_type','merchant_services.type','merchant_services.status as is_show')
->withCount(['UserCourse', 'videos'])->with('account')/*->where('type','business')*/
->orderBy('merchant_services.status', 'desc')->orderBy('merchant_services.is_top', 'desc')
->orderBy('merchant_services.top_time', 'desc')
->paginate();
foreach ($courses as $course) {
if(in_array($course->id,$my_market_services_ids)){
$course->is_my_market_service = 1;
}else{
$course->is_my_market_service = 0;
}
$pv = Redis::zscore('coursepv', $course->id);
$course->pv = $pv ?: 0;
}
return $this->success('ok', $courses);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取列表失败');
}
}
/**
* 课程详情
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function courseDetail(Request $request, $course_id)
{
try {
$serve_tab = $request->serve_tab;
$course = Course::where('merchant_id',$request->account_id)->where('id',$course_id)
->first();
if (empty($course)) {
$merchant_service = MerchantService::where('merchant_id',$request->account_id)
->where('type_id',$course_id)->where('type','course')
->first();
if($merchant_service){
$course = Course::find($course_id);
if($course){
$course->is_show = $merchant_service->status;
$course->audit_status = 1;
}else{
return $this->failure('课程不存在');
}
}else{
$market_service = MarketService::where('type','course')->where('type_id',$course_id)
->where('alliance_id',$request->account_id)
->first();
if($market_service){
$course = Course::find($course_id);
if($course){
$course->service_type = 2;
$course->audit_status = $market_service->audit_status;
}else{
return $this->failure('课程不存在');
}
}else{
return $this->failure('课程不存在');
}
}
}else{
$course->service_type = 0;
}
$is_market_service = MarketService::where('type','course')->where('type_id',$course_id)
->whereNull('alliance_id')
->where('merchant_id',$request->account_id)
->first();
if($is_market_service){
$course->is_my_market_service = 1;
}else{
$course->is_my_market_service = 0;
}
$course->flow = MerchantService::where('merchant_id',$request->account_id)
->where('type_id',$course_id)->where('type','course')
->value('flow');
$jump_url = urlencode(env('APP_URL') . '/pu/#/courseDetail/' . $course_id);
//所属分类
$class_ids = CourseClassification::where('course_id',$course_id)->pluck('class_id')->toArray();
if(!empty($class_ids)){
$course->class_names = CourseClass::whereIn('id',$class_ids)->pluck('name')->toArray();
}else{
$course->class_names = [];
}
$anchor_openid = $course->open_id;
if (!$anchor_openid && $course->merchant_id) {
$merchant = MerchantAccount::where('id', $course->merchant_id)->first();
$anchor_openid = $merchant->openid;
if (!$anchor_openid) $anchor_openid = Anchor::where('m_id', $merchant->id)->value('openid');
}
$course['ratio'] = MEarningRule::where('m_id', $request->account_id)
->where('name', 'course')->where('type_id', $course_id)
->value('ratio');
if ($course['ratio'] === null) {
$course['ratio'] = MEarningRule::where('m_id', $request->account_id)
->where('name', 'course')->where('type_id', 0)
->value('ratio');
}
$course['ratio'] = number_format($course['ratio'], 2);
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->account_id . '&serve_tab=' . $serve_tab. '&from_openid=' . $anchor_openid . '&url=' . $jump_url;
// $qr_code = $this->getPreviewQrcode($url);
// $qr_code = Redis::get('CourseDetail_S'.$course_id);
// if(!$qr_code){
$qr_code = $this->getPreviewQrcode($url);
// Redis::setex('CourseDetail_S'.$course_id,60*60*24*30,$qr_code);
// $qr_code = Redis::get('CourseDetail_S'.$course_id);
// }
$course->qr_codes = $qr_code;
$course->share_url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->account_id . '&serve_tab=' . $serve_tab . '&from_openid=' . $anchor_openid . '&url=' . $jump_url;
return $this->success('ok', $course);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取详情失败');
}
}
/**
* 删除课程
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function deletePlatCourse(Request $request, $course_id)
{
try {
DB::beginTransaction();
$course = Course::where('id',$course_id)->where('merchant_id',$request->account_id)
->first();
if (empty($course)) {
$merchantService = MerchantService::where('type_id',$course_id)
->where('type','course')
->where('merchant_id',$request->account_id)
//->withTrashed()
->first();
if($merchantService){
$merchantService->status = 0;
$merchantService->save();
$merchantService->delete();
}
$service_nature = Anchor::where('m_id',$request->account_id)->value('service_nature');
if($service_nature && ($service_nature == 'person' || $service_nature == 'team')) {
$marketService = MarketService::where('type_id', $course_id)
->where('type', 'course')
->where('merchant_id', $request->account_id)
//->withTrashed()
->first();
}elseif($service_nature && ($service_nature == 'alliance')){
$marketService = MarketService::where('type_id', $course_id)
->where('type', 'course')
->where('alliance_id', $request->account_id)
//->withTrashed()
->first();
}else{
$marketService = null;
}
if($marketService){
$marketService->status = 0;
$marketService->save();
$marketService->delete();
}
DB::commit();
return $this->success('ok',[$request->account_id]);
}
//删除分类下的课程
CourseClassification::where('m_id',$request->account_id)->where('course_id',$course_id)->delete();
$merchantService_ids = MerchantService::where('type_id', $course_id)
->where('type', 'course')
->pluck('id');
MerchantService::whereIn('id',$merchantService_ids)->delete();
$marketService_ids = MarketService::where('type_id', $course_id)
->where('type', 'course')
->where('merchant_id', $request->account_id)
->pluck('id');
MarketService::whereIn('id', $marketService_ids)->delete();
$course->delete();
UserCourses::where('course_id', $course_id)->delete();
CourseComments::where('course_id', $course_id)->delete();
$coupon_ids = Coupon::where('type', 'course')->where('type_id', $course_id)->pluck('id');
Coupon::whereIn('id',$coupon_ids)->delete();
UserCoupon::whereIn('coupons_id',$coupon_ids)->delete();
DB::commit();
return $this->success('ok');
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
return $this->failure('删除失败');
}
}
/**
* 课程成员
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function platCourseMembers(Request $request, $course_id)
{
try {
$keyword = $request->keyword;
$status = $request->pay_status ?? 2;
$merchant_id = $request->account_id;
$merchant_service = MerchantService::where('type', 'course')
->where('type_id', $course_id)
->withTrashed()
->where('merchant_id', $merchant_id)
->first();
if (!$merchant_service) {
$market_service = MarketService::where('type', 'course')->where('type_id', $course_id)
->where('merchant_id',$merchant_id)
->first();
if(!$market_service){
return $this->failure('课程不存在');
}
}
$users = UserCourses::with('s_member', 'torder', 'torder.mEarning:id,m_user_id,m_order_id,sharer,ratio,sub_ratio,value', 'torder.mAdvanceEarning:id,m_user_id,m_order_id,sharer,ratio,sub_ratio,value', 'torder.mEarning.user:id,pic,nickname,mobile', 'torder.mAdvanceEarning.user:id,pic,nickname,mobile')->where('course_id', $course_id)
->orderBy('id', 'desc');
if ($status != 2) {
// $users = $users->where('status',$status);
if ($status == 1) {
$users = $users->whereHas('torder', function ($query) use ($status) {
$query->whereIn('pay_status', [1, 4]);
});
} else {
$users = $users->whereHas('torder', function ($query) use ($status) {
$query->where('pay_status', $status);
});
}
}
$users = $users->whereHas('torder');
if ($keyword) {
$keyword = trim($keyword);
$users = $users->whereHas('s_member', function ($sql) use ($keyword) {
$sql->where('mobile', 'like', '%' . $keyword . '%')->orWhere('nickname', 'like', '%' . $keyword . '%');
});
}
$merchant = MerchantAccount::where('id', $merchant_id)
->select('id', 'share_icon', 'share_title')
->first();
if ($merchant_service->service_type) {
$users = $users->whereHas('torder', function ($query) use ($merchant_id, $course_id) {
$query->where('type', 'course')
->where('merchant_id', $merchant_id)
->where('type_id', $course_id);
});
$course = Course::where('id', $course_id)
->first();
$source_merchant = MerchantAccount::where('id', $course->merchant_id)
->select('id', 'share_icon', 'share_title')
->first();
} else {
$source_merchant = $merchant;
}
$users = $users->orderBy('id', 'desc')->paginate();
foreach ($users as $key => $user) {
$user->m_earning = $user->torder->mEarning?:[];
$user->m_advance_earning = $user->torder->mAdvanceEarning?:[];
unset($user->torder->mEarning, $user->torder->mAdvanceEarning);
if (($user['s_member'] != null && $user['s_member']['pic'] == null)) {
$user['s_member']['pic'] = User::DefaultAvatar;
}
if (($user['s_member'] != null && $user['s_member']['nickname'] == null)) {
$user['s_member']['nickname'] = '未获取';
}
if ($user->torder) {
$user->pay_status = $user->torder->pay_status;
}
// $merchant_user = MerchantUsers::where('id',$user->merchant_user_id)->select('openid','pic','mobile','sex','nickname')->first();
// $user->s_member = $merchant_user;
// if(($user['s_member'] != null && $user['mer_user']['pic'] == null) || $user['s_member'] == null) {
// $user['s_member']['pic'] = User::DefaultAvatar;
// }
// if(($user['s_member'] != null && $user['mer_user']['nickname'] == null) || $user['s_member'] == null) {
// $user['s_member']['nickname'] = '未获取';
// }
$trade_no = $user['trade_no'];
$toursit_order = TouristOrder::with('alliance')->where('trade_no', $trade_no)->first();
$user->price = isset($toursit_order->price) ? $toursit_order->price : 0;
if ($toursit_order) {
$user['buyer'] = [
'name' => $toursit_order->name,
'area_code' => $toursit_order->area_code,
'mobile' => ($toursit_order->mobile == '匿名用户' || $toursit_order->mobile == '未获取') ? null : $toursit_order->mobile,
];
$user['alliance'] = $toursit_order->alliance;
$user->channel = $toursit_order->channel;
if ($toursit_order->merchant_id == $merchant_id) {
$user->merchant = $merchant;
} else {
$user->merchant = MerchantAccount::where('id', $toursit_order->merchant_id)
->select('id', 'share_icon', 'share_title')
->first();
}
} else {
$user['buyer'] = [];
$user['alliance'] = null;
$user->channel = '优惠券';
$user->merchant = null;
$user->merchant = $merchant;
}
$user->source_merchant = $source_merchant;
}
return $this->success('ok', $users);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 设置用户是否可以播放视频
* @param Request $request
* @return JsonResponse|string
*/
public function updateUserCourseCanPlay(Request $request)
{
try {
$id = $request->input('id');
if (!$id) {
return $this->failure('参数错误');
}
$can_play = $request->input('can_play');
if (!in_array($can_play, [0, 1])) {
return $this->failure('参数错误');
}
$data = UserCourses::find($id);
if ($data) {
$data->can_play = $can_play;
$data->save();
}
return $this->success('ok',compact('can_play'));
} catch (\Exception $e) {
return $this->failure($e->getMessage());
}
}
/**
* 课程成员
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function platCourseVideoMembers(Request $request, $course_id)
{
try {
$keyword = $request->keyword;
$status = $request->pay_status??2;
$merchant_id = $request->account_id;
$course_videos_id = CourseVideo::where('course_id',$course_id)->pluck('id');
$orders = TouristOrder::with('mEarning')->with('mUser')->with('mAdvanceEarning')
->whereIn('type_id',$course_videos_id)
->where('type','video');
if ($keyword) {
$keyword = trim($keyword);
$orders = $orders->whereHas('merUser', function ($sql) use ($keyword) {
$sql->where('mobile', 'like', '%' . $keyword . '%')->orWhere('nickname', 'like', '%' . $keyword . '%');
});
}
if($status != 2){
if ($status == 1) {
$orders = $orders->whereIn('pay_status',[1,4]);
}else{
$orders = $orders->where('pay_status',$status);
}
}
$orders = $orders->orderBy('id', 'desc')->paginate();
foreach ($orders as $key => $user) {
$user->title = CourseVideo::where('id',$user->type_id)->value('title');
$user->linkmen = $user->linkmen?json_decode($user->linkmen):[];
$user->m_earning = $user->mEarning?:[];
$user->m_advance_earning = $user->mAdvanceEarning?:[];
}
return $this->success('ok', $orders);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
/**
* 上传课程视频
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function uploadCourseVideo(Request $request, $course_id)
{
try {
$request->validate([
'aliyun_video_id' => 'required',
'title' => 'required',
]);
$await_checkoutTextArray = [];
$result = \AliyunService::getPlayInfo($request->aliyun_video_id);
if (empty($result)) throw new \Exception("获取播放地址失败", 1);
$course_video = new CourseVideo();
$course_video->url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL'];
$course_video->duration = round($result['VideoBase']['Duration']);
$course_video->course_id = $course_id;
$course_video->aliyun_video_id = $request->aliyun_video_id;
$course_video->title = $request->title;
$course_video->ppt_name = $request->ppt_name ?? null;
$course_video->ppt_url = $request->ppt_url ?? null;
$course_video->price = $request->price ?? null;
$await_checkoutTextArray[] = $request->title;
$result = \CommonUtilsService::imageContentCecurity([$request->thumb]);
if ($result && isset($result['result']) && $result['result']) {
return $this->failure('图片' . $result['result'] . ',请换一张照片');
}
$course_video->thumb = $request->thumb;
$course_video->view_num = 0;
$course_video->is_show = 1;
if ($request->has('free_play')) {
$course_video->free_play = $request->free_play;
}
//敏感词汇过滤
$result = \CommonUtilsService::checkoutTextArrayV3($await_checkoutTextArray);
if ($result['code'] == 1) {
return $this->failure($result['cause']);
}
$course_video->save();
return $this->success('ok', $course_video);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('创建失败');
}
}
/**
* 视频列表
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function platVideos(Request $request, $course_id)
{
try {
$m_id = $request->account_id;
$course = Course::find($course_id);
if(!$course) return $this->failure('课程不存在');
$keyword = $request->keyword;
$videos = CourseVideo::where('course_id', $course_id)->orderBy('free_play', 'desc')->orderBy('sort', 'desc')->orderBy('id', 'asc');
if ($keyword) {
$keyword = trim($keyword);
$videos = $videos->where('title', 'like', '%' . $keyword . '%')->orWhere('seo_keywords', 'like', '%' . $keyword . '%');
}
$nopage = $request->input('nopage', 0);
if ($nopage) {
$videos = $videos->get();
} else {
$videos = $videos->paginate();
}
if($course->merchant_id != $m_id){
foreach ($videos as $key => $video) {
//如果不是本商家的课程 隐藏课程目录视频地址
$video->url = '';
}
}
return $this->success('ok', $videos);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取列表失败');
}
}
/**
* 修改课程视频
* @param Request $request
* @param $video_id
* @return JsonResponse|string
*/
public function updateVideo(Request $request, $video_id)
{
try {
$video = CourseVideo::find($video_id);
if (empty($video)) return $this->failure('视频不存在');
$await_checkoutTextArray = [];
if ($request->aliyun_video_id && $video->aliyun_video_id != $request->aliyun_video_id) {
$result = \AliyunService::getPlayInfo($request->aliyun_video_id);
// dd($result);
if (empty($result)) throw new \Exception("获取播放地址失败", 1);
$video->aliyun_video_id = $request->aliyun_video_id;
// $result = \CommonUtilsService::imageContentCecurity([$request->thumb]);
// if ($result && isset($result['result']) && $result['result']) {
// return $this->failure('图片' . $result['result'] . ',请换一张照片');
// }
$video->view_num = 0;
$video->url = $result['PlayInfoList']['PlayInfo'][0]['PlayURL'];
$video->duration = round($result['VideoBase']['Duration']);
CourseComments::where('video_id', $video_id)->delete();
}
$video->thumb = $request->thumb;
if ($request->title && $video->title != $request->title) {
$await_checkoutTextArray[] = $request->title;
$video->title = $request->title;
}
if ($request->has('free_play')) {
$video->free_play = $request->free_play;
}
if ($request->has('ppt_name')) {
$video->ppt_name = $request->ppt_name;
}
if ($request->has('ppt_url')) {
$video->ppt_url = $request->ppt_url;
}
if($request->has('price') && $video->price != $request->price){
$video->price = $request->price;
}
//敏感词汇过滤
$result = \CommonUtilsService::checkoutTextArrayV3($await_checkoutTextArray);
if ($result['code'] == 1) {
return $this->failure($result['cause']);
}
$video->save();
return $this->success('ok', $video);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('修改失败');
}
}
/**
* 置顶课程视频
* @param $video_id
* @return JsonResponse|string
*/
public function topCourseVideo($video_id)
{
$video = CourseVideo::where('id', $video_id)->first();
if (empty($video)) return $this->failure('要置顶的视频不存在');
$sort_arr = CourseVideo::where('course_id', $video->course_id)->pluck('sort')->toArray();
$max_sort = max($sort_arr);
$video->sort = $max_sort + 1;
$video->save();
return $this->success('ok');
}
/**
* 移除课程视频
* @param Request $request
* @return JsonResponse|string
*/
public function delPlatVideo(Request $request)
{
try {
$id = $request->id;
if (empty($id)) return $this->failure('请选择要删除的视频');
CourseVideo::where('id', $id)->delete();
CourseComments::where('video_id', $id)->delete();
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('删除失败');
}
}
/**
* 作业列表
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function platComments(Request $request, $course_id)
{
try {
$keyword = $request->keyword;
$title = $request->title;
$titles = [];
$comments = CourseComments::with('member', 'video','user','merchant_user')->withCount('comments')
->where('status', 1)->where('course_id', $course_id)
->where('type', 'business')->orderBy('is_show', 'desc')
->orderBy('created_at', 'desc');
$titles = CourseVideo::where('course_id', $course_id)->pluck('title')->toArray();
if ($title) {
$video_id = CourseVideo::where('title', $title)->value('id');
$comments = $comments->where('video_id', $video_id);
}
if ($keyword) {
$keyword = trim($keyword);
$comments = $comments->whereHas('member', function ($query) use ($keyword) {
$query->where('mobile', 'like', '%' . $keyword . '%')
->orWhere('nickname', 'like', '%' . $keyword . '%');
});
}
$comments = $comments->paginate();
foreach ($comments as $comment) {
// $comment->likerCount = $comment->likers->count();
$comment->photos = json_decode($comment->photos, true);
// unset($comment->likers);
}
return $this->success('ok', compact('titles', 'comments'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('获取列表失败');
}
}
/**
* 移动端课程详情
* @param Request $request
* @param $course_id
* @return JsonResponse|string
*/
public function phoneCourseDetail(Request $request, $course_id)
{
$course = Course::withTrashed()->withCount('videos')->where('id', $course_id)->first();
$avatar = [];
$serve_tab = $request->serve_tab;
//消费人数
$consume_user_count = TouristOrder::where('type', 'course')->where('type_id', $course_id)
->whereIn('pay_status', [1, 4])->groupBy('open_id')->get()->count();
//订单数
$consume_order_count = TouristOrder::where('type', 'course')->where('type_id', $course_id)
->whereIn('pay_status', [1, 4])->count();
//收入(元)
$income_amount = TouristOrder::where('type', 'course')->where('type_id', $course_id)
->whereIn('pay_status', [1, 4])->sum('price');
//商家分成金额
$order_ids = TouristOrder::where('type', 'course')->where('type_id', $course_id)->whereIn('pay_status', [1, 4])
->pluck('id')->toArray();
$merchant_income_value = MEarning::whereIn('m_order_id', $order_ids)->where('m_user_id', 0)->sum('value');
$pv = Redis::zscore('coursepv', $course->id) ?? 0;
$jump_url = urlencode(env('APP_URL') . '/pu/#/courseDetail/' . $course_id);
$url = env('APP_URL') . '/api/official/live/wechat/FamilyAuth?merchant_id=' . $request->account_id .
'&serve_tab=' . $serve_tab . '&url=' . $jump_url;
$qr_code = Redis::get('CourseDetail_S' . $course_id);
if (!$qr_code) {
$qr_code = $this->getPreviewQrcode($url);
Redis::setex('CourseDetail_S' . $course_id, 60 * 60 * 24 * 30, $qr_code);
$qr_code = Redis::get('CourseDetail_S' . $course_id);
}
$course->consume_user_count = $consume_user_count;
$course->consume_order_count = $consume_order_count;
$course->pv = $pv ?? 0;
$course->merchant_income_value = $merchant_income_value;
$course->share_qr_code = $qr_code;
$course->income_amount = $income_amount;
$orders = TouristOrder::where('type', 'course')->where('type_id', $course_id)->whereIn('pay_status', [1, 4])
->orderBy('id', 'desc')->limit(3)->get();
foreach ($orders as $key => $order) {
$avatar[$key] = MerchantUser::where('id', $order->account_id)->value('pic') ?? User::DefaultAvatar;
if (empty($avatar[$key])) $avatar[$key] = User::DefaultAvatar;
}
$course->avatar = $avatar;
//下架或删除状态 0下架 1正常上架 2已删除
$publish_state = 0;
if ($course->deleted_at) {
$publish_state = 2;
} elseif ($course->is_show == 1) {
$publish_state = 1;
} else {
$publish_state = 0;
}
$course->publish_state = $publish_state;
return $this->success('ok', $course);
}
/**
* 课程订单
* @param Request $request
*/
public function getCourseOrders(Request $request)
{
try {
$account_id = $request->account_id;
$keyword = $request->keyword;
$nopage = $request->input('nopage', 1);
$market_service_ids = MerchantService::where('merchant_id', $account_id)
->withTrashed()
->where('type', 'course')
->whereIn('service_type', [1,2])
->pluck('type_id')
->toArray();
$course_ids = Course::withTrashed()
->where('merchant_id', $account_id)
->pluck('id')
->toArray();
$orders = TouristOrder::with('viewer:avatar,mobile,openid,sex,nickname', 'merchant:id,share_icon,share_title',
'fromUser:user_id as id,avatar,mobile,openid,sex,nickname', 'merUser', 'alliance')->withCount('follow');
$orders = $orders->where('type', 'course')
->where(function ($query) use ($course_ids, $market_service_ids, $account_id) {
$query->whereIn('type_id', $course_ids);
if ($market_service_ids) {
$query->orwhere(function ($orWhereQuery) use ($market_service_ids, $account_id) {
$orWhereQuery->whereIn('type_id', $market_service_ids)->where('merchant_id', $account_id);
});
}
});
if (isset($request->pay_status)) {
if ($request->pay_status == 1) {
$orders = $orders->whereIn('pay_status', [1,4]);
} else {
$orders = $orders->where('pay_status', $request->pay_status);
}
}
if ($keyword) {
$keyword = trim($keyword);
$orders = $orders->where(function ($sql) use ($keyword) {
$sql->where('name', 'like', '%' . $keyword . '%')
->orWhere('mobile', 'like', '%' . $keyword . '%')
->orWhere('desc', 'like', '%' . $keyword . '%');
});
}
if ($nopage) {
$orders = $orders->orderBy('created_at', 'desc')->paginate();
} else {
$orders = $orders->orderBy('created_at', 'desc')->get();
}
$account = MerchantAccount::where('id', $account_id)->select('id','share_icon','share_title')->first();
foreach ($orders as $key => $val){
if(in_array($val->type_id,$course_ids)){
$val->source_merchant = $account;
}elseif(in_array($val->type_id,$market_service_ids)){
$market_service_merchant_id = Course::where('id',$val->type_id)
->value('merchant_id');
$val->source_merchant = MerchantAccount::where('id',$market_service_merchant_id)
->select('id','share_icon','share_title')
->first();
}else{
$val->source_merchant = $account;
}
}
return $this->success('ok',$orders);
} catch (\Exception $e) {
$this->getError($e);
return $this->failure('服务器休息中,请稍后再试');
}
}
//添加课程分类
public function addCourseClass(Request $request){
try {
$m_id = $request->account_id;
$name = $request->name;
$exists = CourseClass::where('m_id',$m_id)->where('name',$name)->first();
if($exists) return $this->failure('已存在相同的分类名称:'.$name.' 请勿重复添加');
$pic = $request->pic ?? null;
$is_show = $request->is_show ?? 1;
$sort = $request->sort ?? 0;
CourseClass::create([
'name'=>$name,
'pic'=>$pic,
'is_show'=>$is_show,
'sort'=>$sort
]);
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
//课程分类列表
public function courseClasses(Request $request){
try {
$nopage = $request->nopage ?? 0;
$keyword = trim($request->keyword);
$course_ids = MerchantService::where('merchant_id',$request->account_id)->where('type','course')->pluck('type_id');
$class_ids = CourseClassification::where('m_id',$request->account_id)->whereIn('course_id',$course_ids)->pluck('class_id');
$class = CourseClass::whereIn('id',$class_ids);
if($keyword){
$class =$class->where('name','like',"%$keyword%");
}
$class =$class->orderBy('sort','desc')->orderBy('id','desc');
if($nopage){
$class = $class->get();
}else{
$class = $class->paginate();
foreach ($class as $key => $value) {
$course_ids = CourseClassification::where('class_id',$value->id)->pluck('course_id');
$courses = Course::join('merchant_services',function($join) use($request){
$join->on('courses.id','=','merchant_services.type_id')
->where('merchant_services.merchant_id',$request->account_id)
->where('merchant_services.type','course')
->whereNull('merchant_services.deleted_at');
},null,null,'right');
$course_count = $courses->whereIn('courses.id',$course_ids)->get()->count();
$value->course_count = $course_count;
}
}
return $this->success('ok',$class);
} catch (\Exception $e) {
$this->getError($e);
return $this->getError($e);
}
}
//删除课程分类
public function removeCourseClass(Request $request,$class_id){
try {
//删除分类 会删除分类下对应的课程
$m_id = $request->account_id;
DB::beginTransaction();
$class = CourseClass::find($class_id);
if(!$class) return $this->failure('要删除的分类不存在或已被其他管理员删除');
CourseClassification::where('class_id',$class_id)->where('m_id',$m_id)->delete();
$class->delete();
DB::commit();
return $this->success('ok');
} catch (\Exception $e) {
DB::rollBack();
$this->getError($e);
return $this->failure();
}
}
//编辑课程分类
public function updateCourseClass(Request $request,$class_id){
try {
$m_id = $request->account_id;
$class = CourseClass::find($class_id);
if(!$class) return $this->failure('要修改的分类不存在或已被其他管理员删除');
if($class->m_id != $m_id) return $this->failure('修改失败,该分类不属于您');
if($request->has('name') && $request->name != $class->name){
$class->name = $request->name;
$exists = CourseClass::where('name',$request->name)->first();
if($exists) return $this->failure('该分类名已存在');
}
if($request->has('pic') && $request->pic != $class->pic){
$class->pic = $request->pic;
}
if($request->has('sort')){
$class->sort = $request->sort;
}
if($request->has('is_show')){
$class->is_show = $request->is_show;
}
$class->save();
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
//添加课程到分类(批量)
public function addCourseToClass(Request $request){
try {
$class_ids = $request->class_ids;
$course_ids = $request->course_ids;
if(!is_array($class_ids) || empty($class_ids)) return $this->failure('请选择要添加的分类');
if(!is_array($course_ids) || empty($course_ids)) return $this->failure('请选择要添加的课程');
foreach ($class_ids as $key => $class_id) {
$has_course_ids = CourseClassification::where('class_id',$class_id)->whereIn('course_id',$course_ids)->pluck('course_id')->toArray();
$course_ids = array_diff($course_ids,array_unique($has_course_ids));
$arr = [];
foreach ($course_ids as $key => $course_id) {
$sub_arr = [
'class_id'=>$class_id,
'course_id'=>$course_id,
'is_show'=>1,
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
];
$arr[] = $sub_arr;
}
CourseClassification::insert($arr);
}
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
//移除课程分类下课程(批量)
public function removeCourseToClass(Request $request){
try {
$m_id = $request->account_id;
$class_id = $request->class_id;
$course_ids = $request->course_ids;
$course = Course::whereIn('id',$course_ids)->first();
if($course->merchant_id != $m_id) return $this->failure('删除失败,该课程不属于您');
CourseClassification::where('class_id',$class_id)->whereIn('course_id',$course_ids)->delete();
return $this->success('ok');
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
//分类下的课程列表
public function classCourses(Request $request,$class_id){
try {
$keyword = trim($request->keyword);
$class_name = CourseClass::where('id',$class_id)->value('name');
$course_ids = CourseClassification::where('class_id',$class_id)->pluck('course_id');
// $courses = Course::whereIn('id',$course_ids);
$courses = Course::join('merchant_services',function($join) use($request){
$join->on('courses.id','=','merchant_services.type_id')
->where('merchant_services.merchant_id',$request->account_id)
->where('merchant_services.type','course')
->whereNull('merchant_services.deleted_at');
},null,null,'right');
$courses = $courses->whereIn('courses.id',$course_ids);
if($keyword){
$courses = $courses->where('courses.title','like',"%$keyword%");
}
$courses = $courses->select('courses.id','courses.title','courses.thumb','courses.charge',
'merchant_services.type','merchant_services.service_type')->orderBy('id','desc')->paginate();
return $this->success('ok',compact('class_name','courses'));
} catch (\Exception $e) {
$this->getError($e);
return $this->failure();
}
}
public function allCourses(Request $request){
$courses = Course::where('merchant_id',$request->account_id)->where('is_show',1)->select('id','title')->get();
return $this->success('ok',$courses);
}
}