谷粒商城分布式基础(十)—— 商品服务API—新增商品 & 商品管理

 


一、商品新增

1、sql脚本测试数据

gulimall_pms.sql

2、调试会员等级相关接口

复制代码
1)检查gulimall-member是否注册到nacos服务中心,并开启服务注册发现功能
  检查配置文件application.yml

  检查主启动程序是否开启服务注册发现功能

复制代码
复制代码
2)gulimall-gateway 修改网关配置值,添加gulimall-member的网关路由
- id: member_route
uri: lb://gulimall-member
predicates:
- Path=/api/member/**
filters:
- RewritePath=/api/(?<segment>/?.*),/$\{segment}
复制代码
3)重启gulimall-gateway和gulimall-member查看效果

3、获取分类关联的品牌

复制代码
(1)新建 com.atguigu.gulimall.product.vo.BrandVo
package com.atguigu.gulimall.product.vo;

import lombok.Data;

@Data
public class BrandVo {
private Long brandId;

private String brandName;
}
(2)com.atguigu.gulimall.product.controller.CategoryBrandRelationController 新增方法 relationBrandsList
/**
* 获取分类关联的品牌
* 1、controller:处理请求,接受和校验数据
* 2、service接受controller传来的数据,进行业务处理
* 3、controller接受service处理完的数据,封装页面指定的vo
* @return
*/
///product/categorybrandrelation/brands/list
@GetMapping("/brands/list")
public R relationBrandsList(@RequestParam(value = "catId", required = true)Long catId){
List<BrandEntity> vos = categoryBrandRelationService.getBrandsByCatId(catId);
List<BrandVo> collect = vos.stream().map(item -> {
BrandVo brandVo = new BrandVo();
brandVo.setBrandId(item.getBrandId());
brandVo.setBrandName(item.getName());
return brandVo;
}).collect(Collectors.toList());
return R.ok().put("data", collect);
}

(3)新增接口和实现类方法getBrandsByCatId
/**
* 获取分类关联的品牌
* @param catId
* @return
*/
@Override
public List<BrandEntity> getBrandsByCatId(Long catId) {
List<CategoryBrandRelationEntity> catelog_id = relationDao.selectList(new QueryWrapper<CategoryBrandRelationEntity>().eq("catelog_id", catId));
List<BrandEntity> collect = catelog_id.stream().map(item -> {
Long brandId = item.getBrandId();
BrandEntity byId = brandService.getById(brandId);
return byId;
}).collect(Collectors.toList());
return collect;
}

(4)bug解决:
  问题:renren-fast-vue中pubsub、publish报错
  解决办法:
    1 npm install --save pubsub-js
    2 在src下的main.js中引用:
      import PubSub from 'pubsub-js'
      Vue.prototype.PubSub = PubSub

(5)效果:
复制代码

4、获取分类下所有分组以及属性

复制代码
1)新建 com.atguigu.gulimall.product.vo.AttrGroupWithAttrsVo;
package com.atguigu.gulimall.product.vo;

import com.atguigu.gulimall.product.entity.AttrEntity;
import lombok.Data;

import java.util.List;

@Data
public class AttrGroupWithAttrsVo {
/**
* 分组id
*/
private Long attrGroupId;
/**
* 组名
*/
private String attrGroupName;
/**
* 排序
*/
private Integer sort;
/**
* 描述
*/
private String descript;
/**
* 组图标
*/
private String icon;
/**
* 所属分类id
*/
private Long catelogId;

private List<AttrEntity> attrs;
}
2)com.atguigu.gulimall.product.controller.AttrGroupController 新增方法 getAttrGroupWithAttrs
/**
* 获取分类下所有分组&关联属性
* @return
*/
///product/attrgroup/{catelogId}/withattr
@GetMapping("/{catelogId}/withattr")
public R getAttrGroupWithAttrs(@PathVariable("catelogId")Long catelogId){
//1、查询当前分类下的所有属性分组
//2、查出每一个属性分组的所有属性
List<AttrGroupWithAttrsVo> vos = attrGroupService.getAttrGroupWithAttrsByCatelogId(catelogId);
return R.ok().put("data", vos);
}

(3)新增接口和实现类方法 getAttrGroupWithAttrsByCatelogId
/**
* 获取分类下所有分组&关联属性
* @param catelogId
* @return
*/
@Override
public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {
//1、查询分组信息
List<AttrGroupEntity> catelog_id = this.list(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
//2、查询所有属性
List<AttrGroupWithAttrsVo> collect = catelog_id.stream().map((group) -> {
AttrGroupWithAttrsVo attrsVo = new AttrGroupWithAttrsVo();
BeanUtils.copyProperties(group, attrsVo);
List<AttrEntity> relationAttr = attrService.getRelationAttr(attrsVo.getAttrGroupId());
attrsVo.setAttrs(relationAttr);
return attrsVo;
}).collect(Collectors.toList());
return collect;
}
效果
复制代码

5、商品新增vo抽取

复制代码
1)操作流程图
 

提交的json信息: 

复制代码
2)利用在线工具生成Java实体类

 

  生成了七个实体类,下载下来,粘贴到 com.atguigu.product.vo包下

复制代码
3)调整生成的vo对象
  (a)调整价格类字段类型为BigDecimal
  (b)调整主键id类型字段为 Long
  (c)删除掉所有set和get方法,使用 @Data 注解
最终结果:
(a)com.atguigu.gulimall.product.vo.Attr
package com.atguigu.gulimall.product.vo;

import lombok.Data;

@Data
public class Attr {

private Long attrId;
private String attrName;
private String attrValue;
}
(b)com.atguigu.gulimall.product.vo.BaseAttrs
package com.atguigu.gulimall.product.vo;

import lombok.Data;

@Data
public class BaseAttrs {

private Long attrId;
private String attrValues;
private int showDesc;

}
(c)com.atguigu.gulimall.product.vo.Bounds
package com.atguigu.gulimall.product.vo;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class Bounds {

private BigDecimal buyBounds;
private BigDecimal growBounds;

}
(d)com.atguigu.gulimall.product.vo.Images
package com.atguigu.gulimall.product.vo;

import lombok.Data;

@Data
public class Images {

private String imgUrl;
private int defaultImg;

}
(e)com.atguigu.gulimall.product.vo.MemberPrice
package com.atguigu.gulimall.product.vo;

import lombok.Data;

import java.math.BigDecimal;

@Data
public class MemberPrice {

private Long id;
private String name;
private BigDecimal price;

}
(f)com.atguigu.gulimall.product.vo.Skus
package com.atguigu.gulimall.product.vo;
import lombok.Data;

import java.math.BigDecimal;
import java.util.List;

@Data
public class Skus {

private List<Attr> attr;
private String skuName;
private BigDecimal price;
private String skuTitle;
private String skuSubtitle;
private List<Images> images;
private List<String> descar;
private int fullCount;
private BigDecimal discount;
private int countStatus;
private BigDecimal fullPrice;
private BigDecimal reducePrice;
private int priceStatus;
private List<MemberPrice> memberPrice;

}
(g)com.atguigu.gulimall.product.vo.SpuSaveVo
package com.atguigu.gulimall.product.vo;
import lombok.Data;

import java.math.BigDecimal;
import java.util.List;

@Data
public class SpuSaveVo {

private String spuName;
private String spuDescription;
private Long catalogId;
private Long brandId;
private BigDecimal weight;
private int publishStatus;
private List<String> decript;
private List<String> images;
private Bounds bounds;
private List<BaseAttrs> baseAttrs;
private List<Skus> skus;

}
复制代码

6、商品新增业务流程分析

复制代码
1)com.atguigu.gulimall.product.controller.SpuInfoController 修改方法 save
  /**
     * 新增商品
     * @param vo
     * @return
     */
    @RequestMapping("/save")
    //@RequiresPermissions("product:spuinfo:save")
    public R save(@RequestBody SpuSaveVo vo){
        //spuInfoService.save(spuInfo);
        spuInfoService.saveSpuInfo(vo);
        return R.ok();
    }

(2)新增接口和实现类方法
saveSpuInfo
/**
* 新增商品
* @param vo
*/
@Override
@Transactional
public void saveSpuInfo(SpuSaveVo vo) {
//1、保存spu基本信息;pms_spu_info

//2、保存spu的描述图片;pms_spu_info_desc

//3、保存spu的图片集;pms_spu_images

//4、保存spu的规格参数;pms_product_attr_value

//5、保存spu的积分信息;gulimall_sms=>sms_spu_bounds

//5、保存当前spu对应的所有sku信息;
//5.1、sku的基本信息;pms_sku_info
//5.2、sku的图片信息;pms_sku_images
//5.3、sku的销售属性信息:pms_sku_sale_attr_value
//5.4、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
复制代码

7、保存SPU基本信息 & 保存SKU基本信息

复制代码
1)修改com.atguigu.gulimall.product.service.impl.SpuInfoServiceImpl 的方法 saveSpuInfo
/**
* 新增商品
* @param vo
*/
@Override
@Transactional
public void saveSpuInfo(SpuSaveVo vo) {
//1、保存spu基本信息;pms_spu_info
SpuInfoEntity infoEntity = new SpuInfoEntity();
BeanUtils.copyProperties(vo, infoEntity);
infoEntity.setCreateTime(new Date());
infoEntity.setUpdateTime(new Date());
this.savBaseSpuInfo(infoEntity);

//2、保存spu的描述图片;pms_spu_info_desc
List<String> decript = vo.getDecript();
SpuInfoDescEntity descEntity = new SpuInfoDescEntity();
descEntity.setSpuId(infoEntity.getId());
descEntity.setDecript(String.join(",",decript));
spuInfoDescService.saveSpuInfoDesc(descEntity);

//3、保存spu的图片集;pms_spu_images
List<String> images = vo.getImages();
spuImagesService.saveImages(images, infoEntity.getId());

//4、保存spu的规格参数;pms_product_attr_value
List<BaseAttrs> baseAttrs = vo.getBaseAttrs();
List<ProductAttrValueEntity> collect = baseAttrs.stream().map(attr -> {
ProductAttrValueEntity valueEntity = new ProductAttrValueEntity();
valueEntity.setAttrId(attr.getAttrId());
AttrEntity byId = attrService.getById(attr.getAttrId());
valueEntity.setAttrName(byId.getAttrName());
valueEntity.setAttrValue(attr.getAttrValues());
valueEntity.setQuickShow(attr.getShowDesc());
valueEntity.setSpuId(infoEntity.getId());
return valueEntity;
}).collect(Collectors.toList());
attrValueService.saveProductAttr(collect);

//5、保存spu的积分信息;gulimall_sms=>sms_spu_bounds

//5、保存当前spu对应的所有sku信息;
//5.1、sku的基本信息;pms_sku_info
List<Skus> skus = vo.getSkus();
if(skus!=null && skus.size()>0){
skus.forEach(item->{
String defaultImg = "";
for (Images image : item.getImages()) {
if(image.getDefaultImg() == 1){
defaultImg = image.getImgUrl();
}
}
SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
BeanUtils.copyProperties(item, skuInfoEntity);
skuInfoEntity.setBrandId(infoEntity.getBrandId());
skuInfoEntity.setCatalogId(infoEntity.getCatalogId());
skuInfoEntity.setSaleCount(0L);
skuInfoEntity.setSpuId(infoEntity.getId());
skuInfoEntity.setSkuDefaultImg(defaultImg);
skuInfoService.saveSkuInfo(skuInfoEntity);

//5.2、sku的图片信息;pms_sku_images
Long skuId = skuInfoEntity.getSkuId();
List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {
SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
skuImagesEntity.setSkuId(skuId);
skuImagesEntity.setImgUrl(img.getImgUrl());
skuImagesEntity.setDefaultImg(img.getDefaultImg());
return skuImagesEntity;
}).collect(Collectors.toList());
skuImagesService.saveBatch(imagesEntities);

//5.3、sku的销售属性信息:pms_sku_sale_attr_value
List<Attr> attr = item.getAttr();
List<SkuSaleAttrValueEntity> skuSaleAttrValueEntitys = attr.stream().map(a -> {
SkuSaleAttrValueEntity attrValueEntity = new SkuSaleAttrValueEntity();
BeanUtils.copyProperties(a, attrValueEntity);
attrValueEntity.setSkuId(skuId);
return attrValueEntity;
}).collect(Collectors.toList());
skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntitys);

//5.4、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price

});
} 
 

(2)com.atguigu.gulimall.product.service.impl.SpuInfoDescServiceImpl 新增接口和实现类方法 saveSpuInfoDesc
/**
* 保存spu的描述图片
* @param descEntity
*/
@Override
public void saveSpuInfoDesc(SpuInfoDescEntity descEntity) {
this.baseMapper.insert(descEntity);
}

(3)com.atguigu.gulimall.product.service.impl.SpuImagesServiceImpl 新增接口和实现方法 saveImages
/**
* 保存spu的图片集
* @param images
* @param id
*/
@Override
public void saveImages(List<String> images, Long id) {
if(images == null || images.size() == 0){

}else{
List<SpuImagesEntity> collect = images.stream().map(img -> {
SpuImagesEntity spuImagesEntity = new SpuImagesEntity();
spuImagesEntity.setSpuId(id);
spuImagesEntity.setImgUrl(img);
return spuImagesEntity;
}).collect(Collectors.toList());
this.saveBatch(collect);
}
}

(4)com.atguigu.gulimall.product.service.impl.ProductAttrValueServiceImpl 新增接口和实现方法 saveProductAttr
/**
* 保存spu的规格参数
* @param collect
*/
@Override
public void saveProductAttr(List<ProductAttrValueEntity> collect) {
this.saveBatch(collect);
}

(5)com.atguigu.gulimall.product.service.impl.SkuInfoServiceImpl 新增接口和实现方法 saveSkuInfo
/**
* sku的基本信息;pms_sku_info
* @param skuInfoEntity
*/
@Override
public void saveSkuInfo(SkuInfoEntity skuInfoEntity) {
this.baseMapper.insert(skuInfoEntity);
}
复制代码

8、调用远程服务保存优惠等信息

复制代码
存在问题:上面还有两个部分没处理
//5、保存spu的积分信息;gulimall_sms=>sms_spu_bounds
//5.4、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
这两个都在远程服务gulimall_coupon(优惠服务)上,那么该如何处理呢

调用远程服务的问题,我们在 谷粒商城分布式基础(四)—— 分布式组件SpringCloud & SpringCloud Alibaba 的 “5、SpringCloud-OpenFeign【网关】” 用feign做过测试
首先必须保证三点:
(a)远程服务必须上线放到注册中心中
  我们在之前已经把gulimall-coupon加到配置中心,并且加到注册中心了
(b)远程服务必须开启服务注册和发现功能
(c)必须开启远程调用功能
复制代码
复制代码
(1)gulimall-product开启远程调用功能

(2)gulimall-product新建文件 com.atguigu.gulimall.product.feign.CouponFeignService
package com.atguigu.gulimall.product.feign;

import com.atguigu.common.to.SkuReductionTo;
import com.atguigu.common.to.SpuBoundTo;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient("gulimall-coupon")
public interface CouponFeignService {

/**
* 远程调用:保存spu的积分信息
* 1CouponFeignService.saveSpuBounds(spuBoundTo);
* 1)@RequestBody将这个对象转为json
* 2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。将上一步转的json放到请求体位置,发送请求
* 3)、对方服务收到请求。请求体里有json数据。
* (@RequestBody SpuBoundsEntity spuBounds):将请求体的json转为SpuBoundsEntity
* 只要json数据模型是兼容的,双方服务无需使用同一个to
*
* @param spuBoundTo
*/
@PostMapping("/coupon/spubounds/save")
R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);

/**
* 5.4sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
* @param skuReductionTo
*/
@PostMapping("/coupon/skufullreduction/saveInfo")
R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
}

(3)修改gulimall-product 中 com.atguigu.gulimall.product.service.impl.SpuInfoServiceImpl 的 saveSpuInfo方法
  其中,通过feign远程调用
/**
* 新增商品
* @param vo
*/
@Override
@Transactional
public void saveSpuInfo(SpuSaveVo vo) {
//1、保存spu基本信息;pms_spu_info
SpuInfoEntity infoEntity = new SpuInfoEntity();
BeanUtils.copyProperties(vo, infoEntity);
infoEntity.setCreateTime(new Date());
infoEntity.setUpdateTime(new Date());
this.savBaseSpuInfo(infoEntity);

//2、保存spu的描述图片;pms_spu_info_desc
List<String> decript = vo.getDecript();
SpuInfoDescEntity descEntity = new SpuInfoDescEntity();
descEntity.setSpuId(infoEntity.getId());
descEntity.setDecript(String.join(",",decript));
spuInfoDescService.saveSpuInfoDesc(descEntity);

//3、保存spu的图片集;pms_spu_images
List<String> images = vo.getImages();
spuImagesService.saveImages(images, infoEntity.getId());

//4、保存spu的规格参数;pms_product_attr_value
List<BaseAttrs> baseAttrs = vo.getBaseAttrs();
List<ProductAttrValueEntity> collect = baseAttrs.stream().map(attr -> {
ProductAttrValueEntity valueEntity = new ProductAttrValueEntity();
valueEntity.setAttrId(attr.getAttrId());
AttrEntity byId = attrService.getById(attr.getAttrId());
valueEntity.setAttrName(byId.getAttrName());
valueEntity.setAttrValue(attr.getAttrValues());
valueEntity.setQuickShow(attr.getShowDesc());
valueEntity.setSpuId(infoEntity.getId());
return valueEntity;
}).collect(Collectors.toList());
attrValueService.saveProductAttr(collect);

//5、保存spu的积分信息;gulimall_sms=>sms_spu_bounds
Bounds bounds = vo.getBounds();
SpuBoundTo spuBoundTo = new SpuBoundTo();
BeanUtils.copyProperties(bounds, spuBoundTo);
spuBoundTo.setSpuId(infoEntity.getId());
R r = couponFeignService.saveSpuBounds(spuBoundTo);
if(r.getCode() != 0){
log.error("远程保存spu积分信息失败");
}

//5、保存当前spu对应的所有sku信息;
//5.1、sku的基本信息;pms_sku_info
List<Skus> skus = vo.getSkus();
if(skus!=null && skus.size()>0){
skus.forEach(item->{
String defaultImg = "";
for (Images image : item.getImages()) {
if(image.getDefaultImg() == 1){
defaultImg = image.getImgUrl();
}
}
SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
BeanUtils.copyProperties(item, skuInfoEntity);
skuInfoEntity.setBrandId(infoEntity.getBrandId());
skuInfoEntity.setCatalogId(infoEntity.getCatalogId());
skuInfoEntity.setSaleCount(0L);
skuInfoEntity.setSpuId(infoEntity.getId());
skuInfoEntity.setSkuDefaultImg(defaultImg);
skuInfoService.saveSkuInfo(skuInfoEntity);

//5.2、sku的图片信息;pms_sku_images
Long skuId = skuInfoEntity.getSkuId();
List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {
SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
skuImagesEntity.setSkuId(skuId);
skuImagesEntity.setImgUrl(img.getImgUrl());
skuImagesEntity.setDefaultImg(img.getDefaultImg());
return skuImagesEntity;
}).filter(entity->{
//返回true就是需要,false就是剔除
return !StringUtils.isEmpty(entity.getImgUrl());
}).collect(Collectors.toList());
skuImagesService.saveBatch(imagesEntities);
//TODO 没有图片路径的无需保存

//5.3、sku的销售属性信息:pms_sku_sale_attr_value
List<Attr> attr = item.getAttr();
List<SkuSaleAttrValueEntity> skuSaleAttrValueEntitys = attr.stream().map(a -> {
SkuSaleAttrValueEntity attrValueEntity = new SkuSaleAttrValueEntity();
BeanUtils.copyProperties(a, attrValueEntity);
attrValueEntity.setSkuId(skuId);
return attrValueEntity;
}).collect(Collectors.toList());
skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntitys);

//5.4、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
SkuReductionTo skuReductionTo = new SkuReductionTo();
BeanUtils.copyProperties(item, skuReductionTo);
skuReductionTo.setSkuId(skuId);
if(skuReductionTo.getFullCount() >0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0"))==1){
R r1 = couponFeignService.saveSkuReduction(skuReductionTo);
if(r1.getCode() != 0){
log.error("远程保存sku优惠信息失败");
}
}
});
}
}

(4)gulimall-common 新建文件 com.atguigu.common.to.SpuBoundTo
package com.atguigu.common.to;

import lombok.Data;
import java.math.BigDecimal;

@Data
public class SpuBoundTo {
private Long spuId;
private BigDecimal buyBounds;
private BigDecimal growBounds;
}

(5)gulimall-common 新建文件 com.atguigu.common.to.SkuReductionTo
package com.atguigu.common.to;

import lombok.Data;
import java.math.BigDecimal;
import java.util.List;

@Data
public class SkuReductionTo {

private Long skuId;
private int fullCount;
private BigDecimal discount;
private int countStatus;
private BigDecimal fullPrice;
private BigDecimal reducePrice;
private int priceStatus;
private List<MemberPrice> memberPrice;
}

(6)gulimall-common 新建文件 com.atguigu.common.to.MemberPrice
package com.atguigu.common.to;

import lombok.Data;
import java.math.BigDecimal;

@Data
public class MemberPrice {

private Long id;
private String name;
private BigDecimal price;
}

(7)gulimall-coupon 中 com.atguigu.gulimall.coupon.controller.SpuBoundsController 修改方法 save
/**
* 保存
*/
@PostMapping("/save")
public R save(@RequestBody SpuBoundsEntity spuBounds){
    spuBoundsService.save(spuBounds);
return R.ok();
}

(8)gulimall-coupon 中 com.atguigu.gulimall.coupon.controller.SkuFullReductionController 新增方法 saveInfo
/**
* sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
* @param skuReductionTo
* @return
*/
@PostMapping("/saveInfo")
public R saveInfo(@RequestBody SkuReductionTo skuReductionTo){
skuFullReductionService.saveSkuReduction(skuReductionTo);
return R.ok();
}

(9)gulimall-coupon 中 com.atguigu.gulimall.coupon.service.impl.SkuFullReductionServiceImpl 新增接口实现方法 saveSkuReduction

/**
* sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
* @param reductionTo
*/
@Override
public void saveSkuReduction(SkuReductionTo reductionTo) {
//1、//5.4、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
//1、保存sms_sku_ladder
SkuLadderEntity skuLadderEntity = new SkuLadderEntity();
skuLadderEntity.setSkuId(reductionTo.getSkuId());
skuLadderEntity.setFullCount(reductionTo.getFullCount());
skuLadderEntity.setDiscount(reductionTo.getDiscount());
skuLadderEntity.setAddOther(reductionTo.getCountStatus());
if(reductionTo.getFullCount() > 0){
skuLadderService.save(skuLadderEntity);
}

//2、保存sms_sku_full_reduction
SkuFullReductionEntity reductionEntity = new SkuFullReductionEntity();
BeanUtils.copyProperties(reductionTo, reductionEntity);
if(reductionEntity.getFullPrice().compareTo(new BigDecimal("0"))==1){
this.save(reductionEntity);
}

//3、保存sms_member_price
List<MemberPrice> memberPrice = reductionTo.getMemberPrice();
List<MemberPriceEntity> collect = memberPrice.stream().map(item -> {
MemberPriceEntity priceEntity = new MemberPriceEntity();
priceEntity.setSkuId(reductionTo.getSkuId());
priceEntity.setMemberLevelId(item.getId());
priceEntity.setMemberLevelName(item.getName());
priceEntity.setMemberPrice(item.getPrice());
priceEntity.setAddOther(1);
return priceEntity;
}).filter(item->{
return item.getMemberPrice().compareTo(new BigDecimal("0"))==1;
}).collect(Collectors.toList());
memberPriceService.saveBatch(collect);
}
(10)测试
  启动 gulimall-product、gulimall-coupon、gulimall-member、gulimall-third-party、gulimall-gateway、renren-fast
复制代码

 

二、商品管理

1、SPU检索

复制代码
1)修改 gulimall-product 中 com.atguigu.gulimall.product.controller.SpuInfoController 的 list 方法
/**
* 列表
*/
@RequestMapping("/list")
//@RequiresPermissions("product:spuinfo:list")
public R list(@RequestParam Map<String, Object> params){
//PageUtils page = spuInfoService.queryPage(params);
PageUtils page = spuInfoService.queryPageByCondition(params);
return R.ok().put("page", page);
}

(2)新增接口和实现类方法 queryPageByCondition
/**
* spu检索
* @param params
* @return
*/
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {
QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
wrapper.and((w)->{
w.eq("id",key).or().like("spu_name",key);
});
}
String status = (String) params.get("status");
if(!StringUtils.isEmpty(status)){
wrapper.eq("publish_status",status);
}
String brandId = (String) params.get("brandId");
if(!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){
wrapper.eq("brand_id",brandId);
}
String catelogId = (String) params.get("catelogId");
if(!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)){
wrapper.eq("catalog_id",catelogId);
}
IPage<SpuInfoEntity> page = this.page(
new Query<SpuInfoEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}

(3)修改application.yml,新增spring的时间格式转换

  最终效果:

复制代码

2、SKU检索

复制代码
1)修改 gulimall-product 中 com.atguigu.gulimall.product.controller.SkuInfoController 的 list 方法
/**
* sku检索
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){
//PageUtils page = skuInfoService.queryPage(params);
PageUtils page = skuInfoService.queryPageByCondition(params);
return R.ok().put("page", page);
}
(2)新增接口和实现类方法 queryPageByCondition
/**
* sku检索
* @param params
* @return
*/
@Override
public PageUtils queryPageByCondition(Map<String, Object> params) {
QueryWrapper<SkuInfoEntity> wrapper = new QueryWrapper<>();
String key = (String) params.get("key");
if(!StringUtils.isEmpty(key)){
wrapper.and((w)->{
w.eq("sku_id",key).or().like("sku_name",key);
});
}
String brandId = (String) params.get("brandId");
if(!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)){
wrapper.eq("brand_id",brandId);
}
String catelogId = (String) params.get("catelogId");
if(!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(brandId)){
wrapper.eq("catalog_id",catelogId);
}
String min = (String) params.get("min");
if(!StringUtils.isEmpty(min)){
wrapper.ge("price",min);
}
String max = (String) params.get("max");
if(!StringUtils.isEmpty(max)){
try{
BigDecimal bigDecimal = new BigDecimal(max);
if(bigDecimal.compareTo(new BigDecimal("0"))==1){
wrapper.le("price",max);
}
}catch (Exception e){

}
}
IPage<SkuInfoEntity> page = this.page(
new Query<SkuInfoEntity>().getPage(params),
wrapper
);
return new PageUtils(page);
}
效果:
复制代码

 

 

 

 

 

  

 

posted @   沧海一粟hr  阅读(583)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示

目录导航