Ver código fonte

Export orders

Alexander Musikhin 2 meses atrás
pai
commit
69ec057d9e

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

@@ -3,7 +3,10 @@
 namespace App\Http\Controllers;
 
 use App\Http\Requests\CreteTtnRequest;
+use App\Http\Requests\ExportScheduleRequest;
 use App\Http\Requests\Order\StoreOrderRequest;
+use App\Jobs\ExportOrdersJob;
+use App\Jobs\ExportScheduleJob;
 use App\Jobs\GenerateFilesPack;
 use App\Jobs\GenerateHandoverPack;
 use App\Jobs\GenerateInstallationPack;
@@ -18,6 +21,7 @@ use App\Models\OrderStatus;
 use App\Models\OrderView;
 use App\Models\ProductSKU;
 use App\Models\Role;
+use App\Models\Schedule;
 use App\Models\Ttn;
 use App\Models\User;
 use App\Services\FileService;
@@ -363,4 +367,16 @@ class OrderController extends Controller
         return redirect()->back()->with(['success' => 'Задача формирования ТН создана!']);
     }
 
+    public function export(Request $request)
+    {
+
+        $schedules = Order::query()
+            ->get();
+
+        ExportOrdersJob::dispatch($schedules, $request->user()->id);
+        return redirect()->route('order.index')
+            ->with(['success' => 'Задача выгрузки создана!']);
+
+    }
+
 }

+ 41 - 0
app/Jobs/ExportOrdersJob.php

@@ -0,0 +1,41 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Events\SendWebSocketMessageEvent;
+use App\Services\ExportOrdersService;
+use App\Services\ExportScheduleService;
+use Exception;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Queue\Queueable;
+use Illuminate\Support\Collection;
+use Illuminate\Support\Facades\Log;
+
+class ExportOrdersJob implements ShouldQueue
+{
+    use Queueable;
+
+    /**
+     * Create a new job instance.
+     */
+    public function __construct(
+        private readonly Collection $orders,
+        private readonly int $userId,
+    )
+    {}
+
+    /**
+     * Execute the job.
+     */
+    public function handle(): void
+    {
+        try {
+            $link = (new ExportOrdersService())->handle($this->orders, $this->userId);
+            Log::info('Export orders finished!');
+            event(new SendWebSocketMessageEvent('Экспорт площадок готов!', $this->userId, ['success' => true, 'link' => $link]));
+        } catch (Exception $e) {
+            Log::error('Export orders failed! ' . $e->getMessage());
+            event(new SendWebSocketMessageEvent('Ошибка экспорта площадок! ', $this->userId, ['error' => $e->getMessage()]));
+        }
+    }
+}

+ 94 - 0
app/Services/ExportOrdersService.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace App\Services;
+
+use App\Helpers\DateHelper;
+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 ExportOrdersService
+{
+
+
+    /**
+     * @throws \Exception
+     */
+    public function handle(Collection $orders, int $userId): string
+    {
+
+        $inputFileType = 'Xlsx'; // Xlsx - Xml - Ods - Slk - Gnumeric - Csv
+        $inputFileName = './templates/Orders.xlsx';
+
+        $reader = IOFactory::createReader($inputFileType);
+        $spreadsheet = $reader->load($inputFileName);
+        $sheet = $spreadsheet->getActiveSheet();
+        $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
+
+        $i = 3;
+        $first = true;
+        $from = '-';
+        $prevInstDate = '';
+        $j = 1;
+        foreach ($orders as $order) {
+
+            $instDate = ($order->installation_date) ? DateHelper::getHumanDate($order->installation_date, true) : '';
+            $readyDate = ($order->ready_date) ? DateHelper::getHumanDate($order->ready_date, true) : '';
+            $mafs = Str::replace('<div>', '', $order->productsWithCount);
+            $mafs = Str::replace('</div>', "\n", $mafs);
+
+            $sheet->setCellValue('A' . $i, $order->id);
+            $sheet->setCellValue('B' . $i, $order->name);
+            $sheet->setCellValue('C' . $i, $order->user->name);
+            $sheet->setCellValue('D' . $i, $order->district->shortname);
+            $sheet->setCellValue('E' . $i, $order->area->name);
+            $sheet->setCellValue('F' . $i, $order->object_address);
+            $sheet->setCellValue('G' . $i, $order->objectType->name);
+            $sheet->setCellValue('H' . $i, $order->comment);
+            $sheet->setCellValue('I' . $i, $instDate);
+            $sheet->setCellValue('J' . $i, $readyDate);
+            $sheet->setCellValue('K' . $i, $order->brigadier?->name);
+            $sheet->setCellValue('L' . $i, $order->orderStatus->name);
+            $sheet->setCellValue('M' . $i, $order->tg_group_name);
+            $sheet->setCellValue('N' . $i, $order->tg_group_link);
+            $sheet->setCellValue('O' . $i, $mafs);
+            $sheet->setCellValue('P' . $i, $order->ready_to_mount);
+
+            $i++;
+        }
+
+
+        $sheet->getStyle('A1:P' . $i - 1)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->setColor(new Color('777777'));
+        $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';
+
+        $writer = new Xlsx($spreadsheet);
+        $fd = 'export/orders/tmp';
+        Storage::disk('public')->makeDirectory($fd);
+        $fp = storage_path('app/public/export/orders/') . '/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 ?? '';
+
+    }
+}

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

@@ -8,7 +8,11 @@
         @if(hasRole('admin'))
             <div class="col-6 text-end">
                 <a href="{{ route('order.create') }}" class="btn btn-sm btn-primary">Создать</a>
+                <a href="#" class="btn btn-sm btn-primary" onclick="$('#export-orders').submit()">Экспорт</a>
             </div>
+            <form class="d-none" method="post" action="{{ route('order.export') }}" id="export-orders">
+                @csrf
+            </form>
         @endif
     </div>
 

+ 1 - 0
routes/web.php

@@ -142,6 +142,7 @@ Route::middleware('auth:web')->group(function () {
         Route::delete('schedule/delete/{schedule}', [ScheduleController::class, 'delete'])->name('schedule.delete');
 
         Route::get('order/create', [OrderController::class, 'create'])->name('order.create');
+        Route::post('order/export', [OrderController::class, 'export'])->name('order.export');
 
         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/Orders.xlsx