十一、商品服务&平台属性
上一级页面:index-la
十一、商品服务&平台属性
11.1 规格参数新增与VO
11.1.1 获取分类规格参数
具体需求:
查询的数据没有分类和分组
属性分类 和 所属分组居然没有数据?
先查看返回的数据
发现没有 catelogName 和 AttrGroupName 的数据!! 原因是 AttrEntity没有这两个属性
但是他关联了 pms_attr_attrgroup_relation 表 这个表里面有 attr_Group_id 那么思路来了?
1、我先用 attr_id 去 pms_attr_attrgroup_relation中查询出 attr_Group_id 然后通过 attr_Group_id去pms_attr_group 表中查询出 分组的名称
2、自身 attr表中有 catelog_id 那我根据这个id去 category表中查询到 分类的姓名 不就行了吗?
上代码
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {
QueryWrapper<AttrEntity> wrapper = new QueryWrapper<>();
if (catelogId != 0) {
wrapper.eq("catelog_id",catelogId);
}
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)) {
wrapper.and((wrapper1) -> {
wrapper1.eq("attr_id",key).or().like("attr_name",key);
});
}
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
wrapper
);
PageUtils pageUtils = new PageUtils(page);
// 拿到分页记录
List<AttrEntity> records = page.getRecords();
List<AttrRespVo> respVo = records.stream().map((attrEntity) -> {
AttrRespVo attrRespVo = new AttrRespVo();
BeanUtils.copyProperties(attrEntity, attrRespVo);
// 1、设置分类和分组的名字
AttrAttrgroupRelationEntity attr_idEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_id", attrEntity.getAttrId()));
if (attr_idEntity != null) {
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attr_idEntity.getAttrGroupId());
attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
}
CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
if (categoryEntity != null) {
attrRespVo.setCatelogName(categoryEntity.getName());
}
return attrRespVo;
}).collect(Collectors.toList());
pageUtils.setList(respVo);
return pageUtils;
}
但是原先的 AttrEntity 对象里面任然没有这两个属性 ! 怎么解决
1、我直接在 AttrEntity中新建对应的字段不就行了吗? 然后设置成不是数据库的字段
缺点:这样子是不是太乱了?
2、新建一个 VO 抽取出这两个属性 不就行了吗?
@Data
public class AttrRespVo extends AttrVo {
/**
* catelogName 手机数码,所属分类名字
* groupName 主体 所属分组名字
*/
private String catelogName;
private String groupName;
}
11.2 规格参数列表&规格修改
11.2.1、获取分类规格参数
/**
* 获取分类规格参数
attrType 和 catelogId 通用
* @param params
* @param catelogId
* @param type sale 销售属性 base 规格参数
* @return
*/
@GetMapping("/{attrType}/list/{catelogId}")
public R baseAttrList(@RequestParam Map<String,Object> params
,@PathVariable("catelogId") Long catelogId,
@PathVariable("attrType") String type) {
PageUtils page = attrService.queryBaseAttrPage(params,catelogId,type);
return R.ok().put("page",page);
}
实现类
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId, String type) {
// 先根据 attr_type字段进行查询 该字段表示 1是基本属性 0是销售属性,基本属性和销售属性我们放在一张表内
QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>()
.eq("attr_type","base".equalsIgnoreCase(type)?
ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode():
ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());
// 分类id不等于0 按照分类id进行查询
if (catelogId != 0) {
wrapper.eq("catelog_id",catelogId);
}
// 取出参数 key,进行条件查询
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)) {
wrapper.and((wrapper1) -> {
wrapper1.eq("attr_id",key).or().like("attr_name",key);
});
}
// 封装分页数据
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
wrapper
);
PageUtils pageUtils = new PageUtils(page);
// 拿到全部的分页记录
List<AttrEntity> records = page.getRecords();
// 查询所属分类以及所属分组
List<AttrRespVo> respVo = records.stream().map((attrEntity) -> {
// 实例化数据传输对象 将 attrEntity的分类名字以及分组名字 复制到该对象
AttrRespVo attrRespVo = new AttrRespVo();
BeanUtils.copyProperties(attrEntity, attrRespVo);
// Controller地址如果是 基础 才进行查询分裂
if("base".equalsIgnoreCase(type)){
// 1、根据attr_id 查询到 attr和 attrGroup的关系表
AttrAttrgroupRelationEntity attr_idEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_id", attrEntity.getAttrId()));
//查询到的关系对象以及分组id不为空
if (attr_idEntity != null && attr_idEntity.getAttrGroupId()!=null) {
// 根据分组id查询到分组信息
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attr_idEntity.getAttrGroupId());
attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
}
}
// 根据attrEntity的分类id 查询到分类对象并设置分类姓名
CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
if (categoryEntity != null) {
attrRespVo.setCatelogName(categoryEntity.getName());
}
return attrRespVo;
}).collect(Collectors.toList());
//封装到分页工具类
pageUtils.setList(respVo);
return pageUtils;
}
先是根据 catelog_id
查询到AttrEntity
对象 该对象里拥有 attr_id
然后根据attr_id 去 pms_attr_attrgroup_relation
表进行查询
11.2.2、查询属性详情
Controller
/**
* 信息
*/
@RequestMapping("/info/{attrId}")
public R info(@PathVariable("attrId") Long attrId){
AttrRespVo attr = attrService.getAttrInfo(attrId);
return R.ok().put("attr", attr);
}
Service 实现
@Override
public AttrRespVo getAttrInfo(Long attrId) {
// 实例化封装VO数据对象
AttrRespVo attrRespVo = new AttrRespVo();
// 根据attrid查询出商品属性
AttrEntity attrEntity = this.getById(attrId);
// 将商品属性对象的属性复制到 VO数据对象
BeanUtils.copyProperties(attrEntity, attrRespVo);
// attrType == 1为基本类型才进行查询分组信息
if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()) {
// 根据 attr_id 查询到 商品属性以及商品分组关系表
AttrAttrgroupRelationEntity relationEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_id", attrId));
if (relationEntity != null) {
// 设置分组id
attrRespVo.setAttrGroupId(relationEntity.getAttrGroupId());
// 分组&商品信息关系表拿到分组id 查询到分组对象
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(relationEntity.getAttrGroupId());
if (attrGroupEntity != null) {
//不为空设置分组姓名
attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
}
}
}
// 从当前商品属性对象中拿到分类id进行设置分类信息
Long catelogId = attrEntity.getCatelogId();
// 根据 catelogId 查询到分类 父 子 孙 路径
Long[] catelogPath = categoryService.findCatelogPath(catelogId);
attrRespVo.setCatelogPath(catelogPath);
//最后根据分类id 查询到分类对象 并进行设置分类姓名
CategoryEntity categoryEntity = categoryService.getById(catelogId);
if (categoryEntity != null) {
attrRespVo.setCatelogName(categoryEntity.getName());
}
return attrRespVo;
}
主要理解: 先是根据 attrId
查询到商品属性 然后根据 attrId 查询到分类关系表 该表中有分组id attrGroup_id 通过这个查询到 分组对象信息,
,同时在 商品属性表中拿到 分类id 通过分类id 查询到 查询到分类对象 同时根据 分类id查询对应层级关系,并设置分类姓名
11.3.3、销售属性
销售属性 和 基本属性 通过一个字段来区分,对应的修改,查询 都用的同一个方法,所以在方法的中 也进行了对应的判断
保存
@Override
public void saveAttr(AttrVo attr) {
AttrEntity attrEntity = new AttrEntity();
BeanUtils.copyProperties(attr, attrEntity);
// 保存基本数据
this.save(attrEntity);
// 2、保存关联关系
// 等于1 说明基本属性 才进行保存分组关系
if (attr.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode() && attr.getAttrGroupId() != null) {
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
relationEntity.setAttrGroupId(attr.getAttrGroupId());
relationEntity.setAttrId(attrEntity.getAttrId());
relationDao.insert(relationEntity);
}
}
修改
@Transactional
@Override
public void updateAttr(AttrVo attr) {
// Vo数据传输对象属性拷贝到 attrEntity对象
AttrEntity attrEntity = new AttrEntity();
BeanUtils.copyProperties(attr, attrEntity);
this.updateById(attrEntity);
// attrType 等于 1 也就是基本属性
if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()) {
//1、修改分组关联
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
// 设置attrid 以及 分组id
relationEntity.setAttrId(attr.getAttrId());
relationEntity.setAttrGroupId(attr.getAttrGroupId());
// 关系表中根据attr_id 进行更新
relationDao.update(relationEntity, new UpdateWrapper<AttrAttrgroupRelationEntity>().
eq("attr_id", attr.getAttrId()));
// 根据 attr_id 是否可以查询到结果
Integer count = relationDao.selectCount(new QueryWrapper<AttrAttrgroupRelationEntity>().
eq("attr_id", attr.getAttrId()));
// 查得到
if (count > 0) {
// 进行更新
relationDao.update(relationEntity, new UpdateWrapper<AttrAttrgroupRelationEntity>().
eq("attr_id", attr.getAttrId()));
} else {
// 查不到意味着 没有该记录 则进行插入
relationDao.insert(relationEntity);
}
}
}
11.3 查询分类关联属性&删除关联&查询分组未关联属性
11.3.1、获取属性分组的关联的所有属性
/**
* 获取属性分组的关联的所有属性
* @param attrgroupId
* @return
*/
@GetMapping("/{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId) {
List<AttrEntity> entityList = attrService.getRelationAttr(attrgroupId);
return R.ok().put("data", entityList);
}
Service 实现
/**
* 根据分组id查找关联的所有基本属性
* @param attrgroupId
* @return
*/
@Override
public List<AttrEntity> getRelationAttr(Long attrgroupId) {
// 根据attr_group_id 查询到 关系表
List<AttrAttrgroupRelationEntity> entities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_group_id", attrgroupId));
// 从关系表中 取到 属性id
List<Long> attrIds = entities.stream().map((attr) -> {
return attr.getAttrId();
}).collect(Collectors.toList());
if (attrIds == null || attrIds.size() == 0) {
return null;
}
// 按照属性id进行查询
Collection<AttrEntity> attrEntities = this.listByIds(attrIds);
return (List<AttrEntity>) attrEntities;
}
已知有参数 attr_group_id 进行查询 能查到 attr_id,在利用 attr_id 查询到 attr相关信息
11.3.2、删除属性与分组的关联关系
/**
* 删除属性与分组的关联关系
* @param relationVo
* @return
*/
@PostMapping("/attr/relation/delete")
public R deleteRelation(@RequestBody AttrGroupRelationVo[] relationVo) {
attrService.deleteRelation(relationVo);
return R.ok();
}
Service 实现
@Override
public void deleteRelation(AttrGroupRelationVo[] relationVo) {
// 转成 list 进行stream流处理
List<AttrAttrgroupRelationEntity> entities = Arrays.asList(relationVo).stream().map((item) -> {
// 将 item对应属性拷贝到 relationEntity对象中
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(item, relationEntity);
return relationEntity;
}).collect(Collectors.toList());
// id批量删除
relationDao.deleteBatchRelation(entities);
}
deleteBatchRelation 方法
<delete id="deleteBatchRelation">
DELETE FROM `pms_attr_attrgroup_relation` WHERE
<!- 循环遍历进行删除 使用的是 or-->
<foreach collection="entities" item="item" separator=" OR ">
( attr_id=#{item.attrId} AND attr_group_id=#{item.attrGroupId} )
</foreach>
</delete>
11.3.3、查询分组未关联属性
@GetMapping("/{attrgroupId}/noattr/relation")
public R attrNoRelation(@PathVariable("attrgroupId") Long attrgroupId,
@RequestParam Map<String, Object> params) {
PageUtils page = attrService.getNoRelationAttr(params,attrgroupId);
return R.ok().put("page",page);
}
Service
@Override
public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
// 1、当前分组只能关联自己所属分类里面的所有属性
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
Long catelogId = attrGroupEntity.getCatelogId();
//2、当前分组只能关联别的分组没有引用的属性
//2.1 当前分类下的 **其他分组** 根据分类id进行查询
List<AttrGroupEntity> group = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>()
.eq("catelog_id", catelogId));
// 拿到分组id
List<Long> collect = group.stream().map(item -> {
return item.getAttrGroupId();
}).collect(Collectors.toList());
//2.2 这些分组关联的属性 根据分组id查询出关联表
List<AttrAttrgroupRelationEntity> groupId = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>()
.in("attr_group_id", collect));
// 拿到所有的属性id
List<Long> attrIds = groupId.stream().map((item) -> {
return item.getAttrId();
}).collect(Collectors.toList());
//2.3 从当前分类的所有属性中移除这些属性
QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>()
.eq("catelog_id", catelogId)
.eq("attr_type", ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
// attrIds 属性id数组不为空
if (attrIds != null && attrIds.size() > 0) {
// 在attrids 数组中得id不用进行查询
wrapper.notIn("attr_id", attrIds);
}
//取出参数进行 对应条件查询
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)) {
wrapper.and((w) -> {
w.eq("attr_id", key).or().like("attr_name", key);
});
}
// 根据分页数据 以及 wrapper进行查询
IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), wrapper);
PageUtils pageUtils = new PageUtils(page);
return pageUtils;
}
11.4.4、新增分组与属性关联
@PostMapping("/attr/relation")
public R addRelation(@RequestBody List<AttrGroupRelationVo> attrGroupRelationVo) {
attrAttrgroupRelationService.saveBatch(attrGroupRelationVo);
return R.ok();
}
Service
@Override
public void saveBatch(List<AttrGroupRelationVo> attrGroupRelationVo) {
List<AttrAttrgroupRelationEntity> collect = attrGroupRelationVo.stream().map((item) -> {
// 复制属性 返回
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(item, relationEntity);
return relationEntity;
}).collect(Collectors.toList());
this.saveBatch(collect);
}
业务之间需要多种测试 各种判断