service = $service; } public function index(Request $request): JsonResponse { try { $query = ParkingPattern::query(); if ($request->has('model_name')) { $model_name = $request->input('model_name'); if ($model_name) { $query->where('name', $model_name); } } if ($request->has('username')) { $username = $request->input('username'); if ($username) { $user_ids = AdminUsers::getIds($username); if ($user_ids) { $query->whereIn('admin_user_id', $user_ids); } else { $query->where('id', 0); } } } if ($request->has('status')) { $status = $request->input('status'); if (is_numeric($status)) { $query->where('status', $status); } } // 分页 $page = $request->input('page', 1); $perPage = $request->input('per_page', 10); $columns = [ 'id', 'name as model_name', 'admin_user_id', 'status', 'is_default' ]; $statusArr = ParkingPatternService::getStatus(); $isDefaultArr = ParkingPatternService::getIsDefaultArr(); $total = $query->count(); $items = $query->latest()->forPage($page, $perPage)->select( $columns )->get()->each(function ($item) use ($statusArr, $isDefaultArr) { $item['admin_username'] = AdminUsers::getUsername( $item['admin_user_id'] ); $item['status'] = $statusArr[$item['status']]; $item['is_default'] = $isDefaultArr[$item['is_default']]; unset($item['admin_user_id']); return $item; }); return $this->responseService->success([ 'items' => $items, 'total' => $total, 'page' => $page, 'per_page' => $perPage, 'last_page' => ceil($total / $perPage), ]); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } public function search(): JsonResponse { try { $data = [ 'status_list' => get_select_data( ParkingPatternService::getStatus(), true ) ]; return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } public function edit(string $id): JsonResponse { try { $this->validateId($id, ParkingPattern::class); $columns = [ 'id', 'name as model_name', 'status', 'is_default', 'change', 'release' ]; $item = ParkingPattern::query()->findOrFail($id, $columns); $data = [ 'status_list' => get_select_data( ParkingPatternService::getStatus() ) ]; $data['item'] = $item; return $this->responseService->success($data); } catch (Exception $e) { return $this->responseService->systemError( __('exception.get_data_failed') . ':' . $e->getMessage() ); } } /** * @param Request $request * @param string $id * @return JsonResponse * @throws CustomException * @throws ValidationException */ public function update(Request $request, string $id): JsonResponse { try { $data = $request->all(); $rules = [ 'model_name' => 'required', 'status' => 'required|in:0,1', 'change' => 'required|in:0,1', 'release' => 'required|in:0,1' ]; $messages = [ 'model_name.required' => __( 'validation.parking_pattern.m_empty' ), 'status.required' => __( 'validation.parking_pattern.s_empty' ), 'change.required' => __( 'validation.parking_pattern.c_empty' ), 'release.required' => __( 'validation.parking_pattern.r_empty' ) ]; if ($id) { $this->validateId($id, ParkingPattern::class); } $validator = Validator::make($data, $rules, $messages); if ($validator->fails()) { throw new ValidationException($validator); } $data['admin_user_id'] = $this->adminUserId; $this->service->updateModel($data, $id); return $this->responseService->success( null, __('admin.update_succeeded') ); } catch (ValidationException|CustomException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('exception.parking_pattern.update_failed') . ':' . $e->getMessage() ); } } /** * @return BinaryFileResponse */ public function importModelTemplate(): BinaryFileResponse { return Excel::download( new ParkingPatternModelExport(), __('exports.parking_pattern.create_pattern') . time() . '.xlsx' ); } /** * @return BinaryFileResponse */ public function importTemplate(): BinaryFileResponse { return Excel::download( new ParkingPatternSpaceExport(), __('exports.parking_pattern.spaces_pattern') . time() . '.xlsx' ); } /** * 创建导入 * @param Request $request * @return JsonResponse * @throws ValidationException */ public function import(Request $request): JsonResponse { try { // 1. 验证上传的文件 $data = $request->all(); $request->validate([ 'file' => 'required|mimes:xlsx,xls,csv|max:2048', // 限制文件类型和大小 'model_name' => 'required' ]); $validator = Validator::make($data, [ 'file' => 'required|mimes:xlsx,xls,csv|max:2048', 'model_name.required' => __( 'validation.parking_pattern.m_empty' ), ], [ 'file.required' => __('validation.admin_list_vip.file_empty'), 'file.mimes' => __('validation.admin_list_vip.file_mimes'), 'file.max' => __('validation.admin_list_vip.file_max'), ]); if ($validator->fails()) { throw new ValidationException($validator); } $model_name = $data['model_name']; // 2. 获取上传的文件 $file = $request->file('file'); // 3. 正确的做法:先存储文件,再获取绝对路径进行导入 $path = $file->store('imports'); // 4. 执行导入(使用存储后的绝对路径) // storage_path('app') 获取 storage/app 的绝对路径 Excel::import( new ParkingPatternImport($model_name, $this->adminUserId), storage_path('app/' . $path) ); // 5. (可选)导入完成后删除临时文件 Storage::delete($path); return $this->responseService->success( __('controller.import.success') ); } catch (ValidationException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('exception.admin_vip_list.import_failed') . ':' . $e->getMessage() ); } } /** * 批量导入 * @param Request $request * @return JsonResponse * @throws ValidationException */ public function batchImport(Request $request): JsonResponse { try { // 1. 验证上传的文件 $data = $request->all(); $request->validate([ 'file' => 'required|mimes:xlsx,xls,csv|max:2048' // 限制文件类型和大小 ]); $validator = Validator::make($data, [ 'file' => 'required|mimes:xlsx,xls,csv|max:2048' ], [ 'file.required' => __('validation.admin_list_vip.file_empty'), 'file.mimes' => __('validation.admin_list_vip.file_mimes'), 'file.max' => __('validation.admin_list_vip.file_max'), ]); if ($validator->fails()) { throw new ValidationException($validator); } // 2. 获取上传的文件 $file = $request->file('file'); // 3. 正确的做法:先存储文件,再获取绝对路径进行导入 $path = $file->store('imports'); // 4. 执行导入(使用存储后的绝对路径) // storage_path('app') 获取 storage/app 的绝对路径 Excel::import( new ParkingPatternSpaceImport($this->adminUserId), storage_path('app/' . $path) ); // 5. (可选)导入完成后删除临时文件 Storage::delete($path); return $this->responseService->success( __('controller.import.success') ); } catch (ValidationException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('exception.admin_vip_list.import_failed') . ':' . $e->getMessage() ); } } /** * @param string $id * @return JsonResponse * @throws ValidationException */ public function destroy(string $id): JsonResponse { try { $this->validateId($id, ParkingPattern::class); $this->service->deleteModel($id); return $this->responseService->success( null, __('admin.delete_succeeded') ); } catch (ValidationException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('exception.parking_pattern.destroy_failed') . ':' . $e->getMessage() ); } } /** * @return JsonResponse * @throws InvalidArgumentException */ public function rule(): JsonResponse { try { return $this->responseService->success( $this->methodShow('pattern', ['batchImport', 'import']) ); } catch (Exception $e) { return $this->responseService->systemError( __('exception.get_data_failed') . ':' . $e->getMessage() ); } } }