问题说明:商品导入优化处理
修改文件:app/services/product/product/StoreProductServices.php
修改方法:productImport()
/**
* 商品导入
* @param $importData
* @param $impord_id
* @param $end
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function productImport($importData, $impord_id, $end)
{
$productCateServices = app()->make(StoreProductCategoryServices::class);
$storeBrandServices = app()->make(StoreBrandServices::class);
$unitServices = app()->make(StoreProductUnitServices::class);
$productData = $issetProductArr = [];
$virtualType = ['普通商品' => 0, '卡密/网盘' => 1, '优惠券' => 2, '虚拟商品' => 3, '次卡商品' => 4, '卡项商品' => 5, '预约商品' => 6];
$productAttrValueServices = app()->make(StoreProductAttrValueServices::class);
$barCodeArr = array_unique($productAttrValueServices->getColumn(['type' => 0], 'code', 'id'));
$barCodeNumberArr = array_unique($productAttrValueServices->getColumn(['type' => 0], 'bar_code', 'id'));
$unit = $unitServices->getColumn(['status' => 1, 'is_del' => 0], 'name', 'id');
$error = [];
$jump1 = 0;
foreach ($importData as $sku) {
if ($sku['id'] == null) {
$jump1 += 1;
continue;
}
$error[$sku['id']][] = $sku;
if (!isset($productData[$sku['id']])) {
$productData[$sku['id']]['product_type'] = $virtualType[$sku['product_type']];
$productData[$sku['id']]['supplier_id'] = 0;
$productData[$sku['id']]['cate_id'] = $productCateServices->getCateId($sku['cate_name_one'], $sku['cate_name_two'], $sku['cate_name_three']);
$productData[$sku['id']]['store_cate_id'] = [];
$productData[$sku['id']]['store_name'] = $sku['store_name'];
$productData[$sku['id']]['brand_id'] = [];
$productData[$sku['id']]['store_info'] = $sku['store_info'];
$productData[$sku['id']]['keyword'] = $sku['keyword'];
$productData[$sku['id']]['unit_name'] = in_array($sku['unit_name'], $unit) ? $sku['unit_name'] : '';
$productData[$sku['id']]['recommend_image'] = '';
$productData[$sku['id']]['slider_image'] = explode(';', $sku['slider_image']);
// $productData[$sku['id']]['is_sub'] = [];
$productData[$sku['id']]['sort'] = 0;
$productData[$sku['id']]['ficti'] = $sku['ficti'];
$productData[$sku['id']]['give_integral'] = $sku['give_integral'];
$productData[$sku['id']]['is_show'] = 0;
$productData[$sku['id']]['is_hot'] = 0;
$productData[$sku['id']]['is_benefit'] = 0;
$productData[$sku['id']]['is_best'] = 0;
$productData[$sku['id']]['is_new'] = 0;
$productData[$sku['id']]['mer_use'] = 0;
$productData[$sku['id']]['is_postage'] = 0;
$productData[$sku['id']]['is_good'] = 0;
$productData[$sku['id']]['description'] = $this->processDescription($sku['description']);
$productData[$sku['id']]['spec_type'] = $sku['spec_type'] == '多规格' ? 1 : 0;
$productData[$sku['id']]['video_open'] = $sku['video_link'] != '' ? 1 : 0;
$productData[$sku['id']]['video_link'] = $sku['video_link'];
//items
//attrs
//attr
$productData[$sku['id']]['related'] = [];
$productData[$sku['id']]['recommend'] = [];
$productData[$sku['id']]['activity'] = ['默认', '秒杀', '砍价', '拼团'];
$productData[$sku['id']]['coupon_ids'] = [];
$productData[$sku['id']]['label_id'] = [];
$productData[$sku['id']]['command_word'] = $sku['command_word'];
$productData[$sku['id']]['tao_words'] = '';
$productData[$sku['id']]['is_copy'] = 0;
$productData[$sku['id']]['delivery_type'] = [1];
$productData[$sku['id']]['freight'] = 1;
$productData[$sku['id']]['postage'] = 0;
$productData[$sku['id']]['temp_id'] = '';
$productData[$sku['id']]['recommend_list'] = [];
$productData[$sku['id']]['soure_link'] = '';
$productData[$sku['id']]['bar_code'] = '';
$productData[$sku['id']]['code'] = '';
$productData[$sku['id']]['is_support_refund'] = 1;
$productData[$sku['id']]['is_presale_product'] = 0;
$productData[$sku['id']]['presale_time'] = [];
$productData[$sku['id']]['presale_day'] = 0;
$productData[$sku['id']]['is_vip_product'] = 0;
$productData[$sku['id']]['auto_on_time'] = 0;
$productData[$sku['id']]['auto_off_time'] = 0;
$productData[$sku['id']]['custom_form'] = [];
$productData[$sku['id']]['system_form_id'] = 0;
$productData[$sku['id']]['store_label_id'] = [];
$productData[$sku['id']]['ensure_id'] = 0;
$productData[$sku['id']]['specs'] = [];
$productData[$sku['id']]['specs_id'] = 0;
$productData[$sku['id']]['is_limit'] = 0;
$productData[$sku['id']]['limit_type'] = 0;
$productData[$sku['id']]['limit_num'] = 0;
$productData[$sku['id']]['presale_status'] = 0;
// $productData[$sku['id']]['applicable_type'] = $sku['applicable_type'];
// $productData[$sku['id']]['applicable_store_id'] = $sku['applicable_store_id'];
}
$detail = [];
$sku_value = explode(';', $sku['sku_value']);
if ($sku_value) {
foreach ($sku_value as $pair) {
if (!$pair) continue;
list($key, $value) = explode('=', $pair);
$detail[$key] = $value;
}
}
if ($sku['code'] != '' && in_array($sku['code'], $barCodeArr)) {
$issetProductArr[] = $sku['id'];
}
if ($sku['bar_code'] != '' && in_array($sku['bar_code'], $barCodeNumberArr)) {
$issetProductArr[] = $sku['id'];
}
if ($sku['spec_type'] == '多规格') {
$productData[$sku['id']]['attrs'][] = [
'attr_arr' => explode(',', $sku['sku_name']),
'detail' => $detail,
'price' => $sku['price'],
'pic' => $sku['pic'],
'ot_price' => $sku['ot_price'],
'cost' => $sku['cost'],
'stock' => $sku['stock'],
'is_show' => 1,
'is_default_select' => 0,
'is_virtual' => 0,
'brokerage' => 0,
'brokerage_two' => 0,
'vip_price' => 0,
'vip_proportion' => 0,
'unique' => '',
'weight' => $sku['weight'],
'volume' => $sku['volume'],
'code' => $sku['code'],
'bar_code' => $sku['bar_code'],
];
} else {
$productData[$sku['id']]['attrs'][] = [];
$productData[$sku['id']]['attr'] = [
'attr_arr' => explode(',', $sku['sku_name']),
'detail' => $detail,
'price' => $sku['price'],
'pic' => $sku['pic'],
'ot_price' => $sku['ot_price'],
'cost' => $sku['cost'],
'stock' => $sku['stock'],
'is_show' => 1,
'is_default_select' => 0,
'is_virtual' => 0,
'brokerage' => 0,
'brokerage_two' => 0,
'vip_price' => 0,
'vip_proportion' => 0,
'unique' => '',
'weight' => $sku['weight'],
'volume' => $sku['volume'],
'code' => $sku['code'],
'bar_code' => $sku['bar_code'],
];
}
$items = [];
$pairs = explode(';', $sku['sku_type_value']);
if ($pairs) {
foreach ($pairs as $pair) {
if (!$pair) continue;
// 将每个部分按等号分割成 key 和 value
list($key, $values) = explode('=', $pair);
// 将 value 部分按逗号分割为数组
$detailArray = explode(',', $values);
$detail = [];
foreach ($detailArray as &$det) {
$detail[] = [
'value' => $det,
'pic' => '',
];
}
// 重新构建原始数组的结构
$items[] = [
'value' => $key,
'detail' => $detail
];
}
}
$productData[$sku['id']]['items'] = $items;
}
$all = count($productData);
foreach (array_unique($issetProductArr) as $issetProduct) {
if (isset($productData[$issetProduct])) {
unset($productData[$issetProduct]);
}
}
$success = count($productData);
$jump = count($issetProductArr);
$jump = $jump + $jump1;
/** @var ImportRecordServices $importServices */
$importServices = app()->make(ImportRecordServices::class);
/** @var ImportRecordErrorServices $errorServices */
$errorServices = app()->make(ImportRecordErrorServices::class);
$error_sum = 0;
foreach ($productData as $k => $info) {
try {
if (!$this->saveData(0, $info)) {
foreach ($error[$k] as $item) {
$errorServices->save([
'record_id' => $impord_id,
'original_data' => json_encode($item),
'fail_msg' => '添加失败,请检测导入数据',
]);
$error_sum += 1;
}
}
} catch (\Throwable $e) {
foreach ($error[$k] as $item) {
$errorServices->save([
'record_id' => $impord_id,
'original_data' => json_encode($item),
'fail_msg' => $e->getMessage(),
]);
$error_sum += 1;
}
}
}
//是否最后一批数据
if ($end) {
$importServices->update($impord_id, ['status' => $error_sum > 0 ? -1 : 1, 'jump_count' => $jump, 'fail_count' => $error_sum]);
} else {
$importServices->update($impord_id, ['status' => -1, 'jump_count' => $jump, 'fail_count' => $error_sum]);
}
return ['error_sum' => $error_sum, 'jump' => $jump];
}