service = $service; } /** * @param Request $request * @return JsonResponse */ public function index(Request $request): JsonResponse { try { $query = ParkingSpaceRepair::query(); if ($request->has('parking_space_number')) { $number = $request->input('parking_space_number'); if ($number) { $space_id = ParkingSpace::getValueId($number); if ($space_id) { $query->where('space_id', $space_id); } else { $query->where('id', 0); } } } if ($request->has('parking_id')) { $parking_id = $request->input('parking_id'); $floor_id = $request->input('floor_id'); if ($parking_id && !$floor_id) { $floor_ids = AdminFloor::query()->where( 'building_floor', $parking_id )->pluck('id')->toArray(); if ($floor_ids) { $space_ids = ParkingSpace::query()->whereIn( 'floor_id', $floor_ids )->pluck('id')->toArray(); if ($space_ids) { $query->whereIn('space_id', $space_ids); } else { $query->where('id', 0); } } else { $query->where('id', 0); } } } if ($request->has('floor_id')) { $floor_id = $request->input('floor_id'); if ($floor_id) { $space_ids = ParkingSpace::query()->where( 'floor_id', $floor_id )->pluck('id')->toArray(); if ($space_ids) { $query->whereIn('space_id', $space_ids); } else { $query->where('id', 0); } } } if ($request->has('start_date')) { $start_date = $request->input('start_date'); if ($start_date) { $query->where('start_at', '>=', $start_date . ' 00:00:00'); } } if ($request->has('end_date')) { $end_date = $request->input('end_date'); if ($end_date) { $query->where('end_at', '<=', $end_date . ' 23:59:59'); } } if ($request->has('admin_user')) { $admin_user = $request->input('admin_user'); if ($admin_user) { $admin_user_ids = AdminUsers::getIds($admin_user); if ($admin_user_ids) { $query->whereIn('admin_user_id', $admin_user_ids); } else { $query->where('id', 0); } } } // 分页 $page = $request->input('page', 1); $perPage = $request->input('per_page', 10); $total = $query->count(); $items = $query->latest()->forPage($page, $perPage)->get()->each( function ($item) { return $this->service->getItem($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() ); } } /** * 列表搜索数据 * @return JsonResponse */ public function search(): JsonResponse { try { $data = [ 'parking_list' => Parking::getData(), 'floor_list' => AdminFloor::getData() ]; return $this->responseService->success($data); } catch (Exception $e) { $m_prefix = __('exception.exception_handler.resource'); return $this->responseService->systemError( $m_prefix . ':' . $e->getMessage() ); } } /** * @return JsonResponse */ public function create(): JsonResponse { try { $data = [ 'parking_list' => Parking::getData() ]; return $this->responseService->success($data); } catch (Exception $e) { return $this->responseService->systemError( __('exception.get_data_failed') . ':' . $e->getMessage() ); } } /** * @param string $id * @return JsonResponse */ public function edit(string $id): JsonResponse { try { $this->validateId($id, ParkingSpaceRepair::class); $data = [ 'parking_list' => Parking::getData(), 'item' => ParkingSpaceRepair::query()->find($id, [ 'id', 'space_id', 'start_at', 'end_at' ]) ]; $ParkingSpace = ParkingSpace::query()->find( $data['item']['space_id'] ); $number = ''; $floor_id = ''; $parking_id = ''; if ($ParkingSpace) { $number = $ParkingSpace['number']; $floor_id = $ParkingSpace['floor_id']; $floorData = AdminFloor::getFirst($floor_id); if ($floorData) { $parking_id = $floorData['building_floor']; } } $data['item']['parking_space_name'] = $number; $data['item']['floor_id'] = $floor_id; $data['item']['parking_id'] = $parking_id; 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(); $this->saveValidator($data); $data['admin_user_id'] = $this->adminUserId; $this->service->updateModel($data, $id); return $this->responseService->success( null, __('admin.update_succeeded') ); } catch (ValidationException $e) { throw $e; } catch (CustomException $e) { return $this->responseService->businessError($e->getMessage()); } catch (Exception $e) { return $this->responseService->systemError( __('admin.operation_failed') . ':' . $e->getMessage() ); } } /** * @param array $data * @param int $id * @return void * @throws CustomException * @throws ValidationException */ protected function saveValidator(array $data, int $id = 0): void { $rules = [ 'parking_space_name' => 'required', 'start_at' => 'required', 'end_at' => 'required' ]; $messages = [ 'parking_space_name.required' => __validation( 'parking_repair_list.psn_empty' ), 'start_at.required' => __validation( 'parking_repair_list.s_empty' ), 'end_at.required' => __validation( 'parking_repair_list.e_empty' ) ]; if ($id) { $this->validateId($id, ParkingSpaceRepair::class); } $validator = Validator::make($data, $rules, $messages); $this->validateDate($data['start_at'], $data['end_at']); if ($validator->fails()) { throw new ValidationException($validator); } } /** * @param string $id * @return JsonResponse * @throws CustomException * @throws ValidationException */ public function destroy(string $id): JsonResponse { try { $this->validateId($id, ParkingSpaceRepair::class); $this->service->deleteModel($id); return $this->responseService->success( null, __('admin.delete_succeeded') ); } catch (ValidationException|CustomException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('admin.operation_failed') . ':' . $e->getMessage() ); } } /** * @param Request $request * @return JsonResponse * @throws CustomException * @throws ValidationException */ public function batchDelete(Request $request): JsonResponse { try { $data = $request->all(); $rules = [ 'ids' => 'required|array', ]; $messages = [ 'ids.required' => __validation( 'parking_repair_list.ids_empty' ), 'ids.array' => __validation( 'parking_repair_list.ids_array' ), ]; $validator = Validator::make($data, $rules, $messages); if ($validator->fails()) { throw new ValidationException($validator); } $ids = $data['ids']; $this->service->batchDeleteModel($ids); return $this->responseService->success( null, __('admin.delete_succeeded') ); } catch (ValidationException|CustomException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('admin.operation_failed') . ':' . $e->getMessage() ); } } public function batchImport(Request $request) { try { // 1. 验证上传的文件 $data = $request->all(); $validator = Validator::make($data, [ 'file' => 'required|mimes:xlsx,xls,csv,txt|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 的绝对路径 $model = new ParkingSpaceRepairImport($this->adminUserId); Excel::import( $model, storage_path('app/' . $path) ); // 5. (可选)导入完成后删除临时文件 Storage::delete($path); // 6. 返回错误行 $error_arr = $model->errorArr(); if ($error_arr) { throw new CustomException(implode("
", $error_arr)); } return $this->responseService->success( __('controller.import.success') ); } catch (ValidationException $e) { throw $e; } catch (CustomException $e) { return $this->responseService->businessError($e->getMessage()); } catch (Exception $e) { return $this->responseService->systemError( __('exception.admin_vip_list.import_failed') . ':' . $e->getMessage() ); } } /** * @param Request $request * @return JsonResponse * @throws CustomException * @throws ValidationException */ public function store(Request $request): JsonResponse { try { $data = $request->all(); $this->saveValidator($data); $data['admin_user_id'] = $this->adminUserId; $this->service->createModel($data); return $this->responseService->success( null, __('admin.save_succeeded') ); } catch (ValidationException $e) { throw $e; } catch (CustomException $e) { return $this->responseService->businessError($e->getMessage()); } catch (Exception $e) { return $this->responseService->systemError( __('admin.operation_failed') . ':' . $e->getMessage() ); } } public function downloadTemplate() { return Excel::download( new ParkingSpaceRepairTemplateExport(), set_space_underline(__exports('parking_repair_list.list')) . get_datetime('date_') . '.xlsx' ); } /** * 维修开始时间不能大于结束时间 * @param $start_at * @param $end_at * @return void * @throws CustomException */ protected function validateDate($start_at, $end_at): void { $start_at_times = strtotime($start_at); $end_at_times = strtotime($end_at); if ($start_at_times >= $end_at_times) { throw new CustomException( __validation('parking_repair_list.date_error') ); } } /** * @param Request $request * @return JsonResponse * @throws CustomException * @throws ValidationException */ public function synchronizeList(Request $request): JsonResponse { try { $data = $request->all(); $rules = [ 'start_at' => 'required', 'end_at' => 'required' ]; $messages = [ 'start_at.required' => __validation( 'parking_repair_list.s_empty' ), 'end_at.required' => __validation( 'parking_repair_list.e_empty' ) ]; $validator = Validator::make($data, $rules, $messages); if ($validator->fails()) { throw new ValidationException($validator); } $this->validateDate($data['start_at'], $data['end_at']); $this->service->synchronize($data); return $this->responseService->success( null, __('admin.operation_successful') ); } catch (ValidationException $e) { throw $e; } catch (CustomException $e) { return $this->responseService->businessError($e->getMessage()); } catch (Exception $e) { return $this->responseService->systemError( __('admin.operation_failed') . ':' . $e->getMessage() ); } } public function getConfig(): JsonResponse { try { $color = AdminConfigs::getRepairColor(); $color_arr = (new ParkingSpaceTypeService( new OperationLogService() ))->color; $color_data = []; $color_temp = []; $color_hue = ParkingSpaceTypeService::$colorArr; foreach ($color_arr as $val) { $type_str = __service('parking_repair_list.not_color'); $type_list = []; $spaceType = ParkingSpaceType::query()->where( function ($query) use ($val) { $query->orWhere('default_color_occupy', $val); $query->orWhere('default_color_vacant', $val); $query->orWhere('default_color_warning', $val); } )->select()->get()->toArray(); foreach ($spaceType as $temp) { $type_list[$temp['id']]['space_type_name'] = ParkingSpaceType::getName($temp['id']); $space_attr_list = []; if ($temp['default_color_occupy'] == $val) { $space_attr_list['occupy'][] = ParkingSpaceAttributes::getDefaultAttr(); } if ($temp['default_color_vacant'] == $val) { $space_attr_list['vacant'][] = ParkingSpaceAttributes::getDefaultAttr(); } if ($temp['default_color_warning'] == $val) { $space_attr_list['warning'][] = ParkingSpaceAttributes::getDefaultAttr(); } $type_list[$temp['id']]['space_attr_list'] = $space_attr_list; } $spaceTypeAttr = ParkingSpaceTypeAttr::query()->where( function ($query) use ($val) { $query->orWhere('color_occupy', $val); $query->orWhere('color_vacant', $val); $query->orWhere('color_warning', $val); } )->select()->get()->toArray(); foreach ($spaceTypeAttr as $temp) { if (!isset($type_list[$temp['space_type_id']]['space_type_name'])) { $type_list[$temp['space_type_id']]['space_type_name'] = ParkingSpaceType::getName($temp['space_type_id']); } $space_attr_list = []; if (isset($type_list[$temp['space_type_id']]['space_attr_list'])) { $space_attr_list = $type_list[$temp['space_type_id']]['space_attr_list']; } if ($temp['color_occupy'] == $val) { $space_attr_list['occupy'][] = ParkingSpaceAttributes::getAttr( $temp['space_attr_id'] ); } if ($temp['color_vacant'] == $val) { $space_attr_list['vacant'][] = ParkingSpaceAttributes::getAttr( $temp['space_attr_id'] ); } if ($temp['color_warning'] == $val) { $space_attr_list['warning'][] = ParkingSpaceAttributes::getAttr( $temp['space_attr_id'] ); } $type_list[$temp['space_type_id']]['space_attr_list'] = $space_attr_list; } if (empty($type_list)) { $color_temp[] = $val; } else { $type_arr = []; foreach ($type_list as &$t_item) { if (count($type_arr) < 2) { $type_arr[] = $t_item['space_type_name']; } $space_attr_list = $t_item['space_attr_list']; $new_list = []; foreach ($space_attr_list as $key => $t_value) { $new_list[] = [ 'light' => __service('parking_space.'.$key), 'attr_str' => implode('、', $t_value) ]; } $t_item['space_attr_list'] = $new_list; } if ($type_arr) { $type_str = implode('、', $type_arr); } } if ($color == $val){ $type_str = __service('parking_repair_list.repair_status'); } $color_data[] = [ 'color' => __service('space_type.' . $val), 'color_hue' => $color_hue[$val] ?? '', 'type_str' => $type_str, 'type_list' => $type_list ]; } if (!$color_temp) { $color_temp = $color_arr; } $color_temp2 = []; foreach ($color_temp as $color_value) { $color_temp2[$color_value] = __('service.space_type.' . $color_value); } $color_list = get_select_data($color_temp2); $data = [ 'color' => $color, 'color_str' => $color ? __('service.space_type.' . $color) : '', 'color_data' => $color_data, 'color_list' => $color_list ]; return $this->responseService->success($data); } catch (Exception $e) { return $this->responseService->systemError( __('exception.get_data_failed') ); } } /** * @param Request $request * @return JsonResponse * @throws ValidationException */ public function setConfig(Request $request): JsonResponse { try { $data = $request->all(); $rules = [ 'color' => 'required' ]; $messages = [ 'color.required' => __validation( 'parking_repair_list.color_empty' ) ]; $validator = Validator::make($data, $rules, $messages); if ($validator->fails()) { throw new ValidationException($validator); } $color = $data['color']; $model = AdminConfigs::query()->where( 'name', 'parking_repair' )->first(); $oldValue = $model->toArray(); $content = $oldValue['content'] ?? []; $content['color'] = $color; $model->update([ 'content' => $content, 'user_id' => $this->adminUserId, 'updated_at' => get_datetime() ]); $logService = new OperationLogService(); $logService->menuTitle = 'total_configuration'; $logService->logUpdated($model, $oldValue, 'config.update'); return $this->responseService->success( null, __('admin.operation_successful') ); } catch (ValidationException $e) { throw $e; } catch (Exception $e) { return $this->responseService->systemError( __('admin.operation_failed') ); } } }