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