Explorar o código

start generate handover pack

Alexander Musikhin hai 7 meses
pai
achega
c87d90de2c

+ 7 - 0
app/Http/Controllers/OrderController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Http\Requests\Order\StoreOrderRequest;
+use App\Jobs\GenerateHandoverPack;
 use App\Jobs\GenerateInstallationPack;
 use App\Models\Dictionary\Area;
 use App\Models\Dictionary\District;
@@ -320,4 +321,10 @@ class OrderController extends Controller
         return redirect()->route('order.show', $order)->with(['success' => 'Задача генерации документов создана!']);
     }
 
+    public function generateHandoverPack(Order $order)
+    {
+        GenerateHandoverPack::dispatch($order, auth()->user()->id);
+        return redirect()->route('order.show', $order)->with(['success' => 'Задача генерации документов создана!']);
+    }
+
 }

+ 39 - 0
app/Jobs/GenerateHandoverPack.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Events\SendWebSocketMessageEvent;
+use App\Models\Order;
+use App\Services\GenerateDocumentsService;
+use Exception;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Queue\Queueable;
+use Illuminate\Support\Facades\Log;
+
+class GenerateHandoverPack implements ShouldQueue
+{
+    use Queueable;
+
+    /**
+     * Create a new job instance.
+     */
+    public function __construct(private readonly Order $order, private readonly int $userId)
+    {
+        //
+    }
+
+    /**
+     * Execute the job.
+     */
+    public function handle(): void
+    {
+        try {
+            $link = (new GenerateDocumentsService())->generateHandoverPack($this->order, $this->userId);
+            Log::info('Generate handover pack finished!');
+            event(new SendWebSocketMessageEvent('Пакет документов для сдачи готов!', $this->userId, ['success' => true, 'link' => $link]));
+        } catch (Exception $e) {
+            Log::error('Generate handover pack failed! ' . $e->getMessage());
+            event(new SendWebSocketMessageEvent('Ошибка создания покета документов для сдачи! ', $this->userId, ['error' => $e->getMessage()]));
+        }
+    }
+}

+ 57 - 0
app/Services/GenerateDocumentsService.php

@@ -93,4 +93,61 @@ class GenerateDocumentsService
 
         $writer->save(storage_path('app/public/orders/') . $order->id .'/tmp/' . $fileName);
     }
+
+
+    /**
+     * @throws Exception
+     */
+    public function generateHandoverPack(Order $order, int $userId): string
+    {
+        $articles = [];
+        Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/ПАСПОРТ/');
+        Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/СЕРТИФИКАТ/');
+        Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/ФОТО ПСТ/photos');
+        Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/ФОТО ТН/');
+
+        // copy app photos
+        foreach ($order->photos as $photo) {
+            $from = $photo->path;
+            $to = 'orders/' . $order->id . '/tmp/ФОТО ПСТ/photos/' . $photo->original_name;
+            if(!Storage::disk('public')->exists($to)) {
+                Storage::disk('public')->copy($from, $to);
+            }
+        }
+
+        foreach ($order->products_sku as $sku) {
+            // copy certificates
+            if($sku->product->certificate_id) {
+                $from = $sku->product->certificate->path;
+                $to = 'orders/' . $order->id . '/tmp/СЕРТИФИКАТ/' . $sku->product->certificate->original_name;
+                if(!Storage::disk('public')->exists($to)) {
+                    Storage::disk('public')->copy($from, $to);
+                }
+            }
+
+            // copy passport
+            if($sku->passport_id) {
+                $from = $sku->passport->path;
+                $to = 'orders/' . $order->id . '/tmp/ПАСПОРТ/' . $sku->passport->original_name;
+                if(!Storage::disk('public')->exists($to)) {
+                    Storage::disk('public')->copy($from, $to);
+                }
+            }
+
+        }
+
+        // generate xlsx order files
+        // ...
+
+        // create zip archive
+        $fileModel = (new FileService())->createZipArchive('orders/' . $order->id . '/tmp', self::HANDOVER_FILENAME . $order->common_name . '.zip', $userId);
+
+        // remove temp files
+        Storage::disk('public')->deleteDirectory('orders/' . $order->id . '/tmp');
+        $order->documents()->syncWithoutDetaching($fileModel);
+
+        // return link
+        return $fileModel?->link ?? '';
+    }
+
 }