Glendale.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?php
  2. namespace App\Libraries\BIM\Glendale;
  3. use App\BO\BIMFileBO;
  4. use App\Libraries\BIM\Abstracts\BIMAbstract;
  5. use App\Libraries\BIM\BIMDriverEnum;
  6. use App\Models\Enums\BimFileConvertStatus;
  7. use App\Models\File;
  8. use Illuminate\Http\UploadedFile;
  9. use Illuminate\Support\Arr;
  10. use Illuminate\Support\Facades\Auth;
  11. class Glendale extends BIMAbstract
  12. {
  13. //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
  14. /**
  15. * 匹配Glendale的轻量化状态码
  16. * @param int $sourceStatus
  17. * @return int
  18. */
  19. public static function mapSourceStatus(int $sourceStatus): int
  20. {
  21. if ($sourceStatus == 100) {
  22. $convertStatus = BimFileConvertStatus::DONE->value;
  23. } elseif ($sourceStatus < 100 && $sourceStatus > 0) {
  24. $convertStatus = BimFileConvertStatus::CONVERTING->value;
  25. } else {
  26. $convertStatus = BimFileConvertStatus::IN_QUEUE->value;
  27. }
  28. return $convertStatus;
  29. }
  30. private function isPointCloudGISModel(string $ext): bool
  31. {
  32. return in_array($ext, ['las', 'laz', 'ply', 'xyz']);
  33. }
  34. private function isOSGBGISModel(string $gisType): bool
  35. {
  36. return $gisType == 'osgb';
  37. }
  38. /**
  39. * 构造query的input传参
  40. * @param \App\BO\BIMFileBO $bimFileBO
  41. * @param array $append
  42. * @return array
  43. */
  44. private function buildQueryParams(BimFileBO $bimFileBO, array $append = []): array
  45. {
  46. $input = [
  47. 'name' => $bimFileBO->name,
  48. 'initiatingUser' => $bimFileBO->initiatingUser,
  49. 'uniqueCode' => $bimFileBO->uniqueCode,
  50. 'priority' => $bimFileBO->priority,
  51. 'isCAD' => $bimFileBO->isCAD,
  52. 'callbackInterfaceURL' => route('glendale.callback'),
  53. 'configJson' => $bimFileBO->configJson,
  54. // 'pointCloudConfigJson' => [
  55. // 'srs' => 'EPSG:32649'
  56. // ]
  57. ];
  58. if (!empty($append)) {
  59. $input = array_merge($input, $append);
  60. }
  61. if (count($input['configJson'] ?? []) == 0) {
  62. $input['configJson'] = ExtensionModelConfig::getConfigOption($bimFileBO->extension);
  63. }
  64. return [
  65. 'input' => json_encode($input)
  66. ];
  67. }
  68. /**
  69. * 指定url方式上传模型到引擎服务器
  70. * @param string $fileUrl
  71. * @param BimFileBO $bimFileBO
  72. * @return array
  73. */
  74. protected function uploadModelByUrl(BimFileBO $bimFileBO): array
  75. {
  76. $append = ['modelDownloadUrl' => $bimFileBO->modelDownloadUrl];
  77. return Client::getInstance()->post('/api/app/model/transcode-file', [
  78. 'query' => $this->buildQueryParams($bimFileBO, $append)
  79. ]);
  80. }
  81. /**
  82. * 文件流方式上传模型到引擎服务器
  83. * @param \Illuminate\Http\UploadedFile $file
  84. * @param BimFileBO $bimFileBO
  85. * @return array
  86. */
  87. protected function uploadModelByStream(UploadedFile $file, BimFileBO $bimFileBO): array
  88. {
  89. return Client::getInstance()->post('/api/app/model/upload-file', [
  90. 'query' => $this->buildQueryParams($bimFileBO),
  91. 'multipart' => [
  92. ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name]
  93. ],
  94. ]);
  95. }
  96. /**
  97. * 文件流方式上传点云GIS模型
  98. * @param \Illuminate\Http\UploadedFile $file
  99. * @param BimFileBO $bimFileBO
  100. * @return array|null
  101. */
  102. protected function uploadPointCloudModelByStream(UploadedFile $file, BimFileBO $bimFileBO)
  103. {
  104. $srs = $bimFileBO->pointCloudConfigJson['srs'] ?? '';
  105. $longitude = $bimFileBO->pointCloudConfigJson['longitude'] ?? null;
  106. $latitude = $bimFileBO->pointCloudConfigJson['latitude'] ?? null;
  107. throw_validation_if(empty($srs) && (empty($longitude) || empty($latitude)), 'srs or longitude & latitude is required');
  108. return Client::getInstance()->post('/api/app/gismodel/PointCloudUploadFile', [
  109. 'query' => $this->buildQueryParams($bimFileBO, ['pointCloudConfigJson' => $bimFileBO->pointCloudConfigJson]),
  110. 'multipart' => [
  111. ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name]
  112. ],
  113. ]);
  114. }
  115. /**
  116. * 文件流方式上OSGB GIS模型
  117. * @param \Illuminate\Http\UploadedFile $file
  118. * @param \App\BO\BIMFileBO $bimFileBO
  119. * @return array|null
  120. */
  121. protected function uploadOSGBModelByStream(UploadedFile $file, BimFileBO $bimFileBO)
  122. {
  123. return Client::getInstance()->post('/api/app/gismodel/OsgbUploadFile', [
  124. 'query' => $this->buildQueryParams($bimFileBO),
  125. 'multipart' => [
  126. ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name]
  127. ],
  128. ]);
  129. }
  130. public function uploadFile(?UploadedFile $file, BimFileBO $bimFileBO): array
  131. {
  132. if (!empty($bimFileBO->modelDownloadUrl)) { //指定URL方式上传
  133. $result = $this->uploadModelByUrl($bimFileBO);
  134. } elseif ($this->isPointCloudGISModel($bimFileBO->extension)) { //点云GIS
  135. $result = $this->uploadPointCloudModelByStream($file, $bimFileBO);
  136. } elseif ($this->isOSGBGISModel($bimFileBO->gisType)) { // OSGB 模型
  137. $result = $this->uploadOSGBModelByStream($file, bimFileBO: $bimFileBO);
  138. } else { //文件流方式上传
  139. $result = $this->uploadModelByStream($file, $bimFileBO);
  140. }
  141. return [
  142. 'bim_data_set_id' => $result['datas']['lightweightName'],
  143. 'bim_file_id' => $result['datas']['lightweightName'],
  144. 'convert_status' => BimFileConvertStatus::IN_QUEUE->value,
  145. 'bim_driver' => BIMDriverEnum::GLENDALE->value,
  146. 'model_type' => $bimFileBO->modelType,
  147. ];
  148. }
  149. public function downloadSourceFile()
  150. {
  151. // TODO: Implement downloadSourceFile() method.
  152. }
  153. public function findConvertStatus(string $dataSetId): array
  154. {
  155. $result = Client::getInstance()->post('/api/app/model/query-model-info', [
  156. 'query' => [
  157. 'LightweightName' => $dataSetId
  158. ]
  159. ]);
  160. $getStatus = function ($status) {
  161. if ($status >= 1 && $status <= 99) {
  162. return BimFileConvertStatus::CONVERTING->value;
  163. }
  164. if ($status <= 0) {
  165. return BimFileConvertStatus::FAILED_TO_ADD_QUEUE->value;
  166. }
  167. return BimFileConvertStatus::IN_QUEUE->value;
  168. };
  169. $status = match ($result['datas'][0]['status']) {
  170. 0, 1, 101 => BimFileConvertStatus::IN_QUEUE->value,
  171. 100 => BimFileConvertStatus::DONE->value,
  172. default => $getStatus($result['datas'][0]['status'])
  173. };
  174. return $this->convertStatusFormat($status, $result['datas'][0]['status']);
  175. }
  176. public function viewDataSetModel(array $dataSetIDS)
  177. {
  178. $result = Client::getInstance()->post('/api/app/model/query-model-info', [
  179. 'query' => [
  180. 'LightweightName' => $dataSetIDS[0]
  181. ]
  182. ]);
  183. return $result['datas'] ?? [];
  184. }
  185. public function getModelDetail(File $file)
  186. {
  187. $result = null;
  188. if (!$file->bimFile) {
  189. return $result;
  190. }
  191. if (in_array($file->extension, config('bim.gis_extensions')) || ($file->is_bim == 1 && $file->extension == 'zip')) {
  192. $result = Client::getInstance()->post('/api/app/gismodel/QueryModelInfo', [
  193. 'query' => [
  194. 'LightweightName' => $file->bimFile->bim_data_set_id
  195. ]
  196. ]);
  197. } else {
  198. $result = Client::getInstance()->post('/api/app/model/query-model-info', [
  199. 'query' => [
  200. 'LightweightName' => $file->bimFile->bim_data_set_id
  201. ]
  202. ]);
  203. }
  204. if (isset($result['datas'][0])) {
  205. $result = $result['datas'][0];
  206. }
  207. $stationUrl = config('bim.glendale.host');
  208. $result = Arr::only($result, ['modelAccessAddress', 'lightweightName', 'fileOwnership', 'floorJsonURL', 'fileType', 'initiatingUser', 'modelType', 'name']);
  209. if (isset($result['modelAccessAddress'])) {
  210. $result['modelAccessAddress'] = str_replace('http://159.75.168.101:18086', $stationUrl, $result['modelAccessAddress']);
  211. }
  212. // $result['baseUrl'] = config('bim.glendale.base_url');
  213. $result['stationUrl'] = $stationUrl;
  214. $result['stationToken'] = config('bim.glendale.token');
  215. $result['modelType'] = $file->bimFile->model_type;
  216. return $result;
  217. }
  218. public function addToConvertQueue(string $dataSetId): array
  219. {
  220. return [];
  221. }
  222. }