|
|
|
@ -31,8 +31,9 @@ use app\common\enum\goods\GoodsType as GoodsTypeEnum; |
|
|
|
|
use app\common\enum\goods\SpecType as GoodsSpecTypeEnum; |
|
|
|
|
use app\common\enum\goods\ImportStatus as GoodsImportStatusEnum; |
|
|
|
|
use app\common\enum\goods\DeductStockType as DeductStockTypeEnum; |
|
|
|
|
use app\common\validate\goods\Import as GoodsImportValidate; |
|
|
|
|
use app\common\validate\goods\AdminImport as GoodsAdminImportValidate; |
|
|
|
|
use cores\exception\BaseException; |
|
|
|
|
use think\facade\Log; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 服务类:商品批量导入 |
|
|
|
@ -99,30 +100,35 @@ class AdminImport extends BaseService |
|
|
|
|
*/ |
|
|
|
|
public function batch(array $list, int $recordId, int $storeId): bool |
|
|
|
|
{ |
|
|
|
|
$service = new \app\job\service\goods\Collector(); |
|
|
|
|
foreach ($list as $item) { |
|
|
|
|
$data = $this->createData($item, $storeId); |
|
|
|
|
$service->single($item['D'], $data, $storeId); |
|
|
|
|
|
|
|
|
|
// 生成商品数据(用于写入数据库) |
|
|
|
|
$data = $this->createData($item, $storeId); |
|
|
|
|
// 数据验证 |
|
|
|
|
if (!$this->validateGoodsData($data, $storeId)) { |
|
|
|
|
$this->errorLog[] = ['goodsSn' => $item['A'], 'message' => $this->getError()]; |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
// 事务处理:添加商品 |
|
|
|
|
$model = new GoodsModel(); |
|
|
|
|
$model->transaction(function () use ($model, $data, $storeId) { |
|
|
|
|
// 添加商品 |
|
|
|
|
$model->save($data); |
|
|
|
|
// 新增商品与分类关联 |
|
|
|
|
GoodsCategoryRelModel::increased((int)$model['goods_id'], $data['categoryIds'], $storeId); |
|
|
|
|
// 新增商品与图片关联 |
|
|
|
|
GoodsImageModel::increased((int)$model['goods_id'], $data['imagesIds'], $storeId); |
|
|
|
|
// 新增商品与规格关联 |
|
|
|
|
GoodsSpecRelModel::increased((int)$model['goods_id'], $data['newSpecList'], $storeId); |
|
|
|
|
// 新增商品sku信息 |
|
|
|
|
GoodsSkuModel::add((int)$model['goods_id'], $data['spec_type'], $data['newSkuList'], $storeId); |
|
|
|
|
// 新增服务与承诺关联 |
|
|
|
|
GoodsServiceRelModel::increased((int)$model['goods_id'], $data['serviceIds'], $storeId); |
|
|
|
|
}); |
|
|
|
|
// $data = $this->createData($item, $storeId); |
|
|
|
|
// Log::record("data".json_encode($data)); |
|
|
|
|
// // 数据验证 |
|
|
|
|
// if (!$this->validateGoodsData($data, $storeId)) { |
|
|
|
|
// $this->errorLog[] = ['goodsSn' => $item['A'], 'message' => $this->getError()]; |
|
|
|
|
// continue; |
|
|
|
|
// } |
|
|
|
|
// // 事务处理:添加商品 |
|
|
|
|
// $model = new GoodsModel(); |
|
|
|
|
// $model->transaction(function () use ($model, $data, $storeId) { |
|
|
|
|
// // 添加商品 |
|
|
|
|
// $model->save($data); |
|
|
|
|
// // 新增商品与分类关联 |
|
|
|
|
// GoodsCategoryRelModel::increased((int)$model['goods_id'], $data['categoryIds'], $storeId); |
|
|
|
|
// // 新增商品与图片关联 |
|
|
|
|
// GoodsImageModel::increased((int)$model['goods_id'], $data['imagesIds'], $storeId); |
|
|
|
|
// // 新增商品与规格关联 |
|
|
|
|
// GoodsSpecRelModel::increased((int)$model['goods_id'], $data['newSpecList'], $storeId); |
|
|
|
|
// // 新增商品sku信息 |
|
|
|
|
// GoodsSkuModel::add((int)$model['goods_id'], $data['spec_type'], $data['newSkuList'], $storeId); |
|
|
|
|
// // 新增服务与承诺关联 |
|
|
|
|
// GoodsServiceRelModel::increased((int)$model['goods_id'], $data['serviceIds'], $storeId); |
|
|
|
|
// }); |
|
|
|
|
// 记录导入成功 |
|
|
|
|
$this->successCount++; |
|
|
|
|
} |
|
|
|
@ -164,7 +170,8 @@ class AdminImport extends BaseService |
|
|
|
|
private function validateGoodsData(array $data, int $storeId): bool |
|
|
|
|
{ |
|
|
|
|
// 验证商品信息:商品名称、分类ID集、图片ID集、运费模板ID |
|
|
|
|
$validate = new GoodsImportValidate; |
|
|
|
|
$validate = new GoodsAdminImportValidate; |
|
|
|
|
Log::record($data); |
|
|
|
|
if (!$validate->scene('goods')->check($data)) { |
|
|
|
|
$this->setError($validate->getError()); |
|
|
|
|
return false; |
|
|
|
@ -172,7 +179,7 @@ class AdminImport extends BaseService |
|
|
|
|
// 验证SKU信息:商品价格、库存数量、商品重量 |
|
|
|
|
$skuList = $data['spec_type'] == GoodsSpecTypeEnum::MULTI ? $data['newSkuList'] : [$data['newSkuList']]; |
|
|
|
|
foreach ($skuList as $item) { |
|
|
|
|
$validate = new GoodsImportValidate; |
|
|
|
|
$validate = new GoodsAdminImportValidate; |
|
|
|
|
if (!$validate->scene('skuInfo')->check($item)) { |
|
|
|
|
$this->setError($validate->getError()); |
|
|
|
|
return false; |
|
|
|
@ -212,66 +219,19 @@ class AdminImport extends BaseService |
|
|
|
|
*/ |
|
|
|
|
private function createData(array $original, int $storeId): array |
|
|
|
|
{ |
|
|
|
|
// 商品规格 |
|
|
|
|
$specType = isset($original['skuList']) ? GoodsSpecTypeEnum::MULTI : GoodsSpecTypeEnum::SINGLE; |
|
|
|
|
// 整理商品数据 |
|
|
|
|
$data = [ |
|
|
|
|
'goods_type' => GoodsTypeEnum::PHYSICAL, |
|
|
|
|
'goods_name' => $original[$this->mapGoods['goods_name']], |
|
|
|
|
'goods_no' => $original[$this->mapGoods['goods_no']], |
|
|
|
|
'spec_type' => $specType, |
|
|
|
|
'delivery_id' => $original[$this->mapGoods['delivery_id']], |
|
|
|
|
'sort' => $original[$this->mapGoods['sort']], |
|
|
|
|
'sales_initial' => $original[$this->mapGoods['sales_initial']], |
|
|
|
|
'deduct_stock_type' => $original[$this->mapGoods['deduct_stock_type']] === '付款减库存' ? DeductStockTypeEnum::PAYMENT |
|
|
|
|
: DeductStockTypeEnum::CREATE, |
|
|
|
|
'is_points_gift' => $original[$this->mapGoods['is_points_gift']] === '关闭' ? 0 : 1, |
|
|
|
|
'is_points_discount' => $original[$this->mapGoods['is_points_discount']] === '关闭' ? 0 : 1, |
|
|
|
|
'is_enable_grade' => $original[$this->mapGoods['is_enable_grade']] === '关闭' ? 0 : 1, |
|
|
|
|
'status' => $original['G'] === '下架' ? GoodsStatusEnum::OFF_SALE : GoodsStatusEnum::ON_SALE, |
|
|
|
|
'categoryIds' => $this->ids2array($original[$this->mapGoods['categoryIds']]), |
|
|
|
|
'imagesIds' => $this->ids2array($original[$this->mapGoods['imagesIds']]), |
|
|
|
|
'serviceIds' => $this->ids2array($original[$this->mapGoods['serviceIds']]), |
|
|
|
|
// 下面是默认数据, 没有会报错 |
|
|
|
|
'content' => '', |
|
|
|
|
'alone_grade_equity' => [], |
|
|
|
|
'newSpecList' => [], |
|
|
|
|
'newSkuList' => [], |
|
|
|
|
'cmmdty_model' => $original["A"], |
|
|
|
|
'channel' => "jd", |
|
|
|
|
'goods_no' => $original["C"], |
|
|
|
|
'categoryIds' => $this->ids2array($original["E"]), |
|
|
|
|
'imageStorage' => 10,//下载图片到本地 |
|
|
|
|
'goods_type' => 10,//实物 |
|
|
|
|
'goods_status' => 10,//上架 |
|
|
|
|
'store_id' => $storeId, |
|
|
|
|
]; |
|
|
|
|
// 规格和sku数据处理 |
|
|
|
|
if ($data['spec_type'] === GoodsSpecTypeEnum::MULTI) { |
|
|
|
|
$specList = $this->createSpecList($original['skuList']); |
|
|
|
|
$data['specData']['specList'] = $specList; |
|
|
|
|
$data['specData']['skuList'] = $this->createSkuList($original['skuList'], $specList); |
|
|
|
|
// 生成多规格数据 (携带id) |
|
|
|
|
$data['newSpecList'] = SpecModel::getNewSpecList($data['specData']['specList'], $storeId); |
|
|
|
|
// 生成skuList (携带goods_sku_id) |
|
|
|
|
$data['newSkuList'] = GoodsSkuModel::getNewSkuList($data['newSpecList'], $data['specData']['skuList']); |
|
|
|
|
} elseif ($data['spec_type'] === GoodsSpecTypeEnum::SINGLE) { |
|
|
|
|
// 生成skuItem |
|
|
|
|
$data['newSkuList'] = [ |
|
|
|
|
'goods_price' => $original[$this->mapSku['goods_price']], |
|
|
|
|
'line_price' => $original[$this->mapSku['line_price']], |
|
|
|
|
'stock_num' => $original[$this->mapSku['stock_num']], |
|
|
|
|
'goods_weight' => $original[$this->mapSku['goods_weight']], |
|
|
|
|
// 'goods_sku_no' => $original[$this->mapSku['goods_sku_no']], |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
// 整理商品的价格和库存总量 |
|
|
|
|
if ($data['spec_type'] === GoodsSpecTypeEnum::MULTI) { |
|
|
|
|
$data['stock_total'] = GoodsSkuModel::getStockTotal($data['specData']['skuList']); |
|
|
|
|
[$data['goods_price_min'], $data['goods_price_max']] = GoodsSkuModel::getGoodsPrices($data['specData']['skuList']); |
|
|
|
|
[$data['line_price_min'], $data['line_price_max']] = GoodsSkuModel::getLinePrices($data['specData']['skuList']); |
|
|
|
|
} elseif ($data['spec_type'] === GoodsSpecTypeEnum::SINGLE) { |
|
|
|
|
$data['goods_price_min'] = $data['goods_price_max'] = $original[$this->mapSku['goods_price']]; |
|
|
|
|
$data['line_price_min'] = $data['line_price_max'] = $original[$this->mapSku['line_price']]; |
|
|
|
|
$data['stock_total'] = $original[$this->mapSku['stock_num']]; |
|
|
|
|
} |
|
|
|
|
// 过滤不存在的ID集数据 |
|
|
|
|
$data['categoryIds'] = CategoryModel::filterCategoryIds($data['categoryIds'], $storeId); |
|
|
|
|
$data['imagesIds'] = UploadFileModel::filteFileIds($data['imagesIds'], $storeId); |
|
|
|
|
$data['serviceIds'] = GoodsServiceModel::filterServiceIds($data['serviceIds'], $storeId); |
|
|
|
|
//$data['categoryIds'] = CategoryModel::filterCategoryIds($data['categoryIds'], $storeId); |
|
|
|
|
return $data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|