service = $service; } /** * 视频详情 * @param $id * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * Author: Mead */ public function show(Request $request) { $this->validateData($request, [ 'id' => 'required|integer', 'course_id' => 'required|integer', ], [ 'course_id' => '课程 id' ]); $id = $request->get('id'); $video = $this->service->handleProfile($id); return $this->response->success($video); } /** * 视频记录 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * @throws \Illuminate\Validation\ValidationException */ public function lookRecord(Request $request) { $this->validateData($request, [ 'course_id' => 'required', 'video_id' => 'required', 'watch_seconds' => 'required', // 'is_watched' => 'required', ]); $course_id = $request->get('course_id'); $video_id = $request->get('video_id'); $watch_seconds = $request->get('watch_seconds', 10); // $is_watched = $request->get('is_watched', VideoWatchEnum::NO); $is_watched = VideoWatchEnum::NO; DB::beginTransaction(); try { $total_seconds = Video::query()->where('id', $video_id)->value('duration') ?? 0; if ($total_seconds <= 0) { return $this->response->ok('请求成功'); } $progress = 0; $progress_index = 0; $sec = 10; $user_id = login_user_id(); $progress_index = bcdiv($watch_seconds, $sec, 0); // $user_id = 10; //进度方式一 // $progress = bcdiv($watch_seconds * 100, $total_seconds, 0); // if ($progress > 100) { // $progress = 100; // $watch_seconds = $total_seconds; // } //进度方式二 $use_nums = WatchRecord::query()->where('video_id', $video_id)->where('user_id', $user_id)->distinct('progress_index')->count(); $progress = bcdiv($use_nums * 100, $total_seconds / $sec, 0); if ($progress >= 98) { if ($sec) { $total_nums = bcdiv($total_seconds, $sec, 0); if ($total_nums - 3 > 0) { if ($use_nums >= ($total_nums - 5)) { $is_watched = VideoWatchEnum::OK; $progress = 100; } } else { $is_watched = VideoWatchEnum::OK; $progress = 100; } } else { $is_watched = VideoWatchEnum::OK; $progress = 100; } } if ($is_watched) { Video::query()->where('id', $video_id)->increment('view_num', 1); } WatchRecord::query()->updateOrCreate([ 'video_id' => $video_id, 'course_id' => $course_id, 'user_id' => $user_id, 'progress_index' => $progress_index, ], [ 'is_watched' => $is_watched, 'watch_seconds' => $watch_seconds, 'watched_at' => Carbon::now(), 'progress' => $progress, 'progress_index' => $progress_index, ]); if ($is_watched == VideoWatchEnum::OK) { $use_complete_nums = WatchRecord::query()->where('course_id', $course_id)->where('is_watched', VideoWatchEnum::OK)->distinct('video_id')->count(); $total_complete_nums = Video::query()->where('course_id', $course_id)->where('status', ModelStatusEnum::OK)->count(); $total_progress = bcdiv($use_complete_nums * 100, $total_complete_nums, 0); if ($total_progress > 100) { $total_progress = 100; } $is_watched = 0; if ($use_complete_nums == $total_complete_nums) { $is_watched = 1; } Subscribe::query() ->where('course_id', $course_id) ->where('user_id', $user_id) ->updateOrCreate([ 'course_id' => $course_id, 'user_id' => $user_id, ], [ 'total_nums' => $total_complete_nums, 'use_nums' => $use_complete_nums, 'progress' => $total_progress, 'is_watched' => $is_watched, 'watched_at' => Carbon::now()->toDateTimeString() ]); } DB::commit(); } catch (\Exception $exception) { DB::rollBack(); $this->exception($exception); } return $this->response->ok('请求成功'); } }