1. 程式人生 > >SKU商品資訊錄入思路以及程式碼具體實現 - Springboot+AngularJS

SKU商品資訊錄入思路以及程式碼具體實現 - Springboot+AngularJS

SKU:

SKU=Stock Keeping Unit(庫存量單位),即庫存進出計量的單位,可以是以件,盒,托盤等為單位。SKU這是對於大型連鎖超市DC(配送中心)物流管理的一個必要的方法。當下已經被我們引申為產品統一編號的簡稱,每種產品均對應有唯一的SKU號。

針對電商而言,SKU有另外的註解:

1、SKU是指一款商品,每款都有出現一個SKU,便於電商品牌識別商品。

2、一款商品多色,則是有多個SKU,例:一件衣服,有紅色、白色、藍色,則SKU編碼也不相同,如相同則會出現混淆,發錯貨。

 

與SPU關係:

SPU = Standard Product Unit (標準化產品單元)

SPU 是商品資訊聚合的最小單位。

例如:品牌蘋果+型號:5s可以確定一個產品,即SPU

再加上顏色白色,尺碼4.0,即表示一個SKU

SPU + 顏色 + 尺碼,就是一個SKU,SKU是從屬於SPU的關係

 

實現思路:

    1、先定義一個初始化的不帶規格名稱的集合,只有一條記錄
    2、每選一個規格選項,則增加一行
    3、如何實現增加一行?克隆
    4、克隆分兩種:淺克隆與深克隆(後端可以使用fastJSON)

 4.1、淺克隆:var a={}; var b=a;  當a發生改變時,b會跟著變化,b變化時a也會跟著變化,因為兩個是同一引用地址
4.2、深克隆:var a={'name':'helloworld'}; var b={'name':'helloworld'};  a與b的內容完全一樣,但是兩個物件。

    5、深克隆其實就是重新構建一個物件,將所有的值都複製到b,但逐個屬性複製效率低,所以可以利用js中JSON類中的stringify()方法(將物件轉成JSON字串)
        5.1、先利用stringify()方法,將物件轉成JSON字串,再使用parse()方法轉回物件

var b=JSON.parse(JSON.stringify(a));

    6、規格項後半部分較為固定,但前半部分是動態獲取的,如何展示?

 //6.1、構造一個集合,集合中的物件就代表每一個規格項,spec:{}代表的就是動態獲取的部分,將其封裝成物件(規格項作為key) 
var list=[{spec:{'網路':'4G','螢幕':'6.5寸'},'price':1024,'count':1024}]

    7、資料最終提交到item表中,item的標題由後端負責拼接:xxx手機+選中的規格項

 

程式碼實現:

1、前端建立SKU列表:

//建立SKU列表
$scope.createItemList=function(){
	//組合實體類中定義,構建初始值,列表初始化(需要深克隆,所以需要事先構建)
	$scope.entity.itemList=[{spec:{},price:0,num:99999,status:'0',isDefault:'0'}];
	//根據頁面所選擇的規格項來迴圈
	var items = $scope.entity.goodsDesc.specificationItems;
	for(var i=0;i<items.length;i++){
		$scope.entity.itemList = addColumn($scope.entity.itemList,items[i].attributeName,items[i].attributeValue); 		
	}
	
}

2、AngularJS的controller層定義私有方法:

//Controller私有方法
addColumn=function(list,columnName,columnValues){
	//獲取原來的集合,返回生成後的集合
	var newList=[];
	//迴圈原列表,得到集合中的每一條記錄
	for(var i=0;i<list.length;i++){
		var oldRow = list[i];
		
		for(var j=0;j<columnValues.length;j++){
			var newRow = JSON.parse(JSON.stringify(oldRow));
			newRow.spec[columnName] = columnValues[j];
			newList.push(newRow);
		}
	}
	
	return newList;
}

3、後臺實現方法:

        /**
	 * 增加
	 */
	@Override
	public void add(Goods goods) {
		//商品狀態為未稽核
		goods.getGoods().setAuditStatus("0");
		
		//插入商品基本資訊
		goodsMapper.insert(goods.getGoods());	
		
		//將商品基本表資訊id給商品擴充套件表資訊id 
		goods.getGoodsDesc().setGoodsId(goods.getGoods().getId());
		//插入擴充套件表資訊
		goodsDescMapper.insert(goods.getGoodsDesc());
		
		if("1".equals(goods.getGoods().getIsEnableSpec())) {
		
			//獲取到前端封裝好的列表資料
			for (TbItem item: goods.getItemList()) {
				//構建標題 SPU名稱+規格選項值
				String title = goods.getGoods().getGoodsName();//SPU名稱
				//前端傳過來的spec,解析之後就是:{"記憶體":"16G","網路":"全網通"}
				Map<String, Object> map = JSON.parseObject(item.getSpec());
				for(String key:map.keySet()) {
					title += " "+map.get(key);
				}
				item.setTitle(title);
				
				setItemValues(item, goods);
				
				itemMapper.insert(item);
			}
		}else {
			//沒有啟用規格選項
			TbItem item = new TbItem();
			item.setTitle(goods.getGoods().getGoodsName());
			item.setPrice(goods.getGoods().getPrice());
			item.setNum(99999);
			item.setStatus("1");
			item.setIsDefault("1");
			//避免存入null資料
			item.setSpec("{}");
			
			setItemValues(item, goods);
			
			itemMapper.insert(item);
		}
		
	}
	
	
	private void setItemValues(TbItem item, Goods goods) {
		//商品分類
		item.setCategoryid(goods.getGoods().getCategory3Id());
		
		//建立日期、更新日期
		item.setCreateTime(new Date());
		item.setUpdateTime(new Date());
		
		//商品id
		item.setGoodsId(goods.getGoods().getId());
		//商家id
		item.setSellerId(goods.getGoods().getSellerId());
		
		//分類名稱
		TbItemCat itemCat = itemCatMapper.selectByPrimaryKey(goods.getGoods().getCategory3Id());
		item.setCategory(itemCat.getName());
		
		//品牌名稱
		TbBrand brand = brandMapper.selectByPrimaryKey(goods.getGoods().getBrandId());
		item.setBrand(brand.getName());
		
		//商家名稱(店鋪名稱)
		TbSeller seller = sellerMapper.selectByPrimaryKey(goods.getGoods().getSellerId());
		item.setSeller(seller.getNickName());
		
		//圖片
		List<Map> list = JSON.parseArray(goods.getGoodsDesc().getItemImages(), Map.class);
		if(list.size() > 0) {
			item.setImage((String)list.get(0).get("url"));
		}
		
	}