后端实现SKU的隐藏
一、在sku增加禁用标识
-
增加商品规格的禁用字段 skuStatus(0-禁用 1-启用)
-
如果该规格参加了活动,不允许进行禁用
-
禁用时,校验至少存在一个有效SKU,避免前端展示没有规格
二、在前端展示规格时,进行禁用的sku的规格隐藏
- 获取可用的sku列表
- 根据可用的sku列表获取可展示的规格
- 遍历当前商品的所有规格与可用的规格进行对比,不存在于可用规格列表中的规格进行remove。具体操作如下:
/***
* 获取有效的规格选项
* @param level
* @param optionList
* @return
*/
public static List<Map<String,Object>> getValidSkuProList(int level,List<Map<String,Object>> optionList, String goodsCode){
Set<String> optionSet = new HashSet<>(); // 所有option
Set<String> validSet = new HashSet<>(); // 有效option
// 获取所有option
for(Iterator<Map<String,Object>> iterator = optionList.iterator(); iterator.hasNext();){
Map<String,Object> skuMap = iterator.next();
List<Map<String,Object>> options = (List<Map<String, Object>>) skuMap.get("options");
for(Iterator<Map<String,Object>> iterator2 = options.iterator(); iterator2.hasNext();){
Map<String,Object> optionMap = iterator2.next();
optionSet.add(optionMap.get("optionCode").toString());
}
}
// 获取可展示的sku列表
List<Map<String, Object>> skuList = SkuUtil.querySkuList(goodsCode);
for(Iterator<Map<String,Object>> iterator = skuList.iterator(); iterator.hasNext();){
Map<String,Object> skuMap = iterator.next();
int skuStatus = NumberUtil.getInt(skuMap.get("skuStatus"),-1);
if(skuStatus == 0){
iterator.remove();
}
}
// 获取可用的optionCode
for(String key: optionSet){
for(Map<String,Object> skuMap: skuList){
String skuOptionCodes = StringUtil.getString(skuMap.get("skuOptionCodes"));
if(skuOptionCodes.contains(key)){
validSet.add(key);
continue;
}
}
}
// 排除无用optionCode
for(Iterator<Map<String,Object>> iterator = optionList.iterator(); iterator.hasNext();){
Map<String,Object> skuMap = iterator.next();
List<Map<String,Object>> options = (List<Map<String, Object>>) skuMap.get("options");
for(Iterator<Map<String,Object>> iterator2 = options.iterator(); iterator2.hasNext();){
Map<String,Object> optionMap = iterator2.next();
String optionCode = StringUtil.getString(optionMap.get("optionCode"));
if(!validSet.contains(optionCode)){
iterator2.remove();
}
}
}
return optionList;
}