From 65e0146ad6b599441ba7556800719b374ab10f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=B8=96=E7=95=8C?= <642747453@qq.com> Date: Fri, 21 Apr 2023 20:11:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20#10000=20=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Goods/GoodsCombinationController.php | 23 +++++ app/Imports/CombinationGoodsImport.php | 86 +++++++++++++++++++ routes/api.php | 2 + 3 files changed, 111 insertions(+) create mode 100644 app/Imports/CombinationGoodsImport.php diff --git a/app/Http/Controllers/Goods/GoodsCombinationController.php b/app/Http/Controllers/Goods/GoodsCombinationController.php index 0cd3ae3..a04b385 100644 --- a/app/Http/Controllers/Goods/GoodsCombinationController.php +++ b/app/Http/Controllers/Goods/GoodsCombinationController.php @@ -5,12 +5,15 @@ namespace App\Http\Controllers\Goods; use App\Events\StockUpdateEvent; use App\Http\Controllers\Controller; use App\Http\Resources\GoodsSkuResource; +use App\Imports\CombinationGoodsImport; use App\Models\CombinationGood; use App\Models\Goods; use App\Models\GoodsSku; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\ValidationException; +use Maatwebsite\Excel\Facades\Excel; class GoodsCombinationController extends Controller { @@ -158,4 +161,24 @@ class GoodsCombinationController extends Controller return GoodsSkuResource::collection($skus); } + + public function import(Request $request) + { + if (!$request->hasFile('combinationGoods')) { + $this->res = [ + 'httpCode' => 404, + 'errorCode' => 404404, + 'errorMessage' => 'not found file', + ]; + } + try { + $import = new CombinationGoodsImport(); + $path = $request->file('combinationGoods'); + Excel::import($import, $path); + } catch (ValidationException $exception) { + $this->setValidatorFailResponse($exception->validator->getMessageBag()->getMessages()); + } + + return response($this->res, $this->res['httpCode']); + } } diff --git a/app/Imports/CombinationGoodsImport.php b/app/Imports/CombinationGoodsImport.php new file mode 100644 index 0000000..31a8622 --- /dev/null +++ b/app/Imports/CombinationGoodsImport.php @@ -0,0 +1,86 @@ + $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()->firstOrCreate( + ['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)); + } catch (\Exception $exception) { + DB::rollBack(); + } + } + } +} diff --git a/routes/api.php b/routes/api.php index 0663751..02f8803 100644 --- a/routes/api.php +++ b/routes/api.php @@ -87,6 +87,8 @@ Route::post('business', [ShopsController::class, 'business'])->name('shop.put.bu Route::post('inventory/goods_skus', [GoodsSkusController::class, 'inventoryImport'])->name('goods_sku.inventory'); // 商品货架导入 Route::post('goods_sku_location', [GoodsSkuLocationController::class, 'import'])->name('goods_sku_location.import'); +// 组合商品导入 +Route::post('combination/goods', [GoodsCombinationController::class, 'import'])->name('goods_combination.import'); // 今日价格导入 Route::post('today/price', [BusinessGoodsSkusController::class, 'todayPriceImport'])->name('plat.today_price.import'); // 文件上传