소스 검색

refactor: 模型上传

waymen 5 달 전
부모
커밋
65c30679e2

+ 8 - 6
app/BO/BimFileBO.php

@@ -7,6 +7,7 @@ use Ramsey\Uuid\Uuid;
 class BimFileBO
 {
     public string $name;
+    public string $initiatingUser;
     public string $extension;
     public bool $isCAD;
     public string $uniqueCode;
@@ -14,27 +15,28 @@ class BimFileBO
     public string $modelDownloadUrl;
     public array $pointCloudConfigJson;
     public string $modelType;
+    public string $gisType;
     public array $configJson; //轻量化配置
 
     public function __construct(
         string $extension,
         string $name,
-        string $modelType = '',
+        string $initiatingUser = '',
+        string $gisType = '',
         int $priority = 205,
         string $modelDownloadUrl = ''
     ) {
         $this->extension = $extension;
         $this->name = $name;
+        $this->initiatingUser = $initiatingUser;
         $this->isCAD = in_array($this->extension, ['dwg', 'dwf', 'dws', 'dwt']);
         $this->uniqueCode = Uuid::uuid4();
         $this->priority = $priority;
         $this->modelDownloadUrl = $modelDownloadUrl;
-        $this->modelType = $modelType;
+        $this->gisType = $gisType;
         $this->configJson = [];
         
-        if (empty($this->modelType)) {
-            $this->modelType = $this->guessModelType();
-        }
+        $this->modelType = $this->guessModelType();
     }
 
     private function guessModelType(): string
@@ -45,7 +47,7 @@ class BimFileBO
         if (in_array($this->extension, config('bim.extensions'))) {
             return 'bim';
         }
-        if (in_array($this->extension, config('bim.gis_extensions'))) {
+        if (in_array($this->extension, config('bim.gis_extensions')) || !empty($this->gisType)) {
             return 'gis';
         }
         return '';

+ 1 - 1
app/Http/Controllers/API/FileController.php

@@ -156,7 +156,7 @@ class FileController extends Controller
             ActionRepository::createByFile($request->object_id, $request->object_type, ObjectAction::UPLOADED);
         }
 
-        return $this->successData($uploadedFiles);
+        return FileUploadSuccessResource::collection($uploadedFiles);
     }
 
     public function companyUpload(FileUploadRequest $request)

+ 1 - 0
app/Http/Resources/API/FileUploadSuccessResource.php

@@ -21,6 +21,7 @@ class FileUploadSuccessResource extends JsonResource
             'url' => Storage::url($this->pathname),
             'extension' => $this->extension,
             'size' => $this->size,
+            'is_bim' => $this->is_bim,
         ];
     }
 }

+ 54 - 0
app/Jobs/ConvertBimFile.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Jobs;
+
+use App\BO\BimFileBO;
+use App\Libraries\BIM\BIMFactory;
+use App\Models\BimFile;
+use App\Models\File;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldBeUnique;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+
+/**
+ * 处理BIM的轻量化转换
+ */
+class ConvertBimFile implements ShouldQueue
+{
+    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+    private $fileId;
+    private BimFileBO $bimFileBO;
+    private $file;
+
+    /**
+     * Create a new job instance.
+     */
+    public function __construct(int $fileId, BimFileBO $bimFileBO, ?UploadedFile $file = null)
+    {
+        $this->fileId = $fileId;
+        $this->bimFileBO = $bimFileBO;
+        $this->file = $file;
+    }
+
+    /**
+     * Execute the job.
+     */
+    public function handle(): void
+    {
+        $file = File::find($this->fileId);
+
+        if ($file) {
+            $bimInfo = BIMFactory::make()->uploadFile($this->file, $this->bimFileBO);
+
+            BimFile::query()->create([
+                'file_id' => $file->id,
+                ...$bimInfo
+            ]);
+        }
+    }
+}

+ 1 - 1
app/Libraries/BIM/BlackHole/BlackHole.php

@@ -11,7 +11,7 @@ use Illuminate\Http\UploadedFile;
 
 class BlackHole extends BIMAbstract
 {
-    public function uploadFile(UploadedFile|null $file, BimFileBO $bimFileBO)
+    public function uploadFile(?UploadedFile $file, BimFileBO $bimFileBO)
     {
         $projectId = config("bim.black_hole.project_id");
         $treeInfo = $this->getTreeById($projectId);

+ 1 - 1
app/Libraries/BIM/Contacts/BIMContact.php

@@ -8,7 +8,7 @@ use Illuminate\Http\UploadedFile;
 
 interface BIMContact {
 
-    public function uploadFile(UploadedFile|null $file, BimFileBO $bimFileBO);
+    public function uploadFile(?UploadedFile $file, BimFileBO $bimFileBO);
 
     public function downloadSourceFile();
 

+ 5 - 5
app/Libraries/BIM/Glendale/Glendale.php

@@ -37,9 +37,9 @@ class Glendale extends BIMAbstract
         return in_array($ext, ['las', 'laz', 'ply', 'xyz']);
     }
 
-    private function isOSGBGISModel(string $modelType): bool
+    private function isOSGBGISModel(string $gisType): bool
     {
-        return $modelType == 'osgb';
+        return $gisType == 'osgb';
     }
 
     /**
@@ -52,7 +52,7 @@ class Glendale extends BIMAbstract
     {
         $input = [
             'name' => $bimFileBO->name,
-            'initiatingUser' => Auth::user()->name,
+            'initiatingUser' => $bimFileBO->initiatingUser,
             'uniqueCode' => $bimFileBO->uniqueCode,
             'priority' => $bimFileBO->priority,
             'isCAD' => $bimFileBO->isCAD,
@@ -145,13 +145,13 @@ class Glendale extends BIMAbstract
         ]);
     }
 
-    public function uploadFile(UploadedFile|null $file, BimFileBO $bimFileBO): array
+    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->modelType)) { // OSGB 模型
+        } elseif ($this->isOSGBGISModel($bimFileBO->gisType)) { // OSGB 模型
             $result = $this->uploadOSGBModelByStream($file, bimFileBO: $bimFileBO);
         } else { //文件流方式上传
             $result = $this->uploadModelByStream($file, $bimFileBO);

+ 24 - 7
app/Services/File/Upload/FilesUploadService.php

@@ -2,7 +2,12 @@
 
 namespace App\Services\File\Upload;
 
+use App\BO\BimFileBO;
+use App\Jobs\ConvertBimFile;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Storage;
 
 class FilesUploadService
 {
@@ -49,15 +54,27 @@ class FilesUploadService
     public function uploadModels(): array
     {
         $files = $this->request->get("files", []);
-        $items = [];
-
-        foreach ($files as $file) {
-            $item = $this->uploadFileWithPath($this->request, $file['pathname'], $file['title'], $file['size']);
-
-            $items[] = $item;
+        $uploadedFiles = [];
+
+        DB::transaction(function() use ($files, &$uploadedFiles) {
+            foreach ($files as $file) {
+                $uploadedFiles[] = $this->uploadFileWithPath($this->request, $file['pathname'], $file['title'], $file['size']);
+            }
+        });
+
+        $gisType = $this->request->input('gis_type', '');
+        foreach ($uploadedFiles as $uploadedFile) {
+            if ($uploadedFile['is_bim'] == 1) {
+                $bimFileBO = new BimFileBO($uploadedFile->extension, $uploadedFile->title, Auth::user()->name, $gisType);
+                $bimFileBO->modelDownloadUrl = Storage::url($uploadedFile->pathname);
+                $bimFileBO->setConfigJson($this->request->input('configJson', []));
+                $bimFileBO->setPointCloudConfigJson($this->request->input('pointCloudConfigJson', []));
+                ConvertBimFile::dispatch($uploadedFile['id'], $bimFileBO);
+            }
         }
 
-        $uploadedFiles = $this->storeFiles($items);
+        $this->updateObjectVersion();
+
         return $uploadedFiles;
     }
 }

+ 47 - 23
app/Services/File/Upload/FilesUploadTrait.php

@@ -67,23 +67,9 @@ trait FilesUploadTrait
         return $filesSize;
     }
 
-    protected function returnUploadResult(string $extension, string $fileName, string $path = '', int $size = 0, Request $request)
+    protected function buildFileArr(string $extension, string $fileName, string $path = '', int $size = 0, Request $request)
     {
-        $modelType = $request->input('model_type', '');
-
-        if ($this->isBIM($extension) || $modelType == 'osgb' && $request->object_type == FileObjectType::CONTAINER->value) {
-            $bimFileBO = new BimFileBO($extension, $fileName, $modelType);
-            if (!empty($path)) {
-                $bimFileBO->modelDownloadUrl = Storage::url($path);
-            }
-            $bimFileBO->setConfigJson($request->input('configJson', []));
-
-            $bimFileBO->setPointCloudConfigJson($request->input('pointCloudConfigJson', []));
-
-            $data['bim'] = BIMFactory::make()->uploadFile($file ?? null, $bimFileBO);
-        }
-
-        $data['file'] = [
+        return [
             'pathname' => $path,
             'title' => $fileName,
             'size' => $size,
@@ -95,17 +81,25 @@ trait FilesUploadTrait
             'source' => $request->get("source", 1),
             'uuid' => $request->get("uuid"),
             'folder_id' => $request->get("folder_id", 0),
-            'is_bim' => isset($data['bim']) ? 1 : 0,
         ];
-
-        return $data;
     }
 
     protected function uploadFileWithPath(Request $request, string $path, string $fileName, int $size = 0)
     {
         $extension = pathinfo($path, PATHINFO_EXTENSION);
 
-        return $this->returnUploadResult($extension, $fileName, $path, $size, $request);
+        $gisType = $request->input('gis_type', '');
+
+        $fileArr = $this->buildFileArr($extension, $fileName, $path, $size, $request);
+        $fileArr['is_bim'] = 0;
+
+        if ($this->isBIM($extension) || $gisType == 'osgb' && $request->object_type == FileObjectType::CONTAINER->value) {
+            $fileArr['is_bim'] = 1;
+        }
+
+        $uploadedFile = $this->storeFile($fileArr);
+
+        return $uploadedFile;
     }
 
     protected function uploadFile(Request $request, UploadedFile $file, ?ProgressBar $progressBar = null): array
@@ -125,10 +119,10 @@ trait FilesUploadTrait
             'bim' => [],
         ];
 
-        $modelType = $request->input('model_type', '');
+        $gisType = $request->input('gis_type', '');
 
-        if ($this->isBIM($extension) || $modelType == 'osgb' && $request->object_type == FileObjectType::CONTAINER->value) {
-            $bimFileBO = new BimFileBO($extension, $file->getClientOriginalName(), $modelType);
+        if ($this->isBIM($extension) || $gisType == 'osgb' && $request->object_type == FileObjectType::CONTAINER->value) {
+            $bimFileBO = new BimFileBO($extension, $file->getClientOriginalName(), Auth::user()->name, $gisType);
             $bimFileBO->setPointCloudConfigJson($request->input('pointCloudConfigJson', []));
 
             $data['bim'] = BIMFactory::make()->uploadFile($file, $bimFileBO);
@@ -151,6 +145,36 @@ trait FilesUploadTrait
         return $data;
     }
 
+    protected function storeFile(array $fileArr): File
+    {
+        if ($fileArr['object_id'] && $fileArr['source'] == 1 || $fileArr['uuid'] && $fileArr['source'] == 1) {
+            $version = File::query()
+                ->where('object_type', $fileArr['object_type'])
+                ->where('object_id', $fileArr['object_id'])
+                ->where("title", $fileArr['title'])
+                ->where("source", 1)
+                ->where("folder_id", $fileArr['folder_id'] ?? 0)
+                ->count();
+            $fileArr['version'] = $version + 1;
+            $fileArr['is_latest_version'] = 1;
+
+            File::query()
+                ->where('object_type', $fileArr['object_type'])
+                ->where('object_id', $fileArr['object_id'])
+                ->where("title", $fileArr['title'])
+                ->where("folder_id", $fileArr['folder_id'] ?? 0)
+                ->where("source", 1)
+                ->where("is_latest_version", 1)
+                ->update([
+                    'is_latest_version' => 0
+                ]);
+        }
+
+        $file = File::query()->create($fileArr);
+
+        return $file;
+    }
+
     protected function storeFiles(array $items)
     {
         $uploadedFiles = [];

+ 1 - 1
app/Services/NamingRule/NamingRuleCheck.php

@@ -20,7 +20,7 @@ class NamingRuleCheck
         protected ?object $object = null
     )
     {
-        if ($this->object) {
+        if ($this->object->naming_rule_id) {
             $this->loadCustomFields($this->object->naming_rule_id);
         }
     }

+ 1 - 0
composer.json

@@ -16,6 +16,7 @@
         "maatwebsite/excel": "^3.1",
         "overtrue/laravel-filesystem-cos": "^3.4",
         "overtrue/laravel-query-logger": "^3.1",
+        "predis/predis": "^2.2",
         "qcloud/cos-sdk-v5": "^2.6",
         "qcloud_sts/qcloud-sts-sdk": "^3.0",
         "spatie/laravel-permission": "^6.3",

+ 46 - 1
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "c04b293eb1697d74aa0156e9e57802f1",
+    "content-hash": "977e12174fa6d3b6dd7d261ce1c4cedf",
     "packages": [
         {
             "name": "aliyuncs/oss-sdk-php",
@@ -3238,6 +3238,51 @@
             ],
             "time": "2024-07-20T21:41:07+00:00"
         },
+        {
+            "name": "predis/predis",
+            "version": "v2.2.2",
+            "dist": {
+                "type": "zip",
+                "url": "https://mirrors.tencent.com/repository/composer/predis/predis/v2.2.2/predis-predis-v2.2.2.zip",
+                "reference": "b1d3255ed9ad4d7254f9f9bba386c99f4bb983d1",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8.0"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "^3.3",
+                "phpstan/phpstan": "^1.9",
+                "phpunit/phpunit": "^8.0 || ~9.4.4"
+            },
+            "suggest": {
+                "ext-relay": "Faster connection with in-memory caching (>=0.6.2)"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Predis\\": "src/"
+                }
+            },
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Till Krüss",
+                    "homepage": "https://till.im",
+                    "role": "Maintainer"
+                }
+            ],
+            "description": "A flexible and feature-complete Redis client for PHP.",
+            "homepage": "http://github.com/predis/predis",
+            "keywords": [
+                "nosql",
+                "predis",
+                "redis"
+            ],
+            "time": "2023-09-13T16:42:03+00:00"
+        },
         {
             "name": "psr/cache",
             "version": "3.0.0",