【B2C-爱购物商城】 开发文档 day09

版权声明:★Study hard and make progress every day.☺★ https://blog.csdn.net/qq_38225558/article/details/86586325

sku属性管理

1、数据库t_sku表重新设计:
在这里插入图片描述
2、编写代码

service:

//添加sku属性
void addSkus(Long productId, List<Map<String,Object>> skuProperties, List<Map<String,Object>> skuDatas);
//通过商品id查询sku
List<Sku> querySkus(Long productId);

实现类:

@Autowired
private ProductMapper productMapper;
@Autowired
private ProductExtMapper productExtMapper;
@Autowired
private SkuMapper skuMapper;

@Override
public void addSkus(Long productId, List<Map<String,Object>> skuProperties, List<Map<String,Object>> skuDatas) {
    Product product = productMapper.selectById(productId);
    //skuProperties修改到product
    product.setSkuTemplate(JSONArray.toJSONString(skuProperties));
    productMapper.updateById(product);
    //skuDatas放入sku表
    //1 删除原来的
    EntityWrapper<Sku> wapper = new EntityWrapper<>();
    wapper.eq("productId", productId);
    skuMapper.delete(wapper);

    //2 插入新的
    Map<String,Object> otherProp = new HashMap<>();
    for (Map<String, Object> skuData : skuDatas) {
        Sku sku = new Sku();
        //处理了四个字段
        sku.setProductId(productId);
        for (String key : skuData.keySet()) {
            //price,stock,state是直接传递进来
            if ("price".equals(key)){
                sku.setPrice(Integer.valueOf(skuData.get(key).toString()));
            }
            else  if ("stock".equals(key)){
                sku.setStock(Integer.valueOf(skuData.get(key).toString()));
            }
            else if ("state".equals(key)){
                Integer state = (Integer) skuData.get(key);
                sku.setState(state==1?true:false);
            }else{//others 身高 三维
                otherProp.put(key, skuData.get(key));
            }
        }
        //处理其他值
        List<Map<String,Object>> tmps = new ArrayList<>();
        for (String key : otherProp.keySet()) {
            Map<String,Object> map = new HashMap<>();
            String properName = key;
            Long properId = getProId(skuProperties,properName);//TODO
            Object proValue = otherProp.get(key);//TODO
            map.put("id", properId);
            map.put("key", properName);
            map.put("value", proValue);
            tmps.add(map);
        }
        String skuValues = JSONArray.toJSONString(tmps);
        sku.setSkuValues(skuValues);

        //indexDexs 1_2_3
        StringBuilder sb = new StringBuilder();
        for (Map<String, Object> map : tmps) {
            Long id = (Long) map.get("id"); //1 定位是哪个属性
            String value = String.valueOf(map.get("value").toString()) ; //定位是哪个选项
            Integer index = getIndex(skuProperties,id,value);
            sb.append(index).append("_");
        }
        String indexDexs =  sb.toString();
        indexDexs=  indexDexs.substring(0, indexDexs.lastIndexOf("_"));
        sku.setIndexs(indexDexs);
        skuMapper.insert(sku);
    }
}

@Override
public List<Sku> querySkus(Long productId) {
    Wrapper<Sku> w = new EntityWrapper<>();
    w.eq("productId", productId);
    return   skuMapper.selectList(w);
}

//获取某个属性选项索引值

/**
 *  从所有的属性(里面包含选项)拿到某个属性某个选项索引值.
 * @param skuProperties 所有的属性(里面包含选项)
 * @param proId 要获取哪个属性
 * @param value 哪个选项
 * @return
 */
private Integer getIndex(List<Map<String, Object>> skuProperties, Long proId, String value) {
    for (Map<String, Object> skuProperty : skuProperties) {
        Long proIdTmp = Long.valueOf(skuProperty.get("id").toString());
        if (proIdTmp.longValue() == proId.longValue()){
            //找到属性的选项
            List<String> skuValues = (List<String>) skuProperty.get("skuValues");
            int index = 0;
            for (String skuValue : skuValues) {
                if(skuValue.equals(value)){
                    return index;
                }
                index++;
            }
        }
    }
    return null;
}

private Long getProId(List<Map<String,Object>> skuProperties, String properName) {
    for (Map<String,Object> skuProperty : skuProperties) {
        Long spId = Long.valueOf(skuProperty.get("id").toString()) ;
        String spName = (String) skuProperty.get("name");
        if (properName.equals(spName)){
            return spId;
        }
    }
    return null;
}

controller:

/**
 * 保存、修改
 * @param params  传递的实体
 * @return Ajaxresult转换结果
 */
@RequestMapping(value="/addSkus",method= RequestMethod.POST)
public AjaxResult addSkus(@RequestBody Map<String,Object> params){
    try {
        Integer tmp = (Integer) params.get("productId"); //Integer
        Long productId = Long.parseLong(tmp.toString());
        //[{id:1,name:xxx,skuValus[]},id:1,name:xxx,skuValus[]}]
        List<Map<String,Object>> skuProperties = (List<Map<String,Object>>) params.get("skuProperties");
        //skuDatas [{'身高':18,"price":18},{'身高':18,"price":18}]
        List<Map<String,Object>> skuDatas = (List<Map<String,Object>>) params.get("skuDatas");
        //sku{id:xx,price:xxx,skuValues:[{id,key,value},{}],indexs:1_2_3}
        productService.addSkus(productId,skuProperties,skuDatas);
        return AjaxResult.me();
    } catch (Exception e) {
        e.printStackTrace();
        return AjaxResult.me().setSuccess(false).setMessage("保存sku属性失败!"+e.getMessage());
    }
}

@RequestMapping(value = "/skus/{productId}",method = RequestMethod.GET)
public List<Map<String,Object>> querySkus(@PathVariable("productId") Long productId){
    List<Sku> skus = productService.querySkus(productId);
    List<Map<String,Object>> result = new ArrayList<>();
    //把skuValues要进行转换
    for (Sku sku : skus) {
        result.add(sku2map(sku));
    }
    return result;
}

private Map<String,Object> sku2map(Sku sku) {
    Map<String,Object> result = new LinkedHashMap<>();
//        result.put("id",sku.getId() );
//        result.put("productId",sku.getProductId() );
//        result.put("indexs",sku.getIndexs() );
    //[{"id":37,"key":"三维","value":"d"},{"id":36,"key":"身高","value":"c"},{"id":35,"key":"肤色","value":"a"}]
    String skuValues = sku.getSkuValues();
    List<Map> maps = JSONArray.parseArray(skuValues, Map.class);
    //{"id":37,"key":"三维","value":"d"}
    for (Map map : maps) {
        String key = (String) map.get("key");
        String value = (String) map.get("value");
        result.put(key, value);
    }
    result.put("price",sku.getPrice() );
    result.put("stock",sku.getStock() );
    result.put("state",sku.getState() );
    return result;
}

3、前端代码略
在这里插入图片描述


源码和文档: https://pan.baidu.com/s/1-VTwO-x-KEO9-S0R4NdCWg

猜你喜欢

转载自blog.csdn.net/qq_38225558/article/details/86586325