'flat_garage']; private static array $isControlLightsArr = ['no', 'yes']; public function __construct(OperationLogService $logService) { parent::__construct($logService); $this->logService->menuTitle = 'camera_management'; } /** * @return array|string[] */ public static function getStatus(): array { $statusArr = self::$statusArr; foreach ($statusArr as $key => $value) { $statusArr[$key] = __('admin.' . $value); } return $statusArr; } /** * @return array|string[] */ public static function getType(): array { $typeArr = self::$typeArr; foreach ($typeArr as $key => $value) { $typeArr[$key] = __('service.parking_camera.' . $value); } return $typeArr; } /** * @return array|string[] */ public static function getIsControlLights(): array { $arr = self::$isControlLightsArr; foreach ($arr as $key => $value) { $arr[$key] = __('service.reservation.' . $value); } return $arr; } /** * 创建车位相机 * @param array $data * @return Builder|Model * @throws CustomException */ public function createModel(array $data): Builder|Model { try { DB::beginTransaction(); $parking_space_data = $data['parking_space_data']; if (ParkingCamera::query()->where('number', $data['number']) ->exists() ) { throw new Exception(__('service.parking_camera.number_exists')); } $floor_id = $data['floor_id'] ?? 0; self::validateSpaceData($parking_space_data, $floor_id); $model = ParkingCamera::query()->create([ 'number' => $data['number'], 'camera_ip' => $data['camera_ip'], 'server_ip' => $data['server_ip'], 'floor_id' => $floor_id, 'floor_region_id' => $data['floor_region_id'] ?? 0, 'is_control_lights' => $data['is_control_lights'] ?? 1, 'is_external' => $data['is_external'] ?? 0, 'built_in_light' => $data['built_in_light'] ?? 0, 'off_light' => $data['off_light'] ?? 0, 'remark' => $data['remark'] ?? '', 'created_at' => get_datetime() ]); $this->logService->logCreated($model, 'parking_camera.create'); $this->addSpaceCamera($model->id, $parking_space_data); DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); throw $e; } } /** * 验证车位控灯相机数据 * @param $data * @return void * @throws CustomException */ private function validateSpaceData(&$data, $floor_id): void { foreach ($data as &$item) { $control_lights_ip = $item['control_lights_ip'] ?? ''; $space_attr_id = $item['space_attr_id'] ?? ''; if (empty($control_lights_ip)) { throw new CustomException( __('validation.parking_camera.lights_ip_empty') ); } if (strlen($control_lights_ip) > 15) { throw new CustomException( __('validation.parking_camera.lights_ip_max') ); } $space_id = ParkingSpace::getValueId($item['space_number']); if (!$space_id && $space_attr_id) { // 创建车位 $spaceData = [ 'floor_id' => $floor_id, 'number' => $item['space_number'], 'space_attr_id' => $space_attr_id ]; (new ParkingSpaceService($this->logService))->create( $spaceData ); $space_id = ParkingSpace::getValueId($item['space_number']); } elseif ($space_id && $space_attr_id) { // 更新车位属性 (new ParkingSpaceService($this->logService))->updateAttr( $space_id, $space_attr_id ); } // 获取车位id $item['space_id'] = $space_id; } } private function addSpaceCamera($camera_id, $data) { ParkingSpaceCamera::createModel($data, $camera_id); $AdminRoleMenuData = ParkingSpaceCamera::getData($camera_id); $this->logService->logCreatedData( new ParkingSpaceCamera(), 'parking_camera.create_space_camera', $AdminRoleMenuData ); } // 创建车位空灯数据 /** * 更新车位相机 * @param array $data * @param string $id * @return Builder|Model * @throws CustomException */ public function updateModel(array $data, string $id): Builder|Model { try { DB::beginTransaction(); $parking_space_data = $data['parking_space_data']; $existsWhere = [ ['number', '=', $data['number']], ['id', '<>', $id] ]; if (ParkingCamera::query()->where($existsWhere)->exists()) { throw new Exception(__('service.parking_camera.number_exists')); } self::validateSpaceData($parking_space_data); // 更新 $model = ParkingCamera::query()->findOrFail($id); $oldValues = $model->toArray(); $model->update([ 'number' => $data['number'], 'camera_ip' => $data['camera_ip'], 'server_ip' => $data['server_ip'], 'floor_id' => $data['floor_id'] ?? 0, 'floor_region_id' => $data['floor_region_id'] ?? 0, 'is_control_lights' => $data['is_control_lights'] ?? 1, 'is_external' => $data['is_external'] ?? 0, 'built_in_light' => $data['built_in_light'] ?? 0, 'off_light' => $data['off_light'] ?? 0, 'remark' => $data['remark'] ?? '', 'updated_at' => get_datetime() ]); $this->logService->logUpdated( $model, $oldValues, 'parking_camera.update' ); // 删除再添加 $this->delSpaceCamera($id); $this->addSpaceCamera($id, $parking_space_data); DB::commit(); return $model; } catch (Exception $e) { DB::rollBack(); throw $e; } } // 删除车位空灯数据 private function delSpaceCamera(int $camera_id): void { $oldAdminRoleMenu = ParkingSpaceCamera::getData($camera_id); $this->logService->logDeletedData( new ParkingSpaceCamera(), 'parking_camera.delete_space_camera', $oldAdminRoleMenu ); ParkingSpaceCamera::query()->where('camera_id', $camera_id)->delete(); } // 删除 public function deleteModel(int $id): bool { try { DB::beginTransaction(); $model = ParkingCamera::query()->findOrFail($id); $this->logService->logDeleted($model, 'parking_camera.delete'); $model->delete(); $this->delSpaceCamera($id); DB::commit(); return true; } catch (Exception $e) { DB::rollBack(); throw $e; } } // 处理列表数据 public function optionItems($item) { $item['floor'] = AdminFloor::getName($item['floor_id']); $item['parking_space_count'] = ParkingSpaceCamera::getSpaceCount($item['id']); $item['parking_space_numbers'] = ParkingSpaceCamera::getParkingSpaceNumber( $item['id'] ); $isArr = ParkingCameraService::getIsControlLights(); $typeArr = ParkingCameraService::getType(); $statusArr = ParkingCameraService::getStatus(); $item['is_control_lights'] = $isArr[$item['is_control_lights']] ?? ''; $item['type'] = $typeArr[$item['type']] ?? ''; $item['status_'] = $item['status']; $item['status'] = $statusArr[$item['status']] ?? ''; return $item; } }