repository = $repository; $this->validator = $validator; } /** * 班级列表 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function index(Request $request) { $lists = $this->repository->paginate($request->get('per_page', self::PAGE_NUM)); return Response::success($lists); } /** * 创建 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource|void * @throws \Illuminate\Validation\ValidationException * Author: Mead */ public function store(Request $request) { $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE)); try { $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE))); $data['user_id'] = login_user_id(); if (!$data['coordinator_id']) { $data['coordinator_id'] = login_user_id(); } $data['slug'] = Str::random(); $model = $this->repository->create($data); return Response::success($model); } catch (\Exception $e) { return $this->errorStore($e); } } /** * 编辑 * @param Request $request * @param $id * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException * Author: Mead */ public function update(Request $request, $id) { $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE)); if (!Organization::query()->where('coordinator_id', login_user_id())->where('id', $id)->exists()) { return $this->error('您暂无编辑权限!'); } $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_UPDATE))); if (isset($data['is_issue']) && $data['is_issue']) { $this->validate($request, [ 'coordinator_id' => 'required|integer', 'cover' => 'required|integer', ], [], ['coordinator_id' => '班主任', 'cover' => '封面图']); } try { $model = $this->repository->update($data, $id); return Response::success($model); } catch (\Exception $e) { $this->errorStore($e); } } /** * 删除 * @param $id * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function destroy($id) { if (!Organization::query()->where('coordinator_id', login_user_id())->where('id', $id)->exists()) { return $this->error('您暂无删除权限!'); } try { $this->repository->delete($id); return Response::success(null, T('successfully delete.')); } catch (\Exception $exception) { return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR); } } /** * 详情 * @param $slug * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function show($slug) { $model = $this->repository->where('slug', $slug)->first(); if (!$model) { return $this->error('找不到资源'); } $model = $this->repository->parserResult($model); return Response::success($model); } /** * 关联课程 * @param Request $request * Author: Mead */ public function syncCourses(Request $request) { $this->validate($request, [ 'id' => 'required|integer', 'course_ids' => 'required|array', ], [], ['id' => '班级', 'course_ids' => '课程']); $model = Organization::query()->where('id', $request->get('id'))->where('status', ModelStatusEnum::OK)->first(); if (!$model) { return $this->error('找不到资源'); } $course_ids = $request->get('course_ids'); $model->courses()->sync($course_ids); $model->course_nums = count($course_ids); $model->save(); return Response::success(null); } /** * 学员列表 * @param Request $request * @param UserRepository $repository * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException * Author: Mead */ public function students(Request $request, UserRepository $repository) { $this->validate($request, [ 'organization_id' => 'required|integer', ], [], ['id' => '班级']); $lists = $repository->paginate($request->get('per_page', self::PAGE_NUM)); return Response::success($lists); } /** * 添加学生 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException * Author: Mead */ public function storeStudent(Request $request) { $this->validate($request, [ 'organization_id' => 'required|integer', // 'keyword' => 'required|string', 'user_ids' => 'required|array', ], [], ['id' => '班级', 'keyword' => '账号\手机号', 'user_ids' => '用户ids']); // $keyword = $request->get('keyword'); // $users = User::query()->where('status', ModelStatusEnum::OK)->where(function ($query) use ($keyword) { // return $query->where('username', 'like', "%{$keyword}%")->orWhere('mobile', 'like', "%{$keyword}%"); // })->select(['id', 'username', 'name', 'turename', 'sex', 'mobile'])->get(); // // if (!$users) { // return $this->error('找不到该用户'); // } // // if (count($users) > 1) { // return Response::success($users); // } // $user_id = $users[0]['id']; $user_ids = $request->get('user_ids'); $id = $request->get('organization_id'); $model = Organization::query()->where('id', $id)->where('status', ModelStatusEnum::OK)->first(); if (!$model) { return $this->error('找不到资源'); } foreach ($user_ids as $user_id) { $is_student = User::query()->where('id', $user_id)->where('role_id', 0)->status()->exists(); $is_band = OrganizationStudent::query()->where('organization_id', $id)->where('user_id', $user_id)->where('status', ModelStatusEnum::OK)->exists(); if (!$is_band && $is_student) { OrganizationStudent::query()->create( [ 'organization_id' => $id, 'user_id' => $user_id, ] ); } } $model->student_nums = OrganizationStudent::query()->where('organization_id', $id)->status()->count(); $model->save(); return Response::success(null); } /** * 更新学生信息 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function updateStudent(Request $request) { $this->validate($request, [ 'organization_id' => 'required|integer', 'user_id' => 'required|integer', 'type' => 'required|integer', ], [], ['id' => '班级', 'user_id' => '学员id', 'type' => '身份类型']); $organization_id = $request->get('organization_id'); $user_id = $request->get('user_id'); $type = $request->get('type'); $model = OrganizationStudent::query()->where('organization_id', $organization_id)->where('user_id', $user_id)->where('status', ModelStatusEnum::OK)->first(); if (!$model) { return $this->error('找不到该资源'); } $model->type = $type; $model->save(); return Response::success(null); } /** * 删除学员 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function destroyStudents(Request $request) { $this->validate($request, [ 'organization_id' => 'required|integer', 'user_ids' => 'required|array', ], [], ['organization_id' => '班级', 'ids' => '记录id']); $organization_id = $request->get('organization_id'); $ids = $request->get('user_ids'); $re = OrganizationStudent::query()->where('organization_id', $organization_id)->whereIn('user_id', $ids)->delete(); if (!$re) { return $this->error('删除失败'); } Organization::query()->where('id', $organization_id)->update(['student_nums' => OrganizationStudent::query()->where('organization_id', $organization_id)->status()->count()]); return Response::success(null); } /** * 班级数据统计 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException * Author: Mead */ public function statistical(Request $request) { $this->validate($request, [ 'organization_id' => 'required|integer', ], [], ['organization_id' => '班级']); $organization_id = $request->get('organization_id'); $student_ids = OrganizationStudent::query()->where('organization_id', $organization_id)->where('status', ModelStatusEnum::OK)->pluck('user_id'); $course_ids = OrganizationCourse::query()->where('organization_id', $organization_id)->pluck('course_id'); $student_nums = count($student_ids); $course_nums = count($course_ids); $study_total_time = ceil(UserVideoWatchRecord::query()->whereIn('course_id', $course_ids)->whereIn('user_id', $student_ids)->sum('watch_seconds') / 60); $study_average_time = 0; if ($student_nums) { $study_average_time = ceil($study_total_time / $student_nums); } $course_name = []; $names = Course::query()->whereIn('id', $course_ids)->pluck('title', 'id'); $course_study = []; foreach ($course_ids as $course_id) { $course_name[] = $names[$course_id]; $total_nums = UserRecord::query()->where('course_id', $course_id)->where('is_watched', 1)->count(); $course_study[] = [ 'id' => $course_id, 'name' => $names[$course_id], 'progress' => $student_nums ? bcdiv($total_nums, $student_nums, 1) : 0 ]; } //统计学生完成度 $student_study = []; foreach ($student_ids as $student_id) { $study_record = UserRecord::query()->whereIn('course_id', $course_ids)->where('user_id', $student_id)->select(['is_watched', 'progress', 'course_id'])->get()->keyBy('course_id')->toArray(); $student_study_keys = array_keys($study_record); $study = []; foreach ($course_ids as $key => $course_id) { if (in_array($course_id, $student_study_keys)) { $record = $study_record[$course_id]; $study[] = [ 'status' => $record['is_watched'] + 1, 'progress' => $record['progress'], 'name' => $course_name[$key] ]; } else { $study[] = [ 'status' => 0, 'progress' => 0, 'name' => $course_name[$key] ]; } } $student_study[] = [ 'id' => $student_id, 'name' => User::query()->where('id', $student_id)->value('name'), 'study' => $study ]; } return Response::success(compact('student_nums', 'course_nums', 'study_total_time', 'study_average_time', 'student_study', 'course_study')); } /** * 班级师资 * @param Request $request * @param UserRepository $repository * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException * Author: Mead */ public function teacher(Request $request) { $this->validate($request, [ 'organization_id' => 'required|integer', ], [], ['organization_id' => '班级']); $organization_id = $request->get('organization_id'); $course_ids = OrganizationCourse::query()->where('organization_id', $organization_id)->distinct()->pluck('course_id'); $user_ids = Course::query()->whereIn('id', $course_ids)->distinct()->pluck('user_id'); $list = User::query()->whereIn('id', $user_ids)->get(); if (!count($list)) { $list = []; } return Response::success(compact('list')); } }