erp/app/Imports/GoodsSkusImport.php

126 lines
4.5 KiB
PHP
Raw Normal View History

<?php
namespace App\Imports;
2022-08-09 16:56:52 +08:00
use App\Models\DailyStockRecord;
use App\Models\Goods;
use App\Models\GoodsBrand;
use App\Models\GoodsSku;
use App\Models\GoodsType;
2022-08-09 16:56:52 +08:00
use App\Utils\DateTimeUtils;
use Exception;
use Illuminate\Support\Collection;
2022-08-09 16:56:52 +08:00
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Illuminate\Validation\ValidationException;
2022-08-01 17:06:43 +08:00
use Maatwebsite\Excel\Concerns\SkipsEmptyRows;
use Maatwebsite\Excel\Concerns\ToCollection;
use Illuminate\Support\Facades\Validator;
use App\Utils\ArrayUtils;
2022-08-01 17:06:43 +08:00
class GoodsSkusImport implements ToCollection, SkipsEmptyRows
{
private $statusMap = [
'下架' => 0,
'在售' => 1,
'预警' => 2,
];
/**
* @throws ValidationException
* @throws Exception
*/
2022-09-08 01:02:07 +08:00
public function collection(Collection $collection)
{
2022-09-08 01:02:07 +08:00
unset($collection[0], $collection[1]);
$collection = $collection->toArray();
$types = $brands = $goodsCodes = [];
2022-09-08 01:02:07 +08:00
foreach ($collection as &$row) {
$row = array_map(static function ($v) {
return trim($v);
}, $row);
$types[] = $row[1];
$brands[] = $row[2];
$goodsCodes[] = $row[3];
}
2022-10-25 17:07:32 +08:00
unset($row);
2022-09-08 01:02:07 +08:00
$validator = Validator::make($collection, [
2022-08-09 16:56:52 +08:00
'*.0' => ['required', 'string', 'max:191'],
'*.1' => ['required', 'string', 'max:191', 'exists:goods_types,name'],
'*.2' => ['string', 'max:191', 'exists:goods_brands,name'],
2022-08-09 10:57:03 +08:00
'*.3' => ['required', 'alpha_dash', 'max:32'],
2022-08-09 16:56:52 +08:00
'*.4' => ['required', 'string', 'max:191'],
2022-08-17 16:01:46 +08:00
'*.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)->pluck('id', 'name')->toArray();
$brands = GoodsBrand::query()->whereIn('name', $brands)->pluck('id', 'name')->toArray();
$hasGoods = Goods::query()->whereIn('goods_code', $goodsCodes)->pluck('id', 'goods_code')->toArray();
$newGoods = $skus = [];
2022-09-08 01:02:07 +08:00
foreach ($collection as $row) {
$sku = [
'goods_code' => $row[3],
'title' => $row[4],
'sku_code' => $row[5],
'status' => $this->statusMap[$row[6]],
'num' => $row[7],
'cost' => $row[8],
];
// 主商品已存在
if (isset($hasGoods[$sku['goods_code']])) {
$sku['goods_id'] = $hasGoods[$sku['goods_code']];
} else {
// 新商品
$newGoods[$sku['goods_code']] = [
'title' => $row[0],
'type_id' => $types[$row[1]],
'brand_id' => $brands[$row[2]],
'goods_code' => $sku['goods_code'],
];
}
$skus[] = $sku;
}
2022-08-09 16:56:52 +08:00
DB::beginTransaction();
try {
if ($newGoods) {
$goods = new Goods();
$goods->batchInsert(array_values($newGoods));
$hasGoods = Goods::query()->whereIn('goods_code', array_column($newGoods, 'goods_code'))->pluck('id', 'goods_code')->toArray();
2022-08-09 16:56:52 +08:00
foreach ($skus as &$newGoodsSku) {
$newGoodsSku['goods_id'] = $hasGoods[$newGoodsSku['goods_code']];
$newGoodsSku['external_sku_id'] = $newGoodsSku['goods_code'] . '_' . $newGoodsSku['sku_code'];
unset($newGoodsSku['goods_code']);
2022-08-09 16:56:52 +08:00
}
unset($newGoodsSku);
}
2022-08-09 16:56:52 +08:00
$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();
2022-08-09 16:56:52 +08:00
$newRecords = [];
$day = DateTimeUtils::getToday();
foreach ($skuIds as $skuId) {
2022-08-09 16:56:52 +08:00
$newRecords[] = [
'sku_id' => $skuId,
'day' => $day,
2022-08-09 16:56:52 +08:00
];
}
$record = new DailyStockRecord();
$record->batchInsert($newRecords);
DB::commit();
} catch (Exception $exception) {
2022-08-09 16:56:52 +08:00
DB::rollBack();
// 返回错误
throw $exception;
}
}
}