value; } elseif ($sourceStatus < 100 && $sourceStatus > 0) { $convertStatus = BimFileConvertStatus::CONVERTING->value; } else { $convertStatus = BimFileConvertStatus::IN_QUEUE->value; } return $convertStatus; } private function isPointCloudGISModel(string $ext): bool { return in_array($ext, ['las', 'laz', 'ply', 'xyz']); } private function isOSGBGISModel(string $gisType): bool { return $gisType == 'osgb'; } /** * 构造query的input传参 * @param \App\BO\BIMFileBO $bimFileBO * @param array $append * @return array */ private function buildQueryParams(BimFileBO $bimFileBO, array $append = []): array { $input = [ 'name' => $bimFileBO->name, 'initiatingUser' => $bimFileBO->initiatingUser, 'uniqueCode' => $bimFileBO->uniqueCode, 'priority' => $bimFileBO->priority, 'isCAD' => $bimFileBO->isCAD, 'callbackInterfaceURL' => route('glendale.callback'), 'configJson' => $bimFileBO->configJson, // 'pointCloudConfigJson' => [ // 'srs' => 'EPSG:32649' // ] ]; if (!empty($append)) { $input = array_merge($input, $append); } if (count($input['configJson'] ?? []) == 0) { $input['configJson'] = ExtensionModelConfig::getConfigOption($bimFileBO->extension); } return [ 'input' => json_encode($input) ]; } /** * 指定url方式上传模型到引擎服务器 * @param string $fileUrl * @param BimFileBO $bimFileBO * @return array */ protected function uploadModelByUrl(BimFileBO $bimFileBO): array { $append = ['modelDownloadUrl' => $bimFileBO->modelDownloadUrl]; return Client::getInstance()->post('/api/app/model/transcode-file', [ 'query' => $this->buildQueryParams($bimFileBO, $append) ]); } /** * 文件流方式上传模型到引擎服务器 * @param \Illuminate\Http\UploadedFile $file * @param BimFileBO $bimFileBO * @return array */ protected function uploadModelByStream(UploadedFile $file, BimFileBO $bimFileBO): array { return Client::getInstance()->post('/api/app/model/upload-file', [ 'query' => $this->buildQueryParams($bimFileBO), 'multipart' => [ ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name] ], ]); } /** * 文件流方式上传点云GIS模型 * @param \Illuminate\Http\UploadedFile $file * @param BimFileBO $bimFileBO * @return array|null */ protected function uploadPointCloudModelByStream(UploadedFile $file, BimFileBO $bimFileBO) { $srs = $bimFileBO->pointCloudConfigJson['srs'] ?? ''; $longitude = $bimFileBO->pointCloudConfigJson['longitude'] ?? null; $latitude = $bimFileBO->pointCloudConfigJson['latitude'] ?? null; throw_validation_if(empty($srs) && (empty($longitude) || empty($latitude)), 'srs or longitude & latitude is required'); return Client::getInstance()->post('/api/app/gismodel/PointCloudUploadFile', [ 'query' => $this->buildQueryParams($bimFileBO, ['pointCloudConfigJson' => $bimFileBO->pointCloudConfigJson]), 'multipart' => [ ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name] ], ]); } /** * 文件流方式上OSGB GIS模型 * @param \Illuminate\Http\UploadedFile $file * @param \App\BO\BIMFileBO $bimFileBO * @return array|null */ protected function uploadOSGBModelByStream(UploadedFile $file, BimFileBO $bimFileBO) { return Client::getInstance()->post('/api/app/gismodel/OsgbUploadFile', [ 'query' => $this->buildQueryParams($bimFileBO), 'multipart' => [ ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name] ], ]); } public function uploadFile(?UploadedFile $file, BimFileBO $bimFileBO): array { if (!empty($bimFileBO->modelDownloadUrl)) { //指定URL方式上传 $result = $this->uploadModelByUrl($bimFileBO); } elseif ($this->isPointCloudGISModel($bimFileBO->extension)) { //点云GIS $result = $this->uploadPointCloudModelByStream($file, $bimFileBO); } elseif ($this->isOSGBGISModel($bimFileBO->gisType)) { // OSGB 模型 $result = $this->uploadOSGBModelByStream($file, bimFileBO: $bimFileBO); } else { //文件流方式上传 $result = $this->uploadModelByStream($file, $bimFileBO); } return [ 'bim_data_set_id' => $result['datas']['lightweightName'], 'bim_file_id' => $result['datas']['lightweightName'], 'convert_status' => BimFileConvertStatus::IN_QUEUE->value, 'bim_driver' => BIMDriverEnum::GLENDALE->value, 'model_type' => $bimFileBO->modelType, ]; } public function downloadSourceFile() { // TODO: Implement downloadSourceFile() method. } public function findConvertStatus(string $dataSetId): array { $result = Client::getInstance()->post('/api/app/model/query-model-info', [ 'query' => [ 'LightweightName' => $dataSetId ] ]); $getStatus = function ($status) { if ($status >= 1 && $status <= 99) { return BimFileConvertStatus::CONVERTING->value; } if ($status <= 0) { return BimFileConvertStatus::FAILED_TO_ADD_QUEUE->value; } return BimFileConvertStatus::IN_QUEUE->value; }; $status = match ($result['datas'][0]['status']) { 0, 1, 101 => BimFileConvertStatus::IN_QUEUE->value, 100 => BimFileConvertStatus::DONE->value, default => $getStatus($result['datas'][0]['status']) }; return $this->convertStatusFormat($status, $result['datas'][0]['status']); } public function viewDataSetModel(array $dataSetIDS) { $result = Client::getInstance()->post('/api/app/model/query-model-info', [ 'query' => [ 'LightweightName' => $dataSetIDS[0] ] ]); return $result['datas'] ?? []; } public function getModelDetail(File $file) { $result = null; if (!$file->bimFile) { return $result; } if (in_array($file->extension, config('bim.gis_extensions')) || ($file->is_bim == 1 && $file->extension == 'zip')) { $result = Client::getInstance()->post('/api/app/gismodel/QueryModelInfo', [ 'query' => [ 'LightweightName' => $file->bimFile->bim_data_set_id ] ]); } else { $result = Client::getInstance()->post('/api/app/model/query-model-info', [ 'query' => [ 'LightweightName' => $file->bimFile->bim_data_set_id ] ]); } if (isset($result['datas'][0])) { $result = $result['datas'][0]; } $stationUrl = config('bim.glendale.host'); $result = Arr::only($result, ['modelAccessAddress', 'lightweightName', 'fileOwnership', 'floorJsonURL', 'fileType', 'initiatingUser', 'modelType', 'name']); if (isset($result['modelAccessAddress'])) { $result['modelAccessAddress'] = str_replace('http://159.75.168.101:18086', $stationUrl, $result['modelAccessAddress']); } // $result['baseUrl'] = config('bim.glendale.base_url'); $result['stationUrl'] = $stationUrl; $result['stationToken'] = config('bim.glendale.token'); $result['modelType'] = $file->bimFile->model_type; return $result; } public function addToConvertQueue(string $dataSetId): array { return []; } }