Glendale.php 8.0 KB

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