1.销售属性-CRUD
1.1.数据表结构说明
- 销售属性和规格参数(基本属性)共用同一张表 pms_attr
- 通过 attr_type 来区分
0:销售属性
1:基本属性
2:既是销售属性又是基本属性
2.属性分组与属性关联-查询
2.1.功能描述
在 属性分组页面 ,点击 关联 ,弹出 属性分组与属性关联列表 对话框
2.2.API
GET /product/attrgroup/{attrgroupId}/attr/relation
2.3.后台接口实现
AttrGroupController
/**
* 查询属性分组与属性关联关系
* @param attrgroupId 属性分组ID
* @return 当前属性分组的属性集合
*/
@RequestMapping("{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId){
List<AttrEntity> attrEntities = attrService.getAttrRelation(attrgroupId);
return R.ok().put("data", attrEntities);
}
AttrGroupServiceImpl
/**
* 查询属性分组与属性关联关系
* @param attrgroupId 属性分组ID
* @return 当前属性分组的属性集合
*/
@Override
public List<AttrEntity> getAttrRelation(Long attrgroupId) {
// 从 pms_attr_attrgroup_relation 表中查找指定的属性分组
List<AttrAttrgroupRelationEntity> relationEntities = relationDao.selectList(
new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_group_id", attrgroupId));
// 根据属性分组查找到所有的属性ID
List<Long> attrIds = relationEntities.stream().map(relationEntity-> {
return relationEntity.getAttrId();
}).collect(Collectors.toList());
if (attrIds == null || attrIds.size() == 0) {
return null;
}
// 批量查找所有的属性
List<AttrEntity> attrEntities = this.listByIds(attrIds);
return attrEntities;
}
3.属性分组与属性关联-移除
3.1.API
POST /product/attrgroup/attr/relation/delete
//请求参数
[{"attrId":1, "attrGroupId":2}]
//响应数据
{
"msg": "success",
"code": 0
}
3.2.后台接口实现
AttrGroupRelationVO
package com.atguigu.gmall.product.vo;
import lombok.Data;
/**
* @Description:属性分组与属性关联关系 VO 对象
* @Auther: zhangwen
* @Date: 2023-02-22 19:58
* @version: 1.0
*/
@Data
public class AttrGroupRelationVO {
/**
* 属性Id
*/
private Long attrId;
/**
* 属性分组Id
*/
private Long attrGroupId;
}
AttrGroupController
/**
* 移除属性分组与属性关联关系
* @param vos 属性分组与属性关联关系VO对象集合
* @return
*/
@PostMapping("/attr/relation/delete")
public R deleteRelation(@RequestBody AttrGroupRelationVO[] vos){
attrGroupService.deleteRelation(vos);
return R.ok();
}
AttrGroupServiceImpl
/**
* 删除属性与属性分组关联关系
* @param vos 属性分组与属性关联关系VO对象集合
*/
@Override
public void deleteRelation(AttrGroupRelationVO[] vos) {
List<AttrAttrgroupRelationEntity> entities =
Arrays.asList(vos).stream().map(relationVO ->{
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(relationVO, relationEntity);
return relationEntity;
}).collect(Collectors.toList());
relationDao.deleteRelation(entities);
}
AttrAttrgroupRelationDao
package com.atguigu.gmall.product.dao;
import com.atguigu.gmall.product.entity.AttrAttrgroupRelationEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 属性&属性分组关联
*
* @author zhangwen
* @email 1466787185@qq.com
* @date 2023-02-03 16:13:37
*/
@Mapper
public interface AttrAttrgroupRelationDao extends BaseMapper<AttrAttrgroupRelationEntity> {
/**
* 删除属性分组与属性关联关系
* @param entities
*/
void deleteRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);
}
AttrAttrgroupRelationDao.xml
<delete id="deleteRelation">
DELETE FROM pms_attr_attrgroup_relation WHERE
<foreach collection="entities" open="(" close=")" separator=" OR "
item="item">
attr_id = #{item.attrId} AND attr_group_id = #{item.attrGroupId}
</foreach>
</delete>
4.属性分组与属性关联 - 新增关联
4.1.获取属性分组没有关联的其他属性
4.1.1.功能描述
4.1.2.API
GET /product/attrgroup/{attrgroupId}/noattr/relation
4.1.3.后台接口实现
AttrGroupController
/**
* 查询属性分组未关联的属性
* @param attrGroupId
* @return
*/
@GetMapping("/{attrGroupId}/noattr/relation")
public R attrNoRelation(@PathVariable("attrGroupId") Long attrGroupId,@RequestParam Map<String,Object> params){
PageUtils page = attrService.getNoAttrRelation(params,attrGroupId);
return R.ok().put("page", page);
}
AttrServiceImpl
/**
* 查询属性分组未关联的属性
* @param params
* @param attrGroupId
* @return
*/
@Override
public PageUtils getNoAttrRelation(Map<String, Object> params, Long attrGroupId) {
// 当前分组只能关联自己所属的分类里面的所有属性
AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrGroupId);
Long catelogId = attrGroupEntity.getCatelogId();
// 当前分组只能关联别的分组没有引用的属性
// 1. 查找当前分类下的所有属性分组
List<AttrGroupEntity> attrGroupEntities = attrGroupDao.selectList(
new QueryWrapper<AttrGroupEntity>()
.eq("catelog_id", catelogId));
List<Long> attrGroupIds = attrGroupEntities.stream().map(groupEntity -> {
return groupEntity.getAttrGroupId();
}).collect(Collectors.toList());
// 2. 查找分组关联的所有属性id
List<AttrAttrgroupRelationEntity> relationEntities = relationDao.selectList(
new QueryWrapper<AttrAttrgroupRelationEntity>()
.in("attr_group_id", attrGroupIds));
List<Long> attrIds = relationEntities.stream().map(relationEntity -> {
return relationEntity.getAttrId();
}).collect(Collectors.toList());
// 3. 从当前分类的所有属性中移除这些属性
QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>()
.eq("catelog_id", catelogId)
.eq("attr_type", ProductConstant.attrEnum.ATTR_TYPE_BASE.getCode());
if (attrIds != null && attrIds.size() > 0) {
queryWrapper.notIn("attr_id", attrIds);
}
// 若带有查询条件,则需要拼装查询语句
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)) {
queryWrapper.and(wrapper -> {
wrapper.eq("attr_id", key).or().like("attr_name", key);
});
}
IPage<AttrEntity> page = this.page(new Query<AttrEntity>().getPage(params), queryWrapper);
return new PageUtils(page);
}
4.2.新增属性分组与属性关联关系
4.2.1.API
POST /product/attrgroup/attr/relation
//请求参数
[{
"attrGroupId": 0, // 分组id
"attrId": 0, // 属性id
}]
//响应数据
{
"msg": "success",
"code": 0
}
4.2.2.后台接口实现
AttrGroupController
/**
* 新增属性与分组关联关系
* @param vos
* @return
*/
@RequestMapping("/attr/relation")
public R addRelation(@RequestBody List<AttrGroupRelationVO> vos){
relationService.addRelation(vos);
return R.ok();
}
AttrAttrgroupRelationServiceImpl
/**
* 新增属性与分组关联关系
* @param vos
* @return
*/
@Override
public void addRelation( List<AttrGroupRelationVO> vos) {
List<AttrAttrgroupRelationEntity> relationEntities = vos.stream().map(vo -> {
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
BeanUtils.copyProperties(vo,relationEntity);
return relationEntity;
}).collect(Collectors.toList());
//批量保存关联关系
this.saveBatch(relationEntities);
}