Browse Source

export one order

Alexander Musikhin 1 tháng trước cách đây
mục cha
commit
24330d1184

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

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Http\Requests\CreteTtnRequest;
 use App\Http\Requests\ExportScheduleRequest;
 use App\Http\Requests\Order\StoreOrderRequest;
+use App\Jobs\ExportOneOrderJob;
 use App\Jobs\ExportOrdersJob;
 use App\Jobs\ExportScheduleJob;
 use App\Jobs\GenerateFilesPack;
@@ -395,5 +396,13 @@ class OrderController extends Controller
             ->with(['success' => 'Задача выгрузки создана!']);
 
     }
+    public function exportOne(Order $order, Request $request)
+    {
+
+        ExportOneOrderJob::dispatch($order, $request->user()->id);
+        return redirect()->route('order.show', $order->id)
+            ->with(['success' => 'Задача выгрузки создана!']);
+
+    }
 
 }

+ 41 - 0
app/Jobs/ExportOneOrderJob.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Events\SendWebSocketMessageEvent;
+use App\Models\Order;
+use App\Services\ExportOneOrderService;
+use Exception;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Queue\Queueable;
+use Illuminate\Support\Facades\Log;
+
+class ExportOneOrderJob 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 ExportOneOrderService())->handle($this->order, $this->userId);
+            Log::info('Export order finished!');
+            event(new SendWebSocketMessageEvent('Экспорт площадки готов!', $this->userId, ['success' => true, 'link' => $link]));
+        } catch (Exception $e) {
+            Log::error('Export order failed! ' . $e->getMessage());
+            event(new SendWebSocketMessageEvent('Ошибка экспорта площадки! ', $this->userId, ['error' => $e->getMessage()]));
+        }
+    }
+}

+ 82 - 0
app/Services/ExportOneOrderService.php

@@ -0,0 +1,82 @@
+<?php
+
+namespace App\Services;
+
+use App\Helpers\DateHelper;
+use App\Models\Order;
+use App\Models\Product;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
+use PhpOffice\PhpSpreadsheet\IOFactory;
+use PhpOffice\PhpSpreadsheet\Style\Alignment;
+use PhpOffice\PhpSpreadsheet\Style\Border;
+use PhpOffice\PhpSpreadsheet\Style\Color;
+use PhpOffice\PhpSpreadsheet\Style\Fill;
+use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
+use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
+
+class ExportOneOrderService
+{
+
+
+    /**
+     * @throws \Exception
+     */
+    public function handle(Order $order, int $userId): string
+    {
+
+        $inputFileType = 'Xlsx';
+        $inputFileName = './templates/Order.xlsx';
+
+        $reader = IOFactory::createReader($inputFileType);
+        $spreadsheet = $reader->load($inputFileName);
+        $sheet = $spreadsheet->getActiveSheet();
+        $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
+        $sheet->setCellValue('A1', 'МАФ площадки ' . $order->common_name);
+        $i = 3;
+
+        foreach ($order->products_sku as $sku) {
+
+            $mnfDate = ($sku->manufacture_date) ? DateHelper::getHumanDate($sku->manufacture_date, true) : '';
+
+            $sheet->setCellValue('A' . $i, $sku->product->article);
+            $sheet->setCellValue('B' . $i, $sku->product->nomenclature_number);
+            $sheet->setCellValue('C' . $i, $sku->status);
+            $sheet->setCellValue('D' . $i, $sku->maf_order?->order_number);
+            $sheet->setCellValue('E' . $i, $sku->rfid);
+            $sheet->setCellValue('F' . $i, $sku->factory_number);
+            $sheet->setCellValue('G' . $i, $mnfDate);
+            $sheet->setCellValue('H' . $i, ($sku->maf_order?->order_number) ? 'Да' : 'Нет');
+            $sheet->setCellValue('I' . $i, (!is_null($sku->passport_id)) ? 'Да' : 'Нет');
+
+            $i++;
+        }
+
+
+        $sheet->getStyle('A1:I' . $i - 1)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->setColor(new Color('777777'));
+        $sheet->getStyle('A1:I' . $i - 1)->getAlignment()->setWrapText(true);
+        $sheet->getStyle('A1:I' . $i - 1)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
+
+        $fileName = fileName('Площадка ' . $order->common_name . '.xlsx');
+
+        $writer = new Xlsx($spreadsheet);
+        $fd = 'export/order/tmp';
+        Storage::disk('public')->makeDirectory($fd);
+        $fp = storage_path('app/public/export/order/') . '/tmp/' . $fileName;
+        Storage::disk('public')->delete($fd . '/' . $fileName);
+        $writer->save($fp);
+        PdfConverterClient::convert($fp);
+
+        // create zip archive
+        $fileModel = (new FileService())->createZipArchive($fd, Str::replace('.xlsx', '.zip', $fileName), $userId);
+
+        //   remove temp files
+        Storage::disk('public')->deleteDirectory($fd);
+
+        // return link
+        return $fileModel?->link ?? '';
+
+    }
+}

+ 1 - 1
app/Services/ExportOrdersService.php

@@ -71,7 +71,7 @@ class ExportOrdersService
         $sheet->getStyle('A1:P' . $i - 1)->getAlignment()->setWrapText(true);
         $sheet->getStyle('A1:P' . $i - 1)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
 
-        $fileName = 'Площадки ' . date('Y-m-d H-i-s') . '.xlsx';
+        $fileName = fileName('Площадки ' . date('Y-m-d H-i-s') . '.xlsx');
 
         $writer = new Xlsx($spreadsheet);
         $fd = 'export/orders/tmp';

+ 4 - 0
resources/views/orders/show.blade.php

@@ -18,6 +18,10 @@
                 @if(hasRole('admin,manager'))
                     <a href="{{ route('order.edit', ['order' => $order, 'previous_url' => $previous_url]) }}"
                        class="btn btn-sm mb-1 btn-primary">Редактировать</a>
+                    <a href="#" class="btn btn-sm btn-primary mb-1" onclick="$('#export-order').submit()">Экспорт МАФ</a>
+                    <form class="d-none" method="post" action="{{ route('order.export-one', $order) }}" id="export-order">
+                        @csrf
+                    </form>
                 @endif
                 @if(hasRole('admin') && ($order->order_status_id == Order::STATUS_NEW))
                     <a href="#" onclick="if(confirm('Удалить площадку?')) $('form#destroy').submit();"

+ 2 - 1
routes/web.php

@@ -86,7 +86,7 @@ Route::middleware('auth:web')->group(function () {
 
         Route::post('order/store', [OrderController::class, 'store'])->name('order.store');
         Route::post('order/update', [OrderController::class, 'store'])->name('order.update');
-        Route::delete('order/{order}', [OrderController::class, 'destroy'])->name('order.destroy')->middleware('role:' . Role::ADMIN);
+        Route::delete('order/delete/{order}', [OrderController::class, 'destroy'])->name('order.destroy')->middleware('role:' . Role::ADMIN);
 
         Route::post('order/{order}/upload-document', [OrderController::class, 'uploadDocument'])->name('order.upload-document');
         Route::post('order/{order}/upload-statement', [OrderController::class, 'uploadStatement'])->name('order.upload-statement');
@@ -150,6 +150,7 @@ Route::middleware('auth:web')->group(function () {
 
         Route::get('order/create', [OrderController::class, 'create'])->name('order.create');
         Route::post('order/export', [OrderController::class, 'export'])->name('order.export');
+        Route::post('order/export-one/{order}', [OrderController::class, 'exportOne'])->name('order.export-one');
 
         Route::get('order/{order}/get-maf', [OrderController::class, 'getMafToOrder'])->name('order.get-maf');
         Route::get('order/revert-maf/{order}', [OrderController::class, 'revertMaf'])->name('order.revert-maf');

BIN
templates/Order.xlsx