1. 程式人生 > >規格引數介面總結

規格引數介面總結

介面層

   
    @ApiOperation(value = "規格引數介面", notes = "規格引數業務", produces = "application/json")
    @PostMapping("/Specifications")
    public BaseResponse<Map<String,Object>> list1(@RequestHeader(name = "Authorization", defaultValue = "token") String token,
                                                  @RequestBody ProductAttrMember productAttrMember 
                                    ) throws IOException {
        _logger.info("規格引數介面");
        Integer productId=productAttrMember.getProductId();
        String goodId=productAttrMember.getGoodId();
        Map<String, Object> dataMap=new HashMap<>();
        
    // 組裝商品規格資訊
    List<ProductNorm> normList = new ArrayList<ProductNorm>();
    Map<String, ProductNorm> normMap = new HashMap<String, ProductNorm>();
    Map<String, ProductNormAttr> attrMap = new HashMap<String, ProductNormAttr>();
    // 記錄有效的規格組合
    List<String> effectAttr = new ArrayList<>();
    boolean def = false;
    boolean defWithId = false;
  //獲得貨品資訊,預設取第一個 包含某規格商品的庫存及價格資訊 
    ServiceResult<List<ProductGoods>> goodsServiceResult = productGoodsService
        .getGoodSByProductId(productId);
    List<ProductGoods> goods = goodsServiceResult.getResult();

    if (goods == null || goods.size() == 0) {
        dataMap.put("info", "貨品資訊為空。");
        return new BaseResponse<Map<String,Object>>(false,null,"商品資訊為空");
    }
    for (ProductGoods good : goods) {
        String normName = good.getNormName(); // 如:顏色,紅色;記憶體,4G
        String normAttrId = good.getNormAttrId(); // 如:1,17

        if (StringUtil.isEmpty(normName, true)) {
            // 規則屬性為空則表示該商品沒有啟用規格(只有一個貨品)
            // 設定預設貨品,只有一個貨品時設定該貨品
            dataMap.put("商品資訊", good);
            continue;
        }

        if (good.getState() == null || good.getState().intValue() == ProductGoods.DISABLE) {
            // 貨品沒有啟用則規格不參與組裝
            continue;
        }

        // 獲取預設顯示的貨品,不管id為goodId的貨品存在與否、啟用與否,必須設定一個預設的貨品
        if (!defWithId) {
            if (good.getId().equals(goodId)) {
                defWithId = true;
                def = true;
                // 如果有指定ID的貨品,設定指定ID的貨品為預設貨品
                dataMap.put("商品資訊", good);
            } else if (!def) {
                // 設定預設貨品,有多個貨品時,第一個有效貨品為預設貨品
                dataMap.put("商品資訊", good);
                def = true;
            }
        }

        effectAttr.add(normAttrId);

        String[] normNameSplit = normName.split(";");
        String[] normAttrIdSplit = normAttrId.split(",");

        if (normNameSplit.length > 0) {
            // 迴圈
            for (int i = 0; i < normNameSplit.length; i++) {
                String name = normNameSplit[i];

                // 得到類似:顏色,紅色的值,顏色為規格名稱,紅色為規格的值
                String[] cellName = name.split(",");

                if (normMap.get(cellName[0]) == null) {
                    // 如果規格map中沒有當前規格,則新增規格和對應的規格值
                    ProductNorm norm = new ProductNorm();
                    norm.setName(cellName[0]);
                    // 儲存規則名稱
                    normList.add(norm);
                    normMap.put(cellName[0], norm);
                    // 儲存規則值
                    List<ProductNormAttr> attrList = new ArrayList<ProductNormAttr>();
                    ProductNormAttr attr = new ProductNormAttr();
                    attr.setId(ConvertUtil.toInt(normAttrIdSplit[i], 0));
                    attr.setName(cellName[1]);
                    attrList.add(attr);
                    norm.setAttrList(attrList);

                    // 記錄到map中防止重複新增
                    attrMap.put(cellName[1], attr);
                } else {
                    // 如果規格map中有當前規格,則不新增規格,對應的規格值再判斷是否已經存在決定是否新增
                    ProductNorm norm = normMap.get(cellName[0]);

                    // 判斷是否已有規則值,如果沒有則新增,有則不再新增
                    if (attrMap.get(cellName[1]) == null) {
                        // 規則值
                        List<ProductNormAttr> attrList = norm.getAttrList();
                        ProductNormAttr attr = new ProductNormAttr();
                        attr.setId(ConvertUtil.toInt(normAttrIdSplit[i], 0));
                        attr.setName(cellName[1]);
                        attrList.add(attr);
                        norm.setAttrList(attrList);
                        // 記錄到map中防止重複新增
                        attrMap.put(cellName[1], attr);
                    }
                }
            }
        }
    }
    // 有效貨品包含的規格
    dataMap.put("有效商品包含的規格", normList);
    // 規格數量
    dataMap.put("規格數量", normList.size());
    // 有效的規格組合
    dataMap.put("有效的規格組合", new Gson().toJson(effectAttr));
    return new BaseResponse<>(true,dataMap,null);
 }