【谷粒商城基础篇】商品服务:商品维护

news2024/12/25 17:18:41

在这里插入图片描述

谷粒商城笔记合集

分布式基础篇分布式高级篇高可用集群篇
===简介&环境搭建===
项目简介与分布式概念(第一、二章)
基础环境搭建(第三章)
===整合SpringCloud===
整合SpringCloud、SpringCloud alibaba(第四、五章)
===前端知识===
前端开发基础知识(第六章)
===商品服务开发===
商品服务开发:基础概念、三级分类(第七、八章)
商品服务开发:品牌管理(第九章)
商品服务开发:属性分组、平台属性(第十、十一章)
商品服务:商品维护(第十二、十三章)
===仓储服务开发===
仓储服务:仓库维护(第十四章)
基础篇总结(第十五章)

十二、商品服务&商品维护&发布商品⚠️

12.1 后端开发:会员服务⚠️

  • 网关服务 中配置会员服务的路由信息并重启:商品发布需要加载会员等级信息

    spring:
      cloud:
        gateway:
          routes:
            - id: member_route
              uri: lb://bilimall-member
              predicates:
                - Path=/api/member/**
              filters:
                - RewritePath=/api/?(?<segment>.*),/$\{segment}
    
  • 启动 会员服务商品发布需要加载会员等级信息

12.2 API:查询 分类下的可选品牌

发布商品的基本信息填写中,选择分类后需要选择分类下的品牌

在这里插入图片描述

  1. 创建响应数据的BrandVo:cn/lzwei/bilimall/product/vo/BrandVo.java

    @Data
    public class BrandVo {
        //品牌id
        private Long brandId;
        //品牌名
        private String brandName;
    }
    
  2. CategoryBrandRelationController:查询分类下的可供选择品牌,用于用户商品发布的基本信息填写

    @RestController
    @RequestMapping("product/categorybrandrelation")
    public class CategoryBrandRelationController {
        @Autowired
        private CategoryBrandRelationService categoryBrandRelationService;
    
        /**
         * 查询分类下的可供选择品牌,用于用户商品发布的基本信息填写
         */
        @RequestMapping("/brands/list")
        public R brandsList(@RequestParam(name = "catId") Long catId){
            List<CategoryBrandRelationEntity> brands= categoryBrandRelationService.getCategoryRelationBrands(catId);
            List<BrandVo> brandVos = brands.stream().map(item -> {
                BrandVo brandVo = new BrandVo();
                BeanUtils.copyProperties(item,brandVo);
                return brandVo;
            }).collect(Collectors.toList());
            return R.ok().put("data", brandVos);
        }
    }
    
  3. CategoryBrandRelationService:查询分类下的可供选择品牌,用于用户商品发布的基本信息填写

    public interface CategoryBrandRelationService extends IService<CategoryBrandRelationEntity> {
        /**
         * 查询分类下的可供选择品牌,用于用户商品发布的基本信息填写
         * @return
         */
        List<CategoryBrandRelationEntity> getCategoryRelationBrands(Long catId);
    }
    
  4. CategoryBrandRelationServiceImpl:查询分类下的可供选择品牌,用于用户商品发布的基本信息填写

    @Service("categoryBrandRelationService")
    public class CategoryBrandRelationServiceImpl extends ServiceImpl<CategoryBrandRelationDao, CategoryBrandRelationEntity> implements CategoryBrandRelationService {
        /**
         * 查询分类下的可供选择品牌,用于用户商品发布的基本信息填写
         * @return
         */
        @Override
        public List<CategoryBrandRelationEntity> getCategoryRelationBrands(Long catId) {
            //通过分类id关联查询出品牌信息
            List<CategoryBrandRelationEntity> entities = this.list(new QueryWrapper<CategoryBrandRelationEntity>().eq("catelog_id", catId));
            return entities;
        }
    }
    

12.3 API:查询 分类下的属性分组&属性

发布商品的基本信息填写后下一步设置规格参数,需要查询出分类下的属性分组及关联属性

在这里插入图片描述

  1. 创建响应数据的AttrGroupAttrVo:cn/lzwei/bilimall/product/vo/AttrGroupAttrVo.java

    @Data
    public class AttrGroupAttrVo {
        /**
         * 分组id
         */
        private Long attrGroupId;
        /**
         * 组名
         */
        private String attrGroupName;
        /**
         * 排序
         */
        private Integer sort;
        /**
         * 描述
         */
        private String descript;
        /**
         * 组图标
         */
        private String icon;
        /**
         * 所属分类id
         */
        private Long catelogId;
    
        /**
         * 属性分组下的所有基本属性
         */
        private List<AttrEntity> attrs;
    }
    
  2. AttrGroupController:查询出分类下的属性分组及关联属性

    @RestController
    @RequestMapping("product/attrgroup")
    public class AttrGroupController {
        @Autowired
        private AttrGroupService attrGroupService;
    
        /**
         * 获取分类下的属性分组以及每个分组下的基本属性:用于商品发布的规格参数设置
         */
        @GetMapping("/{catelogId}/withattr")
        public R getAttrGroupAndAttrsByCategory(@PathVariable(value = "catelogId") Long catelogId){
            List<AttrGroupAttrVo> attrGroupAttrVos=attrGroupService.getAttrGroupAndAttrsByCategory(catelogId);
            return R.ok().put("data",attrGroupAttrVos);
        }
    }
    
  3. AttrGroupService:查询出分类下的属性分组及关联属性

    public interface AttrGroupService extends IService<AttrGroupEntity> {
        /**
         * 获取分类下的属性分组以及每个分组下的基本属性:用于商品发布的规格参数设置
         */
        List<AttrGroupAttrVo> getAttrGroupAndAttrsByCategory(Long catelogId);
    }
    
  4. AttrGroupServiceImpl:查询出分类下的属性分组及关联属性

    @Service("attrGroupService")
    public class AttrGroupServiceImpl extends ServiceImpl<AttrGroupDao, AttrGroupEntity> implements AttrGroupService {
        @Resource
        AttrService attrService;
    
        /**
         * 获取分类下的属性分组以及每个分组下的基本属性:用于商品发布的规格参数设置
         */
        @Override
        public List<AttrGroupAttrVo> getAttrGroupAndAttrsByCategory(Long catelogId) {
            //1.获取分类下的所有属性分组
            List<AttrGroupEntity> attrGroups = this.list(new QueryWrapper<AttrGroupEntity>().eq("catelog_id", catelogId));
            //2.遍历分组集合,对每个分组下的所有基本属性进行封装
            List<AttrGroupAttrVo> collect = attrGroups.stream().map(item -> {
                AttrGroupAttrVo attrGroupAttrVo = new AttrGroupAttrVo();
                //2.1 将group的基本属性添加到vo中
                BeanUtils.copyProperties(item,attrGroupAttrVo);
                //2.2 设置vo中的attr信息
                List<AttrEntity> attrEntities = attrService.attrGroupRelation(attrGroupAttrVo.getAttrGroupId());
                attrGroupAttrVo.setAttrs(attrEntities);
                return attrGroupAttrVo;
            }).collect(Collectors.toList());
            return collect;
        }
    }
    

12.4 前后端联调:生成spu的VO类

  1. 获取sku相关的json数据

    在这里插入图片描述

  2. 利用json数据生成java代码

    在这里插入图片描述

  3. 解压生成的代码,将代码拷贝到 bilimall-product/src/main/java/cn/lzwei/bilimall/product/vo 中

    • SpuSaveVo.java:Spu

      @Data
      public class SpuSaveVo {
      
          private String spuName;
          private String spuDescription;
          private Long catalogId;
          private Long brandId;
          private BigDecimal weight;
          private Integer publishStatus;
          private List<String> decript;
          private List<String> images;
          private Bounds bounds;
          private List<BaseAttrs> baseAttrs;
          private List<Skus> skus;
      }
      
    • Bounds.java:积分

      @Data
      public class Bounds {
      
          private BigDecimal buyBounds;
          private BigDecimal growBounds;
      }
      
    • BaseAttrs.java:基础属性

      @Data
      public class BaseAttrs {
      
          private Long attrId;
          private String attrValues;
          private int showDesc;
      }
      
    • Skus.java:Sku

      @Data
      public class Skus {
      
          private List<Attr> attr;
          private String skuName;
          private BigDecimal price;
          private String skuTitle;
          private String skuSubtitle;
          private List<Images> images;
          private List<String> descar;
          private int fullCount;
          private BigDecimal discount;
          private int countStatus;
          private BigDecimal fullPrice;
          private BigDecimal reducePrice;
          private int priceStatus;
          private List<MemberPrice> memberPrice;
      }
      
    • MemberPrice.java:sku会员价格

      @Data
      public class MemberPrice {
      
          private Long id;
          private String name;
          private BigDecimal price;
      }
      
    • Images.java:sku图片

      @Data
      public class Images {
      
          private String imgUrl;
          private int defaultImg;
      }
      
    • Attr.java:销售属性

      @Data
      public class Attr {
      
          private Long attrId;
          private String attrName;
          private String attrValue;
      }
      

12.5 API:保存 商品信息⚠️

在这里插入图片描述

在这里插入图片描述

12.5.1 公共服务开发⚠️

  1. 新增远程调用TO:cn/lzwei/common/to/BoundsTo.java

    //积分信息
    @Data
    public class BoundsTo {
    
        private Long id;
    
        private Long spuId;
        /**
         * 成长积分
         */
        private BigDecimal growBounds;
        /**
         * 购物积分
         */
        private BigDecimal buyBounds;
        /**
         * 优惠生效情况[1111(四个状态位,从右到左);0 - 无优惠,成长积分是否赠送;1 - 无优惠,购物积分是否赠送;2 - 有优惠,成长积分是否赠送;3 - 有优惠,购物积分是否赠送【状态位0:不赠送,1:赠送】]
         */
        private Integer work;
    }
    
  2. 新增远程调用TO:cn/lzwei/common/to/FullReductionTo.java

    //打折、满减、会员优惠信息
    @Data
    public class FullReductionTo {
        private Long skuId;
        private int fullCount;
        private BigDecimal discount;
        private int countStatus;
        private BigDecimal fullPrice;
        private BigDecimal reducePrice;
        private int priceStatus;
        private List<MemberPrice> memberPrice;
    }
    
  3. 新增远程调用TO:cn/lzwei/common/to/MemberPrice.java

    //会员优惠信息
    @Data
    public class MemberPrice {
    
        private Long id;
        private String name;
        private BigDecimal price;
    }
    
  4. 修改响应包装类,添加响应码获取方法,用于远程调用判断:cn/lzwei/common/utils/R.java

    public class R extends HashMap<String, Object> {
        ...
    	public Integer getCode(){
    		return (Integer) get("code");
    	}
    }
    

12.5.2 优惠服务开发⚠️

  1. SpuBoundsController:修改API /bilimall-coupon/coupon/spubounds/save ,直接进行远程调用

    @RestController
    @RequestMapping("coupon/spubounds")
    public class SpuBoundsController {
        @Autowired
        private SpuBoundsService spuBoundsService;
        /**
         * 保存
         */
        @PostMapping("/save")
        public R save(@RequestBody SpuBoundsEntity spuBounds){
    		spuBoundsService.save(spuBounds);
            return R.ok();
        }
    }
    
  2. SkuFullReductionController:为新增商品保存优惠信息时远程调用提供专门的API

    @RestController
    @RequestMapping("coupon/skufullreduction")
    public class SkuFullReductionController {
        @Autowired
        private SkuFullReductionService skuFullReductionService;
    
        /**
         * 批量保存:保存打折、满减、会员优惠信息
         */
        @PostMapping("/saveTotal")
        public R saveTotal(@RequestBody FullReductionTo fullReductionTo){
            skuFullReductionService.saveTotal(fullReductionTo);
            return R.ok();
        }
    }
    
  3. SkuFullReductionService:为新增商品保存优惠信息时远程调用提供专门的API

    public interface SkuFullReductionService extends IService<SkuFullReductionEntity> {
        /**
         * 批量保存:保存打折、满减、会员优惠信息
         */
        void saveTotal(FullReductionTo fullReductionTo);
    }
    
  4. SkuFullReductionServiceImpl:为新增商品保存优惠信息时远程调用提供专门的API

    @Service("skuFullReductionService")
    public class SkuFullReductionServiceImpl extends ServiceImpl<SkuFullReductionDao, SkuFullReductionEntity> implements SkuFullReductionService {
        @Resource
        SkuLadderService skuLadderService;
        @Resource
        SkuFullReductionService skuFullReductionService;
        @Resource
        MemberPriceService memberPriceService;
    
        /**
         * 批量保存:保存打折、满减、会员优惠信息
         */
        @Override
        @Transactional
        public void saveTotal(FullReductionTo fullReductionTo) {
            //保存打折、满减、会员优惠信息 (远程服务) sms_sku_ladder、sms_sku_full_reduction、sms_member_price
            //1.保存打折信息 sms_sku_ladder:    id  sku_id  full_count  discount  price   add_other
            SkuLadderEntity skuLadderEntity = new SkuLadderEntity();
            BeanUtils.copyProperties(fullReductionTo,skuLadderEntity);
            skuLadderEntity.setAddOther(1);
            //存在打折优惠才保存
            if (skuLadderEntity.getFullCount()>0){
                skuLadderService.save(skuLadderEntity);
            }
            //2.保存满减信息 sms_sku_full_reduction:    id  sku_id  full_price  reduce_price  add_other
            SkuFullReductionEntity skuFullReductionEntity = new SkuFullReductionEntity();
            BeanUtils.copyProperties(fullReductionTo,skuFullReductionEntity);
            skuFullReductionEntity.setAddOther(1);
            //存在满减优惠才保存
            if (skuFullReductionEntity.getFullPrice().compareTo(new BigDecimal(0))==1){
                this.save(skuFullReductionEntity);
            }
            //3.保存会员优惠信息 sms_member_price:    id  sku_id  member_level_id  member_level_name  member_price  add_other
            List<MemberPrice> memberPrice = fullReductionTo.getMemberPrice();
            List<MemberPriceEntity> memberPriceEntities = memberPrice.stream().map(item -> {
                MemberPriceEntity memberPriceEntity = new MemberPriceEntity();
                memberPriceEntity.setSkuId(fullReductionTo.getSkuId());
                memberPriceEntity.setMemberLevelId(item.getId());
                memberPriceEntity.setMemberLevelName(item.getName());
                memberPriceEntity.setMemberPrice(item.getPrice());
                memberPriceEntity.setAddOther(1);
             return memberPriceEntity;
            }).filter(item->{
                //存在会员优惠才保存
                return item.getMemberPrice().compareTo(new BigDecimal(0))==1;
            }).collect(Collectors.toList());
            memberPriceService.saveBatch(memberPriceEntities);
        }
    }
    

12.5.3 商品服务开发💡

  1. 进行远程调用相关相关配置:配置注册中心,开启服务注册发现功能,开启远程调用功能并指定远程调用接口所在包等…

  2. 创建远程调用接口:cn/lzwei/bilimall/product/feign/CouponFeignService.java

    @FeignClient(name = "bilimall-coupon")
    public interface CouponFeignService {
    
        //保存积分信息
        @PostMapping("coupon/spubounds/save")
        R saveBounds(@RequestBody BoundsTo boundsTo);
        //保存打折、满减、会员优惠信息
        @PostMapping("coupon/skufullreduction/saveTotal")
        R saveTotal(@RequestBody FullReductionTo fullReductionTo);
    }
    
  3. SpuInfoDescEntity:将spu描述信息的特殊id设置为非自增

    @Data
    @TableName("pms_spu_info_desc")
    public class SpuInfoDescEntity implements Serializable {
    	/**
    	 * 商品id
    	 */
    	@TableId(type = IdType.INPUT)
    	private Long spuId;
    }
    
  4. SpuInfoController:保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品

    @RestController
    @RequestMapping("product/spuinfo")
    public class SpuInfoController {
        @Autowired
        private SpuInfoService spuInfoService;
    
        /**
         * 保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品
         */
        @RequestMapping("/save")
        public R save(@RequestBody SpuSaveVo spuSaveVo){
            spuInfoService.saveSpuInfo(spuSaveVo);
            return R.ok();
        }
    }
    
  5. SpuInfoService:保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品

    public interface SpuInfoService extends IService<SpuInfoEntity> {
        /**
         * 保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品
         */
        void saveSpuInfo(SpuSaveVo spuSaveVo);
    }
    
  6. SpuInfoServiceImpl:保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品

    @Service("spuInfoService")
    public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService {
        @Resource
        SpuInfoDescService spuInfoDescService;
        @Resource
        SpuImagesService spuImagesService;
        @Resource
        ProductAttrValueService productAttrValueService;
        @Resource
        AttrService attrService;
        @Resource
        SkuInfoService skuInfoService;
        @Resource
        SkuSaleAttrValueService skuSaleAttrValueService;
        @Resource
        SkuImagesService skuImagesService;
        @Resource
        CouponFeignService couponFeignService;
    
        /**
         * TODO 高级部分完善
         * 保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品
         */
        @Transactional
        @Override
        public void saveSpuInfo(SpuSaveVo spuSaveVo) {
            //1.保存spu基本信息 pms_spu_info:id  spu_name  spu_description  catalog_id  brand_id  weight  publish_status  create_time  update_time
            SpuInfoEntity spuInfoEntity = new SpuInfoEntity();
            BeanUtils.copyProperties(spuSaveVo,spuInfoEntity);
            spuInfoEntity.setCreateTime(new Date());
            spuInfoEntity.setUpdateTime(new Date());
            this.save(spuInfoEntity);
            Long spuId = spuInfoEntity.getId();
    
            //2.保存spu介绍 pms_spu_info_desc: spu_id  decript
            SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();
            spuInfoDescEntity.setSpuId(spuId);
            List<String> decript = spuSaveVo.getDecript();
            spuInfoDescEntity.setDecript(String.join(",",decript));
            spuInfoDescService.save(spuInfoDescEntity);
    
            //3.保存spu图集 pms_spu_images:  id  spu_id  img_name  img_url  img_sort  default_img
            List<String> images = spuSaveVo.getImages();
            List<SpuImagesEntity> spuImagesEntities = images.stream().map(item -> {
                SpuImagesEntity spuImagesEntity = new SpuImagesEntity();
                spuImagesEntity.setSpuId(spuId);
                spuImagesEntity.setImgUrl(item);
                return spuImagesEntity;
            }).collect(Collectors.toList());
            spuImagesService.saveBatch(spuImagesEntities);
    
            //4.保存积分信息 (远程服务)sms_spu_bounds: id  spu_id  grow_bounds  buy_bounds    work
            Bounds bounds = spuSaveVo.getBounds();
            BoundsTo boundsTo = new BoundsTo();
            BeanUtils.copyProperties(bounds,boundsTo);
            boundsTo.setSpuId(spuId);
            R r = couponFeignService.saveBounds(boundsTo);
            if (r.getCode()!=0){
                log.error("远程调用失败!");
            }
    
            //5.保存规格参数 pms_product_attr_value:    id  spu_id  attr_id  attr_name  attr_value  attr_sort  quick_show
            List<BaseAttrs> baseAttrs = spuSaveVo.getBaseAttrs();
            List<ProductAttrValueEntity> productAttrValueEntities = baseAttrs.stream().map(item -> {
                ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
                productAttrValueEntity.setSpuId(spuId);
                productAttrValueEntity.setAttrId(item.getAttrId());
                AttrEntity attrEntity = attrService.getById(item.getAttrId());
                productAttrValueEntity.setAttrName(attrEntity.getAttrName());
                productAttrValueEntity.setAttrValue(item.getAttrValues());
                productAttrValueEntity.setQuickShow(item.getShowDesc());
                return productAttrValueEntity;
            }).collect(Collectors.toList());
            productAttrValueService.saveBatch(productAttrValueEntities);
    
            //6.sku信息:
            List<Skus> skus = spuSaveVo.getSkus();
            for (Skus sku : skus) {
                //6.1、保存sku基本信息 pms_sku_info:sku_id  spu_id  sku_name  sku_desc  catalog_id  brand_id  sku_default_img  sku_title  sku_subtitle  price   sale_count
                String defaultImg="";
                for (Images image : sku.getImages()) {
                    if (image.getDefaultImg()==1) defaultImg=image.getImgUrl();
                }
                SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
                BeanUtils.copyProperties(sku,skuInfoEntity);
                skuInfoEntity.setSpuId(spuId);
                List<String> descar = sku.getDescar();
                skuInfoEntity.setSkuDesc(String.join(",",descar));
                skuInfoEntity.setCatalogId(spuSaveVo.getCatalogId());
                skuInfoEntity.setBrandId(spuSaveVo.getBrandId());
                skuInfoEntity.setSkuDefaultImg(defaultImg);
                skuInfoEntity.setSaleCount(0l);
                skuInfoService.save(skuInfoEntity);
                Long skuId = skuInfoEntity.getSkuId();
    
                //6.2、保存sku销售属性 pms_sku_sale_attr_value:   id  sku_id  attr_id  attr_name  attr_value  attr_sort
                List<Attr> attrs = sku.getAttr();
                List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attrs.stream().map(item -> {
                    SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity();
                    skuSaleAttrValueEntity.setSkuId(skuId);
                    BeanUtils.copyProperties(item,skuSaleAttrValueEntity);
                    skuSaleAttrValueEntity.setAttrSort(0);
                    return skuSaleAttrValueEntity;
                }).collect(Collectors.toList());
                skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);
    
                //6.3、保存sku图集 pms_sku_images:    id  sku_id  img_url  img_sort  default_img
                List<Images> imgs = sku.getImages();
                List<SkuImagesEntity> skuImagesEntities = imgs.stream().map(item -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    BeanUtils.copyProperties(item,skuImagesEntity);
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setImgSort(0);
                    return skuImagesEntity;
                }).filter(item->{
                    //过滤空图片
                    return !StringUtils.isNullOrEmpty(item.getImgUrl());
                }).collect(Collectors.toList());
                skuImagesService.saveBatch(skuImagesEntities);
    
                //6.4、保存打折、满减、会员优惠信息 (远程服务) sms_sku_ladder、sms_sku_full_reduction、sms_member_price
                FullReductionTo fullReductionTo = new FullReductionTo();
                fullReductionTo.setSkuId(skuId);
                BeanUtils.copyProperties(sku,fullReductionTo);
                //如果存在打折优惠或者满减优惠再进行保存
                if(sku.getFullCount()>0 || sku.getFullPrice().compareTo(new BigDecimal(0))==1){
                    R r1 = couponFeignService.saveTotal(fullReductionTo);
                    if(r1.getCode()!=0){
                        log.error("远程调用失败!");
                    }
             }
            }
        }
    }
    

12.5.4 Debug优化 商品信息数据插入异常

由于 SpuInfoDescEntity 的主键字段特殊(pms_spu_info_desc: spu_id decript),需要设置为非自增:否则mybatis插入数据时没有添加主键导致抛异常

@Data
@TableName("pms_spu_info_desc")
public class SpuInfoDescEntity implements Serializable {
	/**
	 * 商品id
	 */
	@TableId(type = IdType.INPUT)
	private Long spuId;
}

在这里插入图片描述

12.5.5 优化 过滤无用数据

在这里插入图片描述

  • SpuInfoServiceImpl

    @Service("skuFullReductionService")
    public class SkuFullReductionServiceImpl extends ServiceImpl<SkuFullReductionDao, SkuFullReductionEntity> implements SkuFullReductionService {
        @Resource
        SkuLadderService skuLadderService;
        @Resource
        SkuFullReductionService skuFullReductionService;
        @Resource
        MemberPriceService memberPriceService;
    
        /**
         * 批量保存:保存打折、满减、会员优惠信息
         */
        @Override
        @Transactional
        public void saveTotal(FullReductionTo fullReductionTo) {
            //保存打折、满减、会员优惠信息 (远程服务) sms_sku_ladder、sms_sku_full_reduction、sms_member_price
            //1.保存打折信息 sms_sku_ladder:    id  sku_id  full_count  discount  price   add_other
            SkuLadderEntity skuLadderEntity = new SkuLadderEntity();
            BeanUtils.copyProperties(fullReductionTo,skuLadderEntity);
            skuLadderEntity.setAddOther(1);
            //存在打折优惠才保存
            if (skuLadderEntity.getFullCount()>0){
                skuLadderService.save(skuLadderEntity);
            }
            //2.保存满减信息 sms_sku_full_reduction:    id  sku_id  full_price  reduce_price  add_other
            SkuFullReductionEntity skuFullReductionEntity = new SkuFullReductionEntity();
            BeanUtils.copyProperties(fullReductionTo,skuFullReductionEntity);
            skuFullReductionEntity.setAddOther(1);
            //存在满减优惠才保存
            if (skuFullReductionEntity.getFullPrice().compareTo(new BigDecimal(0))==1){
                this.save(skuFullReductionEntity);
            }
            //3.保存会员优惠信息 sms_member_price:    id  sku_id  member_level_id  member_level_name  member_price  add_other
            List<MemberPrice> memberPrice = fullReductionTo.getMemberPrice();
            List<MemberPriceEntity> memberPriceEntities = memberPrice.stream().map(item -> {
                MemberPriceEntity memberPriceEntity = new MemberPriceEntity();
                memberPriceEntity.setSkuId(fullReductionTo.getSkuId());
                memberPriceEntity.setMemberLevelId(item.getId());
                memberPriceEntity.setMemberLevelName(item.getName());
                memberPriceEntity.setMemberPrice(item.getPrice());
                memberPriceEntity.setAddOther(1);
                return memberPriceEntity;
            }).filter(item->{
                //存在会员优惠才保存
                return item.getMemberPrice().compareTo(new BigDecimal(0))==1;
            }).collect(Collectors.toList());
            memberPriceService.saveBatch(memberPriceEntities);
        }
    }
    
  • SkuFullReductionServiceImpl

    @Service("spuInfoService")
    public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService {
        @Resource
        SpuInfoDescService spuInfoDescService;
        @Resource
        SpuImagesService spuImagesService;
        @Resource
        ProductAttrValueService productAttrValueService;
        @Resource
        AttrService attrService;
        @Resource
        SkuInfoService skuInfoService;
        @Resource
        SkuSaleAttrValueService skuSaleAttrValueService;
        @Resource
        SkuImagesService skuImagesService;
        @Resource
        CouponFeignService couponFeignService;
    
        /**
         * TODO 高级部分完善
         * 保存spu、sku信息,跨服务保存打折、满减、会员优惠信息:新增商品
         */
        @Transactional
        @Override
        public void saveSpuInfo(SpuSaveVo spuSaveVo) {
            //1.保存spu基本信息 pms_spu_info:id  spu_name  spu_description  catalog_id  brand_id  weight  publish_status  create_time  update_time
            SpuInfoEntity spuInfoEntity = new SpuInfoEntity();
            BeanUtils.copyProperties(spuSaveVo,spuInfoEntity);
            spuInfoEntity.setCreateTime(new Date());
            spuInfoEntity.setUpdateTime(new Date());
            this.save(spuInfoEntity);
            Long spuId = spuInfoEntity.getId();
    
            //2.保存spu介绍 pms_spu_info_desc: spu_id  decript
            SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();
            spuInfoDescEntity.setSpuId(spuId);
            List<String> decript = spuSaveVo.getDecript();
            spuInfoDescEntity.setDecript(String.join(",",decript));
            spuInfoDescService.save(spuInfoDescEntity);
    
            //3.保存spu图集 pms_spu_images:  id  spu_id  img_name  img_url  img_sort  default_img
            List<String> images = spuSaveVo.getImages();
            List<SpuImagesEntity> spuImagesEntities = images.stream().map(item -> {
                SpuImagesEntity spuImagesEntity = new SpuImagesEntity();
                spuImagesEntity.setSpuId(spuId);
                spuImagesEntity.setImgUrl(item);
                return spuImagesEntity;
            }).collect(Collectors.toList());
            spuImagesService.saveBatch(spuImagesEntities);
    
            //4.保存积分信息 (远程服务)sms_spu_bounds: id  spu_id  grow_bounds  buy_bounds    work
            Bounds bounds = spuSaveVo.getBounds();
            BoundsTo boundsTo = new BoundsTo();
            BeanUtils.copyProperties(bounds,boundsTo);
            boundsTo.setSpuId(spuId);
            R r = couponFeignService.saveBounds(boundsTo);
            if (r.getCode()!=0){
                log.error("远程调用失败!");
            }
    
            //5.保存规格参数 pms_product_attr_value:    id  spu_id  attr_id  attr_name  attr_value  attr_sort  quick_show
            List<BaseAttrs> baseAttrs = spuSaveVo.getBaseAttrs();
            List<ProductAttrValueEntity> productAttrValueEntities = baseAttrs.stream().map(item -> {
                ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
                productAttrValueEntity.setSpuId(spuId);
                productAttrValueEntity.setAttrId(item.getAttrId());
                AttrEntity attrEntity = attrService.getById(item.getAttrId());
                productAttrValueEntity.setAttrName(attrEntity.getAttrName());
                productAttrValueEntity.setAttrValue(item.getAttrValues());
                productAttrValueEntity.setQuickShow(item.getShowDesc());
                return productAttrValueEntity;
            }).collect(Collectors.toList());
            productAttrValueService.saveBatch(productAttrValueEntities);
    
            //6.sku信息:
            List<Skus> skus = spuSaveVo.getSkus();
            for (Skus sku : skus) {
                //6.1、保存sku基本信息 pms_sku_info:sku_id  spu_id  sku_name  sku_desc  catalog_id  brand_id  sku_default_img  sku_title  sku_subtitle  price   sale_count
                String defaultImg="";
                for (Images image : sku.getImages()) {
                    if (image.getDefaultImg()==1) defaultImg=image.getImgUrl();
                }
                SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
                BeanUtils.copyProperties(sku,skuInfoEntity);
                skuInfoEntity.setSpuId(spuId);
                List<String> descar = sku.getDescar();
                skuInfoEntity.setSkuDesc(String.join(",",descar));
                skuInfoEntity.setCatalogId(spuSaveVo.getCatalogId());
                skuInfoEntity.setBrandId(spuSaveVo.getBrandId());
                skuInfoEntity.setSkuDefaultImg(defaultImg);
                skuInfoEntity.setSaleCount(0l);
                skuInfoService.save(skuInfoEntity);
                Long skuId = skuInfoEntity.getSkuId();
    
                //6.2、保存sku销售属性 pms_sku_sale_attr_value:   id  sku_id  attr_id  attr_name  attr_value  attr_sort
                List<Attr> attrs = sku.getAttr();
                List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attrs.stream().map(item -> {
                    SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity();
                    skuSaleAttrValueEntity.setSkuId(skuId);
                    BeanUtils.copyProperties(item,skuSaleAttrValueEntity);
                    skuSaleAttrValueEntity.setAttrSort(0);
                    return skuSaleAttrValueEntity;
                }).collect(Collectors.toList());
                skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);
    
                //6.3、保存sku图集 pms_sku_images:    id  sku_id  img_url  img_sort  default_img
                List<Images> imgs = sku.getImages();
                List<SkuImagesEntity> skuImagesEntities = imgs.stream().map(item -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    BeanUtils.copyProperties(item,skuImagesEntity);
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setImgSort(0);
                    return skuImagesEntity;
                }).filter(item->{
                    //过滤空图片
                    return !StringUtils.isNullOrEmpty(item.getImgUrl());
                }).collect(Collectors.toList());
                skuImagesService.saveBatch(skuImagesEntities);
    
                //6.4、保存打折、满减、会员优惠信息 (远程服务) sms_sku_ladder、sms_sku_full_reduction、sms_member_price
                FullReductionTo fullReductionTo = new FullReductionTo();
                fullReductionTo.setSkuId(skuId);
                BeanUtils.copyProperties(sku,fullReductionTo);
                //如果存在打折优惠或者满减优惠再进行保存
                if(sku.getFullCount()>0 || sku.getFullPrice().compareTo(new BigDecimal(0))==1){
                    R r1 = couponFeignService.saveTotal(fullReductionTo);
                    if(r1.getCode()!=0){
                        log.error("远程调用失败!");
                    }
                }
            }
        }
    }
    

十三、商品服务&商品维护&管理

13.1 API:SPU检索

在这里插入图片描述

  1. 配置时间格式化规则:application.yaml

    spring:
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
    
  2. SpuInfoController:spu检索:模糊查询、分类、品牌、状态

    @RestController
    @RequestMapping("product/spuinfo")
    public class SpuInfoController {
        @Autowired
        private SpuInfoService spuInfoService;
        /**
         * spu检索列表:模糊查询、分类、品牌、状态
         */
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params){
            PageUtils page = spuInfoService.queryPageByCondition(params);
    
            return R.ok().put("page", page);
        }
    }
    
  3. SpuInfoService:spu检索:模糊查询、分类、品牌、状态

    public interface SpuInfoService extends IService<SpuInfoEntity> {
        /**
         * spu检索列表:模糊查询、分类、品牌、状态
         */
        PageUtils queryPageByCondition(Map<String, Object> params);
    }
    
  4. SpuInfoServiceImpl:spu检索:模糊查询、分类、品牌、状态

    @Service("spuInfoService")
    public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService {
        /**
         * spu检索列表:模糊查询、分类、品牌、状态
         */
        @Override
        public PageUtils queryPageByCondition(Map<String, Object> params) {
            QueryWrapper<SpuInfoEntity> queryWrapper = new QueryWrapper<>();
            //1.状态
            String status = (String) params.get("status");
            if (!StringUtils.isNullOrEmpty(status)){
                queryWrapper.eq("publish_status",status);
            }
            //2.模糊查询
            String key = (String) params.get("key");
            if (!StringUtils.isNullOrEmpty(key)){
                queryWrapper.and(item->{
                    item.eq("id",key).or().like("spu_name",key);
                });
            }
            //3.品牌
            String brandId = (String) params.get("brandId");
            if (!StringUtils.isNullOrEmpty(brandId) && !"0".equals(brandId)){
                queryWrapper.eq("brand_id",brandId);
            }
            //4.分类
            String catelogId = (String) params.get("catelogId");
            if (!StringUtils.isNullOrEmpty(catelogId) && !"0".equals(catelogId)){
                queryWrapper.eq("catalog_id",catelogId);
            }
            IPage<SpuInfoEntity> page = this.page(
                    new Query<SpuInfoEntity>().getPage(params),
                    queryWrapper
            );
    
            return new PageUtils(page);
        }
    
    }
    

13.2 API:SKU检索

在这里插入图片描述

  1. SkuInfoController:检索sku:模糊查询、分类、品牌、价格区间

    @RestController
    @RequestMapping("product/skuinfo")
    public class SkuInfoController {
        @Autowired
        private SkuInfoService skuInfoService;
    
        /**
         * 检索sku:模糊查询、分类、品牌、价格区间
         */
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params){
            PageUtils page = skuInfoService.queryPageByCondition(params);
    
            return R.ok().put("page", page);
        }
    }
    
  2. SkuInfoService:检索sku:模糊查询、分类、品牌、价格区间

    public interface SkuInfoService extends IService<SkuInfoEntity> {
        /**
         * 检索sku:模糊查询、分类、品牌、价格区间
         */
        PageUtils queryPageByCondition(Map<String, Object> params);
    }
    
  3. SkuInfoServiceImpl:检索sku:模糊查询、分类、品牌、价格区间

    @Service("skuInfoService")
    public class SkuInfoServiceImpl extends ServiceImpl<SkuInfoDao, SkuInfoEntity> implements SkuInfoService {
        /**
         * 检索sku:模糊查询、分类、品牌、价格区间
         */
        @Override
        public PageUtils queryPageByCondition(Map<String, Object> params) {
            QueryWrapper<SkuInfoEntity> queryWrapper = new QueryWrapper<>();
            //1.模糊查询
            String key = (String) params.get("key");
            if(!StringUtils.isNullOrEmpty(key)){
                queryWrapper.and(item->{
                    item.eq("sku_id",key).or().like("sku_name",key);
                });
            }
            //2.分类
            String catelogId = (String) params.get("catelogId");
            if(!StringUtils.isNullOrEmpty(catelogId) && !"0".equals(catelogId)){
                queryWrapper.eq("catalog_id",catelogId);
            }
            //3.品牌
            String brandId = (String) params.get("brandId");
            if(!StringUtils.isNullOrEmpty(brandId) && !"0".equals(brandId)){
                queryWrapper.eq("brand_id",brandId);
            }
            //4.价格区间
            String min = (String) params.get("min");
            if(!StringUtils.isNullOrEmpty(min)){
                queryWrapper.ge("price",min);
            }
            String max = (String) params.get("max");
            if(!StringUtils.isNullOrEmpty(max)){
                int value = new BigDecimal(max).compareTo(BigDecimal.valueOf(0));
                if (value>0){
                    queryWrapper.le("price",max);
                }
            }
            IPage<SkuInfoEntity> page = this.page(
                    new Query<SkuInfoEntity>().getPage(params),
                    queryWrapper
            );
    
            return new PageUtils(page);
        }
    }
    

13.3 API:获取spu规格

在这里插入图片描述

  • AttrController:获取spu规格

    @RestController
    @RequestMapping("product/attr")
    public class AttrController {
        @Resource
        private ProductAttrValueService productAttrValueService;
    
        /**
         * 获取spu规格
         */
        @GetMapping("/base/listforspu/{spuId}")
        public R listForSpuAttr(@PathVariable(value = "spuId") Long spuId){
            QueryWrapper<ProductAttrValueEntity> queryWrapper = new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId);
            List<ProductAttrValueEntity> entityList=productAttrValueService.list(queryWrapper);
            return R.ok().put("data",entityList);
        }
    }
    

13.4 API:修改spu规格

在这里插入图片描述

  1. AttrController:修改商品规格

    @RestController
    @RequestMapping("product/attr")
    public class AttrController {
        @Resource
        private ProductAttrValueService productAttrValueService;
    
        /**
         * 商品管理:修改商品规格
         */
        @PostMapping("/update/{spuId}")
        public R updateBySpu(@RequestBody List<ProductAttrValueEntity> productAttrValue,@PathVariable Long spuId){
            productAttrValueService.updateBySpu(productAttrValue,spuId);
    
            return R.ok();
        }
    }
    
  2. ProductAttrValueService:修改商品规格

    public interface ProductAttrValueService extends IService<ProductAttrValueEntity> {
        /**
         * 商品管理:修改商品规格
         */
        void updateBySpu(List<ProductAttrValueEntity> productAttrValue, Long spuId);
    }
    
  3. ProductAttrValueServiceImpl:修改商品规格

    @Service("productAttrValueService")
    public class ProductAttrValueServiceImpl extends ServiceImpl<ProductAttrValueDao, ProductAttrValueEntity> implements ProductAttrValueService {
        /**
         * 商品管理:修改商品规格
         */
        @Transactional
        @Override
        public void updateBySpu(List<ProductAttrValueEntity> productAttrValue, Long spuId) {
            //1.删除该商品的所有规格参数
            UpdateWrapper<ProductAttrValueEntity> wrapper = new UpdateWrapper<ProductAttrValueEntity>().eq("spu_id",spuId);
            this.remove(wrapper);
            //2.将传过来的规格重新插入
            List<ProductAttrValueEntity> collect = productAttrValue.stream().map(item -> {
                item.setSpuId(spuId);
                return item;
            }).collect(Collectors.toList());
            this.saveBatch(collect);
        }
    
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

xxx.lua入门编程

lua入门级编程,openresty的前置技能lua入门级编程,openresty的前置技能 看上图 lua示例&#xff1a; 入门示例 print("hello world!") local arr {"java","mysql","oracle"}; local map {usernamezhangsan,password123}; local fu…

Debezium 同步 PostgreSQL 数据到 RocketMQ 中

1.RocketMQ Connect概览 RocketMQ Connect是RocketMQ数据集成重要组件&#xff0c;可将各种系统中的数据通过高效&#xff0c;可靠&#xff0c;流的方式&#xff0c;流入流出到RocketMQ&#xff0c;它是独立于RocketMQ的一个单独的分布式&#xff0c;可扩展&#xff0c;可容错系…

字节二面:Redis 的大 Key 对持久化有什么影响?

Redis 的持久化方式有两种&#xff1a;AOF 日志和 RDB 快照。 所以接下来&#xff0c;针对这两种持久化方式具体分析分析。 大 Key 对 AOF 日志的影响 先说说 AOF 日志三种写回磁盘的策略 Redis 提供了 3 种 AOF 日志写回硬盘的策略&#xff0c;分别是&#xff1a; Always&am…

Git(四) - Git 分支操作

​​​​​​​ 一、什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候&#xff0c;不会影响主线分支…

前端面试常考 | js原型与原型链

文章目录一. 什么是原型?二. 什么是原型链?一. 什么是原型? 在js中所有的引用类型都有一个__proto__(隐式原型)属性&#xff0c;属性值是一个普通的对象。 而在js中的引用类型包括&#xff1a;Object&#xff0c;Array&#xff0c;Date&#xff0c;Function 而所有函数都有…

基于K8s的DevOps平台实践(二)

文章目录1. 流水线入门&#x1f351; 流水线基础语法&#x1f351; 脚本示例&#x1f351; 脚本解释&#x1f351; Blue Ocean2. Jenkinsfile实践&#x1f351; 演示一&#x1f351; 演示二&#x1f351; 演示三&#x1f351; 演示四&#x1f351; 总结3. 多分支流水线实践&…

BEV视觉3D感知算法梳理

1. 基于BEV空间的自动驾驶感知任务 最近&#xff0c;基于BEV空间下的感知任务已经涌现出了众多优秀算法&#xff0c;并在多个自动驾驶公开数据集&#xff08;KITTI&#xff0c;Waymo&#xff0c;nuScenes&#xff09;上取得了非常不错的成绩。根据自动驾驶汽车上安装的传感器类…

【从零开始学习深度学习】37. 深度循环神经网络与双向循环神经网络简介

目录1. 深度循环神经网络2. 双向循环神经网络总结1. 深度循环神经网络 之前介绍的循环神经网络只有一个单向的隐藏层&#xff0c;在深度学习应用里&#xff0c;我们通常会用到含有多个隐藏层的循环神经网络&#xff0c;也称作深度循环神经网络。下图演示了一个有LLL个隐藏层的…

数字化时代,全方位解读商业智能BI

商业智能BI是一种通用的数据类技术解决方案&#xff0c;不会因为行业BI没有进行针对性开发而出现不适配、无法使用的情况。同时&#xff0c;也正因为商业智能BI核心是数据&#xff0c;只要企业有数据沉淀&#xff0c;不管是哪些行业BI商业智能都能发挥出作用。 不过考虑到不同…

文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128438303 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

portraiture2023智能磨皮修饰滤镜插件中文版

在人像后期修图的时候免不了需要进行磨皮处理&#xff0c;很多人在挑选磨皮软件的时候都不知道该如何选择&#xff0c;今天的文章就来带大家看看磨皮软件哪个好&#xff0c;能磨皮的修图软件和插件!借助磨皮软件即使是新手也能做出高级的人像图片&#xff0c;下面挑选了几款好用…

Java 并发编程知识总结【五】

6. 线程中断与 LockSupport 6.1 线程中断机制 大厂&#xff08;蚂蚁金服&#xff09;面试题&#xff1a; 什么是中断&#xff1f; 首先&#xff0c;一个线程不应该由其他线程来强制中断或停止&#xff0c;而是应该由线程自己自行停止。所以&#xff0c;Thread.stop, Thread.…

Exynos_4412——中断控制器

目录 一、中断控制器 中断控制器的作用&#xff1a; 二、Exynos_4412下的中断控制器 它支持三种类型的中断 可以编程设置&#xff1a; 三、中断控制器详解 四、中断控制器编程 一、中断控制器 外设产生的中断信号&#xff0c;先要经过中断控制器&#xff0c;中断是异常…

如何解决软件项目管理中的冲突?

1、项目干系人间的良好沟通 项目干系人之间保持良好的沟通交流&#xff0c;是减少项目管理中冲突的重要手段。甲乙双方签订合同后&#xff0c;为保障项目的成功&#xff0c;在项目发生矛盾和困难时&#xff0c;需要双方相互理解和沟通&#xff0c;共同协商解决问题。 为了及时解…

Git(八) - IDEA 集成 GitHub

一、设置 GitHub 账号 二、分享工程到 GitHub 来到GitHub中发现已经帮我们创建好了git-test的远程仓库。 三、push 推送本地库到远程库 注意&#xff1a;push是将本地库代码推送到远程库&#xff0c;如果本地库代码跟远程库代码版本不一致&#xff0c; push的操作是会被拒绝的…

go 性能分析pprof和trace

runtime/pprof&#xff1a;采集程序&#xff08;非 Server&#xff09;的运行数据进行分析&#xff0c;用于可结束的代码块&#xff0c;如一次编解码操作等net/http/pprof&#xff1a;采集 HTTP Server 的运行时数据进行分析。用于不可结束的代码块&#xff0c;如 web 应用等 使…

​工程师如何对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师&#xff0c;亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践&#xff0c;也看到了很多 Bad Cases&#xff0c;所以想把自己的一些心得体会写在这里&#xff0c;供工程师进行…

linux的shell的概述

Shell 教程 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Ke…

各种颜色的代码

颜色代码对照表如下&#xff1a; 关于16进制颜色代码&#xff1a; 这有必要了解一颜色系统的概念&#xff1a; RGB&#xff1a;RGB色彩模式是工业界的一种颜色标准&#xff0c;是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的&a…

MySQL的一些有意思的指令和函数

这个里面我准备记录一些比较有意思的MySQL的指令和函数&#xff0c;当然使用函数的时候我们要注意&#xff0c;会不会因为函数导致不走索引&#xff0c;走全表扫描的情况。 因为对索引字段做函数操作&#xff0c;可能会破坏索引值的有序性&#xff0c;因此优化器就决定放弃走树…