SchedulesController.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. <?php
  2. namespace App\Http\Controllers\Admin\Lab;
  3. use App\Http\Controllers\Controller;
  4. use App\Repositories\Enums\ModelStatusEnum;
  5. use App\Repositories\Enums\ResponseCodeEnum;
  6. use App\Repositories\Enums\School\LessonScheduleStatusEnum;
  7. use App\Repositories\Enums\School\ScheduleTypeEnum;
  8. use App\Repositories\Enums\School\TeachTypeEnum;
  9. use App\Repositories\Models\Base\Admin;
  10. use App\Repositories\Models\Lab\ImportRecord;
  11. use App\Repositories\Models\Lab\LessonSchedule;
  12. use App\Repositories\Models\Lab\LessonTeacher;
  13. use App\Repositories\Models\Lab\Maintain;
  14. use App\Repositories\Models\Lab\OpenAppointment;
  15. use App\Repositories\Models\Lab\Schedule;
  16. use App\Repositories\Models\School\Teacher;
  17. use App\Repositories\Models\School\Term;
  18. use App\Repositories\Models\School\Time;
  19. use Carbon\Carbon;
  20. use Illuminate\Http\Request;
  21. use Illuminate\Support\Arr;
  22. use Jiannei\Response\Laravel\Support\Facades\Response;
  23. use App\Contracts\Repositories\Lab\ScheduleRepository;
  24. use App\Repositories\Validators\Lab\ScheduleValidator;
  25. /**
  26. * Class SchedulesController.
  27. *
  28. * @package namespace App\Http\Controllers\Lab;
  29. */
  30. class SchedulesController extends Controller
  31. {
  32. /**
  33. * @var ScheduleRepository
  34. */
  35. protected $repository;
  36. /**
  37. * @var ScheduleValidator
  38. */
  39. protected $validator;
  40. /**
  41. * SchedulesController constructor.
  42. *
  43. * @param ScheduleRepository $repository
  44. * @param ScheduleValidator $validator
  45. */
  46. public function __construct(ScheduleRepository $repository, ScheduleValidator $validator)
  47. {
  48. parent::__construct();
  49. $this->repository = $repository;
  50. $this->validator = $validator;
  51. }
  52. /**
  53. * 排班列表
  54. * @param Request $request
  55. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  56. */
  57. public function index(Request $request)
  58. {
  59. $lists = $this->repository->paginate($request->get('per_page', self::PAGE_NUM));
  60. return Response::success($lists);
  61. }
  62. /**
  63. * 排班列表
  64. * @param Request $request
  65. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  66. */
  67. public function lists(Request $request)
  68. {
  69. $lists = $this->repository->all();
  70. return Response::success($lists);
  71. }
  72. /**
  73. * 详情
  74. * @param $id
  75. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  76. */
  77. public function show($id)
  78. {
  79. $data = $this->repository->find($id);
  80. return Response::success($data);
  81. }
  82. /**
  83. * 删除
  84. * @param $id
  85. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  86. * Author: Mead
  87. */
  88. public function destroy($id)
  89. {
  90. try {
  91. $this->repository->skipPresenter()->delete($id);
  92. return Response::success(null, T('successfully delete.'));
  93. } catch (\Exception $exception) {
  94. return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
  95. }
  96. }
  97. /**
  98. * 暂停
  99. * @param Request $request
  100. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  101. * @throws \Illuminate\Validation\ValidationException
  102. */
  103. public function pause(Request $request)
  104. {
  105. $this->validate($request, [
  106. 'id' => 'required|integer',
  107. ]);
  108. $re = Schedule::query()->where('id', $request->get('id'))->update(['status' => ModelStatusEnum::PAUSE]);
  109. if ($re) {
  110. return Response::success([]);
  111. }
  112. return $this->error('操作失败');
  113. }
  114. /**
  115. * 实时课表
  116. * @param Request $request
  117. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  118. */
  119. public function calendar(Request $request)
  120. {
  121. $this->validate($request, [
  122. // 'term_id' => 'required|integer',
  123. 'id' => 'required|integer',
  124. 'week' => 'required|integer',
  125. 'room_id' => 'required|integer',
  126. ]);
  127. $term_id = self::$TERM_ID;
  128. $id = $request->get('id', false);
  129. $week = $request->get('week', 1);
  130. $room_id = $request->get('room_id', false);
  131. $teacher_id = $request->get('teacher_id', false);
  132. $lesson_id = $request->get('lesson_id', false);
  133. $importRecordModel = ImportRecord::query()->find($id);
  134. if (!$importRecordModel) {
  135. return $this->error('找不到该记录');
  136. }
  137. $term = Term::byId($importRecordModel->term_id);
  138. $firstWeekDay = Carbon::parse($term->start_date)->addWeeks($week - 1)->toDateString();
  139. $lessonModel = Schedule::query()
  140. ->where('import_record_id', $id)
  141. ->where('term_id', $term_id)
  142. ->when($room_id, function ($query) use ($room_id) {
  143. return $query->where('room_id', $room_id);
  144. })
  145. ->with(['lesson', 'teacher', 'grade', 'room'])
  146. ->orderBy('week_index')
  147. ->where('week', $week);
  148. $mainLessonModel = \App\Repositories\Models\School\LessonSchedule::query()
  149. ->where('term_id', $term_id)
  150. ->when($room_id, function ($query) use ($room_id) {
  151. return $query->where('room_id', $room_id);
  152. })
  153. ->with(['lesson', 'teacher', 'grade', 'room'])
  154. ->orderBy('week_index')
  155. ->where('week', $week);
  156. $times = Time::query()->where('status', ModelStatusEnum::OK)->orderBy('start_time')->select(['id', 'name'])->get();
  157. $headers = [];
  158. $calendar = [];
  159. foreach ($times as $k => $time) {
  160. $lists = [];
  161. for ($i = 0; $i < 7; $i++) {
  162. if (!$k) {
  163. $date = Carbon::parse($firstWeekDay)->addDays($i);
  164. $headers[] = [
  165. 'week' => LessonSchedule::toWeekIndex($date->dayOfWeek),
  166. 'day' => $date->toDateString(),
  167. ];
  168. }
  169. $model = $lessonModel->clone();
  170. $mainModel = $mainLessonModel->clone();
  171. $lists[$i]['is_main_lesson'] = false;
  172. $lists[$i]['is_maintain'] = false;
  173. $lists[$i]['is_lesson'] = false;
  174. $mainLesson = $mainModel->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->first();
  175. // if ($mainLesson) {
  176. // $lists[$i]['is_main_lesson'] = true;
  177. // $lists[$i]['main_lesson'] = [
  178. // 'teach_title' => $mainLesson->teach_title,
  179. // 'id' => $mainLesson->id,
  180. // 'lesson' => $mainLesson->lesson,
  181. // 'teacher' => $mainLesson->teacher,
  182. // 'grade' => $mainLesson->grade,
  183. // 'group_name' => $mainLesson->group_name,
  184. // 'is_clash' => $mainLesson->is_clash,
  185. // 'student_nums' => $mainLesson->student_nums,
  186. // 'type' => $mainLesson->type,
  187. // ];
  188. // } else {
  189. // $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');
  190. // if ($is_maintain) $lists[$i]['is_maintain'] = $is_maintain;
  191. // }
  192. if ($mainLesson) {
  193. switch ($mainLesson->type) {
  194. case ScheduleTypeEnum::LESSON:
  195. $lists[$i]['is_main_lesson'] = true;
  196. // $lists[$i]['is_main_lesson'] = $mainLesson->migrate_id ? true : false;
  197. $lists[$i]['main_lesson'] = [
  198. 'teach_title' => $mainLesson->teach_title,
  199. 'id' => $mainLesson->id,
  200. 'lesson' => $mainLesson->lesson,
  201. 'teacher' => $mainLesson->teacher,
  202. 'grade' => $mainLesson->grade,
  203. 'group_name' => $mainLesson->group_name,
  204. 'migrate_id' => $mainLesson->migrate_id,
  205. 'student_nums' => $mainLesson->student_nums,
  206. // 'is_stop_lesson' => $is_stop_lesson,
  207. 'type_id' => $mainLesson->type_id
  208. ];
  209. break;
  210. case ScheduleTypeEnum::MAINTAIN:
  211. $lists[$i]['is_maintain'] = $mainLesson->type_id;
  212. break;
  213. case ScheduleTypeEnum::OPEN_APPOINTMENT:
  214. $lists[$i]['is_open_appointment'] = $mainLesson->type_id;
  215. $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();
  216. break;
  217. }
  218. }
  219. $lessons = $model->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->get();
  220. if ($lessons->isNotEmpty()) {
  221. $lists[$i]['is_lesson'] = true;
  222. foreach ($lessons as $lesson) {
  223. $lists[$i]['lesson'][] = [
  224. 'teach_title' => $lesson->teach_title,
  225. 'id' => $lesson->id,
  226. 'lesson' => $lesson->lesson,
  227. 'teacher' => $lesson->teacher,
  228. 'grade' => $lesson->grade,
  229. 'group_name' => $lesson->group_name,
  230. 'is_clash' => $lesson->is_clash,
  231. 'student_nums' => $lesson->student_nums,
  232. ];
  233. }
  234. }
  235. }
  236. $calendar[$k] = $lists;
  237. }
  238. return Response::success(compact('calendar', 'headers', 'week', 'times'));
  239. }
  240. /**
  241. * 实时课表
  242. * @param Request $request
  243. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  244. */
  245. public function calendarSimple(Request $request)
  246. {
  247. $this->validate($request, [
  248. 'id' => 'required|integer',
  249. 'week' => 'required|integer',
  250. 'room_id' => 'required|integer',
  251. ]);
  252. $term_id = self::$TERM_ID;
  253. $id = $request->get('id', false);
  254. $week = $request->get('week', 1);
  255. $room_id = $request->get('room_id', false);
  256. $importRecordModel = ImportRecord::query()->find($id);
  257. if (!$importRecordModel) {
  258. return $this->error('找不到该记录');
  259. }
  260. $term = Term::byId($importRecordModel->term_id);
  261. $firstWeekDay = Carbon::parse($term->start_date)->addWeeks($week - 1)->toDateString();
  262. $lessonModel = Schedule::query()
  263. ->where('import_record_id', $id)
  264. ->where('term_id', $term_id)
  265. ->when($room_id, function ($query) use ($room_id) {
  266. return $query->where('room_id', $room_id);
  267. })
  268. // ->with(['lesson', 'teacher', 'grade', 'room'])
  269. ->orderBy('week_index')
  270. ->where('week', $week);
  271. $mainLessonModel = \App\Repositories\Models\School\LessonSchedule::query()
  272. ->where('term_id', $term_id)
  273. ->when($room_id, function ($query) use ($room_id) {
  274. return $query->where('room_id', $room_id);
  275. })
  276. ->with(['lesson', 'teacher', 'grade', 'room'])
  277. ->orderBy('week_index')
  278. ->where('week', $week);
  279. $times = Time::query()->where('status', ModelStatusEnum::OK)->orderBy('start_time')->select(['id', 'name'])->get();
  280. $headers = [];
  281. $calendar = [];
  282. for ($i = 0; $i < 7; $i++) {
  283. $date = Carbon::parse($firstWeekDay)->addDays($i);
  284. $week_index = LessonSchedule::toWeekIndex($date->dayOfWeek);
  285. $headers[] = [
  286. 'week' => $week_index,
  287. 'day' => $date->toDateString(),
  288. ];
  289. $lists = [];
  290. foreach ($times as $key => $time) {
  291. $model = $lessonModel->clone();
  292. $mainModel = $mainLessonModel->clone();
  293. $is_lesson = $model->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->exists();
  294. $is_main_lesson = $mainModel->where('status', LessonScheduleStatusEnum::OK)->where('week_index', $i)->where('time_id', $time['id'])->exists();
  295. $lists[$key]['is_lesson'] = $is_lesson;
  296. $lists[$key]['is_main_lesson'] = $is_main_lesson;
  297. $lists[$key]['is_maintain_lesson'] = false;
  298. if (!$is_main_lesson) {
  299. $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();
  300. $lists[$key]['is_maintain_lesson'] = $is_maintain;
  301. }
  302. }
  303. $calendar[] = [
  304. 'day' => $date->toDateString(),
  305. 'week' => $week,
  306. 'week_index' => $week_index,
  307. 'lists' => $lists
  308. ];
  309. }
  310. return Response::success(compact('calendar', 'headers', 'week', 'times'));
  311. }
  312. /**
  313. * 创建
  314. * @param Request $request
  315. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource|void
  316. * @throws \Illuminate\Validation\ValidationException
  317. * Author: Mead
  318. */
  319. public function storeSchedule(Request $request)
  320. {
  321. $this->validate($request, [
  322. 'import_record_id' => 'required|integer',
  323. 'lesson_teacher_id' => 'required|integer',
  324. 'room_id' => 'required|integer',
  325. 'time_id' => 'required|integer',
  326. 'day' => 'required|date',
  327. 'teach_title' => 'sometimes|nullable',
  328. // 'class_hour' => 'required|integer',
  329. 'group' => 'required|integer',
  330. 'student_nums' => 'required|integer',
  331. ]);
  332. $lesson_teacher_id = $request->get('lesson_teacher_id', false);
  333. $import_record_id = $request->get('import_record_id', false);
  334. $importRecordModel = ImportRecord::query()->find($import_record_id);
  335. if (!$importRecordModel) {
  336. return $this->error('找不到该记录');
  337. }
  338. $lessonTeacher = null;
  339. if ($lesson_teacher_id) {
  340. $lessonTeacher = LessonTeacher::query()->find($lesson_teacher_id);
  341. if (!$lessonTeacher) {
  342. return $this->error('找不到任课记录');
  343. }
  344. } else {
  345. $this->validate($request, [
  346. 'lesson_teacher.lesson_id' => 'required|integer',
  347. 'lesson_teacher.teacher_admin_id' => 'required|integer',
  348. 'lesson_teacher.grade_id' => 'required|integer',
  349. ]);
  350. }
  351. $day = $request->get('day');
  352. $time_id = $request->get('time_id');
  353. $data = $request->only(['teach_title', 'group', 'student_nums', 'time_id', 'room_id', 'day']);
  354. $data['import_record_id'] = $importRecordModel->id;
  355. $week = Schedule::byDateGetWeek($importRecordModel->term_id, $day);
  356. $data['week'] = $week['week'];
  357. $data['week_index'] = $week['week_index'];
  358. $data['term_id'] = $importRecordModel->term_id;
  359. $data['teach_type'] = TeachTypeEnum::SJ;
  360. $data['class_hour'] = Time::byIdGetHour($time_id);
  361. //判断是否有课
  362. $where = Arr::only($data, ['term_id', 'week', 'week_index', 'room_id', 'time_id']);
  363. $is_exist = Schedule::query()->where('import_record_id', $import_record_id)->where('status', LessonScheduleStatusEnum::OK)->where($where)->exists();
  364. if ($is_exist) {
  365. return $this->error('该时间段已有课!');
  366. }
  367. $is_t_exist = \App\Repositories\Models\School\LessonSchedule::query()->where($where)->where('status', ModelStatusEnum::OK)->exists();
  368. if ($is_t_exist) {
  369. return $this->error('该时间段已有课程');
  370. }
  371. $is_m_exist = Maintain::query()->where($where)->where('status', ModelStatusEnum::OK)->exists();
  372. if ($is_m_exist) {
  373. return $this->error('该时间段暂不能用');
  374. }
  375. if (!$lesson_teacher_id) {
  376. $d = $request->get('lesson_teacher');
  377. $teacher_id = Admin::byIdGetTypeId($d['teacher_admin_id'], Teacher::class);
  378. $lessonTeacher = LessonTeacher::query()->firstOrCreate([
  379. 'term_id' => $data['term_id'],
  380. 'grade_id' => $d['grade_id'],
  381. 'lesson_id' => $d['lesson_id'],
  382. 'teacher_admin_id' => $d['teacher_admin_id'],
  383. 'status' => ModelStatusEnum::OK,
  384. ], [
  385. 'teacher_id' => $teacher_id,
  386. 'student_nums' => $data['student_nums'],
  387. 'import_record_id' => $data['import_record_id'],
  388. ]);
  389. }
  390. unset($data['lesson_teacher']);
  391. $data['lesson_teacher_id'] = $lessonTeacher->teacher_id;
  392. $data['teach_teacher_ids'] = [$lessonTeacher->teacher_id];
  393. $data['teacher_admin_id'] = $lessonTeacher->teacher_admin_id;
  394. $data['teacher_id'] = $lessonTeacher->teacher_id;
  395. $data['grade_id'] = $lessonTeacher->grade_id;
  396. $data['lesson_id'] = $lessonTeacher->lesson_id;
  397. $data['admin_id'] = login_admin_id();
  398. try {
  399. $model = Schedule::query()->create($data);
  400. return Response::success($model);
  401. } catch (\Exception $e) {
  402. return $this->error($e);
  403. }
  404. }
  405. /**
  406. * 更新
  407. * @param Request $request
  408. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  409. * @throws \Illuminate\Validation\ValidationException
  410. */
  411. public function updateSchedule(Request $request)
  412. {
  413. $this->validate($request, [
  414. 'id' => 'required|integer',
  415. 'room_id' => 'required|integer',
  416. // 'week' => 'sometimes|integer',
  417. // 'week_index' => 'sometimes|integer',
  418. 'time_id' => 'required|integer',
  419. 'day' => 'required|date',
  420. ]);
  421. $id = $request->get('id');
  422. $room_id = $request->get('room_id');
  423. // $week = $request->get('week');
  424. $time_id = $request->get('time_id');
  425. $day = $request->get('day');
  426. $lessonScheduleModel = Schedule::query()->find($id);
  427. if (!$lessonScheduleModel) {
  428. return $this->error('找不到该记录');
  429. }
  430. $weekData = \App\Repositories\Models\School\LessonSchedule::byDateGetWeek($lessonScheduleModel->term_id, $day);
  431. //判断是否有课
  432. $migrate_where = ['week' => $weekData['week'], 'time_id' => $time_id, 'week_index' => $weekData['week_index'], 'room_id' => $room_id, 'time_id' => $time_id];
  433. //查看当前调课是否存在课程
  434. $is_t_exist = \App\Repositories\Models\School\LessonSchedule::query()->where($migrate_where)->where('status', ModelStatusEnum::OK)->exists();
  435. if ($is_t_exist) {
  436. return $this->error('该时间段已有课程');
  437. }
  438. $is_t_exist = Schedule::query()->where('import_record_id', $lessonScheduleModel->import_record_id)->where($migrate_where)->where('status', ModelStatusEnum::OK)->exists();
  439. if ($is_t_exist) {
  440. return $this->error('该时间段已有课');
  441. }
  442. $is_m_exist = Maintain::query()->where($migrate_where)->where('status', ModelStatusEnum::OK)->exists();
  443. if ($is_m_exist) {
  444. return $this->error('该时间段暂不能用');
  445. }
  446. $lessonScheduleModel->day = $day;
  447. $lessonScheduleModel->week = $weekData['week'];
  448. $lessonScheduleModel->week_index = $weekData['week_index'];
  449. $lessonScheduleModel->room_id = $room_id;
  450. $lessonScheduleModel->time_id = $time_id;
  451. $lessonScheduleModel->is_clash = 0;
  452. $lessonScheduleModel->save();
  453. return Response::success([]);
  454. }
  455. /**
  456. * 删除
  457. * @param Request $request
  458. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  459. * @throws \Illuminate\Validation\ValidationException
  460. */
  461. public function delSchedule(Request $request)
  462. {
  463. $this->validate($request, [
  464. 'id' => 'required|integer',
  465. ]);
  466. $id = $request->get('id');
  467. $lessonScheduleModel = Schedule::query()->find($id);
  468. if (!$lessonScheduleModel) {
  469. return $this->error('找不到该记录');
  470. }
  471. $lessonScheduleModel->delete();
  472. return Response::success([]);
  473. }
  474. }