携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
开发流程如下: 开发需求,就像在线接口文档如下https://easydoc.net/s/78237135/ZUqEdvA4/OXTgKobR这里一样, 别人告诉你需要什么功能,需要返回什么样的数据,你就通过接口的形式把他们呢实现出来即可!
商品新增vo抽取
设置完属性,点击保存之后取消保存,复制控制台输出
[在线JSON字符串转Java实体类(JavaBean、Entity)-BeJSON.com](https://www.bejson.com/json2javapojo/new/)
直接解析json数据封装成实体类
这里我简单截取一个主要的Vo
此Vo包括每个步骤所携带的数据,有的是单个字段有的是一个集合
逻辑不难,难点是要理清逻辑,注意细节!
@Data
public class SpuSaveVo {
@NotEmpty(groups = {AddGroup.class})
private String spuName;
private String spuDescription;
@NotEmpty(groups = {AddGroup.class})
private Long catalogId;
@NotEmpty(groups = {AddGroup.class})
private Long brandId;
private double weight;
private int publishStatus;
private List<String> decript;
private List<String> images;
private Bounds bounds;
@NotEmpty(groups = {AddGroup.class})
private List<BaseAttrs> baseAttrs;
@NotEmpty(groups = {AddGroup.class})
private List<Skus> skus;
}
商品新增业务流程分析
逻辑很简单那,就是把
数据保存到多张表中因为这个
Vo收集的数据很多,包括每个步骤你所选择的数据
这个业务逻辑并不复杂,写这个逻辑之前我们一定要对每张表都非常熟悉,并且我们还要对它们之间的关系很清楚,因为下面的业务都是把数据保存到多张表中!
1.保存spu基本信息 pms_spu_info
因为所有传来的信息都在vo里,所以我们把信息拷贝到对应的实体类中,如果vo没有的那就可以自己赋值
表结构如下:
这里的infoEntity.setCreateTime(new Date());infoEntity.setUpdateTime(new Date());是因为前端传入的是没有这两个字段的,我们自己赋值即可
SpuInfoEntity infoEntity = new SpuInfoEntity();
BeanUtils.copyProperties(vo, infoEntity);
infoEntity.setCreateTime(new Date());
infoEntity.setUpdateTime(new Date());
this.saveBaseInfo(infoEntity);
2.保存spu的描述图片 pms_spu_info_desc
保存哪个数据到哪个表,就注入那个service
String.join()的作用是把集合中的元素通过","分割形成一个一个的字符串
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
从vo中获取所有图片集合 调用图片service进行保存,保存只需要两个点 图片id和url地址,传入对象即可
List<String> images = vo.getImages();
imagesService.saveImages(infoEntity.getId(), images);
4.保存spu的规格参数 pms_product_attr_value
从vo中获取所有规格参数集合 对规格参数集合进行遍历,设置每项的属性
List<BaseAttrs> baseAttrs = vo.getBaseAttrs();
List<ProductAttrValueEntity> collect = baseAttrs.stream().map((attr) -> {
ProductAttrValueEntity valueEntity = new ProductAttrValueEntity();
valueEntity.setAttrId(attr.getAttrId());
AttrEntity id = attrService.getById(attr.getAttrId());
valueEntity.setAttrName(id.getAttrName());
valueEntity.setAttrValue(attr.getAttrValues());
valueEntity.setQuickShow(attr.getShowDesc());
valueEntity.setSpuId(infoEntity.getId());
return valueEntity;
}).collect(Collectors.toList());
attrValueService.saveProductAttr(collect);
5.保存spu的积分信息 mall_sms -> sms_spu_bounds
保存积分信息,这里用到了另外一个微服务 其实就是调用另一个微服务的保存积分方法...
Bounds bounds = vo.getBounds();
SpuBoundTo spuBoundTo = new SpuBoundTo();
BeanUtils.copyProperties(bounds, spuBoundTo);
spuBoundTo.setSpuId(infoEntity.getId());
R r0 = couponFeignService.saveSpuBounds(spuBoundTo);
if (r0.getCode() != 0) {
log.error("远程保存spu积分信息异常");
}
couponFeignService.saveSpuBounds(spuBoundTo);