$row[0], 'external_sku_id' => $row[1], 'item' => [] ]; } else { $main[$row[1]]['item'][] = [ 'item_code' => $row[2], 'item_num' => $row[3], ]; } } foreach ($main as $info) { if (empty($info['item'])) { continue; } DB::beginTransaction(); try { $itemCodes = array_column($info['item'], 'item_code'); $skus = GoodsSku::query() ->whereIn('external_sku_id', $itemCodes) ->get(['id', 'external_sku_id', 'stock']) ->toArray(); $skus = ArrayUtils::index($skus, 'external_sku_id'); $stock = 0; foreach ($info['item'] as $item) { $num = (int)($skus[$item['item_code']]['stock'] / $item['item_num']); if (0 === $stock) { $stock = $num; continue; } if ($num < $stock) { $stock = $num; } } $sku = GoodsSku::query()->updateOrCreate( ['external_sku_id' => $info['external_sku_id'], 'is_combination' => 1], ['title' => $info['title'], 'goods_id' => 0, 'sku_code' => $info['external_sku_id'], 'stock' => $stock] ); CombinationGood::query() ->where('goods_sku_id', $sku->id) ->delete(); foreach ($info['item'] as $item) { CombinationGood::query()->create(['goods_sku_id' => $sku->id, 'item_id' => $skus[$item['item_code']]['id'], 'item_num' => $item['item_num']]); } DB::commit(); // event(new StockUpdateEvent($sku, 0, true)); } catch (\Exception $exception) { DB::rollBack(); } } } }