repository = $repository; $this->validator = $validator; } /** * 排班列表 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource */ public function index(Request $request) { $this->isCan(PermissionEnum::controller_schedule_list); $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 */ public function lists(Request $request) { $this->isCan(PermissionEnum::controller_schedule_list); $lists = $this->repository->all(); return Response::success($lists); } /** * 详情 * @param $id * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource */ public function show($id) { $data = $this->repository->find($id); return Response::success($data); } /** * 删除 * @param $id * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function destroy($id) { $this->isCan(PermissionEnum::controller_schedule_del); try { $this->repository->skipPresenter()->delete($id); return Response::success(null, T('successfully delete.')); } catch (\Exception $exception) { return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR); } } /** * 批量删除 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * Author: Mead */ public function delete(Request $request) { $this->isCan(PermissionEnum::controller_schedule_del); try { $this->validate($request, [ 'ids' => 'required|array', ]); $ids = $request->get('ids'); $this->repository->whereIn('id', $ids)->delete(); return Response::success(null, T('successfully delete.')); } catch (\Exception $exception) { return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR); } } /** * 创建 * @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->isCan(PermissionEnum::controller_schedule_add); $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE)); $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE))); $week = LessonSchedule::byDateGetWeek(self::$TERM_ID, $data['day']); $data['week'] = $week['week']; $data['week_index'] = $week['week_index']; $data['term_id'] = self::$TERM_ID; $data['teach_type'] = TeachTypeEnum::SJ; $data['class_hour'] = Time::byIdGetHour($data['time_id']); //判断是否有课 $where = Arr::only($data, ['term_id', 'week', 'week_index', 'room_id', 'time_id']); $is_exist = LessonSchedule::query()->where('status', LessonScheduleStatusEnum::OK)->where($where)->exists(); if ($is_exist) { return $this->error('该时间段已有课!'); } $teacher_id = Admin::query()->where('id', $data['teacher_admin_id'])->where('type', Teacher::class)->value('type_id') ?? 0; $lessonTeacher = LessonTeacher::query()->firstOrCreate([ 'term_id' => $data['term_id'], 'grade_id' => $data['grade_id'], 'lesson_id' => $data['lesson_id'], 'teacher_id' => $teacher_id, 'teacher_admin_id' => $data['teacher_admin_id'], 'status' => ModelStatusEnum::OK, ], [ 'student_nums' => $data['student_nums'], ]); $data['lesson_teacher_id'] = $lessonTeacher->id; $data['admin_id'] = login_admin_id(); try { $model = $this->repository->create($data); return Response::success($model); } catch (\Exception $e) { return $this->error($e); } } /** * 实时课表 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource */ public function calendar(Request $request) { $this->isCan(PermissionEnum::controller_schedule_list); $this->validate($request, [ // 'term_id' => 'required|integer', 'week' => 'required|integer', 'room_id' => 'required|integer', ]); $term_id = self::$TERM_ID; $week = $request->get('week', false); $room_id = $request->get('room_id', false); $teacher_id = $request->get('teacher_id', false); $lesson_id = $request->get('lesson_id', false); $teach_lesson_id = $request->get('teach_lesson_id', false); $term = Term::byId($term_id); //获取本周 $day = '2022-05-01'; if (!$week) { $week = ceil(Carbon::parse($day)->diffInDays(Carbon::parse($term->start_date)) / 7); if ($week < 1) { $week = 1; } } if (self::$TERM->weeks < $week) { $week = self::$TERM->weeks; } $firstWeekDay = Carbon::parse($term->start_date)->addWeeks($week - 1)->toDateString(); $lessonModel = LessonSchedule::query() ->where('term_id', $term_id) ->when($room_id, function ($query) use ($room_id) { return $query->where('room_id', $room_id); }) ->when($teach_lesson_id, function ($query) use ($teach_lesson_id) { return $query->where('lesson_teacher_id', $teach_lesson_id); }) ->with(['lesson', 'teacher', 'grade', 'room']) ->orderBy('week_index') ->where('week', $week); $times = Time::query()->where('status', ModelStatusEnum::OK)->orderBy('start_time')->select(['id', 'name'])->get(); $headers = []; $calendar = []; for ($i = 0; $i < 7; $i++) { $date = Carbon::parse($firstWeekDay)->addDays($i); $week_index = LessonSchedule::toWeekIndex($date->dayOfWeek); $headers[] = [ 'week' => LessonSchedule::toWeekIndex($date->dayOfWeek), 'day' => $date->toDateString(), ]; $lists = []; foreach ($times as $key => $time) { $model = $lessonModel->clone(); $lesson = $model->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->first(); $tModel = $lessonModel->clone(); $is_stop_lesson = $tModel->whereIn('status', [LessonScheduleStatusEnum::SJ, LessonScheduleStatusEnum::TK])->where('week_index', $i)->where('time_id', $time['id'])->exists(); $lists[$key]['is_stop_lesson'] = $is_stop_lesson; $lists[$key]['is_lesson'] = false; $lists[$key]['is_migrate_lesson'] = false; $lists[$key]['is_maintain'] = false; $lists[$key]['is_open_appointment'] = false; if ($lesson) { switch ($lesson->type) { case ScheduleTypeEnum::LESSON: $lists[$key]['is_lesson'] = true; $lists[$key]['is_migrate_lesson'] = $lesson->migrate_id ? true : false; $lists[$key]['lesson'] = [ 'teach_title' => $lesson->teach_title, 'id' => $lesson->id, 'lesson' => $lesson->lesson, 'teacher' => $lesson->teacher, 'grade' => $lesson->grade, 'group_name' => $lesson->group_name, 'migrate_id' => $lesson->migrate_id, 'student_nums' => $lesson->student_nums, 'is_stop_lesson' => $is_stop_lesson, 'type_id' => $lesson->type_id ]; break; case ScheduleTypeEnum::MAINTAIN: $lists[$key]['is_maintain'] = $lesson->type_id; break; case ScheduleTypeEnum::OPEN_APPOINTMENT: $lists[$key]['is_open_appointment'] = $lesson->type_id; $lists[$key]['open_appointment'] = OpenAppointment::query()->with(['admin'])->where('id', $lesson->type_id)->select(['id', 'department', 'applicant_name', 'applicant_mobile', 'admin_id', 'use_reason'])->first(); break; } } } $calendar[] = [ 'day' => $date->toDateString(), 'week' => $week, 'week_index' => $week_index, 'lists' => $lists ]; } return Response::success(compact('calendar', 'headers', 'week', 'times', 'day')); } /** * 实时课表 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource */ public function calendarSimple(Request $request) { $this->isCan(PermissionEnum::controller_schedule_list); $this->validate($request, [ 'week' => 'required|integer', 'room_id' => 'required|integer', ]); $term_id = self::$TERM_ID; $week = $request->get('week', false); $room_id = $request->get('room_id', false); $term = Term::byId($term_id); //获取本周 $day = '2022-05-01'; if (!$week) { $week = ceil(Carbon::parse($day)->diffInDays(Carbon::parse($term->start_date)) / 7); if ($week < 1) { $week = 1; } } if (self::$TERM->weeks < $week) { $week = self::$TERM->weeks; } $firstWeekDay = Carbon::parse($term->start_date)->addWeeks($week - 1)->toDateString(); $lessonModel = LessonSchedule::query() ->where('term_id', $term_id) ->when($room_id, function ($query) use ($room_id) { return $query->where('room_id', $room_id); }) // ->with(['lesson', 'teacher', 'grade', 'room']) ->orderBy('week_index') ->where('week', $week); $times = Time::query()->where('status', ModelStatusEnum::OK)->orderBy('start_time')->select(['id', 'name'])->get(); $headers = []; $calendar = []; for ($i = 0; $i < 7; $i++) { $date = Carbon::parse($firstWeekDay)->addDays($i); $week_index = LessonSchedule::toWeekIndex($date->dayOfWeek); $headers[] = [ 'week' => $week_index, 'day' => $date->toDateString(), ]; $lists = []; foreach ($times as $key => $time) { $model = $lessonModel->clone(); $is_lesson = $model->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->exists(); $lists[$key]['is_lesson'] = $is_lesson; // if (!$is_lesson) { // $is_maintain = Maintain::query()->where('term_id', $term_id)->where('status', ModelStatusEnum::OK)->where('week', $week)->where('week_index', $i)->where('room_id', $room_id)->where('time_id', $time['id'])->exists(); // $lists[$key]['is_lesson'] = $is_maintain; // } } $calendar[] = [ 'day' => $date->toDateString(), 'week' => $week, 'week_index' => $week_index, 'lists' => $lists ]; } return Response::success(compact('calendar', 'headers', 'week', 'times', 'day')); } /** * 停课、调课 * @param Request $request * @return \Illuminate\Http\JsonResponse|void */ public function changeLesson(Request $request) { $this->isCan(PermissionEnum::controller_schedule_change); $this->validate($request, [ 'id' => 'required|integer', 'type' => 'required|in:1,2,3', 'body' => 'sometimes|nullable', 'migrate_data' => 'sometimes|nullable|array', ]); $id = $request->get('id'); $term_id = self::$TERM_ID; $type = $request->get('type'); $migrate_data = $request->get('migrate_data'); $body = $request->get('body'); $source_type = ScheduleRecordSourceTypeEnum::ADMIN; $admin = login_admin(); if (!$admin->hasAnyRole(['admin'])) { $source_type = ScheduleRecordSourceTypeEnum::TEACHER; } if (in_array($type, [ScheduleRecordTypeEnum::TK, ScheduleRecordTypeEnum::BK])) { //调课 $this->validate($request, [ 'migrate_data' => 'required|array', ]); if (!Arr::has($migrate_data, ['day', 'week', 'time_id', 'week_index', 'room_id', 'time_id'])) { return $this->error('参数有误'); } $migrate_where = Arr::only($migrate_data, ['week', 'time_id', 'week_index', 'room_id', 'time_id']); //查看当前调课是否存在课程 $is_t_exist = LessonSchedule::query()->where($migrate_where)->where('status', ModelStatusEnum::OK)->exists(); if ($is_t_exist) { return $this->error('该时间段已有课程'); } $is_m_exist = Maintain::query()->where($migrate_where)->where('status', ModelStatusEnum::OK)->exists(); if ($is_m_exist) { return $this->error('该时间段暂不能用'); } $migrate_data['time'] = Time::byIdGetBaseInfo($migrate_data['time_id']); } $lesson = LessonSchedule::query()->where('term_id', $term_id)->where('id', $id)->first(); if (!$lesson) { return $this->error('找不该上课记录'); } if ($type != ScheduleRecordTypeEnum::BK && $lesson->status !== LessonScheduleStatusEnum::OK) { return $this->error('该课程状态不对'); } //判断是否有申请单 $is_exist = ScheduleApproveRecord::query() ->whereIn('status', [LessonScheduleApproveStatusEnum::WAIT, LessonScheduleApproveStatusEnum::YX_OK, LessonScheduleApproveStatusEnum::YX_OK]) ->where('lesson_schedule_id', $lesson->id) ->exists(); if ($is_exist) { return $this->error('该排班已经有申请单,请勿重复申请'); } ScheduleApproveRecord::query()->create([ 'term_id' => $lesson->term_id, 'lesson_id' => $lesson->lesson_id, 'teacher_id' => 0, 'lesson_schedule_id' => $lesson->id, 'room_id' => $lesson->room_id, 'schedule_data' => [ 'day' => $lesson->day, 'week' => $lesson->week, 'time' => $lesson->time, 'week_index' => $lesson->week_index, 'grade' => $lesson->grade, 'group_name' => $lesson->group_name, 'teach_title' => $lesson->teach_title, 'room' => $lesson->room, 'teacher' => $lesson->teacher, ], 'type' => $type, 'source_type' => $source_type, 'migrate_data' => $migrate_data, 'body' => $body, 'admin_id' => login_admin_id(), 'status' => LessonScheduleApproveStatusEnum::WAIT ]); return Response::success([]); } /** * 根据时间过去当前时间段的记录 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException */ public function byTimeGetScheduleLogs(Request $request) { $this->isCan(PermissionEnum::controller_schedule_list); $this->validate($request, [ 'week' => 'required|integer', 'week_index' => 'required|integer', 'time_id' => 'required|integer', 'room_id' => 'required|integer', ]); $where = $request->only(['week', 'week_index', 'time_id', 'room_id']); $where['term_id'] = self::$TERM_ID; $lists = LessonSchedule::query()->where('status', '<>', LessonScheduleStatusEnum::OK)->where($where)->orderByDesc('id')->get(); $lists = (new LessonSchedulePresenter())->present($lists); return Response::success($lists); } /** * 暂停 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException */ public function pause(Request $request) { $this->isCan(PermissionEnum::controller_schedule_del); $this->validate($request, [ 'id' => 'required|integer', 'type' => 'sometimes|nullable|integer', ]); $status = ModelStatusEnum::PAUSE; if ($request->get('type')) { $status = ModelStatusEnum::OK; } $re = LessonSchedule::query()->where('id', $request->get('id'))->update(['status' => $status]); if ($re) { return Response::success([]); } return $this->error('操作失败'); } /** * 导出排班 * @param Request $request * @return * @throws \Illuminate\Validation\ValidationException */ public function scheduleExport(Request $request) { $this->isCan(PermissionEnum::controller_schedule_export); $this->validate($request, [ 'room_id' => 'sometimes|integer', ]); $room_id = $request->get('room_id', false); $file_name = '教学任务_' . Str::random(8) . '.xlsx'; return Excel::download(new ScheduleExport(self::$TERM_ID, $room_id), $file_name); } /** * 批量停课 * @param Request $request * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource * @throws \Illuminate\Validation\ValidationException */ public function batchStopLesson(Request $request) { $this->isCan(PermissionEnum::controller_schedule_batch_stop); $this->validate($request, [ 'ids' => 'required|array', 'body' => 'sometimes|nullable', ]); $ids = $request->get('ids'); $term_id = self::$TERM_ID; $type = ScheduleRecordTypeEnum::SK; $body = $request->get('body'); $lessons = LessonSchedule::query()->where('term_id', $term_id)->where('status', LessonScheduleStatusEnum::OK)->whereIn('id', $ids)->get(); if (count($lessons) !== count($ids)) { return $this->error('选中停课中有不满足条件的记录'); } //判断是否有申请单 $is_exist = ScheduleApproveRecord::query() // ->where('source_type', ScheduleRecordSourceTypeEnum::ADMIN) ->whereIn('status', [LessonScheduleApproveStatusEnum::WAIT, LessonScheduleApproveStatusEnum::YX_OK, LessonScheduleApproveStatusEnum::YX_OK]) ->whereIn('lesson_schedule_id', $ids) ->exists(); if ($is_exist) { return $this->error('该排班已经有申请单,请勿重复申请'); } foreach ($lessons as $lesson) { ScheduleApproveRecord::query()->create([ 'term_id' => $lesson->term_id, 'lesson_id' => $lesson->lesson_id, 'teacher_id' => 0, 'lesson_schedule_id' => $lesson->id, 'room_id' => $lesson->room_id, 'schedule_data' => [ 'day' => $lesson->day, 'week' => $lesson->week, 'time' => $lesson->time, 'week_index' => $lesson->week_index, 'grade' => $lesson->grade, 'group_name' => $lesson->group_name, 'teach_title' => $lesson->teach_title, 'room' => $lesson->room, 'teacher' => $lesson->teacher, ], 'type' => $type, 'source_type' => ScheduleRecordSourceTypeEnum::ADMIN, 'body' => $body, 'admin_id' => login_admin_id(), 'status' => LessonScheduleApproveStatusEnum::WAIT ]); } return Response::success([]); } }