123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533 |
- <?php
- namespace App\Http\Controllers\Admin\Lab;
- use App\Http\Controllers\Controller;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Enums\ResponseCodeEnum;
- use App\Repositories\Enums\School\LessonScheduleStatusEnum;
- use App\Repositories\Enums\School\ScheduleTypeEnum;
- use App\Repositories\Enums\School\TeachTypeEnum;
- use App\Repositories\Models\Base\Admin;
- use App\Repositories\Models\Lab\ImportRecord;
- use App\Repositories\Models\Lab\LessonSchedule;
- use App\Repositories\Models\Lab\LessonTeacher;
- use App\Repositories\Models\Lab\Maintain;
- use App\Repositories\Models\Lab\OpenAppointment;
- use App\Repositories\Models\Lab\Schedule;
- use App\Repositories\Models\School\Teacher;
- use App\Repositories\Models\School\Term;
- use App\Repositories\Models\School\Time;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use Illuminate\Support\Arr;
- use Jiannei\Response\Laravel\Support\Facades\Response;
- use App\Contracts\Repositories\Lab\ScheduleRepository;
- use App\Repositories\Validators\Lab\ScheduleValidator;
- /**
- * Class SchedulesController.
- *
- * @package namespace App\Http\Controllers\Lab;
- */
- class SchedulesController extends Controller
- {
- /**
- * @var ScheduleRepository
- */
- protected $repository;
- /**
- * @var ScheduleValidator
- */
- protected $validator;
- /**
- * SchedulesController constructor.
- *
- * @param ScheduleRepository $repository
- * @param ScheduleValidator $validator
- */
- public function __construct(ScheduleRepository $repository, ScheduleValidator $validator)
- {
- parent::__construct();
- $this->repository = $repository;
- $this->validator = $validator;
- }
- /**
- * 排班列表
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
- */
- 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
- */
- public function lists(Request $request)
- {
- $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)
- {
- 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
- * @throws \Illuminate\Validation\ValidationException
- */
- public function pause(Request $request)
- {
- $this->validate($request, [
- 'id' => 'required|integer',
- ]);
- $re = Schedule::query()->where('id', $request->get('id'))->update(['status' => ModelStatusEnum::PAUSE]);
- if ($re) {
- return Response::success([]);
- }
- return $this->error('操作失败');
- }
- /**
- * 实时课表
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
- */
- public function calendar(Request $request)
- {
- $this->validate($request, [
- // 'term_id' => 'required|integer',
- 'id' => 'required|integer',
- 'week' => 'required|integer',
- 'room_id' => 'required|integer',
- ]);
- $term_id = self::$TERM_ID;
- $id = $request->get('id', false);
- $week = $request->get('week', 1);
- $room_id = $request->get('room_id', false);
- $teacher_id = $request->get('teacher_id', false);
- $lesson_id = $request->get('lesson_id', false);
- $importRecordModel = ImportRecord::query()->find($id);
- if (!$importRecordModel) {
- return $this->error('找不到该记录');
- }
- $term = Term::byId($importRecordModel->term_id);
- $firstWeekDay = Carbon::parse($term->start_date)->addWeeks($week - 1)->toDateString();
- $lessonModel = Schedule::query()
- ->where('import_record_id', $id)
- ->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);
- $mainLessonModel = \App\Repositories\Models\School\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 = [];
- foreach ($times as $k => $time) {
- $lists = [];
- for ($i = 0; $i < 7; $i++) {
- if (!$k) {
- $date = Carbon::parse($firstWeekDay)->addDays($i);
- $headers[] = [
- 'week' => LessonSchedule::toWeekIndex($date->dayOfWeek),
- 'day' => $date->toDateString(),
- ];
- }
- $model = $lessonModel->clone();
- $mainModel = $mainLessonModel->clone();
- $lists[$i]['is_main_lesson'] = false;
- $lists[$i]['is_maintain'] = false;
- $lists[$i]['is_lesson'] = false;
- $mainLesson = $mainModel->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->first();
- // if ($mainLesson) {
- // $lists[$i]['is_main_lesson'] = true;
- // $lists[$i]['main_lesson'] = [
- // 'teach_title' => $mainLesson->teach_title,
- // 'id' => $mainLesson->id,
- // 'lesson' => $mainLesson->lesson,
- // 'teacher' => $mainLesson->teacher,
- // 'grade' => $mainLesson->grade,
- // 'group_name' => $mainLesson->group_name,
- // 'is_clash' => $mainLesson->is_clash,
- // 'student_nums' => $mainLesson->student_nums,
- // 'type' => $mainLesson->type,
- // ];
- // } else {
- // $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'])->value('id');
- // if ($is_maintain) $lists[$i]['is_maintain'] = $is_maintain;
- // }
- if ($mainLesson) {
- switch ($mainLesson->type) {
- case ScheduleTypeEnum::LESSON:
- $lists[$i]['is_main_lesson'] = true;
- // $lists[$i]['is_main_lesson'] = $mainLesson->migrate_id ? true : false;
- $lists[$i]['main_lesson'] = [
- 'teach_title' => $mainLesson->teach_title,
- 'id' => $mainLesson->id,
- 'lesson' => $mainLesson->lesson,
- 'teacher' => $mainLesson->teacher,
- 'grade' => $mainLesson->grade,
- 'group_name' => $mainLesson->group_name,
- 'migrate_id' => $mainLesson->migrate_id,
- 'student_nums' => $mainLesson->student_nums,
- // 'is_stop_lesson' => $is_stop_lesson,
- 'type_id' => $mainLesson->type_id
- ];
- break;
- case ScheduleTypeEnum::MAINTAIN:
- $lists[$i]['is_maintain'] = $mainLesson->type_id;
- break;
- case ScheduleTypeEnum::OPEN_APPOINTMENT:
- $lists[$i]['is_open_appointment'] = $mainLesson->type_id;
- $lists[$i]['open_appointment'] = OpenAppointment::query()->with(['admin'])->where('id', $mainLesson->type_id)->select(['id', 'department', 'applicant_name', 'applicant_mobile', 'admin_id', 'use_reason'])->first();
- break;
- }
- }
- $lessons = $model->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->get();
- if ($lessons->isNotEmpty()) {
- $lists[$i]['is_lesson'] = true;
- foreach ($lessons as $lesson) {
- $lists[$i]['lesson'][] = [
- 'teach_title' => $lesson->teach_title,
- 'id' => $lesson->id,
- 'lesson' => $lesson->lesson,
- 'teacher' => $lesson->teacher,
- 'grade' => $lesson->grade,
- 'group_name' => $lesson->group_name,
- 'is_clash' => $lesson->is_clash,
- 'student_nums' => $lesson->student_nums,
- ];
- }
- }
- }
- $calendar[$k] = $lists;
- }
- return Response::success(compact('calendar', 'headers', 'week', 'times'));
- }
- /**
- * 实时课表
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
- */
- public function calendarSimple(Request $request)
- {
- $this->validate($request, [
- 'id' => 'required|integer',
- 'week' => 'required|integer',
- 'room_id' => 'required|integer',
- ]);
- $term_id = self::$TERM_ID;
- $id = $request->get('id', false);
- $week = $request->get('week', 1);
- $room_id = $request->get('room_id', false);
- $importRecordModel = ImportRecord::query()->find($id);
- if (!$importRecordModel) {
- return $this->error('找不到该记录');
- }
- $term = Term::byId($importRecordModel->term_id);
- $firstWeekDay = Carbon::parse($term->start_date)->addWeeks($week - 1)->toDateString();
- $lessonModel = Schedule::query()
- ->where('import_record_id', $id)
- ->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);
- $mainLessonModel = \App\Repositories\Models\School\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();
- $mainModel = $mainLessonModel->clone();
- $is_lesson = $model->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->exists();
- $is_main_lesson = $mainModel->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->exists();
- $lists[$key]['is_lesson'] = $is_lesson;
- $lists[$key]['is_main_lesson'] = $is_main_lesson;
- $lists[$key]['is_maintain_lesson'] = false;
- if (!$is_main_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_maintain_lesson'] = $is_maintain;
- }
- }
- $calendar[] = [
- 'day' => $date->toDateString(),
- 'week' => $week,
- 'week_index' => $week_index,
- 'lists' => $lists
- ];
- }
- return Response::success(compact('calendar', 'headers', 'week', 'times'));
- }
- /**
- * 创建
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource|void
- * @throws \Illuminate\Validation\ValidationException
- * Author: Mead
- */
- public function storeSchedule(Request $request)
- {
- $this->validate($request, [
- 'import_record_id' => 'required|integer',
- 'lesson_teacher_id' => 'required|integer',
- 'room_id' => 'required|integer',
- 'time_id' => 'required|integer',
- 'day' => 'required|date',
- 'teach_title' => 'sometimes|nullable',
- // 'class_hour' => 'required|integer',
- 'group' => 'required|integer',
- 'student_nums' => 'required|integer',
- ]);
- $lesson_teacher_id = $request->get('lesson_teacher_id', false);
- $import_record_id = $request->get('import_record_id', false);
- $importRecordModel = ImportRecord::query()->find($import_record_id);
- if (!$importRecordModel) {
- return $this->error('找不到该记录');
- }
- $lessonTeacher = null;
- if ($lesson_teacher_id) {
- $lessonTeacher = LessonTeacher::query()->find($lesson_teacher_id);
- if (!$lessonTeacher) {
- return $this->error('找不到任课记录');
- }
- } else {
- $this->validate($request, [
- 'lesson_teacher.lesson_id' => 'required|integer',
- 'lesson_teacher.teacher_admin_id' => 'required|integer',
- 'lesson_teacher.grade_id' => 'required|integer',
- ]);
- }
- $day = $request->get('day');
- $time_id = $request->get('time_id');
- $data = $request->only(['teach_title', 'group', 'student_nums', 'time_id', 'room_id', 'day']);
- $data['import_record_id'] = $importRecordModel->id;
- $week = Schedule::byDateGetWeek($importRecordModel->term_id, $day);
- $data['week'] = $week['week'];
- $data['week_index'] = $week['week_index'];
- $data['term_id'] = $importRecordModel->term_id;
- $data['teach_type'] = TeachTypeEnum::SJ;
- $data['class_hour'] = Time::byIdGetHour($time_id);
- //判断是否有课
- $where = Arr::only($data, ['term_id', 'week', 'week_index', 'room_id', 'time_id']);
- $is_exist = Schedule::query()->where('import_record_id', $import_record_id)->where('status', LessonScheduleStatusEnum::OK)->where($where)->exists();
- if ($is_exist) {
- return $this->error('该时间段已有课!');
- }
- $is_t_exist = \App\Repositories\Models\School\LessonSchedule::query()->where($where)->where('status', ModelStatusEnum::OK)->exists();
- if ($is_t_exist) {
- return $this->error('该时间段已有课程');
- }
- $is_m_exist = Maintain::query()->where($where)->where('status', ModelStatusEnum::OK)->exists();
- if ($is_m_exist) {
- return $this->error('该时间段暂不能用');
- }
- if (!$lesson_teacher_id) {
- $d = $request->get('lesson_teacher');
- $teacher_id = Admin::byIdGetTypeId($d['teacher_admin_id'], Teacher::class);
- $lessonTeacher = LessonTeacher::query()->firstOrCreate([
- 'term_id' => $data['term_id'],
- 'grade_id' => $d['grade_id'],
- 'lesson_id' => $d['lesson_id'],
- 'teacher_admin_id' => $d['teacher_admin_id'],
- 'status' => ModelStatusEnum::OK,
- ], [
- 'teacher_id' => $teacher_id,
- 'student_nums' => $data['student_nums'],
- 'import_record_id' => $data['import_record_id'],
- ]);
- }
- unset($data['lesson_teacher']);
- $data['lesson_teacher_id'] = $lessonTeacher->teacher_id;
- $data['teach_teacher_ids'] = [$lessonTeacher->teacher_id];
- $data['teacher_admin_id'] = $lessonTeacher->teacher_admin_id;
- $data['teacher_id'] = $lessonTeacher->teacher_id;
- $data['grade_id'] = $lessonTeacher->grade_id;
- $data['lesson_id'] = $lessonTeacher->lesson_id;
- $data['admin_id'] = login_admin_id();
- try {
- $model = Schedule::query()->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
- * @throws \Illuminate\Validation\ValidationException
- */
- public function updateSchedule(Request $request)
- {
- $this->validate($request, [
- 'id' => 'required|integer',
- 'room_id' => 'required|integer',
- // 'week' => 'sometimes|integer',
- // 'week_index' => 'sometimes|integer',
- 'time_id' => 'required|integer',
- 'day' => 'required|date',
- ]);
- $id = $request->get('id');
- $room_id = $request->get('room_id');
- // $week = $request->get('week');
- $time_id = $request->get('time_id');
- $day = $request->get('day');
- $lessonScheduleModel = Schedule::query()->find($id);
- if (!$lessonScheduleModel) {
- return $this->error('找不到该记录');
- }
- $weekData = \App\Repositories\Models\School\LessonSchedule::byDateGetWeek($lessonScheduleModel->term_id, $day);
- //判断是否有课
- $migrate_where = ['week' => $weekData['week'], 'time_id' => $time_id, 'week_index' => $weekData['week_index'], 'room_id' => $room_id, 'time_id' => $time_id];
- //查看当前调课是否存在课程
- $is_t_exist = \App\Repositories\Models\School\LessonSchedule::query()->where($migrate_where)->where('status', ModelStatusEnum::OK)->exists();
- if ($is_t_exist) {
- return $this->error('该时间段已有课程');
- }
- $is_t_exist = Schedule::query()->where('import_record_id', $lessonScheduleModel->import_record_id)->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('该时间段暂不能用');
- }
- $lessonScheduleModel->day = $day;
- $lessonScheduleModel->week = $weekData['week'];
- $lessonScheduleModel->week_index = $weekData['week_index'];
- $lessonScheduleModel->room_id = $room_id;
- $lessonScheduleModel->time_id = $time_id;
- $lessonScheduleModel->is_clash = 0;
- $lessonScheduleModel->save();
- return Response::success([]);
- }
- /**
- * 删除
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
- * @throws \Illuminate\Validation\ValidationException
- */
- public function delSchedule(Request $request)
- {
- $this->validate($request, [
- 'id' => 'required|integer',
- ]);
- $id = $request->get('id');
- $lessonScheduleModel = Schedule::query()->find($id);
- if (!$lessonScheduleModel) {
- return $this->error('找不到该记录');
- }
- $lessonScheduleModel->delete();
- return Response::success([]);
- }
- }
|