/ * 解析属性,得到属性格式 * @param id * @param jsonStr * @return */ public ResponseVO getAttrFormat(Integer id, String jsonStr) { if (id == null){ return ResponseVO.error("请选择商品"); } Product product = productMapper.selectByPrimaryKey(id); if (product == null){ return ResponseVO.error("商品不存在"); } AttrDetailDto detailDTO = analysisAttr(jsonStr); List<ProductSkuDto> newList = new ArrayList<>(); for (Map<String, Map<String,String>> map : detailDTO.getRes()) { // 封装结果 ProductSkuDto productSkuDto = new ProductSkuDto(); productSkuDto.setDetail(map.get("detail")); productSkuDto.setCost(product.getCost()); productSkuDto.setPrice(product.getPrice()); productSkuDto.setSales(product.getSales()); productSkuDto.setLogo(product.getLogo()); newList.add(productSkuDto); } return ResponseVO.success(newList); } / * 解析属性规则算法 * @param jsonStr * @return */ public AttrDetailDto analysisAttr(String jsonStr){ JSONObject jsonObject = JSON.parseObject(jsonStr); List<ProductAttrDto> productAttrList = JSONArray.parseArray(jsonObject.get("attrs").toString(), ProductAttrDto.class); // 声明当前属性所拥有规格模板 List<String> currentAttrSpecTemp = new ArrayList<>(); List<Map<String,Map<String,String>>> res =new ArrayList<>(); if(productAttrList.size() > 1){ // 如果大于1,说明增加了多个属性 for (int i=0; i<productAttrList.size()-1; i++){// 遍历属性 if(i == 0) { // 如果是第一个属性 获取第一个属性的元素规格列表,给模板temp0进行遍历操作,如果不是,说明已经拼接过一轮,继续拼接 currentAttrSpecTemp = productAttrList.get(i).getDetail(); } // 清空初始化模板集合,用于存储拼接后的规格信息,注意,只能在这个位置初始化,如果拿到上一个for循环之上,下面给将skuTemp实例的引用赋值之后(currentAttrSpecTemp = skuTemp),currentAttrSpecTemp就会因为skuTemp.add(skuDetail);而实时增加数据,导致出现ConcurrentModificationException异常 List<String> skuTemp = new LinkedList<>(); // 遍历元素规格列表 for (String skuName : currentAttrSpecTemp) { // 当前元素拼接下一个元素 // 将下一个属性的 元素依次遍历 List<String> nextAttrSpecTemp = productAttrList.get(i + 1).getDetail(); for (String nextSpecName : nextAttrSpecTemp) { String skuDetail = ""; if(i == 0){ // 如果为0,就使用第一属性的名称去拼接第一个规格,用下一个属性名称拼接下一个属性的当前规格 // 颜色_白色-体积_小 skuDetail = productAttrList.get(i).getAttrName() + "_" + skuName + "-" + productAttrList.get(i+1).getAttrName() + "_" + nextSpecName; }else{ // 如果不为0,表示不是第一个属性,那么就使用之前拼接得到的结果,继续拼接 // 颜色_白色-体积_小-温度_冰 skuDetail = skuName + "-" + productAttrList.get(i+1).getAttrName() + "_" + nextSpecName; } // 将解析拼接后的规格存入 skuTemp.add(skuDetail); // 如果是数组中的倒数第二个元素,因为会向后拼接一个元素(productAttrList.get(i+1)),所以此处表示已经拼接结束 if(i == productAttrList.size() - 2){ Map<String,Map<String,String>> skuDetailTemp = new LinkedHashMap<>(); // 将一组结果,拆分成键值对的方式存储 Map<String,String> skuDetailTempKv = new LinkedHashMap<>(); // 根据-分成数组,得到[颜色_白色,体积_小,温度_冰] List<String> attr_sku_arr = Arrays.asList(skuDetail.split("-")); for (String h : attr_sku_arr) { // _分成数组,得到[颜色,白色] List<String> attrBySpecArr = Arrays.asList(h.split("_")); // 如果大于1,说明属性有对应的 规格值 if(attrBySpecArr.size() > 1){ // 按照属性名:规格值的结构存入临时模板列表 skuDetailTempKv.put(attrBySpecArr.get(0), attrBySpecArr.get(1)); }else{ // 未获取到属性名,按空字符串存储 skuDetailTempKv.put(attrBySpecArr.get(0),""); } } // 得到[颜色:白色,体积:小,温度:冰] skuDetailTemp.put("detail",skuDetailTempKv); // 将这一组结果存入到最终将要返回的数据中 res.add(skuDetailTemp); } } } // 走到这里,表示第一个元素和第二个元素已经全部生成完毕,将得到的结果列表交给temp0去执行下一趟 if(!skuTemp.isEmpty()){ // 这里只能将自己的参数给这个值,不能将引用也给他,否则在内循环的时候,就会照成java.util.ConcurrentModificationException currentAttrSpecTemp = skuTemp; } } }else{ // 只有一种属性 List<String> temp0Arr = new ArrayList<>(); // 清空初始化模板集合,用于存储拼接后的规格信息 List<String> skuTemp = new LinkedList<>(); for (ProductAttrDto productAttr : productAttrList) { for (String str : productAttr.getDetail()) { // 这这种属性和其中的规格遍历得到属性规格键值对,不需要拼接下一个属性 Map<String,Map<String,String>> skuDetailTemp = new LinkedHashMap<>(); //List<Map<String,String>> list1 = new ArrayList<>(); temp0Arr.add(productAttr.getAttrName()+"_"+str); Map<String,String> skuDetailTempKv = new LinkedHashMap<>(); skuDetailTempKv.put(productAttr.getAttrName(),str); //list1.add(map1); skuDetailTemp.put("detail",skuDetailTempKv); res.add(skuDetailTemp); // 将解析拼接后的规格存入 skuTemp.add(productAttr.getAttrName() + "-" + str); } currentAttrSpecTemp = skuTemp; } }// 此时已得到每一组的匹配详情,(所有可能产生的匹配结果列表),将其已文本,和键值对的方式返回 AttrDetailDto detailDTO = new AttrDetailDto(); detailDTO.setData(currentAttrSpecTemp); detailDTO.setRes(res); return detailDTO; } @Transactional(rollbackFor = Exception.class) public ResponseVO productAttrAdd(Integer productId, String jsonStr) { JSONObject jsonObject = JSON.parseObject(jsonStr); // 传入属性列表[{"attrName":"颜色","defaulValue":"","isHidden":1,"detail":["白色","黑色"]},{"attrName":"体积","defaulValue":"","isHidden":1,"detail":["小","中","大"]},{"attrName":"温度","defaulValue":"","isHidden":1,"detail":["冰","常温"]}] List<ProductAttrDto> attrDtoList = JSON.parseArray( jsonObject.get("attrs").toString(), ProductAttrDto.class); List<ProductSkuDto> valueDtoList = JSON.parseArray(// 传入解析后的规格详情列表[{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"白色","体积":"小","温度":"冰"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"白色","体积":"小","温度":"常温"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"白色","体积":"中","温度":"冰"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"白色","体积":"中","温度":"常温"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"白色","体积":"大","温度":"冰"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"白色","体积":"大","温度":"常温"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"黑色","体积":"小","温度":"冰"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"黑色","体积":"小","温度":"常温"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"黑色","体积":"中","温度":"冰"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"黑色","体积":"中","温度":"常温"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"黑色","体积":"大","温度":"冰"},"check":false},{"price":120,"cost":0.2,"sales":52,"logo":"https://image.dayouqiantu.cn/5ca011a1cd487.jpg","detail":{"颜色":"黑色","体积":"大","温度":"常温"},"check":false}] jsonObject.get("sku").toString(), ProductSkuDto.class); Product product = productMapper.selectByPrimaryKey(productId); //取最小价格 Double minPrice = product.getPrice(); // 计算库存 Integer stock = product.getStock(); if(attrDtoList.isEmpty() || valueDtoList.isEmpty()){ return ResponseVO.error("请设置至少一个属性!"); }else{ //插入之前清空 productAttrClear(product.getId()); } for (ProductAttrDto attrDto : attrDtoList) { ProductAttr attr = new ProductAttr(); // 记录商品属性 attr.setProductId(productId); attr.setAttrName(attrDto.getAttrName()); attr.setDefaulValue(attrDto.getDefaulValue()); //根据,号拼接商品属性下的规格 "大,中,小" String attrValues = ""; for (String valueName : attrDto.getDetail()){ // 如果未指定默认值,那么就使用第一个 if (attr.getDefaulValue() == null || attr.getDefaulValue().length() == 0){ attr.setDefaulValue(valueName); } attrValues += attrValues.length() > 0 ? "," + valueName : valueName; } attr.setAttrValues(attrValues); productAttrMapper.insertSelective(attr); } for (ProductSkuDto attrValuesDTO : valueDtoList) { ProductSku attrValues = new ProductSku();// 记录商品属性规格详情信息 attrValues.setProductId(productId); List<String> stringList = attrValuesDTO.getDetail().values() .stream().collect(Collectors.toList()); Collections.sort(stringList); // 将属性对应的每一种规格通过,号拼接,存入表中,同一产品唯一 "冰,小,白色" String suk = ""; for (String sukName : stringList){ suk += suk.length() > 0 ? "," + sukName : sukName; } attrValues.setSuk(suk); attrValues.setPrice(attrValuesDTO.getPrice()); attrValues.setCost(attrValuesDTO.getCost()); attrValues.setStock(attrValuesDTO.getSales()); attrValues.setLogo(attrValuesDTO.getLogo()); productSkuMapper.insertSelective(attrValues); // 计算价格 minPrice = minPrice > attrValues.getPrice() ? attrValues.getPrice() : minPrice; // 计算库存 stock += attrValues.getStock(); } Map<String,Object> map = new LinkedHashMap<>(); map.put("attr",jsonObject.get("attr")); map.put("sku",jsonObject.get("sku")); //设置库存及价格 product.setPrice(minPrice); product.setStock(stock); product.setAttrResult(JSON.toJSONString(map)); int result = productMapper.updateByPrimaryKeySelective(product); if (result != 1){ return ResponseVO.error("请设置至少一个属性!"); } return ResponseVO.success(); } / * 清空属性及sku * @param productId * @return */ public void productAttrClear(Integer productId) { productAttrMapper.deleteByProductId(productId); productSkuMapper.deleteByProductId(productId); }
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/14574.html