0, '在售' => 1, '预警' => 2, ]; /** * @throws ValidationException * @throws Exception */ public function collection(Collection $collection) { unset($collection[0], $collection[1]); $collection = $collection->toArray(); $types = $brands = $goodsCodes = []; foreach ($collection as &$row) { $row = array_map(static function ($v) { return trim($v); }, $row); $types[] = $row[1]; $brands[] = $row[2]; $goodsCodes[] = $row[3]; } $validator = Validator::make($collection, [ '*.0' => ['required', 'string', 'max:191'], '*.1' => ['required', 'string', 'max:191', 'exists:goods_types,name'], '*.2' => ['string', 'max:191', 'exists:goods_brands,name'], '*.3' => ['required', 'alpha_dash', 'max:32'], '*.4' => ['required', 'string', 'max:191'], '*.5' => ['required', 'alpha_dash', 'max:32'], '*.6' => ['required', 'string', Rule::in(['下架', '在售', '预警'])], '*.7' => ['required', 'max:10'], '*.8' => ['required', 'max:10'], ]); if ($validator->fails()) { throw new ValidationException($validator); } $types = GoodsType::query()->whereIn('name', $types)->get(['id', 'name'])->toArray(); $types = ArrayUtils::index($types, 'name'); $brands = GoodsBrand::query()->whereIn('name', $brands)->get(['id', 'name'])->toArray(); $brands = ArrayUtils::index($brands, 'name'); $hasGoods = Goods::query()->whereIn('goods_code', $goodsCodes)->get(['id', 'goods_code'])->toArray(); $hasGoods = ArrayUtils::index($hasGoods, 'goods_code'); $newGoods = $skus = []; foreach ($collection as $row) { $sku = [ 'goods_id' => $row[3], 'title' => $row[4], 'sku_code' => $row[5], 'status' => $this->statusMap[$row[6]], 'num' => $row[7], 'cost' => $row[8], ]; // 主商品已存在 if (isset($hasGoods[$row[3]])) { $sku['goods_id'] = $hasGoods[$row[3]]['id']; } else { // 新商品 $newGoods[$row[3]] = [ 'title' => $row[0], 'type_id' => $types[$row[1]]['id'], 'brand_id' => $brands[$row[2]]['id'], 'goods_code' => $row[3], ]; } $skus[] = $sku; } DB::beginTransaction(); try { if ($newGoods) { $goods = new Goods(); $goods->batchInsert(array_values($newGoods)); $hasGoods = Goods::query()->whereIn('goods_code', array_column($newGoods, 'goods_code'))->get(['id', 'goods_code'])->toArray(); $hasGoods = ArrayUtils::index($hasGoods, 'goods_code'); foreach ($skus as &$newGoodsSku) { $newGoodsSku['goods_id'] = isset($hasGoods[$newGoodsSku['goods_id']]) ? $hasGoods[$newGoodsSku['goods_id']]['id'] : $newGoodsSku['goods_id']; } unset($newGoodsSku); } $goodsSku = new GoodsSku(); $goodsSku->batchInsert(array_values($skus)); $goodsIds = Goods::query()->whereIn('goods_code', $goodsCodes)->pluck('id')->toArray(); $skuIds = GoodsSku::query()->whereIn('goods_id', $goodsIds)->pluck('id')->toArray(); $newRecords = []; $day = DateTimeUtils::getToday(); foreach ($skuIds as $skuId) { $newRecords[] = [ 'sku_id' => $skuId, 'day' => $day, ]; } $record = new DailyStockRecord(); $record->batchInsert($newRecords); DB::commit(); } catch (Exception $exception) { DB::rollBack(); // 返回错误 throw $exception; } } }