Переглянути джерело

feat:拉取BIM信息Command

waymen 4 місяців тому
батько
коміт
ba7da819d8

+ 54 - 0
app/Console/Commands/FetchBimInfo.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\BimFile;
+use App\Models\Enums\BimFileConvertStatus;
+use App\Services\File\BimService;
+use Illuminate\Console\Command;
+
+/**
+ * 拉取引擎服务器的BIM信息
+ */
+class FetchBimInfo extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'lpc:fetch-bim-info {scope=1}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'fetch bim info from engine';
+
+    /**
+     * Execute the console command.
+     */
+    public function handle()
+    {
+        $this->info('start to fetch bim info');
+
+        $scopeDay = (int) $this->argument('scope'); //拉取最近n天
+
+        if ($scopeDay == 0) {
+            $startDateTime = '';
+        } else {
+            $startDateTime = date_time_str(strtotime('-' . $scopeDay . 'days'));
+        }
+
+        $bimService = new BimService;
+
+        BimFile::query()->createdAtStart($startDateTime)
+            ->chunkById(50, function ($bimFiles) use ($bimService) {
+                foreach ($bimFiles as $bimFile) {
+                    $bimFile = $bimService->storeBimInfo($bimFile);
+                    $this->info($bimFile->id . ' extra is ' . json_encode($bimFile->extra));
+                }
+            });
+    }
+}

+ 1 - 14
app/Console/Commands/SyncBimConvertStatus.php

@@ -5,7 +5,6 @@ namespace App\Console\Commands;
 use App\Libraries\BIM\BIMFactory;
 use App\Models\BimFile;
 use App\Models\Enums\BimFileConvertStatus;
-use App\Services\File\BimService;
 use Carbon\Carbon;
 use Illuminate\Console\Command;
 use Illuminate\Database\Eloquent\Collection;
@@ -27,8 +26,6 @@ class SyncBimConvertStatus extends Command
      */
     protected $description = 'sync bim convert status';
 
-    private $bimService;
-
     /**
      * Execute the console command.
      */
@@ -36,8 +33,6 @@ class SyncBimConvertStatus extends Command
     {
         Log::info('start to sync bim convert status');
 
-        $this->bimService = new BimService;
-
         BimFile::query()
             ->where("created_at", ">=", Carbon::now()->subDay())
             ->whereIn("convert_status", BimFileConvertStatus::unfinishedStatus())
@@ -54,17 +49,9 @@ class SyncBimConvertStatus extends Command
 
                 $bimFile->fill($statusArr);
                 $bimFile->save();
-                
-                $this->syncInfo($bimFile);
+
             } catch (\Exception $exception) {
             }
         }
     }
-
-    protected function syncInfo(BimFile $bimFile)
-    {
-        $this->bimService->storeBimInfo($bimFile);
-
-        $this->info($bimFile->id . '已拉取模型轻量化信息');
-    }
 }

+ 0 - 24
app/Http/Controllers/API/ContainerController.php

@@ -5,7 +5,6 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Container\ApprovalMoveFileRequest;
 use App\Http\Requests\API\Container\CreateOrUpdateRequest;
-use App\Http\Resources\API\BimFileResource;
 use App\Http\Resources\API\ContainerDetailResource;
 use App\Http\Resources\API\ContainerReportResource;
 use App\Http\Resources\API\ContainerResource;
@@ -13,7 +12,6 @@ use App\Http\Resources\API\FileAttachmentResource;
 use App\Http\Resources\API\FileByObjectResource;
 use App\Http\Resources\API\LibraryReportResource;
 use App\Models\Approval;
-use App\Models\BimFile;
 use App\Models\Container;
 use App\Models\ContainerContent;
 use App\Models\Enums\ActionObjectType;
@@ -28,7 +26,6 @@ use App\Repositories\CustomFieldRepository;
 use App\Services\File\FileAssociationService;
 use App\Services\File\ImageUrlService;
 use App\Services\History\ModelChangeDetector;
-use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 
@@ -370,25 +367,4 @@ class ContainerController extends Controller
 
         return $this->noContent();
     }
-
-    /**
-     * 容器下的所有模型列表
-     */
-    public function models(Request $request)
-    {
-        $containerId = $request->container_id;
-        $pageSize = $request->get('page_size') ?? 10;
-
-        $container = Container::query()->allowed()->findOrFail($containerId);
-
-        $bimFiles = BimFile::query()
-            ->whereHas('file', function ($query) use ($container) {
-                return $query->containerLibraryId($container->library_id);
-            })
-            ->with('file')
-            ->latest('id')
-            ->paginate($pageSize);
-
-        return BimFileResource::collection($bimFiles);
-    }
 }

+ 35 - 0
app/Http/Controllers/API/FileController.php

@@ -6,11 +6,15 @@ use App\Http\Controllers\Controller;
 use App\Http\Requests\API\File\DownloadZipRequest;
 use App\Http\Requests\API\File\FileUploadRequest;
 use App\Http\Requests\API\File\KeepDirectoryUploadRequest;
+use App\Http\Resources\API\BimFileResource;
 use App\Http\Resources\API\FileByObjectResource;
 use App\Http\Resources\API\FileDownloadResource;
 use App\Http\Resources\API\FileUploadSuccessResource;
 use App\Libraries\BIM\BIMFactory;
 use App\Libraries\ChunkedUpload\Disks\Cos;
+use App\Models\BimFile;
+use App\Models\Container;
+use App\Models\Enums\BimFileModelType;
 use App\Models\Enums\FileObjectType;
 use App\Models\Enums\ObjectAction;
 use App\Models\File;
@@ -296,4 +300,35 @@ class FileController extends Controller
 
         return $this->successData($data);
     }
+
+    /**
+     * 容器下的所有模型列表
+     */
+    public function models(Request $request)
+    {
+        $containerId = $request->container_id;
+        $pageSize = (int) $request->get('page_size', 10);
+        $modelType = $request->get('model_type', 'bim');
+        switch ($modelType) {
+            case 'gis':
+                $modelTypeArr = [BimFileModelType::GIS->value];
+                break;
+            default:
+                $modelTypeArr = [BimFileModelType::BIM->value, BimFileModelType::CAD->value];
+                break;
+        }
+
+        $container = Container::query()->allowed()->findOrFail($containerId);
+
+        $bimFiles = BimFile::query()
+            ->modelType($modelTypeArr)
+            ->whereHas('file', function ($query) use ($container) {
+                return $query->containerLibraryId($container->library_id);
+            })
+            ->with('file')
+            ->latest('id')
+            ->paginate($pageSize);
+
+        return BimFileResource::collection($bimFiles);
+    }
 }

+ 13 - 1
app/Http/Controllers/API/GlendaleController.php

@@ -3,6 +3,8 @@
 namespace App\Http\Controllers\API;
 
 use App\Http\Controllers\Controller;
+use App\Libraries\BIM\BIMDriverEnum;
+use App\Models\BimFile;
 use App\Services\File\BimService;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Log;
@@ -16,7 +18,17 @@ class GlendaleController extends Controller
 
         Log::info('glendale callback params:', $arr);
 
-        $bimService->setGlendaleModelCovertStatus($arr['LightweightName'] ?? '', (int) ($arr['status'] ?? 0));
+        $lightweightName = $arr['LightweightName'] ?? '';
+
+        $bimFile = BimFile::where("bim_file_id", $lightweightName)
+            ->where('bim_driver', BIMDriverEnum::GLENDALE->value)
+            ->first();
+
+        if (!$bimFile) {
+            Log::info('no this glendale bim:', $lightweightName);
+        } else {
+            $bimService->storeBimInfo($bimFile);
+        }
 
         return $this->success($arr);
     }

+ 14 - 0
app/Models/BimFile.php

@@ -8,4 +8,18 @@ class BimFile extends BaseModel
     {
         return $this->hasOne(File::class, 'id', 'file_id');
     }
+
+    public function scopeModelType($query, array $modelTypeArr = [])
+    {
+        if (!empty($modelTypeArr)) {
+            return $query->whereIn('model_type', $modelTypeArr);
+        }
+    }
+
+    public function scopeCreatedAtStart($query, string $dateTime = '')
+    {
+        if (!empty($dateTime)) {
+            return $query->where('created_at', '>=', $dateTime);
+        }
+    }
 }

+ 1 - 1
app/Services/File/BimService.php

@@ -40,7 +40,7 @@ class BimService
     public function storeBimInfo(BimFile $bimFile): BimFile
     {
         try {
-            $infoArr = BIMFactory::make($bimFile->bim_driver)->getModelDetail($bimFile, false);
+            $infoArr = BIMFactory::make($bimFile->bim_driver)->getModelDetail($bimFile);
 
             $extra = Arr::only($infoArr, ['softwareType', 'dataVersion', 'fileOwnership', 'achievementFileSize', 'configJson', 'callbackInterfaceURL']);
             if ($infoArr) {

+ 24 - 5
app/helpers.php

@@ -114,27 +114,46 @@ if (!function_exists('cos_upload_prefix')) {
     }
 }
 
+if (!function_exists('date_time_str')) {
+
+    /**
+     * 生成日期时间格式
+     * @param int $companyId
+     * @param string $objectType
+     * @param mixed $extra
+     * @return string
+     */
+    function date_time_str(int $timestamp = 0): string
+    {
+        if ($timestamp == 0) {
+            $timestamp = time();
+        }
+        
+        return date('Y-m-d H:i:s', $timestamp);
+    }
+}
+
 //对树进行id重置封装生成新的id
 if (!function_exists('make_tree_display_id')) {
-    function make_tree_display_id(&$tree, $parentId = 0, $index = 1,$isParent=true)
+    function make_tree_display_id(&$tree, $parentId = 0, $index = 1, $isParent = true)
     {
         foreach ($tree as &$node) {
             // 设置当前节点的ID
-            $node['display_id'] = ($parentId == 0 || $isParent == true)?(string)$index:$parentId . '.' . $index;
+            $node['display_id'] = ($parentId == 0 || $isParent == true) ? (string) $index : $parentId . '.' . $index;
             // 更新索引值
             $index++;
 
             // 如果当前节点有子节点,递归调用本函数,并传递新的父ID和索引值
             if (isset($node['children'])) {
-                make_tree_display_id($node['children'], $node['display_id'], 1,false);
+                make_tree_display_id($node['children'], $node['display_id'], 1, false);
             }
         }
     }
 }
 
 //对普通列表装生成新的id
-if(!function_exists('make_display_id')){
-    function make_display_id($datas,$pageSize)
+if (!function_exists('make_display_id')) {
+    function make_display_id($datas, $pageSize)
     {
         $page = $datas->currentPage();
 

+ 0 - 28
database/seeders/BimInfoSeeder.php

@@ -1,28 +0,0 @@
-<?php
-
-namespace Database\Seeders;
-
-use App\Libraries\BIM\BIMFactory;
-use App\Models\BimFile;
-use App\Services\File\BimService;
-use Illuminate\Database\Console\Seeds\WithoutModelEvents;
-use Illuminate\Database\Seeder;
-use Illuminate\Support\Arr;
-
-class BimInfoSeeder extends Seeder
-{
-    /**
-     * Run the database seeds.
-     */
-    public function run(): void
-    {
-        $bimService = new BimService;
-
-        BimFile::query()->whereJsonDoesntContain('extra', 'softwareType')->chunkById(50, function ($bimFiles) use ($bimService) {
-            foreach ($bimFiles as $bimFile) {
-                $bimFile = $bimService->storeBimInfo($bimFile);
-                echo $bimFile->id . ' extra is ' . json_encode($bimFile->extra) . PHP_EOL;
-            }
-        });
-    }
-}

+ 1 - 1
routes/api.php

@@ -267,10 +267,10 @@ Route::middleware(['auth:sanctum','account.limit'])->group(function () {
         Route::post("file/keep-directory-upload", [API\FileController::class, "keepDirectoryUpload"])->name("file.keep-directory-upload");
         Route::delete("file/{file}/hide", [API\FileController::class, "hide"])->name("file.hide");
         Route::get("file-bim-view/{file}", [API\FileController::class, "bimView"])->name("file.bim-view");
+        Route::get("file/models", [API\FileController::class, "models"])->name("file.models");
 
 
         Route::get("container-attachments", [API\ContainerController::class, "attachments"])->name("container.attachments");
-        Route::get("container-models", [API\ContainerController::class, "models"])->name("container.models");
 
         Route::post("share-file", [API\ShareFileController::class, "store"])->name("share-file.store");
         Route::delete("share-file/{share_file}", [API\ShareFileController::class, "destroy"])