接口层
@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);
}