123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <?php
- namespace App\Http\Controllers\Api\Course;
- use App\Http\Controllers\Controller;
- use App\Repositories\Enums\Course\VideoWatchEnum;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Enums\ResponseCodeEnum;
- use App\Repositories\Models\Course\Subscribe;
- use App\Repositories\Models\Course\UserRecord;
- use App\Repositories\Models\Course\Video;
- use App\Repositories\Models\Course\WatchRecord;
- use App\Services\Course\VideoService;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Jiannei\Response\Laravel\Support\Facades\Response;
- /**
- * 视频管理
- *
- * @package namespace App\Http\Controllers;
- */
- class VideoController extends Controller
- {
- protected $service;
- public function __construct(VideoService $service)
- {
- parent::__construct();
- $this->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('请求成功');
- }
- }
|