OpenAppointmentsController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. namespace App\Http\Controllers\Admin\Lab;
  3. use App\Http\Controllers\Controller;
  4. use App\Repositories\Enums\CheckStatusEnum;
  5. use App\Repositories\Enums\Lab\OpenAppointmentStatusEnum;
  6. use App\Repositories\Enums\ModelStatusEnum;
  7. use App\Repositories\Enums\PermissionEnum;
  8. use App\Repositories\Enums\ResponseCodeEnum;
  9. use App\Repositories\Enums\School\ScheduleTypeEnum;
  10. use App\Repositories\Enums\School\TeachTypeEnum;
  11. use App\Repositories\Models\Base\Admin;
  12. use App\Repositories\Models\Lab\Maintain;
  13. use App\Repositories\Models\Lab\OpenAppointment;
  14. use App\Repositories\Models\Lab\OpenAppointmentLog;
  15. use App\Repositories\Models\School\LessonSchedule;
  16. use App\Repositories\Models\School\Room;
  17. use App\Repositories\Models\School\ScheduleApproveLog;
  18. use App\Repositories\Models\School\Teacher;
  19. use App\Repositories\Models\School\Time;
  20. use App\Services\Lab\OpenAppointmentService;
  21. use Carbon\Carbon;
  22. use Illuminate\Http\Request;
  23. use Illuminate\Support\Arr;
  24. use Illuminate\Support\Facades\DB;
  25. use Jiannei\Response\Laravel\Support\Facades\Response;
  26. use App\Contracts\Repositories\Lab\OpenAppointmentRepository;
  27. use App\Repositories\Validators\Lab\OpenAppointmentValidator;
  28. use PhpOffice\PhpWord\Element\Table;
  29. use PhpOffice\PhpWord\SimpleType\TblWidth;
  30. use PhpOffice\PhpWord\TemplateProcessor;
  31. use Prettus\Validator\Contracts\ValidatorInterface;
  32. /**
  33. * Class OpenAppointmentsController.
  34. *
  35. * @package namespace App\Http\Controllers\Lab;
  36. */
  37. class OpenAppointmentsController extends Controller
  38. {
  39. /**
  40. * @var OpenAppointmentRepository
  41. */
  42. protected $repository;
  43. /**
  44. * @var OpenAppointmentValidator
  45. */
  46. protected $validator;
  47. /**
  48. * OpenAppointmentsController constructor.
  49. *
  50. * @param OpenAppointmentRepository $repository
  51. * @param OpenAppointmentValidator $validator
  52. */
  53. public function __construct(OpenAppointmentRepository $repository, OpenAppointmentValidator $validator)
  54. {
  55. parent::__construct();
  56. $this->repository = $repository;
  57. $this->validator = $validator;
  58. }
  59. /**
  60. * 列表
  61. * @param Request $request
  62. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  63. * Author: Mead
  64. */
  65. public function index(Request $request)
  66. {
  67. $lists = $this->repository->paginate($request->get('per_page', self::PAGE_NUM));
  68. return Response::success($lists);
  69. }
  70. /**
  71. * 申请
  72. * @param Request $request
  73. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  74. * @throws \Illuminate\Validation\ValidationException
  75. */
  76. public function store(Request $request)
  77. {
  78. $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE));
  79. $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE)));
  80. $use = $data['use_data'];
  81. //验证时间是否合法
  82. $appointments = [];
  83. foreach ($use as $u) {
  84. if (!Arr::has($u, ['week', 'week_index', 'time_id', 'room_id'])) {
  85. return $this->error('参数非法');
  86. }
  87. $time = Arr::only($u, ['week', 'week_index', 'time_id', 'room_id']);
  88. $is_exists = LessonSchedule::query()->where($time)->where('term_id', self::$TERM_ID)->where('status', ModelStatusEnum::OK)->exists();
  89. if ($is_exists) {
  90. return $this->error('该时间段不能预约');
  91. }
  92. $time['day'] = LessonSchedule::byTimeGetDate(self::$TERM_ID, $time['week'], $time['week_index']);
  93. $time['room_name'] = Room::query()->where('id', $time['room_id'])->value('name');
  94. $time['time_name'] = Time::query()->where('id', $time['time_id'])->value('name');
  95. $appointments[] = $time;
  96. }
  97. $data['term_id'] = self::$TERM_ID;
  98. $data['use_data'] = $appointments;
  99. $data['enclosure'] = [];
  100. $data['status'] = OpenAppointmentStatusEnum::WAIT_UPLOAD;
  101. $data['admin_id'] = login_admin_id();
  102. $model = $this->repository->create($data);
  103. return Response::success($model);
  104. }
  105. /**
  106. * 上传附件
  107. * @param Request $request
  108. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  109. * @throws \Illuminate\Validation\ValidationException
  110. */
  111. public function uploadPrint(Request $request)
  112. {
  113. $this->validate($request, [
  114. 'id' => 'required|integer',
  115. 'enclosure' => 'required',
  116. ]);
  117. $id = $request->get('id');
  118. $model = OpenAppointment::query()->find($id);
  119. if (!$model) {
  120. return $this->error('找不到该申请记录');
  121. }
  122. if ($model->status != OpenAppointmentStatusEnum::WAIT_UPLOAD) {
  123. return $this->error('状态不对');
  124. }
  125. $model->enclosure = $request->get('enclosure');
  126. $model->status = OpenAppointmentStatusEnum::WAIT;
  127. $model->save();
  128. return Response::success([]);
  129. }
  130. /**
  131. * 详情
  132. * @param $id
  133. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  134. * Author: Mead
  135. */
  136. public function show($id)
  137. {
  138. $data = $this->repository->find($id);
  139. return Response::success($data);
  140. }
  141. /**
  142. * 更新
  143. * @param Request $request
  144. * @param $id
  145. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  146. * @throws \Illuminate\Validation\ValidationException
  147. * Author: Mead
  148. */
  149. public function update(Request $request, $id)
  150. {
  151. $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE));
  152. $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE)));
  153. //验证时间是否合法
  154. $use = $data['use_data'];
  155. $appointments = [];
  156. foreach ($use as $u) {
  157. if (!Arr::has($u, ['week', 'week_index', 'time_id', 'room_id'])) {
  158. return $this->error('参数非法');
  159. }
  160. $time = Arr::only($u, ['week', 'week_index', 'time_id', 'room_id']);
  161. $is_exists = LessonSchedule::query()->where($time)->where('term_id', self::$TERM_ID)->where('status', ModelStatusEnum::OK)->exists();
  162. if ($is_exists) {
  163. return $this->error('该时间段不能预约');
  164. }
  165. $time['day'] = LessonSchedule::byTimeGetDate(self::$TERM_ID, $time['week'], $time['week_index']);
  166. $time['room_name'] = Room::query()->where('id', $time['room_id'])->value('name');
  167. $time['time_name'] = Time::query()->where('id', $time['time_id'])->value('name');
  168. $appointments[] = $time;
  169. }
  170. $data['use_data'] = $appointments;
  171. $data['status'] = OpenAppointmentStatusEnum::WAIT;
  172. if (empty($data['enclosure'])) {
  173. $data['status'] = OpenAppointmentStatusEnum::WAIT_UPLOAD;
  174. }
  175. try {
  176. $model = $this->repository->update($data, $id);
  177. return Response::success($model);
  178. } catch (\Exception $e) {
  179. $this->error($e);
  180. }
  181. }
  182. /**
  183. * 删除
  184. * @param $id
  185. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  186. * Author: Mead
  187. */
  188. public function destroy($id)
  189. {
  190. $is = OpenAppointment::query()->where('id', $id)->where('status', OpenAppointmentStatusEnum::COMPLETE)->exists();
  191. if ($is) {
  192. return $this->error('该申请已经审核完成,暂不能删除');
  193. }
  194. try {
  195. $this->repository->skipPresenter()->delete($id);
  196. return Response::success(null, T('successfully delete.'));
  197. } catch (\Exception $exception) {
  198. return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
  199. }
  200. }
  201. /**
  202. * 批量删除
  203. * @param Request $request
  204. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  205. * Author: Mead
  206. */
  207. public function delete(Request $request)
  208. {
  209. $this->validate($request, [
  210. 'ids' => 'required|array',
  211. ]);
  212. $ids = $request->get('ids');
  213. $is = OpenAppointment::query()->whereIn('id', $ids)->where('status', OpenAppointmentStatusEnum::COMPLETE)->exists();
  214. if ($is) {
  215. return $this->error('该申请已经审核完成,暂不能删除');
  216. }
  217. try {
  218. $this->repository->whereIn('id', $ids)->delete();
  219. return Response::success(null, T('successfully delete.'));
  220. } catch (\Exception $exception) {
  221. return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR);
  222. }
  223. }
  224. /**
  225. * 审核
  226. * @param Request $request
  227. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  228. * @throws \Illuminate\Validation\ValidationException
  229. */
  230. public function check(Request $request)
  231. {
  232. $this->validate($request, [
  233. 'id' => 'required|integer',
  234. 'check_status' => 'required|integer',
  235. 'check_result' => 'nullable|sometimes',
  236. ]);
  237. $id = $request->get('id');
  238. $check_status = $request->get('check_status');
  239. $check_result = $request->get('check_result');
  240. $record = OpenAppointment::query()->find($id);
  241. if (!$record) {
  242. return $this->error('找不到该记录');
  243. }
  244. $admin = login_admin();
  245. $role_index = 0;
  246. if ($this->iscan([PermissionEnum::controller_openAppointment_check_YX, PermissionEnum::controller_openAppointment_check_SYZX], true)) {
  247. $this->validate($request, ['type' => 'required|in:1,2,3']);
  248. $type = $request->get('type');
  249. $role_index = $type;
  250. } else {
  251. $role_index = $admin->can(PermissionEnum::controller_openAppointment_check_SYZX) ? 2 : 0;
  252. $role_index += $admin->can(PermissionEnum::controller_openAppointment_check_YX) ? 1 : 0;
  253. }
  254. $re = (new OpenAppointmentService())->check(self::$TERM_ID, $record, $check_status, $check_result, $role_index);
  255. if ($re) {
  256. return $this->error($re);
  257. }
  258. return Response::success([]);
  259. }
  260. /**
  261. * 批量检查
  262. * @param Request $request
  263. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  264. * @throws \Illuminate\Validation\ValidationException
  265. */
  266. public function approveCheck(Request $request)
  267. {
  268. $this->validate($request, [
  269. 'ids' => 'required|array',
  270. 'check_status' => 'required|integer',
  271. 'check_result' => 'nullable|sometimes',
  272. ]);
  273. $ids = $request->get('ids');
  274. $check_status = $request->get('check_status');
  275. $check_result = $request->get('check_result');
  276. $records = OpenAppointment::query()->whereIn('id', $ids)->whereIn('status', [OpenAppointmentStatusEnum::WAIT, OpenAppointmentStatusEnum::SYZX_OK])->get();
  277. if (count($records) != count($ids)) {
  278. return $this->error('修改记录中存在不满足条件的');
  279. }
  280. //需要检查权限 1:院系审核权限 2:实验室审核权限 3:两者全部权限
  281. $admin = login_admin();
  282. $role_index = 0;
  283. if ($this->iscan([PermissionEnum::controller_openAppointment_check_YX, PermissionEnum::controller_openAppointment_check_SYZX])) {
  284. $this->validate($request, ['type' => 'required|in:1,2,3']);
  285. $type = $request->get('type');
  286. $role_index = $type;
  287. } else {
  288. $role_index = $admin->can(PermissionEnum::controller_openAppointment_check_SYZX) ? 2 : 0;
  289. $role_index += $admin->can(PermissionEnum::controller_openAppointment_check_YX) ? 1 : 0;
  290. }
  291. foreach ($records as $record) {
  292. $re = (new OpenAppointmentService())->check(self::$TERM_ID, $record, $check_status, $check_result, $role_index, true);
  293. if ($re) {
  294. return $this->error($re);
  295. }
  296. }
  297. DB::beginTransaction();
  298. foreach ($records as $record) {
  299. $re = (new OpenAppointmentService())->check(self::$TERM_ID, $record, $check_status, $check_result, $role_index);
  300. if ($re) {
  301. DB::rollBack();
  302. return $this->error($re);
  303. }
  304. }
  305. DB::commit();
  306. return Response::success([]);
  307. }
  308. /**
  309. * 审核进度
  310. * @param Request $request
  311. * @return
  312. */
  313. public function checkProgress(Request $request)
  314. {
  315. $this->validate($request, [
  316. 'id' => 'required|integer',
  317. ]);
  318. $id = $request->get('id');
  319. $yx = OpenAppointmentLog::query()->where('status', ModelStatusEnum::OK)->where('open_appointment_id', $id)->where('type', ScheduleApproveLog::TYPE_YX)->with(['check_admin'])->select(['id', 'check_admin_id', 'check_time', 'check_status', 'check_result'])->orderByDesc('id')->first();
  320. $syzx = OpenAppointmentLog::query()->where('status', ModelStatusEnum::OK)->where('open_appointment_id', $id)->where('type', ScheduleApproveLog::TYPE_SYZX)->with(['check_admin'])->select(['id', 'check_admin_id', 'check_time', 'check_status', 'check_result'])->orderByDesc('id')->first();
  321. return Response::success(compact('yx', 'syzx'));
  322. }
  323. /**
  324. * 暂停
  325. * @param Request $request
  326. * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\Resource
  327. * @throws \Illuminate\Validation\ValidationException
  328. */
  329. public function pause(Request $request)
  330. {
  331. $this->validate($request, [
  332. 'id' => 'required|integer',
  333. ]);
  334. $status = OpenAppointmentStatusEnum::CLOSE;
  335. $model = OpenAppointment::query()->where('id', $request->get('id'))->first();
  336. if (in_array($model->sattus, [OpenAppointmentStatusEnum::COMPLETE, OpenAppointmentStatusEnum::OPERATION_ERROR])) {
  337. return $this->error('该状态不能关闭申请');
  338. }
  339. $model->status = $status;
  340. $re = $model->save();
  341. if ($re) {
  342. return Response::success([]);
  343. }
  344. return $this->error('操作失败');
  345. }
  346. /**
  347. * 下载申请表
  348. * @param Request $request
  349. * @return \Illuminate\Http\JsonResponse|void
  350. * @throws \Illuminate\Validation\ValidationException
  351. */
  352. public function downPrint(Request $request)
  353. {
  354. $this->validate($request, [
  355. 'id' => 'required|integer',
  356. ]);
  357. $id = $request->get('id');
  358. $model = OpenAppointment::query()->find($id);
  359. if (!$model) {
  360. return $this->error('找不到该申请记录');
  361. }
  362. $type = $model->template;
  363. $path = base_path("public/template/lab/template_p_{$type}.docx");
  364. $is = file_exists($path);
  365. if (!$is) {
  366. return $this->error('模板文件找不到');
  367. }
  368. try {
  369. $template = new TemplateProcessor($path);
  370. // $phpWord = new PhpWord();
  371. // $template = $phpWord->loadTemplate($path); //初始化模板
  372. // $template = $phpWord->loadTemplate($path); //初始化模板
  373. $template->setValue('department', $model->department);
  374. $template->setValue('name', $model->applicant_name);
  375. $template->setValue('mobile', $model->applicant_mobile);
  376. $template->setValue('nums', $model->use_people_nums);
  377. $template->setValue('use_reason', $model->use_reason);
  378. $template->setValue('use_need', $model->use_need);
  379. if (is_array($model->use_data)) {
  380. $labs = array_unique(array_column($model->use_data, 'room_name'));
  381. $template->setValue('use_labs', arr2str($labs));
  382. $template->setValue('lab_nums', count($labs));
  383. $table = new Table(['borderSize' => 5, 'width' => 5500, 'unit' => TblWidth::AUTO, 'alignMent' => 'center']);
  384. foreach ($model->use_data as $r => $time) {
  385. if ($r == 0) {
  386. $table->addRow();
  387. $table->addCell(3000)->addText('实验室');
  388. $table->addCell(1500)->addText('日期');
  389. $table->addCell(1000)->addText('节次');
  390. }
  391. $table->addRow();
  392. $table->addCell(3000)->addText($time['room_name']);
  393. $table->addCell(1500)->addText($time['day']);
  394. $table->addCell(1000)->addText($time['time_name']);
  395. }
  396. $template->setComplexBlock('use_times', $table);
  397. }
  398. $filename = date('Y-m-d') . '.docx';
  399. header('Content-Type: application/vnd.ms-word');
  400. header('Content-Disposition: attachment;filename=' . $filename);
  401. header('Cache-Control: max-age=0');
  402. $template->saveAs('php://output');//直接下载
  403. } catch (\Exception $exception) {
  404. dd($exception);
  405. }
  406. }
  407. }