ImportService.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Product;
  4. use Exception;
  5. use Illuminate\Support\Facades\Storage;
  6. use PhpOffice\PhpSpreadsheet\IOFactory;
  7. class ImportService
  8. {
  9. const HEADERS_TO_FIELDS = [
  10. "Фото" => '',
  11. "Наименование по ТЗ" => 'name_tz',
  12. "Тип по ТЗ" => 'type_tz',
  13. "№ по номенкл." => 'nomenclature_number',
  14. "Габаритные размеры" => 'sizes',
  15. "Производитель" => 'manufacturer',
  16. "ед. изм." => 'unit',
  17. "Тип оборудования" => 'type',
  18. "Статус цены" => 'price_status',
  19. "Цена поставки" => 'product_price',
  20. "Цена установки" => 'installation_price',
  21. "Цена обслуживания" => 'service_price',
  22. "Итого цена" => 'total_price',
  23. "Наименование производителя" => 'manufacturer_name',
  24. "Артикул образца" => 'article',
  25. "Примечание" => 'note',
  26. ];
  27. /**
  28. * @throws Exception
  29. */
  30. public function handle(string $path, int $year): void
  31. {
  32. $path = Storage::disk('upload')->path($path);
  33. $xls = IOFactory::createReaderForFile($path);
  34. $xls->setReadDataOnly(true);
  35. $sheet = $xls->load($path);
  36. $records = $sheet->setActiveSheetIndex(0)->toArray();
  37. $data = [];
  38. $err = [];
  39. if($this->checkHeaders($records[0])) {
  40. foreach ($records as $k => $record){
  41. if($k === 0) continue;
  42. Product::query()
  43. ->updateOrCreate(['year' => $year, 'nomenclature_number' => $record[3]],
  44. [
  45. 'name_tz' => $record[1],
  46. 'type_tz' => $record[2],
  47. 'sizes' => $record[4],
  48. 'manufacturer' => $record[5],
  49. 'unit' => $record[6],
  50. 'type' => $record[7],
  51. 'price_status' => $record[8],
  52. 'product_price' => $record[9],
  53. 'installation_price'=> $record[10],
  54. 'service_price' => $record[11],
  55. 'total_price' => $record[12],
  56. 'manufacturer_name' => $record[13],
  57. 'article' => $record[14],
  58. 'note' => $record[15],
  59. ]);
  60. }
  61. } else {
  62. throw new Exception('Ошибка заголовков файла!');
  63. }
  64. }
  65. protected function checkHeaders(array $headers): bool
  66. {
  67. return $this->getHeaders() == $headers;
  68. }
  69. /**
  70. * @return array
  71. */
  72. protected function getHeaders(): array
  73. {
  74. return array_keys(self::HEADERS_TO_FIELDS);
  75. }
  76. }