123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <?php
- namespace App\Libraries\BIM\Glendale;
- use App\BO\BIMFileBO;
- use App\Libraries\BIM\Abstracts\BIMAbstract;
- use App\Libraries\BIM\BIMDriverEnum;
- use App\Models\BimFile;
- use App\Models\Enums\BimFileConvertStatus;
- use App\Models\Enums\BimFileModelType;
- use Illuminate\Http\UploadedFile;
- 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
- {
- $defaultConfigJson = ExtensionModelConfig::getConfigOption($bimFileBO->extension);
- $configJson = array_merge($defaultConfigJson, $bimFileBO->configJson);
- $input = [
- 'name' => $bimFileBO->name,
- 'initiatingUser' => $bimFileBO->initiatingUser,
- 'uniqueCode' => $bimFileBO->uniqueCode,
- 'priority' => $bimFileBO->priority,
- 'isCAD' => $bimFileBO->isCAD,
- 'callbackInterfaceURL' => route('glendale.callback'),
- 'configJson' => $configJson,
- // 'pointCloudConfigJson' => [
- // 'srs' => 'EPSG:32649'
- // ]
- ];
- if (!empty($append)) {
- $input = array_merge($input, $append);
- }
- 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(BimFile $bimFile)
- {
- $result = null;
- if (!$bimFile) {
- return $result;
- }
- if ($bimFile->model_type == BimFileModelType::GIS->value) {
- $result = Client::getInstance()->post('/api/app/gismodel/QueryModelInfo', [
- 'query' => [
- 'LightweightName' => $bimFile->bim_data_set_id
- ]
- ]);
- } else {
- $result = Client::getInstance()->post('/api/app/model/query-model-info', [
- 'query' => [
- 'LightweightName' => $bimFile->bim_data_set_id
- ]
- ]);
- }
- if (isset($result['datas'][0])) {
- $result = $result['datas'][0];
- }
- return $result;
- }
- public function addToConvertQueue(string $dataSetId): array
- {
- return [];
- }
- }
|