10.商品服务-API-平台属性

1 属性分组模糊查询

添加属性分组中查询全部功能设置模糊查询

修改AttrGroupServiceImpl里的querypage方法

@Override
public PageUtils queryPage(Map<String, Object> params, Long catelogId) {
    String key = (String) params.get("key");
    //select * from pms_attr_group where catelog_id=? and (attr_group_id=key or attr_group_name like %key%)
    QueryWrapper<AttrGroupEntity> wrapper = new QueryWrapper<>();
    if (!StringUtils.isEmpty(key)) {
        wrapper.and((obj) -> {
            obj.eq("attr_group_id", key).or().like("attr_group_name", key);
        });
    }
    // 查询所有
    if (catelogId == 0) {
        IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params),
                wrapper);
        return new PageUtils(page);
    }
    // 查询指定的值
    else {
        wrapper.eq("catelog_id", catelogId);
        IPage<AttrGroupEntity> page = this.page(new Query<AttrGroupEntity>().getPage(params),
                wrapper);
        return new PageUtils(page);
    }

}

重启服务测试

image-20220425134233884

2 Object划分

2.1 PO(Persistant Object) 持久对象

PO 就是对应数据库中某个表中的一条记录,多个记录可以用Po 的集合。Po中应该不包含任何对数据库的操作。

2.2 DO(Domain Object) 领域对象

就是从现实世界中抽象出来的有形或无形的业务实体。

2.3 TO(Transfer Object) 数据传输对象

不同的应用程序之间传输的对象

2.4 DTO(Data Transfer Object) 数据传输对象

这个概念来源于J2EE的设计模式,原来的目的是为了EB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,泛指用于展示层与服务层之间的数据传输对象。

2.5 VO(value object) 值对象

通常用于业务层之间的数据传递,和 PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要。用new 关键字创建,由GC回收的。

视图对象:

1、接收页面传递来的数据,封装对象

2、将业务处理完的对象,封装成页面需要用的数据

2.6 BO(Business Object) 业务对象

从业务模型的角度看,见 UML元件领域模型中的领域对象。封装业务逻辑的 java对象,通过调用DAO方法,结合PO,vo进行业务操作。business object:业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个 PO ,工作经历对应一个PO,社会关系对应一个PO。建立一个对应简历的 BO对象处理简历,每个BO包含这些PO。这样处理业务逻辑时,我们就可以针对Bo去处理。

2.7 POJO(Plain Ordinary Java Object) 简单无规则java对象

传统意义的 java对象。就是说在一些object/Relation Mapping工具中,能够做到维护数据库表记录的 persisent object完全是一个符合Java Bean规范的纯 Java对象,没有增加别的属性和方法。我的理解就是最基本的java Bean ,只有属性字段及setter和getter方法!。

POJO是DO/DTO/Bo/Vo的统称。

2.8 DAO(Data Access Object) 数据访问对象

是一个sun的一个标准j2ee设计模式,这个模式中有个接口就是DAO ,它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和Po 结合使用,DAO中包含了各种数据库的操作方法。通过它的方法,结合Po 对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合vo,提供数据库的CRUD操作.

2 新增规格参数

1、在product模块创建vo.AttrVo

@Data
public class AttrVo {
    
    /**
     * 属性id
     */
    private Long attrId;
    
    /**
     * 属性名
     */
    private String attrName;
    
    /**
     * 是否需要检索[0-不需要,1-需要]
     */
    private Integer searchType;
    
    /**
     * 值类型[0-为单个值,1-可以选择多个值]
     */
    private Integer valueType;
    
    /**
     * 属性图标
     */
    private String icon;
    
    /**
     * 可选值列表[用逗号分隔]
     */
    private String valueSelect;
    
    /**
     * 属性类型[0-销售属性,1-基本属性,2-既是销售属性又是基本属性]
     */
    private Integer attrType;
    
    /**
     * 启用状态[0 - 禁用,1 - 启用]
     */
    private Long enable;
    
    /**
     * 所属分类
     */
    private Long catelogId;
    
    /**
     * 快速展示【是否展示在介绍上;0-否 1-是】,在sku中仍然可以调整
     */
    private Integer showDesc;

    private Long attrGroupId;
}

2、修改AttrControllersave方法

/**
 * 保存
 */
@RequestMapping("/save")
// @RequiresPermissions("product:attr:save")
public R save(@RequestBody AttrVo attr) {
    attrService.saveAttr(attr);

    return R.ok();
}

3、实现saveAttr方法

@Autowired
AttrAttrgroupRelationDao relationDao;

@Override
@Transactional
public void saveAttr(AttrVo attr) {
    AttrEntity attrEntity = new AttrEntity();
    // 属性名需要一一对应
    BeanUtils.copyProperties(attr, attrEntity);
    //1、保存基本数据
    this.save(attrEntity);
    //2、保存关联关系
    AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
    relationEntity.setAttrGroupId(attr.getAttrGroupId());
    relationEntity.setAttrId(attrEntity.getAttrId());
    relationDao.insert(relationEntity);
}

4、重启服务测试

image-20220425135928300

5、查看数据库变化

image-20220425140358236

image-20220425140405279

3 获取规格参数列表

1、创建AttrRespVo

@Data
public class AttrRespVo extends AttrVo {
    /**
     *           "catelogName": "手机/数码/手机", //所属分类名字
     *           "groupName": "主体", //所属分组名字
     */
    private String catelogName;
    private String groupName;

    private Long[] catelogPath;
}

2、修改attrcontroller,添加baseAttrList方法

@GetMapping("/base/list/{catelogId}")
public R baseAttrList(@RequestParam Map<String, Object> params,
                      @PathVariable("catelogId") Long catelogId) {
    PageUtils page = attrService.queryBaseAttrPage(params, catelogId);
    return R.ok().put("page", page);
}

2、实现queryBaseAttrPage方法

@Autowired
AttrGroupDao attrGroupDao;

@Autowired
CategoryDao categoryDao;

@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId) {
    QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<>();

    if (catelogId != 0) {
        queryWrapper.eq("catelog_id", catelogId);
    }

    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
    );

    PageUtils pageUtils = new PageUtils(page);

    List<AttrEntity> records = page.getRecords();

    // 流处理records
    List<AttrRespVo> respVos = records.stream().map(attrEntity -> {
        AttrRespVo attrRespVo = new AttrRespVo();
        BeanUtils.copyProperties(attrEntity, attrRespVo);

        // 1、设置分类和分组的名字
        // 2、根据attrEntity的attr_id到表pms_attr_attrgroup_relation查询对应记录
        AttrAttrgroupRelationEntity relationEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
        if (relationEntity != null) {
            // 使用relationEntity的attrGroupId到表pms_attr_group中查询记录
            AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(relationEntity.getAttrGroupId());
            // 设置attrGroupName
            attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
        }

        // 3、根据attrEntity的catelogId到表pms_category查询记录
        CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
        if (categoryEntity != null) {
            attrRespVo.setCatelogName(categoryEntity.getName());
        }

        return attrRespVo;

    }).collect(Collectors.toList());

    pageUtils.setList(respVos);
    return pageUtils;
}

3、重启服务测试

image-20220425144632462

4 规格修改

4.1 回显数据

1、修改AttrRespVo

@Data
public class AttrRespVo extends AttrVo {
    /**
     *           "catelogName": "手机/数码/手机", //所属分类名字
     *           "groupName": "主体", //所属分组名字
     */
    private String catelogName;
    private String groupName;

    private Long[] catelogPath;
}

2、修改AttrControllerinfo方法

/**
     * 信息
     */
    @RequestMapping("/info/{attrId}")
    // @RequiresPermissions("product:attr:info")
    public R info(@PathVariable("attrId") Long attrId) {
//        AttrEntity attr = attrService.getById(attrId);
        AttrRespVo respVo = attrService.getAttrInfo(attrId);
        
        return R.ok().put("attr", respVo);
    }

3、实现getAttrInfo方法

@Autowired
CategoryService categoryService;

@Override
public AttrRespVo getAttrInfo(Long attrId) {
    AttrRespVo respVo = new AttrRespVo();
    AttrEntity attrEntity = this.getById(attrId);
    BeanUtils.copyProperties(attrEntity, respVo);

    //1、设置分组信息
    AttrAttrgroupRelationEntity attrgroupRelation = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrId));
    if (attrgroupRelation != null) {
        respVo.setAttrGroupId(attrgroupRelation.getAttrGroupId());
        AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupRelation.getAttrGroupId());
        if (attrGroupEntity != null) {
            respVo.setGroupName(attrGroupEntity.getAttrGroupName());
        }
    }

    //2、设置分类信息
    Long catelogId = attrEntity.getCatelogId();
    Long[] catelogPath = categoryService.findCatelogPath(catelogId);
    respVo.setCatelogPath(catelogPath);

    CategoryEntity categoryEntity = categoryDao.selectById(catelogId);
    if (categoryEntity != null) {
        respVo.setCatelogName(categoryEntity.getName());
    }

    return respVo;
}

4、重启服务测试,查看回显数据

image-20220425204742968

4.2 修改数据

1、修改AttrControllerupdate方法

/**
 * 修改
 */
@RequestMapping("/update")
// @RequiresPermissions("product:attr:update")
public R update(@RequestBody AttrEntity attr) {
    attrService.updateAttr(attr);

    return R.ok();
}

2、实现方法updateAttr

@Override
public void updateAttr(AttrVo attr) {
    AttrEntity attrEntity = new AttrEntity();
    BeanUtils.copyProperties(attr, attrEntity);
    this.updateById(attrEntity);

    //1、修改分组关联
    AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();

    relationEntity.setAttrGroupId(attr.getAttrGroupId());
    relationEntity.setAttrId(attr.getAttrId());

    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);
    }
}

3、重启服务测试

image-20220425205143159

image-20220425205214896

5 销售属性维护

5.1 获取销售属性列表

1、在common里创建constant.ProductConstant

public class ProductConstant {


    public enum  AttrEnum{
        ATTR_TYPE_BASE(1,"基本属性"),ATTR_TYPE_SALE(0,"销售属性");
        private int code;
        private String msg;

        AttrEnum(int code,String msg){
            this.code = code;
            this.msg = msg;
        }

        public int getCode() {
            return code;
        }

        public String getMsg() {
            return msg;
        }
    }
}

2、修改AttrControllerbaseAttrList方法

@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);
}

3、实现queryBaseAttrPage方法

@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId, String type) {

    // base : 1
    // sale : 0
    QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>()
            .eq("attr_type", "base".equalsIgnoreCase(type) ?
                    ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()
                    : ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());

    if (catelogId != 0) {
        queryWrapper.eq("catelog_id", catelogId);
    }

    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
    );

    PageUtils pageUtils = new PageUtils(page);

    List<AttrEntity> records = page.getRecords();

    // 流处理records
    List<AttrRespVo> respVos = records.stream().map(attrEntity -> {
        AttrRespVo attrRespVo = new AttrRespVo();
        BeanUtils.copyProperties(attrEntity, attrRespVo);

        // 如果类型是base,查询的是规格参数,则设置分类和分组的名字
        if ("base".equalsIgnoreCase(type)) {
            // 2、根据attrEntity的attr_id到表pms_attr_attrgroup_relation查询对应记录
            AttrAttrgroupRelationEntity relationEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            if (relationEntity != null) {
                // 使用relationEntity的attrGroupId到表pms_attr_group中查询记录
                AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(relationEntity.getAttrGroupId());
                // 设置attrGroupName
                attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
        }


        // 3、根据attrEntity的catelogId到表pms_category查询记录
        CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
        if (categoryEntity != null) {
            attrRespVo.setCatelogName(categoryEntity.getName());
        }

        return attrRespVo;

    }).collect(Collectors.toList());

    pageUtils.setList(respVos);
    return pageUtils;
}

4、修改getAttrInfo方法

@Override
public AttrRespVo getAttrInfo(Long attrId) {
    AttrRespVo respVo = new AttrRespVo();
    AttrEntity attrEntity = this.getById(attrId);
    BeanUtils.copyProperties(attrEntity, respVo);

    //1、如果是查询参数规格列表,则设置分组信息
    if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()) {
        AttrAttrgroupRelationEntity attrgroupRelation = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrId));
        if (attrgroupRelation != null) {
            respVo.setAttrGroupId(attrgroupRelation.getAttrGroupId());
            AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupRelation.getAttrGroupId());
            if (attrGroupEntity != null) {
                respVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
        }
    }


    //2、设置分类信息
    Long catelogId = attrEntity.getCatelogId();
    Long[] catelogPath = categoryService.findCatelogPath(catelogId);
    respVo.setCatelogPath(catelogPath);

    CategoryEntity categoryEntity = categoryDao.selectById(catelogId);
    if (categoryEntity != null) {
        respVo.setCatelogName(categoryEntity.getName());
    }

    return respVo;
}

5、修改updateAttr方法

@Transactional
@Override
    public void updateAttr(AttrVo attr) {
        AttrEntity attrEntity = new AttrEntity();
        BeanUtils.copyProperties(attr, attrEntity);
        this.updateById(attrEntity);

        //1、如果是修改参数规格,则修改分组关联
        if (attrEntity.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()) {
            {
                AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();

                relationEntity.setAttrGroupId(attr.getAttrGroupId());
                relationEntity.setAttrId(attr.getAttrId());

                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);
                }
            }
        }

    }
}

6、修改saveAttr方法

@Override
@Transactional
public void saveAttr(AttrVo attr) {
    AttrEntity attrEntity = new AttrEntity();
    // 属性名需要一一对应
    BeanUtils.copyProperties(attr, attrEntity);
    //1、保存基本数据
    this.save(attrEntity);
    //2、保存关联关系
    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);
    }

}

7、重启服务测试,新增销售属性

image-20220425235659750

添加后列表显示

image-20220425235721247

查看数据库表,表pms_attr中新增一条记录

image-20220425235804647

且表pms_attr_attrgroup_relation表没有增加记录

image-20220425235834062

5.2、查询分组关联属性

1、修改AttrGroupController,添加attrRelation方法

@Autowired
AttrService attrService;

@GetMapping("/{attrgroupId}/attr/relation")
public R attrRelation(@PathVariable("attrgroupId") Long attrgroupId) {
    List<AttrEntity> entities = attrService.getRelationAttr(attrgroupId);
    return R.ok().put("data", entities);
}

2、实现getRelationAttr方法

@Override
public List<AttrEntity> getRelationAttr(Long attrgroupId) {
    List<AttrAttrgroupRelationEntity> entities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_group_id", attrgroupId));

    List<Long> attrIds = entities.stream().map(attr -> {
        return attr.getAttrId();
    }).collect(Collectors.toList());

    if(attrIds.size() == 0){
        return null;
    }
    Collection<AttrEntity> attrEntities = this.listByIds(attrIds);
    return (List<AttrEntity>) attrEntities;
}

3、重启服务测试,点击属性分组右侧菜单的关联按钮

image-20220426141405029

这里点击其他两个按钮时不显示信息,且product服务报错。原因是表pms_attr_attrgroup_relation只有attr_group_id为1的记录

image-20220426141544318

image-20220426141714543

5.3 删除属性与分组的关联关系

1、创建AttrGroupRelationVo

@Data
public class AttrGroupRelationVo {

    //"attrId":1,"attrGroupId":2
    private Long attrId;
    private Long attrGroupId;
}

2、修改AttrGroupController,创建deleteRelation方法

@PostMapping要和@RequestBody联用

@PostMapping("/attr/relation/delete")
public R deleteRelation(@RequestBody AttrGroupRelationVo[] vos) {
    attrService.deleteRelation(vos);
    return R.ok();
}

3、实现deleteRelation方法

@Override
public void deleteRelation(AttrGroupRelationVo[] vos) {
    List<AttrAttrgroupRelationEntity> entities = Arrays.asList(vos).stream().map(item -> {
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        BeanUtils.copyProperties(item, relationEntity);
        return relationEntity;
    }).collect(Collectors.toList());
    relationDao.deleteBatchRelation(entities);
}

4、创建接口

@Mapper
public interface AttrAttrgroupRelationDao extends BaseMapper<AttrAttrgroupRelationEntity> {

    void deleteBatchRelation(@Param("entities") List<AttrAttrgroupRelationEntity> entities);
}

5、生成SQL语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.atguigu.gulimall.product.dao.AttrAttrgroupRelationDao">

    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="com.atguigu.gulimall.product.entity.AttrAttrgroupRelationEntity" id="attrAttrgroupRelationMap">
        <result property="id" column="id"/>
        <result property="attrId" column="attr_id"/>
        <result property="attrGroupId" column="attr_group_id"/>
        <result property="attrSort" column="attr_sort"/>
    </resultMap>
    <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>

</mapper>

7、重启服务测试

新增规格参数

image-20220426142811057

查看表pms_attr_attrgroup_relation中的记录是否增加一条

点击属性分组主体的关联按钮

image-20220426142843760

点击移除入网型号

查看表pms_attr_attrgroup_relation中是否少一条记录

5.4 查询分组未关联的属性

1、修改AttrGroupController添加attrNoRelation方法

@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);
}

2、实现getNoRelationAttr方法

@Override
public PageUtils getNoRelationAttr(Map<String, Object> params, Long attrgroupId) {
    //1、获取当前点击分组的分类id:catelog_id
    AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(attrgroupId);
    Long catelogId = attrGroupEntity.getCatelogId();
    //2、查询表pms_attr_group所有分类id为catelogId的所有分组信息
    List<AttrGroupEntity> groupEntities = attrGroupDao.selectList(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));

    // 3.将所有分组的attr_group_id封装成集合
    List<Long> attr_group_ids = groupEntities.stream().map(item -> {
        return item.getAttrGroupId();
    }).collect(Collectors.toList());

    // 4. 到表pms_attr_attrgroup_relation中查询"attr_group_id"在集合attr_group_ids中的所有记录
    List<AttrAttrgroupRelationEntity> relationEntities = relationDao.selectList(new QueryWrapper<AttrAttrgroupRelationEntity>().in("attr_group_id", attr_group_ids));

    // 5. 将所有关联信息的的attr_id封装成集合
    List<Long> attrIds = relationEntities.stream().map(item -> {
        return item.getAttrId();
    }).collect(Collectors.toList());

    // 6. 到表pms_attr中查询所有attr_id不在集合attrIds中的所有记录
    QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>().eq("catelog_id", catelogId).eq("attr_type", ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());
    if (attrIds.size() > 0) {
        wrapper.notIn("attr_id", attrIds);
    }
    // 7. 关键字模糊查询判断
    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);

    PageUtils pageUtils = new PageUtils(page);

    return pageUtils;

}

3、重启服务测试

表pms_attr信息

image-20220426150908108

表pms_attr_attrgroup_relation信息

image-20220426150918971

表pms_attr_group信息

image-20220426150935667

页面主体分组关联信息

image-20220426150957849

基本信息分组关联信息

image-20220426151027357

移除主体分组中的入网信号关联后,在查看基本信息分组的新建关联信息

image-20220426151113549

业务逻辑分析

假如说你要关联主体属性,先根据主体分组的catelog_id=255查找出其他的分组信息:基本信息和屏幕,再把基本信息和屏幕的attr_group_id封装为集合{2, 3},在到表pms_attr_attrgroup_relation中查找attr_group_id在集合中的所有记录,将记录的attr_id封装成集合,最后到表pms_attr中查询所有attr_id不在集合中的所有记录。

pms_attr_group

image-20220426144606387

pms_attr_attrgroup_relation

image-20220426144751515

pms_attr

image-20220426144757608

5.5 新增分组与属性关联

1、修改AttrGroupController,添加addRelation方法

@Autowired
AttrAttrgroupRelationService relationService;

@PostMapping("/attr/relation")
public R addRelation(@RequestBody List<AttrGroupRelationVo> vos) {
    relationService.saveBatch(vos);
    return R.ok();
}

2、实现saveBatch方法

@Override
public void saveBatch(List<AttrGroupRelationVo> vos) {
    List<AttrAttrgroupRelationEntity> collect = vos.stream().map(item -> {
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        BeanUtils.copyProperties(item, relationEntity);
        return relationEntity;
    }).collect(Collectors.toList());

    this.saveBatch(collect);
}

3、改空指针异常bug

queryBaseAttrPage方法

@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Long catelogId, String type) {

    // base : 1
    // sale : 0
    QueryWrapper<AttrEntity> queryWrapper = new QueryWrapper<AttrEntity>()
            .eq("attr_type", "base".equalsIgnoreCase(type) ?
                    ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode()
                    : ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());

    if (catelogId != 0) {
        queryWrapper.eq("catelog_id", catelogId);
    }

    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
    );

    PageUtils pageUtils = new PageUtils(page);

    List<AttrEntity> records = page.getRecords();

    // 流处理records
    List<AttrRespVo> respVos = records.stream().map(attrEntity -> {
        AttrRespVo attrRespVo = new AttrRespVo();
        BeanUtils.copyProperties(attrEntity, attrRespVo);

        // 如果类型是base,查询的是规格参数,则设置分类和分组的名字
        if ("base".equalsIgnoreCase(type)) {
            // 2、根据attrEntity的attr_id到表pms_attr_attrgroup_relation查询对应记录
            AttrAttrgroupRelationEntity relationEntity = relationDao.selectOne(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attrEntity.getAttrId()));
            if (relationEntity != null && relationEntity.getAttrGroupId() != null) {
                // 使用relationEntity的attrGroupId到表pms_attr_group中查询记录
                AttrGroupEntity attrGroupEntity = attrGroupDao.selectById(relationEntity.getAttrGroupId());
                // 设置attrGroupName
                attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());
            }
        }


        // 3、根据attrEntity的catelogId到表pms_category查询记录
        CategoryEntity categoryEntity = categoryDao.selectById(attrEntity.getCatelogId());
        if (categoryEntity != null) {
            attrRespVo.setCatelogName(categoryEntity.getName());
        }

        return attrRespVo;

    }).collect(Collectors.toList());

    pageUtils.setList(respVos);
    return pageUtils;
}

saveAttr方法

@Override
@Transactional
public void saveAttr(AttrVo attr) {
    AttrEntity attrEntity = new AttrEntity();
    // 属性名需要一一对应
    BeanUtils.copyProperties(attr, attrEntity);
    //1、保存基本数据
    this.save(attrEntity);
    //2、保存关联关系
    if (attr.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode() && attr.getAttrGroupId() != null && attr.getAttrGroupId() != null) {
        AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
        relationEntity.setAttrGroupId(attr.getAttrGroupId());
        relationEntity.setAttrId(attrEntity.getAttrId());
        relationDao.insert(relationEntity);
    }

}

4、重启服务测试

删除表pms_attr_attrgroup_relation中的一条记录,在到页面进行关联

image-20220426152853746

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值