123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- <?php
- namespace App\Libraries\BIM\Glendale;
- use App\BO\BIMFileBO;
- use App\Libraries\BIM\Abstracts\BIMAbstract;
- use App\Libraries\BIM\BIMDriverEnum;
- use App\Models\Enums\BimFileConvertStatus;
- use App\Models\File;
- use Illuminate\Http\UploadedFile;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Facades\Auth;
- class Glendale extends BIMAbstract
- {
- //http://gisbimapi.glendale.top/#/serviceApi/BIM%E6%A8%A1%E5%9E%8B%E6%9C%8D%E5%8A%A1?id=%e6%ba%90%e6%96%87%e4%bb%b6%e7%9b%b8%e5%85%b3
- /**
- * 匹配Glendale的轻量化状态码
- * @param int $sourceStatus
- * @return int
- */
- public static function mapSourceStatus(int $sourceStatus): int
- {
- if ($sourceStatus == 100) {
- $convertStatus = BimFileConvertStatus::DONE->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 [];
- }
- }
|