gulimall-分布式基础篇-平台属性完善
一、获取属性分组的关联的所有属性
1.1 attrGroupController
因为我们返回的是分组下的属性(就是属性),所以使用attrService
@GetMapping("/{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId){
List<AttrEntity> data = attrService.getRelationAttr(attrgroupId);
return R.ok().put("data", data);
}
1.2 attrServiceImpl
/**
* 根据分组id查找关联的所有基本属性
* @param attrgroupId
* @return
*/
@Override
public List<AttrEntity> getRelationAttr(Long attrgroupId) {
//通过pms_attr_attrgroup_relation中间表中的attr_group_id找到attrgroupId,然后去attr表中找到对应信息即可
List<AttrAttrgroupRelationEntity> entities = relationDao.selectList(
new QueryWrapper<AttrAttrgroupRelationEntity>().
eq("attr_group_id", attrgroupId));
//找到所有的attrId的集合
List<Long> attrIds = entities.stream().map((attr) -> {
return attr.getAttrId();
}).collect(Collectors.toList());
//解决空指针异常问题,不然直接传到listByIds直接出错
if(attrIds == null || attrIds.size() == 0){
return null;
}
//通过listByIds找到所有的attr实体类
Collection<AttrEntity> attrEntities = this.listByIds(attrIds);
//返回
return (List<AttrEntity>) attrEntities;
}
二、删除属性与分组的关联关系
不希望发送多次请求,使用批量删除
2.1 新建AttrGroupRelationVo
@Data
public class AttrGroupRelationVo {
private Long attrId;
private Long attrGroupId;
}
2.2 AttrGroupController
@PostMapping("/attr/relation/delete")
public R attrRelationDelete(@RequestBody AttrGroupRelationVo[] vos){
attrService.deleteRelation(vos);
return R.ok();
}
2.3 AttrServiceImpl
@Override
public void deleteRelation(AttrGroupRelationVo[] vos) {
//将数组转换为集合list
List<AttrGroupRelationVo> relationVos = Arrays.asList(vos);
// AttrAttrgroupRelationDao relationDao 我们希望使用的是relationDao中使用的AttrAttrgroupRelationEntity这个实体类,所以我们转换
List<AttrAttrgroupRelationEntity> entities = relationVos.stream().map((relationVo) -> {
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(relationVo, relationEntity);
return relationEntity;
}).collect(Collectors.toList());
//根据attrId,attrGroupId批量删除关联关系
relationDao.deleteBatchRelation(entities);
}
2.4 AttrAttrgroupRelationDao.xml
void deleteBatchRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);
2.5 AttrAttrgroupRelationDao.xml
使用多个or,自定义一个方法
<delete id="deleteBatchRelation">
DELETE FROM `pms_attr_attrgroup_relation` WHERE
<!--遍历循环来实现动态取值删除-->
<foreach collection="entities" item="item" separator=" OR ">
(attr_id=#{item.attrId} AND attr_group_id=#{item.attrGroupId})
</foreach>
</delete>
三、获取属性分组没有关联的其他属性
当前属性分组只能关联自己所属分类里面的所有属性
当前分组只能关联别的分组没有引用的属性
3.1 AttrGroupController
@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);
}
3.2 AttrServiceImpl
逻辑
- 当前分类下的其他分组
- 这些分组关联的属性
- 从当前分类的所有属性中移除这些属性
/**
* 获取当前分组没有关联的所有属性
* @param params
* @param attrgroupId
* @return
*/
@Override
public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
//1.当前分组只能关联自己所属分类里面的所有属性
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
//得到分类id
Long catelogId = attrGroupEntity.getCatelogId();
//2.当前分组只能关联别的分组没有引用的属性
//2.1当前分类下的其他分组
List<AttrGroupEntity> attrGroupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
List<Long> collect = attrGroupEntities.stream().map(attrGroupEntity1 -> {
return attrGroupEntity1.getAttrGroupId();
}).collect(Collectors.toList());
//2.2 这些分组关联的属性
List<AttrAttrgroupRelationEntity> relationEntities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", collect));
//属性id的集合
List<Long> attrIds = relationEntities.stream().map((relationEntity) -> {
return relationEntity.getAttrId();
}).collect(Collectors.toList());
//从当前分类的所有属性中移除这些属性
QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>().eq("catelog_id", catelogId).eq("attr_type", ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
if(attrIds != null && attrIds.size() > 0){
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);
});
}
IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), wrapper);
return new PageUtils(page);
}
四、添加属性与分组关联关系
4.1 AttrGroupController
@PostMapping("/attr/relation")
public R attrRelation(@RequestBody List<AttrGroupRelationVo> vos){
relationService.saveBatch(vos);
return R.ok();
}
4.2 AttrAttrgroupRelationServiceImpl
@Override
public void saveBatch(List<AttrGroupRelationVo> vos) {
List<AttrAttrgroupRelationEntity> entities = vos.stream().map((vo) -> {
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
//属性对拷
BeanUtils.copyProperties(vo, relationEntity);
return relationEntity;
}).collect(Collectors.toList());
this.saveBatch(entities);
}