ExportOneOrderService.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace App\Services;
  3. use App\Helpers\DateHelper;
  4. use App\Models\Order;
  5. use App\Models\Product;
  6. use Illuminate\Support\Collection;
  7. use Illuminate\Support\Facades\Log;
  8. use Illuminate\Support\Facades\Storage;
  9. use Illuminate\Support\Str;
  10. use PhpOffice\PhpSpreadsheet\IOFactory;
  11. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  12. use PhpOffice\PhpSpreadsheet\Style\Border;
  13. use PhpOffice\PhpSpreadsheet\Style\Color;
  14. use PhpOffice\PhpSpreadsheet\Style\Fill;
  15. use PhpOffice\PhpSpreadsheet\Worksheet\PageSetup;
  16. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  17. class ExportOneOrderService
  18. {
  19. /**
  20. * @throws \Exception
  21. */
  22. public function handle(Order $order, int $userId): string
  23. {
  24. $productsSku = $order->products_sku()
  25. ->withoutGlobalScopes()
  26. ->where('year', $order->year)
  27. ->get();
  28. $order->setRelation('products_sku', $productsSku);
  29. $inputFileType = 'Xlsx';
  30. $inputFileName = './templates/Order.xlsx';
  31. $reader = IOFactory::createReader($inputFileType);
  32. $spreadsheet = $reader->load($inputFileName);
  33. $sheet = $spreadsheet->getActiveSheet();
  34. $sheet->getPageSetup()->setOrientation(PageSetup::ORIENTATION_LANDSCAPE);
  35. $sheet->setCellValue('A1', 'МАФ площадки ' . $order->common_name);
  36. $i = 3;
  37. foreach ($productsSku as $sku) {
  38. $mnfDate = ($sku->manufacture_date) ? DateHelper::getHumanDate($sku->manufacture_date, true) : '';
  39. $sheet->setCellValue('A' . $i, $sku->product->article);
  40. $sheet->setCellValue('B' . $i, $sku->product->nomenclature_number);
  41. $sheet->setCellValue('C' . $i, $sku->status);
  42. $sheet->setCellValue('D' . $i, $sku->maf_order?->order_number);
  43. $sheet->setCellValue('E' . $i, $sku->rfid);
  44. $sheet->setCellValue('F' . $i, $sku->factory_number);
  45. $sheet->setCellValue('G' . $i, $mnfDate);
  46. $sheet->setCellValue('H' . $i, ($sku->maf_order?->order_number) ? 'Да' : 'Нет');
  47. $sheet->setCellValue('I' . $i, (!is_null($sku->passport_id)) ? 'Да' : 'Нет');
  48. $i++;
  49. }
  50. $sheet->getStyle('A1:I' . $i - 1)->getBorders()->getAllBorders()->setBorderStyle(Border::BORDER_THIN)->setColor(new Color('777777'));
  51. $sheet->getStyle('A1:I' . $i - 1)->getAlignment()->setWrapText(true);
  52. $sheet->getStyle('A1:I' . $i - 1)->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
  53. $fileName = fileName('Площадка ' . $order->common_name . '.xlsx');
  54. $writer = new Xlsx($spreadsheet);
  55. $fd = 'export/order/tmp';
  56. Storage::disk('public')->makeDirectory($fd);
  57. $fp = storage_path('app/public/export/order/') . '/tmp/' . $fileName;
  58. Storage::disk('public')->delete($fd . '/' . $fileName);
  59. $writer->save($fp);
  60. PdfConverterClient::convert($fp);
  61. // create zip archive
  62. $fileModel = (new FileService())->createZipArchive($fd, Str::replace('.xlsx', '.zip', $fileName), $userId);
  63. // remove temp files
  64. Storage::disk('public')->deleteDirectory($fd);
  65. // return link
  66. return $fileModel?->link ?? '';
  67. }
  68. }