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"));
}
}