首先我们需要和前端约定下
- 新增的商品SKU信息不传ID 【skuID == null】
- 要修改的商品SKU信息传ID【skuID != null => updateSkuIDs】
- 删除的直接不传SKU信息 【Db库中获取原始 skuIDList 数组中 比对 更新的updateSkuIDs 获取 removeSkuIDs】
- 然后我们可以根据传入的SKU信息来确定需要新增、修改、删除的SKU信息
- 这样就可以做到在更新商品SKU信息时,不改变原来商品SKU的ID了,具体流程如下。
具体代码实现如下:
/**
* 商品管理Service实现类
* Created by macro on 2018/4/26.
*/
@Service
public class PmsProductServiceImpl implements PmsProductService {
private void handleUpdateSkuStockList(Long id, PmsProductParam productParam) {
//当前的sku信息
List<PmsSkuStock> currSkuList = productParam.getSkuStockList();
//当前没有sku直接删除
if(CollUtil.isEmpty(currSkuList)){
PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
skuStockExample.createCriteria().andProductIdEqualTo(id);
skuStockMapper.deleteByExample(skuStockExample);
return;
}
//获取初始sku信息
PmsSkuStockExample skuStockExample = new PmsSkuStockExample();
skuStockExample.createCriteria().andProductIdEqualTo(id);
List<PmsSkuStock> oriStuList = skuStockMapper.selectByExample(skuStockExample);
//获取新增sku信息
List<PmsSkuStock> insertSkuList = currSkuList.stream().filter(item->item.getId()==null).collect(Collectors.toList());
//获取需要更新的sku信息
List<PmsSkuStock> updateSkuList = currSkuList.stream().filter(item->item.getId()!=null).collect(Collectors.toList());
List<Long> updateSkuIds = updateSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
//获取需要删除的sku信息
List<PmsSkuStock> removeSkuList = oriStuList.stream().filter(item-> !updateSkuIds.contains(item.getId())).collect(Collectors.toList());
handleSkuStockCode(insertSkuList,id);
handleSkuStockCode(updateSkuList,id);
//新增sku
if(CollUtil.isNotEmpty(insertSkuList)){
relateAndInsertList(skuStockDao, insertSkuList, id);
}
//删除sku
if(CollUtil.isNotEmpty(removeSkuList)){
List<Long> removeSkuIds = removeSkuList.stream().map(PmsSkuStock::getId).collect(Collectors.toList());
PmsSkuStockExample removeExample = new PmsSkuStockExample();
removeExample.createCriteria().andIdIn(removeSkuIds);
skuStockMapper.deleteByExample(removeExample);
}
//修改sku
if(CollUtil.isNotEmpty(updateSkuList)){
for (PmsSkuStock pmsSkuStock : updateSkuList) {
skuStockMapper.updateByPrimaryKeySelective(pmsSkuStock);
}
}
}
}
改进后的设计
由于商品的销售属性是动态的,没法确定到底有多少个,此时我们可以改用JSON格式来存储,在pms_sku_stock
表中添加了sp_data
字段。
sp_data
存储的就是一个JSON数组,比如颜色为黑色,容量为32G的手机存储信息如下。
[
{
"key": "颜色",
"value": "黑色"
},
{
"key": "容量",
"value": "32G"
}
]
这样修改以后,在原来的购物车表oms_cart_item
和订单商品表oms_order_item
中就都可以用JSON格式来存储销售属性了,使用的是product_attr
字段。
如果我们要在数据库中存储一些格式不固定的属性时,可以采用JSON的形式进行存储(不考虑统计筛选情况)。对于关联属性的修改,可以通过一些逻辑操作来实现不改变原有ID的修改。