123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- <?php
- namespace App\Http\Controllers\Admin\School;
- use App\Contracts\Repositories\School\LessonScheduleRepository;
- use App\Exports\School\ScheduleExport;
- use App\Http\Controllers\Controller;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Enums\PermissionEnum;
- use App\Repositories\Enums\ResponseCodeEnum;
- use App\Repositories\Enums\School\LessonScheduleApproveStatusEnum;
- use App\Repositories\Enums\School\LessonScheduleStatusEnum;
- use App\Repositories\Enums\School\ScheduleRecordSourceTypeEnum;
- use App\Repositories\Enums\School\ScheduleRecordTypeEnum;
- use App\Repositories\Enums\School\ScheduleTypeEnum;
- use App\Repositories\Enums\School\TeachTypeEnum;
- use App\Repositories\Models\Base\Admin;
- use App\Repositories\Models\Lab\Maintain;
- use App\Repositories\Models\Lab\OpenAppointment;
- use App\Repositories\Models\School\LessonSchedule;
- use App\Repositories\Models\School\LessonTeacher;
- use App\Repositories\Models\School\ScheduleApproveRecord;
- use App\Repositories\Models\School\Teacher;
- use App\Repositories\Models\School\Term;
- use App\Repositories\Models\School\Time;
- use App\Repositories\Presenters\School\LessonSchedulePresenter;
- use App\Repositories\Validators\School\LessonScheduleValidator;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Str;
- use Jiannei\Response\Laravel\Support\Facades\Response;
- use Maatwebsite\Excel\Facades\Excel;
- use Prettus\Validator\Contracts\ValidatorInterface;
- /**
- * Class RoomsController.
- *
- * @package namespace App\Http\Controllers\School;
- */
- class ScheduleController extends Controller
- {
- /**
- * @var LessonScheduleRepository
- */
- protected $repository;
- /**
- * @var LessonScheduleValidator
- */
- protected $validator;
- /**
- * LessonsController constructor.
- *
- * @param LessonScheduleRepository $repository
- * @param LessonScheduleValidator $validator
- */
- public function __construct(LessonScheduleRepository $repository, LessonScheduleValidator $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)
- {
- $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([]);
- }
- }
|