Glendale.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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 DragonCode\Support\Facades\Helpers\Arr;
  9. use Illuminate\Http\UploadedFile;
  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. /**
  35. * 构造query的input传参
  36. * @param \App\BO\BIMFileBO $bimFileBO
  37. * @param array $append
  38. * @return array
  39. */
  40. private function buildQueryParams(BimFileBO $bimFileBO, array $append = []): array
  41. {
  42. $input = [
  43. 'name' => $bimFileBO->name,
  44. 'initiatingUser' => Auth::user()->name,
  45. 'uniqueCode' => $bimFileBO->uniqueCode,
  46. 'priority' => $bimFileBO->priority,
  47. 'isCAD' => $bimFileBO->isCAD,
  48. 'configJson' => ExtensionModelConfig::getConfigOption($bimFileBO->extension),
  49. 'callbackInterfaceURL' => route('glendale.callback'),
  50. 'pointCloudConfigJson' => [
  51. 'srs' => 'EPSG:32649'
  52. ]
  53. ];
  54. if (!empty($append)) {
  55. $input = array_merge($input, $append);
  56. }
  57. return [
  58. 'input' => json_encode($input)
  59. ];
  60. }
  61. /**
  62. * 指定url方式上传模型到引擎服务器
  63. * @param string $fileUrl
  64. * @param BimFileBO $bimFileBO
  65. * @return array
  66. */
  67. protected function uploadModelByUrl(BimFileBO $bimFileBO): array
  68. {
  69. $append = ['modelDownloadUrl' => $bimFileBO->modelDownloadUrl];
  70. return Client::getInstance()->post('/api/app/model/transcode-file', [
  71. 'query' => $this->buildQueryParams($bimFileBO, $append)
  72. ]);
  73. }
  74. /**
  75. * 文件流方式上传模型到引擎服务器
  76. * @param \Illuminate\Http\UploadedFile $file
  77. * @param BimFileBO $bimFileBO
  78. * @return array
  79. */
  80. protected function uploadModelByStream(UploadedFile $file, BimFileBO $bimFileBO): array
  81. {
  82. return Client::getInstance()->post('/api/app/model/upload-file', [
  83. 'query' => $this->buildQueryParams($bimFileBO),
  84. 'multipart' => [
  85. ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name]
  86. ],
  87. ]);
  88. }
  89. /**
  90. * 文件流方式上传点云GIS模型
  91. * @param \Illuminate\Http\UploadedFile $file
  92. * @param BimFileBO $bimFileBO
  93. * @return array|null
  94. */
  95. protected function uploadPointCloudModelByStream(UploadedFile $file, BimFileBO $bimFileBO)
  96. {
  97. $srs = $bimFileBO->pointCloudConfigJson['srs'] ?? '';
  98. $longitude = $bimFileBO->pointCloudConfigJson['longitude'] ?? null;
  99. $latitude = $bimFileBO->pointCloudConfigJson['latitude'] ?? null;
  100. throw_validation_if(empty($srs) && (empty($longitude) || empty($latitude)), 'srs or longitude & latitude is required');
  101. return Client::getInstance()->post('/api/app/gismodel/PointCloudUploadFile', [
  102. 'query' => $this->buildQueryParams($bimFileBO, ['pointCloudConfigJson' => $bimFileBO->pointCloudConfigJson]),
  103. 'multipart' => [
  104. ['name' => 'file', 'contents' => fopen($file, 'r+'), 'filename' => $bimFileBO->name]
  105. ],
  106. ]);
  107. }
  108. public function uploadFile(UploadedFile $file, BimFileBO $bimFileBO): array
  109. {
  110. if (!empty($bimFileBO->modelDownloadUrl)) { //指定URL方式上传
  111. $result = $this->uploadModelByUrl($bimFileBO);
  112. } elseif ($this->isPointCloudGISModel($bimFileBO->extension)) { //点云GIS
  113. $result = $this->uploadPointCloudModelByStream($file, $bimFileBO);
  114. } else { //文件流方式上传
  115. $result = $this->uploadModelByStream($file, $bimFileBO);
  116. }
  117. return [
  118. 'bim_data_set_id' => $result['datas']['lightweightName'],
  119. 'bim_file_id' => $result['datas']['lightweightName'],
  120. 'convert_status' => BimFileConvertStatus::IN_QUEUE->value,
  121. 'bim_driver' => BIMDriverEnum::GLENDALE->value,
  122. ];
  123. }
  124. public function downloadSourceFile()
  125. {
  126. // TODO: Implement downloadSourceFile() method.
  127. }
  128. public function findConvertStatus(string $dataSetId): array
  129. {
  130. $result = Client::getInstance()->post('/api/app/model/query-model-info', [
  131. 'query' => [
  132. 'LightweightName' => $dataSetId
  133. ]
  134. ]);
  135. $getStatus = function ($status) {
  136. if ($status >= 1 && $status <= 99) {
  137. return BimFileConvertStatus::CONVERTING->value;
  138. }
  139. if ($status <= 0) {
  140. return BimFileConvertStatus::FAILED_TO_ADD_QUEUE->value;
  141. }
  142. return BimFileConvertStatus::IN_QUEUE->value;
  143. };
  144. $status = match ($result['datas'][0]['status']) {
  145. 0, 1, 101 => BimFileConvertStatus::IN_QUEUE->value,
  146. 100 => BimFileConvertStatus::DONE->value,
  147. default => $getStatus($result['datas'][0]['status'])
  148. };
  149. return $this->convertStatusFormat($status, $result['datas'][0]['status']);
  150. }
  151. public function viewDataSetModel(array $dataSetIDS)
  152. {
  153. $result = Client::getInstance()->post('/api/app/model/query-model-info', [
  154. 'query' => [
  155. 'LightweightName' => $dataSetIDS[0]
  156. ]
  157. ]);
  158. return $result['datas'] ?? [];
  159. }
  160. public function getModelDetail(File $file)
  161. {
  162. $result = null;
  163. if (!$file->bimFile) {
  164. return $result;
  165. }
  166. if (in_array($file->extension, config('bim.gis_extensions'))) {
  167. $result = Client::getInstance()->post('/api/app/gismodel/QueryModelInfo', [
  168. 'query' => [
  169. 'LightweightName' => $file->bimFile->bim_data_set_id
  170. ]
  171. ]);
  172. if (isset($result['datas'][0])) {
  173. $result = $result['datas'][0];
  174. $result['modelType'] = 'gis';
  175. }
  176. } else {
  177. $result = Client::getInstance()->post('/api/app/model/query-model-info', [
  178. 'query' => [
  179. 'LightweightName' => $file->bimFile->bim_data_set_id
  180. ]
  181. ]);
  182. if (isset($result['datas'][0])) {
  183. $result = $result['datas'][0];
  184. if ($result['isCAD']) {
  185. $result['modelType'] = 'cad';
  186. } else {
  187. $result['modelType'] = 'bim';
  188. }
  189. }
  190. }
  191. $result = Arr::only($result, ['modelAccessAddress', 'lightweightName', 'fileOwnership', 'floorJsonURL', 'fileType', 'initiatingUser', 'modelType']);
  192. $result['modelAccessAddress'] = str_replace('http://159.75.168.101:18086', 'https://gelan.autocde.com', $result['modelAccessAddress']);
  193. $result['baseUrl'] = config('bim.glendale.base_url');
  194. $result['stationUrl'] = config('bim.glendale.host');
  195. $result['stationToken'] = config('bim.glendale.token');
  196. return $result;
  197. }
  198. public function addToConvertQueue(string $dataSetId): array
  199. {
  200. return [];
  201. }
  202. /**
  203. * 获取model的浏览链接
  204. * @param string $dataSetId
  205. * @return string
  206. */
  207. public function getModelViewLink(string $dataSetId): string
  208. {
  209. return config('bim.glendale.view_url') . '/#/webgl?id=' . $dataSetId;
  210. }
  211. }