Files
ZangShiQi/addon/v3tov4/model/Goods.php
2026-04-04 17:27:12 +08:00

455 lines
22 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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');
}
}