| 
						 | 
						<?php
namespace App\Imports;
use App\Models\Category;use App\Models\Product;use Illuminate\Support\Collection;use Illuminate\Support\Facades\Storage;use Maatwebsite\Excel\Concerns\ToCollection;use Maatwebsite\Excel\Facades\Excel;
class ProductImport implements ToCollection{	private int $supplier_id;	private string $extract_path;	private array $keys = [];
	public function __construct(int $supplier_id, $extract_path)	{		$this->supplier_id = $supplier_id;		$this->extract_path = $extract_path;	}
	public function collection(Collection $collection)	{		if ($collection->isEmpty()) {			return;		}
		//校验数组count()是否正确
		if (count($collection[0]) < 35) {			throw new \Exception('Excel产品信息格式不正确');		}
		$this->keys = array_flip($collection[0]->toArray());
		//去除第一行的标题
		unset($collection[0]);
		//$collection
		$this->createData($collection);	}
	private function createData($rows)	{		$keys = $this->keys;		foreach ($rows as $product_index => $row) {			$category = Category::where(['agent_id' => 0, 'name' => trim($row[$keys['分类']])])->first();			if (!$category) continue;
			$insert_data = [				'supplier_id' => $this->supplier_id,				'category_id' => $category->id,				'type' => $category->publish_type,				'title' => $row[$keys['产品标题']] ?? '',				'price' => $row[$keys['销售价']] ?? 0,				'original_price' => $row[$keys['市场价']] ?? 0,				'stock' => $row[$keys['库存']] ?? 0,				'know' => $row[$keys['旅客须知']] ?? '',				'content' => $row[$keys['产品详情']] ?? '',				'verify_mobile' => $row[$keys['核销手机号']] ?? '',				'diy_form_id' => $row[$keys['信息收集表单ID']] ?? '',				'pictures' => $this->get_pictures($product_index),			];
			# 扩展字段
			$insert_data['extends'] = $this->get_extends($category->publish_type, $row);
			if ($category->publish_type == 0) {				$insert_data['longitude'] = $insert_data['extends']['field_0_departure_place_longitude'] ?? 0;				$insert_data['latitude'] = $insert_data['extends']['field_0_departure_place_latitude'] ?? 0;				$insert_data['address'] = $insert_data['extends']['field_0_departure_place'] ?? '';			} else {				$insert_data['longitude'] = $insert_data['extends']['field_'.$category->publish_type.'_longitude'] ?? 0;				$insert_data['latitude'] = $insert_data['extends']['field_'.$category->publish_type.'_latitude'] ?? 0;				$insert_data['address'] = $insert_data['extends']['field_'.$category->publish_type.'_address'] ?? '';			}
			$product = Product::create($insert_data);			if ($product->id) {				$this->insert_spec($product_index, $product->id);			}		}	}
	# 插入规格
	private function insert_spec($product_index, $product_id)	{		$spec_file = $this->extract_path . "/产品规格{$product_index}.xlsx";		if (file_exists($spec_file)) {			Excel::import(new ProductSpecImport($product_id), $spec_file);		}	}
	# 遍历图片文件,并移动到storage/app/public/supplier/import目录下
	private function get_pictures($product_index): array	{		$storage_disk = Storage::disk('public');
		$http_path = 'supplier/import/' . $this->supplier_id . '/' . date('Y-m');
		if (!$storage_disk->exists($http_path)) {			$storage_disk->makeDirectory($http_path); //Storage的makeDirectory才能递归创建
		}
		$image_path = $this->extract_path . "/产品主图/$product_index";		chdir($image_path);
		$pictures = [];		foreach (glob('*') as $file) {			$ext = strtolower(pathinfo($file)['extension']);			if (!in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'jfif'])) {				continue;			}
			$filename = '/' . md5_file($file) . '.' . $ext;			$move_file = realpath($file);
			# Storage::move只适用于storage/app目录下的文件,且是相对路径
			if (rename($move_file, $storage_disk->path($http_path . $filename))) {				$pictures[] = $http_path . $filename;			}		}		return $pictures;	}
	# 获取扩展字段
	private function get_extends(int $publish_type, $row): array	{		$keys = $this->keys;		return match ($publish_type) {			0 => [				'field_0_departure_place' => $row[$keys['出发地']] ?? '',				'field_0_departure_place_longitude' => $row[$keys['出发地经度']] ?? 0,				'field_0_departure_place_latitude' => $row[$keys['出发地纬度']] ?? 0,				'field_0_destination' => $row[$keys['目的地']] ?? '',				'field_0_destination_longitude' => $row[$keys['目的地经度']] ?? 0,				'field_0_destination_latitude' => $row[$keys['目的地纬度']] ?? 0,				'field_0_date' => [					# Excel日期是从1900-01-01起,PHP日期是1970-01-01起,所以要减去25569天数得到正确日期
					'start' => !empty($row[$keys['行程起始时间']]) ? date('Y-m-d', strtotime('+ ' . ($row[$keys['行程起始时间']] - 25569) . 'day', 0)) : '',					'end' => !empty($row[$keys['行程结束时间']]) ? date('Y-m-d', strtotime('+ ' . ($row[$keys['行程结束时间']] - 25569) . 'day', 0)) : '',				],			],			1 => [				'field_1_name' => $row[$keys['酒店名']] ?? '',				'field_1_address' => $row[$keys['酒店地址']] ?? '',				'field_1_longitude' => $row[$keys['酒店经度']] ?? 0,				'field_1_latitude' => $row[$keys['酒店纬度']] ?? 0,			],			2 => [				'field_2_name' => $row[$keys['景区名']] ?? '',				'field_2_address' => $row[$keys['景区地址']] ?? '',				'field_2_longitude' => $row[$keys['景区经度']] ?? 0,				'field_2_latitude' => $row[$keys['景区纬度']] ?? 0,			],			3 => [				'field_3_name' => $row[$keys['餐厅名']] ?? '',				'field_3_address' => $row[$keys['餐厅地址']] ?? '',				'field_3_longitude' => $row[$keys['餐厅经度']] ?? 0,				'field_3_latitude' => $row[$keys['餐厅纬度']] ?? 0,			],			4 => [				'field_4_address' => $row[$keys['交通地址']] ?? '',				'field_4_longitude' => $row[$keys['交通经度']] ?? 0,				'field_4_latitude' => $row[$keys['交通纬度']] ?? 0,			],			5 => [				'field_5_address' => $row[$keys['购物地址']] ?? '',				'field_5_longitude' => $row[$keys['购物经度']] ?? 0,				'field_5_latitude' => $row[$keys['购物纬度']] ?? 0,			],			default => [],		};	}}
  |