$data['floor_id'], 'license_plate_id' => $data['license_plate_id'], 'space_id' => $data['space_id'], 'status' => 1, 'enter_time' => $data['enter_time'], 'scene_image' => $data['scene_image'] ?? '', 'created_at' => date("Y-m-d H:i:s", time()) ]; $model = ParkingAccessRecord::query()->create($data); $this->logService->logCreated($model, $this->menuTitle . '.create'); $data = $model->toArray(); return $data['id'] ?? 0; } /** * @return ParkingAccessRecordService */ public static function query(): ParkingAccessRecordService { return new self(new OperationLogService()); } // 离开车位 public function leaveData($id, $data) { $model = ParkingAccessRecord::query()->findOrFail($id); $oldValues = $model->toArray(); $data = [ 'status' => 0, 'leave_time' => $data['leave_time'], 'updated_at' => date("Y-m-d H:i:s", time()) ]; $model->update($data); $this->logService->logUpdated( $model, $oldValues, $this->menuTitle . '.update' ); } // 车辆进入车位 public function enterOrLeave($camera_ip, $space_number, $license_plate, $now_time, $image_data = '') { $camera_id = ParkingCamera::query()->where('camera_ip', $camera_ip) ->value('id'); $ParkingSpace = ParkingSpace::query()->where('number', $space_number) ->first(); $exists = false; $space_id = 0; $spaceData = []; if ($ParkingSpace) { $spaceData = $ParkingSpace->toArray(); $space_id = $spaceData['id']; $exists = ParkingSpaceCamera::query()->where([ 'camera_id' => $camera_id, 'space_id' => $space_id ])->exists(); } if (!$exists) { return; } $where = $data = [ 'space_id' => $space_id, 'floor_id' => $spaceData['floor_id'], ]; // 记录车牌信息 if ($license_plate) { $licensePlateService = new ParkingLicensePlateService( $this->logService ); $license_plate = str_replace('蓝', '', $license_plate); $license_plate = str_replace('黄', '', $license_plate); $license_plate = str_replace('绿', '', $license_plate); $license_plate = trim($license_plate); $license_plate_id = $licensePlateService->saveNumber($license_plate); $data['license_plate_id'] = $license_plate_id; } // 查询车位记录 $oldQuery = ParkingAccessRecord::query()->where($where)->where('status', 1) ->first(['id', 'license_plate_id']); $ParkingSpaceService = new ParkingSpaceService($this->logService); $old_license_plate_id = ''; $id = ''; if ($oldQuery) { $id = $oldQuery['id']; $old_license_plate_id = $oldQuery['license_plate_id']; $data['leave_time'] = strtotime($now_time); // 有记录 无车牌 离场 if (!isset($data['license_plate_id'])) { $this->leaveData($id, $data); // 同步车位车辆进入 $ParkingSpaceService->updateEnterLeave($space_id, 0, $now_time); // VIP车辆离场 ParkingVipListService::leave($id, $now_time); return; } elseif ($data['license_plate_id'] == $old_license_plate_id) { // 车牌相同不做操作 return; } } // 无车牌不添加 if (!isset($data['license_plate_id'])) { return; } // 有记录 车牌不同 if ($old_license_plate_id) { // 原车牌离场 $this->leaveData($id, $data); // VIP车辆离场 ParkingVipListService::leave($id, $now_time); } // 有车牌 无停车记录,可以进入 $data['enter_time'] = strtotime($now_time); $data['scene_image'] = $this->saveSceneImage($image_data); $access_record_id = $this->enterData($data); // 同步车位车辆进入 $ParkingSpaceService->updateEnterLeave( $space_id, 1, $now_time, $data['license_plate_id'], $data['scene_image'], empty($id) ); // 判断是否为VIP 并添加入场 ParkingVipListService::enter( $space_id, $spaceData['space_type_id'], $access_record_id, $now_time, $data['license_plate_id'] ); } // 手动添加车辆进出记录 public function syncSpaceStatusRecord( $floor_id, $license_plate_id, $space_id, $datetime, $status = 0 ) { $data = [ 'space_id' => $space_id, 'floor_id' => $floor_id, ]; $where = [ ['space_id', '=', $space_id], ['floor_id', '=', $floor_id] ]; $date_times = strtotime($datetime); // 车辆进入创建记录 if ($status == 1 && $license_plate_id) { $data['license_plate_id'] = $license_plate_id; $data['enter_time'] = $date_times; $access_record_id = $this->enterData($data); // 查询当前车位是否存在其他未离开车辆,当不包含刚进入车辆 $where[] = ['license_plate_id', '<>', $license_plate_id]; // 判断是否为VIP ParkingVipListService::enter( $space_id, 0, $access_record_id, $datetime, $license_plate_id ); } // 查询车位进入车辆记录 $id = ParkingAccessRecord::query()->where($where)->where('status', 1) ->value('id'); if ($id) { $data['leave_time'] = $date_times; $this->leaveData($id, $data); ParkingVipListService::leave($id, $datetime); } } // 保存场景图 public function saveSceneImage($imageData): string { $scene_image = ''; if ($imageData) { $filename = time() . '_' . md5(Str::random(6)) . '.jpg'; $save_file_path = 'public/images/scene/' . date("Ymd") . '/' . $filename; $deBaseData = base64_decode($imageData); Storage::put($save_file_path, $deBaseData); $scene_image = Storage::url($save_file_path); } return $scene_image; } }