open($file); foreach ($reader->getSheetIterator() as $sheet) { foreach ($sheet->getRowIterator() as $num => $row) { if ($num === 1) { continue; } $cells = $row->toArray(); $goods = [ 'name' => $cells[0], 'subtitle' => $cells[1], 'shipping_template_id' => 1, ]; $category = ProductCategory::where('name', $cells[2])->firstOrFail(); $goods['category_id'] = $category->id; // 图片组 if ($path = $cells[3]) { if (Str::startsWith($path, ['http://', 'https://'])) { $images = explode(',', $path); } else { $images = $this->getImageUrlFromPath($path); } if (count($images) > 0) { $goods['cover'] = $images[0]; $goods['images'] = $images; } } // 运费模板 if ($cell_11 = data_get($cells, 11)) { $goods['shipping_template_id'] = $cell_11; } // 重量 if ($cell_12 = data_get($cells, 12)) { $goods['weight'] = $cell_12; } // 详细描述 if ($cell_13 = data_get($cells, 13)) { $description = ''; foreach(explode(',', $cell_13) as $item) { $description .= '

'; } $goods['description'] = $description; } $goods = array_merge($goods, [ 'sell_price' => $cells[4] * 100, 'market_price' => $cells[5] * 100, 'cost_price' => $cells[6] * 100, 'vip_price' => $cells[7] * 100, 'sales_value' => $cells[8] * 100, ]); $product = ProductSpu::updateOrCreate(['name' => $goods['name']],$goods); // 属性规格 $coll_9 = data_get($cells, 9); $cell_10 = data_get($cells, 10); if ($coll_9) { $format_specs = $this->formatAttr($coll_9); $format_attrs = $this->formatAttr($cell_10); $spec_group = $this->getSpec($cells[0], $coll_9, $cell_10); $attrs = []; foreach($spec_group->attrs as $index => $item) { $attr = ['name' => $item['title'], 'attrs' => []]; foreach(explode(PHP_EOL, $item['value']) as $value) { array_push($attr['attrs'], ['name' => $value, 'value' => data_get($format_attrs, "$index.values.$value")]); } array_push($attrs, $attr); } $product->update(['attrs' => $attrs]); $specs = []; $product->specs()->delete(); foreach($spec_group->specs as $index => $item) { $spec = ['name' => $item['title'], 'items' => []]; foreach(explode(PHP_EOL, $item['value']) as $value) { array_push($spec['items'], ['name' => $value, 'value' => data_get($format_specs, "$index.values.$value")]); } array_push($specs, $spec); } $product->specs()->createMany($specs); } } } $reader->close(); } protected function getImageUrlFromPath($dir) { $disk = Storage::disk(); $files = $disk->files($dir); $images = []; foreach($files as $filename) { array_push($images, $disk->url($filename)); } return $images; } protected function getSpec($name, $specs, $attrs) { if (Str::contains($specs, ':')) { // 创建新的规格 $spec = ProductGroup::updateOrCreate([ 'name' => $name ], [ 'attrs' => $this->formatGroupAttr($this->formatAttr($attrs)), 'specs' => $this->formatGroupAttr($this->formatAttr($specs)) ]); } else { $spec = ProductGroup::where('name', $specs)->firstOrFail(); } return $spec; } /** * 颜色[灰色:0,银色:0] * 尺寸[13寸:0,14寸:500,16寸:1000] * 处理器[M1:0,M1 Pro:1000,M1 Max:1500] * 内存[8G:0,16G:1000,32G:2000] * 硬盘[256G:0,512G:1000,1TB:2000] * * [ * ['name' => '颜色', 'values' => ['灰色' => 0, '银色' => 0]], * ['name' => '尺寸', 'values' => ['13寸' => 0, '14寸' => 500, '16寸' => '1000']] * ... * ] */ protected function formatAttr($attrs) { $attr_data = []; if (!Str::contains($attrs, ':')) { return $attr_data; } foreach(explode("\n", $attrs) as $item) { $name = explode('[', $item)[0]; $attr_values = []; foreach(explode(',', Str::between($item, '[', ']')) as $item1) { $item1_explode = explode(':', $item1); $attr_values[$item1_explode[0]] = $item1_explode[1]; } array_push($attr_data, ['name' => $name, 'values' => $attr_values]); } return $attr_data; } protected function formatGroupAttr($data) { $list = []; foreach($data as $item) { array_push($list, ['title' => $item['name'], 'value' => implode(PHP_EOL, array_keys($item['values']))]); } return $list; } }