初始上传
This commit is contained in:
455
addon/v3tov4/model/Goods.php
Executable file
455
addon/v3tov4/model/Goods.php
Executable file
@@ -0,0 +1,455 @@
|
||||
<?php
|
||||
/**
|
||||
* Niushop商城系统 - 团队十年电商经验汇集巨献!
|
||||
* =========================================================
|
||||
* Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
|
||||
* ----------------------------------------------
|
||||
* 官方网址: https://www.niushop.com
|
||||
|
||||
* =========================================================
|
||||
*/
|
||||
|
||||
namespace addon\v3tov4\model;
|
||||
|
||||
use app\model\goods\Goods as GoodsModel;
|
||||
use app\model\system\Stat;
|
||||
|
||||
/**
|
||||
* 迁移商品相关数据(商品、商品分类、商品标签)
|
||||
*/
|
||||
class Goods extends Upgrade
|
||||
{
|
||||
|
||||
private $site_id = 1;
|
||||
|
||||
/**
|
||||
* 迁移商品数据
|
||||
* @param $page_index
|
||||
* @param $page_size
|
||||
* @return array
|
||||
*/
|
||||
public function getGoodsList($page_index, $page_size)
|
||||
{
|
||||
try {
|
||||
|
||||
// 查询v3商品表
|
||||
$field = 'goods_id, goods_name, category_id, category_id_1, category_id_2, category_id_3, group_id_array, goods_type, market_price, price, promotion_price, cost_price, shipping_fee, shipping_fee_id, stock, max_buy, clicks, min_stock_alarm, sales, collects, star, evaluates, picture, keywords, introduction, description, code, state, sort, img_id_array, sku_img_array, goods_attribute_id, goods_spec_format, goods_weight, goods_volume, supplier_id, create_time, update_time, min_buy, is_virtual, goods_video_address, goods_unit';
|
||||
$goods_list = $this->getPageList('ns_goods', [ [ 'goods_type', 'in', '1,2' ] ], $field, $page_index, $page_size);
|
||||
|
||||
if (!empty($goods_list)) {
|
||||
if ($page_index == 1) {
|
||||
// 首次清空商品表
|
||||
$prefix = config("database")[ "connections" ][ "mysql" ][ "prefix" ];
|
||||
model('goods')->execute("TRUNCATE TABLE {$prefix}goods");
|
||||
model('goods_sku')->execute("TRUNCATE TABLE {$prefix}goods_sku");
|
||||
}
|
||||
|
||||
foreach ($goods_list as $item) {
|
||||
|
||||
// 商品参数
|
||||
$item[ 'goods_attr_class' ] = 0;
|
||||
$item[ 'goods_attr_name' ] = '';
|
||||
if (!empty($item[ 'goods_attribute_id' ])) {
|
||||
$attribute_info = $this->getInfo('ns_attribute', [ [ 'attr_id', '=', $item[ 'goods_attribute_id' ] ] ], 'attr_id,attr_name');
|
||||
if (!empty($attribute_info)) {
|
||||
$item[ 'goods_attr_class' ] = $attribute_info[ 'attr_id' ];
|
||||
$item[ 'goods_attr_name' ] = $attribute_info[ 'attr_name' ];
|
||||
}
|
||||
}
|
||||
$join = [
|
||||
[ 'ns_attribute_value nav', 'nav.attr_value_id = nga.attr_value_id', 'right' ],
|
||||
];
|
||||
$goods_attribute_list = $this->getList("ns_goods_attribute", [ [ 'goods_id', '=', $item[ 'goods_id' ] ] ], 'nav.attr_id as attr_class_id,nga.attr_id,nga.attr_value_id,nga.attr_value,nga.attr_value_name', '', 'nga', $join);
|
||||
$item[ 'goods_attr_format' ] = '';
|
||||
if (!empty($goods_attribute_list)) {
|
||||
$item[ 'goods_attr_format' ] = [];
|
||||
foreach ($goods_attribute_list as $attr_k => $attr_v) {
|
||||
$item[ 'goods_attr_format' ][] = [
|
||||
"attr_class_id" => $attr_v[ 'attr_class_id' ],
|
||||
"attr_id" => $attr_v[ 'attr_id' ],
|
||||
"attr_name" => $attr_v[ 'attr_value' ],
|
||||
"attr_value_id" => $attr_v[ 'attr_value_id' ],
|
||||
"attr_value_name" => $attr_v[ 'attr_value_name' ]
|
||||
];
|
||||
}
|
||||
$item[ 'goods_attr_format' ] = json_encode($item[ 'goods_attr_format' ]);
|
||||
}
|
||||
|
||||
// 商品标签
|
||||
$item[ 'label_id' ] = 0;
|
||||
if (!empty($item[ 'group_id_array' ])) {
|
||||
$item[ 'label_id' ] = explode(",", $item[ 'group_id_array' ])[ 0 ];
|
||||
}
|
||||
|
||||
if ($item[ 'goods_type' ] == 1) {
|
||||
$item[ 'goods_class' ] = 1;
|
||||
$item[ 'goods_class_name' ] = '实物商品';
|
||||
} elseif ($item[ 'goods_type' ] == 2) {
|
||||
$item[ 'goods_class' ] = 0;
|
||||
$item[ 'goods_class_name' ] = '虚拟商品';
|
||||
}
|
||||
|
||||
//商品主图
|
||||
$picture_info = $this->getInfo("sys_album_picture", [ [ 'pic_id', '=', $item[ 'picture' ] ] ], 'pic_cover');
|
||||
$item[ 'goods_image' ] = $picture_info[ 'pic_cover' ];
|
||||
|
||||
$goods_spec_format = json_decode($item[ 'goods_spec_format' ], true);
|
||||
$goods_spec_format_temp = [];
|
||||
// 循环处理规格
|
||||
foreach ($goods_spec_format as $spec_k => $spec_v) {
|
||||
$goods_spec_format_temp[ $spec_k ] = [
|
||||
"spec_name" => $spec_v[ 'spec_name' ],
|
||||
"spec_id" => $spec_v[ 'spec_id' ],
|
||||
"value" => []
|
||||
];
|
||||
foreach ($spec_v[ 'value' ] as $spec_value_k => $spec_value_v) {
|
||||
$goods_spec_format_temp[ $spec_k ] [ 'value' ][ $spec_value_k ] = [
|
||||
"spec_name" => $spec_v[ 'spec_name' ],
|
||||
"spec_id" => $spec_v[ 'spec_id' ],
|
||||
"spec_value_name" => $spec_value_v[ 'spec_value_name' ],
|
||||
"spec_value_id" => $spec_value_v[ 'spec_value_id' ]
|
||||
];
|
||||
if ($spec_value_v[ 'spec_show_type' ] == 2) {
|
||||
$goods_spec_format_temp[ $spec_k ] [ 'value' ][ $spec_value_k ][ 'image' ] = $spec_value_v[ 'spec_value_data' ];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// SKU数据
|
||||
$item[ 'goods_sku_data' ] = [];
|
||||
|
||||
if (!empty($goods_spec_format_temp)) {
|
||||
$item[ 'goods_spec_format' ] = json_encode($goods_spec_format_temp);
|
||||
} else {
|
||||
$item[ 'goods_spec_format' ] = '';
|
||||
}
|
||||
|
||||
|
||||
// 排序:按价格升序
|
||||
$goods_sku_list = $this->getList("ns_goods_sku", [ [ 'goods_id', '=', $item[ 'goods_id' ] ] ], "sku_id,goods_id,sku_name,attr_value_items,market_price, price, promote_price, cost_price, stock, picture, code, weight, volume, sku_img_array", 'price asc');
|
||||
|
||||
foreach ($goods_sku_list as $sku_k => $sku_v) {
|
||||
|
||||
$sku_spec_format = '';
|
||||
if (!empty($sku_v[ 'attr_value_items' ])) {
|
||||
$sku_spec_format = [];
|
||||
$attr_value_items = explode(";", $sku_v[ 'attr_value_items' ]);
|
||||
foreach ($attr_value_items as $attr_value_k => $attr_value_v) {
|
||||
$temp = explode(":", $attr_value_v);
|
||||
$spec_id = $temp[ 0 ];
|
||||
$spec_value_id = $temp[ 1 ];
|
||||
foreach ($goods_spec_format_temp as $spec_temp_k => $spec_temp_v) {
|
||||
if ($spec_temp_v[ 'spec_id' ] == $spec_id) {
|
||||
foreach ($spec_temp_v[ 'value' ] as $spec_temp_value_k => $spec_temp_value_v) {
|
||||
if ($spec_temp_value_v[ 'spec_value_id' ] == $spec_value_id) {
|
||||
$sku_spec_format[] = [
|
||||
"spec_name" => $spec_temp_value_v[ 'spec_name' ],
|
||||
"spec_id" => $spec_id,
|
||||
"spec_value_id" => $spec_value_id,
|
||||
"spec_value_name" => $spec_temp_value_v[ 'spec_value_name' ]
|
||||
];
|
||||
if (!empty($spec_temp_value_v[ 'image' ])) {
|
||||
$sku_spec_format[ count($sku_spec_format) - 1 ][ 'image' ] = $spec_temp_value_v[ 'image' ];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$pic_id_arr = explode(",", $item[ 'img_id_array' ]);
|
||||
if (!empty($sku_v[ 'sku_img_array' ])) {
|
||||
$pic_id_arr = array_merge(explode(",", $sku_v[ 'sku_img_array' ]), $pic_id_arr);
|
||||
}
|
||||
|
||||
$sku_images = [];
|
||||
$picture_list = $this->getList("sys_album_picture", [ [ 'pic_id', 'in', implode(",", $pic_id_arr) ] ], 'pic_cover');
|
||||
foreach ($picture_list as $picture_list_k => $picture_list_v) {
|
||||
$sku_images[] = $picture_list_v[ 'pic_cover' ];
|
||||
}
|
||||
|
||||
$item[ 'goods_sku_data' ] [] = [
|
||||
'sku_id' => $sku_v[ 'sku_id' ],
|
||||
'site_id' => $this->site_id,
|
||||
'sku_name' => $item[ 'goods_name' ] . ' ' . $sku_v[ 'sku_name' ],
|
||||
'spec_name' => $sku_v[ 'sku_name' ],
|
||||
'sku_no' => $sku_v[ 'code' ],
|
||||
'sku_spec_format' => !empty($sku_spec_format) ? json_encode($sku_spec_format) : "",
|
||||
'price' => $sku_v[ 'price' ],
|
||||
'cost_price' => $sku_v[ 'cost_price' ],
|
||||
'market_price' => $sku_v[ 'market_price' ],
|
||||
'discount_price' => $sku_v[ 'promote_price' ],//sku折扣价(默认等于单价)
|
||||
'is_free_shipping' => $item[ 'shipping_fee' ] == 0 ? 1 : 0,
|
||||
'shipping_template' => 0,//$item[ 'shipping_fee_id' ],
|
||||
'stock' => $sku_v[ 'stock' ],
|
||||
'weight' => $sku_v[ 'weight' ],
|
||||
'volume' => $sku_v[ 'volume' ],
|
||||
'goods_id' => $item[ 'goods_id' ],
|
||||
'goods_class' => $item[ 'goods_type' ],
|
||||
"sku_image" => $sku_images[ 0 ],
|
||||
"sku_images" => implode(",", $sku_images),
|
||||
'collect_num' => $item[ 'collects' ],
|
||||
'click_num' => $item[ 'clicks' ],
|
||||
'goods_content' => $item['description']
|
||||
];
|
||||
}
|
||||
|
||||
$res = $this->addGoods($item);
|
||||
if ($res[ 'code' ] < 0) {
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return $this->success();
|
||||
} catch (\Exception $e) {
|
||||
return $this->error('', $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取需要迁移商品数量
|
||||
* @return int
|
||||
*/
|
||||
public function getGoodsCount()
|
||||
{
|
||||
return $this->getCount('ns_goods', [ [ 'goods_type', 'in', '1,2' ] ], 'goods_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品添加
|
||||
* @param $data
|
||||
* @return array
|
||||
*/
|
||||
private function addGoods($data)
|
||||
{
|
||||
model('goods')->startTrans();
|
||||
|
||||
try {
|
||||
|
||||
$goods_image = $data[ 'goods_image' ];
|
||||
|
||||
$category_id = [];
|
||||
if (!empty($data[ 'category_id_1' ])) {
|
||||
$category_id[] = $data[ 'category_id_1' ];
|
||||
}
|
||||
if (!empty($data[ 'category_id_2' ])) {
|
||||
$category_id[] = $data[ 'category_id_2' ];
|
||||
}
|
||||
if (!empty($data[ 'category_id_3' ])) {
|
||||
$category_id[] = $data[ 'category_id_3' ];
|
||||
}
|
||||
$category_json = '["' . implode(",", $category_id) . '"]';
|
||||
|
||||
$goods_data = array (
|
||||
'goods_image' => $goods_image,
|
||||
'goods_stock' => $data[ 'stock' ],
|
||||
'price' => $data[ 'price' ],
|
||||
'market_price' => $data[ 'market_price' ],
|
||||
'cost_price' => $data[ 'cost_price' ],
|
||||
'goods_spec_format' => $data[ 'goods_spec_format' ],
|
||||
'category_id' => implode(",", $category_id),
|
||||
'category_json' => $category_json,
|
||||
'label_id' => $data[ 'label_id' ],
|
||||
'sku_id' => $data[ 'goods_sku_data' ][ 0 ][ 'sku_id' ]
|
||||
);
|
||||
|
||||
$common_data = array (
|
||||
'goods_id' => $data[ 'goods_id' ],
|
||||
'goods_name' => $data[ 'goods_name' ],
|
||||
'goods_class' => $data[ 'goods_class' ],
|
||||
'goods_class_name' => $data[ 'goods_class_name' ],
|
||||
'goods_attr_class' => $data[ 'goods_attr_class' ],
|
||||
'goods_attr_name' => $data[ 'goods_attr_name' ],
|
||||
'site_id' => $this->site_id,
|
||||
'goods_content' => $data[ 'description' ],
|
||||
'goods_state' => $data[ 'state' ] == 10 ? 0 : $data[ 'state' ],
|
||||
'goods_stock_alarm' => $data[ 'min_stock_alarm' ],
|
||||
'is_free_shipping' => $data[ 'shipping_fee' ] == 0 ? 1 : 0,
|
||||
'shipping_template' => 0,//$data[ 'shipping_fee_id' ],
|
||||
'goods_attr_format' => $data[ 'goods_attr_format' ],
|
||||
'introduction' => $data[ 'introduction' ],
|
||||
'keywords' => $data[ 'keywords' ],
|
||||
'unit' => $data[ 'goods_unit' ],
|
||||
'video_url' => $data[ 'goods_video_address' ],
|
||||
'sort' => $data[ 'sort' ],
|
||||
'goods_service_ids' => '',
|
||||
'virtual_sale' => 0,
|
||||
'max_buy' => $data[ 'max_buy' ],
|
||||
'min_buy' => $data[ 'min_buy' ],
|
||||
'evaluate' => $data[ 'evaluates' ],
|
||||
'sale_num' => $data[ 'sales' ],
|
||||
'create_time' => $data[ 'create_time' ],
|
||||
'modify_time' => $data[ 'update_time' ],
|
||||
'is_virtual' => $data[ 'is_virtual' ],
|
||||
'supplier_id' => $data[ 'supplier_id' ]
|
||||
);
|
||||
|
||||
$goods_id = model('goods')->add(array_merge($goods_data, $common_data));
|
||||
model('goods_sku')->addList($data[ 'goods_sku_data' ]);
|
||||
|
||||
if (!empty($data[ 'goods_spec_format' ])) {
|
||||
// 刷新SKU商品规格项/规格值JSON字符串
|
||||
$goods_model = new GoodsModel();
|
||||
$goods_model->dealGoodsSkuSpecFormat($goods_id, $data[ 'goods_spec_format' ]);
|
||||
}
|
||||
|
||||
// 添加店铺添加统计
|
||||
$stat = new Stat();
|
||||
// $stat->addShopStat([ 'add_goods_count' => 1, 'site_id' => $this->site_id ]);
|
||||
$stat->switchStat(['type' => 'add_goods', 'data' => [ 'add_goods_count' => 1, 'site_id' => $this->site_id ]]);
|
||||
model('goods')->commit();
|
||||
return $this->success($goods_id);
|
||||
} catch (\Exception $e) {
|
||||
model('goods')->rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 迁移商品分类数据
|
||||
* @param $page_index
|
||||
* @param $page_size
|
||||
* @return array
|
||||
*/
|
||||
public function getGoodsCategoryList($page_index, $page_size)
|
||||
{
|
||||
try {
|
||||
|
||||
model("goods_category")->startTrans();
|
||||
|
||||
// 查询v3商品分类表
|
||||
$field = 'category_id, category_name, short_name, pid, level , is_visible, attr_id, attr_name, keywords, description, sort, category_pic';
|
||||
$goods_category_list = $this->getPageList('ns_goods_category', [], $field, $page_index, $page_size);
|
||||
|
||||
if (!empty($goods_category_list)) {
|
||||
if ($page_index == 1) {
|
||||
// 首次清空商品分类表
|
||||
$prefix = config("database")[ "connections" ][ "mysql" ][ "prefix" ];
|
||||
model('goods_category')->execute("TRUNCATE TABLE {$prefix}goods_category");
|
||||
}
|
||||
$data = [];
|
||||
foreach ($goods_category_list as $k => $v) {
|
||||
$category_id_1 = 0;
|
||||
$category_id_2 = 0;
|
||||
$category_id_3 = 0;
|
||||
$category_full_name = [];
|
||||
if ($v[ 'level' ] == 1) {
|
||||
$category_id_1 = $v[ 'category_id' ];
|
||||
$category_full_name[] = $v[ 'category_name' ];
|
||||
} elseif ($v[ 'level' ] == 2) {
|
||||
$category_id_2 = $v[ 'category_id' ];
|
||||
$one_category = $this->getInfo("ns_goods_category", [ [ 'category_id', '=', $v[ 'pid' ] ] ], 'category_id,category_name');
|
||||
$category_id_1 = $one_category[ 'category_id' ];
|
||||
|
||||
$category_full_name[] = $one_category[ 'category_name' ];
|
||||
$category_full_name[] = $v[ 'category_name' ];
|
||||
} elseif ($v[ 'level' ] == 3) {
|
||||
$category_id_3 = $v[ 'category_id' ];
|
||||
$two_category = $this->getInfo("ns_goods_category", [ [ 'category_id', '=', $v[ 'pid' ] ] ], 'category_id,pid,category_name');
|
||||
$one_category = $this->getInfo("ns_goods_category", [ [ 'category_id', '=', $two_category[ 'pid' ] ] ], 'category_id,category_name');
|
||||
$category_id_1 = $one_category[ 'category_id' ];
|
||||
$category_id_2 = $two_category[ 'category_id' ];
|
||||
|
||||
$category_full_name[] = $one_category[ 'category_name' ];
|
||||
$category_full_name[] = $two_category[ 'category_name' ];
|
||||
$category_full_name[] = $v[ 'category_name' ];
|
||||
}
|
||||
$data[] = [
|
||||
'category_id' => $v[ 'category_id' ],
|
||||
'site_id' => $this->site_id,
|
||||
'category_name' => $v[ 'category_name' ],
|
||||
'short_name' => $v[ 'short_name' ],
|
||||
'pid' => $v[ 'pid' ],
|
||||
'level' => $v[ 'level' ],
|
||||
'is_show' => $v[ 'is_visible' ],
|
||||
'sort' => $v[ 'sort' ],
|
||||
'image' => $v[ 'category_pic' ],
|
||||
'keywords' => $v[ 'keywords' ],
|
||||
'description' => $v[ 'description' ],
|
||||
'category_id_1' => $category_id_1,
|
||||
'category_id_2' => $category_id_2,
|
||||
'category_id_3' => $category_id_3,
|
||||
'category_full_name' => implode("/", $category_full_name),
|
||||
'image_adv' => '',
|
||||
'commission_rate' => 0
|
||||
];
|
||||
}
|
||||
model("goods_category")->addList($data);
|
||||
}
|
||||
|
||||
model('goods_category')->commit();
|
||||
return $this->success();
|
||||
} catch (\Exception $e) {
|
||||
model('goods_category')->rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取需要迁移商品分类数量
|
||||
* @return int
|
||||
*/
|
||||
public function getGoodsCategoryCount()
|
||||
{
|
||||
return $this->getCount('ns_goods_category', [], 'category_id');
|
||||
}
|
||||
|
||||
/**
|
||||
* 迁移商品标签数据
|
||||
* 丢失数据:上下级、图片、是否显示
|
||||
* @param $page_index
|
||||
* @param $page_size
|
||||
* @return array
|
||||
*/
|
||||
public function getGoodsLabelList($page_index, $page_size)
|
||||
{
|
||||
try {
|
||||
model("goods_label")->startTrans();
|
||||
|
||||
// 查询v3商品标签表
|
||||
$field = 'group_id, group_name, is_visible, sort, group_dec';
|
||||
$goods_group_list = $this->getPageList('ns_goods_group', [], $field, $page_index, $page_size);
|
||||
|
||||
if (!empty($goods_group_list)) {
|
||||
if ($page_index == 1) {
|
||||
// 首次清空商品标签表
|
||||
$prefix = config("database")[ "connections" ][ "mysql" ][ "prefix" ];
|
||||
model('goods_label')->execute("TRUNCATE TABLE {$prefix}goods_label");
|
||||
}
|
||||
$data = [];
|
||||
foreach ($goods_group_list as $k => $v) {
|
||||
$data[] = [
|
||||
'id' => $v[ 'group_id' ],
|
||||
'site_id' => $this->site_id,
|
||||
'label_name' => $v[ 'group_name' ],
|
||||
'desc' => $v[ 'group_dec' ],
|
||||
'create_time' => time(),
|
||||
'update_time' => 0,
|
||||
'sort' => $v[ 'sort' ]
|
||||
];
|
||||
}
|
||||
model("goods_label")->addList($data);
|
||||
}
|
||||
|
||||
model("goods_label")->commit();
|
||||
return $this->success();
|
||||
} catch (\Exception $e) {
|
||||
model("goods_label")->rollback();
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取需要迁移商品标签数量
|
||||
* @return int
|
||||
*/
|
||||
public function getGoodsLabelCount()
|
||||
{
|
||||
return $this->getCount('ns_goods_group', [], 'group_id');
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user