谷粒商城day61-商品服务-API-新增商品-保存SPU基本信息+保存SKU基本信息+调用远程服务保存优惠等信息

Feign远程调用 说明: 分布式远程调用,feign。下面以电商项目的会员服务(member)与优惠服务(coupon)进行演示。如有错,请大佬指点 一、 导入包(使用远程调用的服务都要导)。 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId& 阅读详情

1.调整之前生成的实体类

把ID相关的字段类型都改为Long,把积分价格等相关的字段类型都改为BigDecimal

然后用@Data注解替代get,set方法

如下图

2.核心代码

service层

SpuInfoServiceImpl
    /**
     * //TODO 高级部分完善
     * @param vo
     */
    @Transactional
    @Override
    public void saveSpuInfo(SpuSaveVo vo) {

        //1、保存spu基本信息 pms_spu_info
        SpuInfoEntity infoEntity = new SpuInfoEntity();
        BeanUtils.copyProperties(vo,infoEntity);
        infoEntity.setCreateTime(new Date());
        infoEntity.setUpdateTime(new Date());
        this.saveBaseSpuInfo(infoEntity);

        //2、保存Spu的描述图片 pms_spu_info_desc
        List<String> decript = vo.getDecript();
        SpuInfoDescEntity descEntity = new SpuInfoDescEntity();
        descEntity.setSpuId(infoEntity.getId());
        descEntity.setDecript(String.join(",",decript));
        spuInfoDescService.saveSpuInfoDesc(descEntity);



        //3、保存spu的图片集 pms_spu_images
        List<String> images = vo.getImages();
        imagesService.saveImages(infoEntity.getId(),images);


        //4、保存spu的规格参数;pms_product_attr_value
        List<BaseAttrs> baseAttrs = vo.getBaseAttrs();
        List<ProductAttrValueEntity> collect = baseAttrs.stream().map(attr -> {
            ProductAttrValueEntity valueEntity = new ProductAttrValueEntity();
            valueEntity.setAttrId(attr.getAttrId());
            AttrEntity id = attrService.getById(attr.getAttrId());
            valueEntity.setAttrName(id.getAttrName());
            valueEntity.setAttrValue(attr.getAttrValues());
            valueEntity.setQuickShow(attr.getShowDesc());
            valueEntity.setSpuId(infoEntity.getId());

            return valueEntity;
        }).collect(Collectors.toList());
        attrValueService.saveProductAttr(collect);


        //5、保存spu的积分信息;gulimall_sms->sms_spu_bounds
        Bounds bounds = vo.getBounds();
        SpuBoundTo spuBoundTo = new SpuBoundTo();
        BeanUtils.copyProperties(bounds,spuBoundTo);
        spuBoundTo.setSpuId(infoEntity.getId());
        R r = couponFeignService.saveSpuBounds(spuBoundTo);
        if(r.getCode() != 0){
            log.error("远程保存spu积分信息失败");
        }


        //5、保存当前spu对应的所有sku信息;

        List<Skus> skus = vo.getSkus();
        if(skus!=null && skus.size()>0){
            skus.forEach(item->{
                String defaultImg = "";
                for (Images image : item.getImages()) {
                    if(image.getDefaultImg() == 1){
                        defaultImg = image.getImgUrl();
                    }
                }
                //    private String skuName;
                //    private BigDecimal price;
                //    private String skuTitle;
                //    private String skuSubtitle;
                SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
                BeanUtils.copyProperties(item,skuInfoEntity);
                skuInfoEntity.setBrandId(infoEntity.getBrandId());
                skuInfoEntity.setCatalogId(infoEntity.getCatalogId());
                skuInfoEntity.setSaleCount(0L);
                skuInfoEntity.setSpuId(infoEntity.getId());
                skuInfoEntity.setSkuDefaultImg(defaultImg);
                //5.1)、sku的基本信息;pms_sku_info
                skuInfoService.saveSkuInfo(skuInfoEntity);

                Long skuId = skuInfoEntity.getSkuId();

                List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setImgUrl(img.getImgUrl());
                    skuImagesEntity.setDefaultImg(img.getDefaultImg());
                    return skuImagesEntity;
                }).filter(entity->{
                    //返回true就是需要,false就是剔除
                    return !StringUtils.isEmpty(entity.getImgUrl());
                }).collect(Collectors.toList());
                //5.2)、sku的图片信息;pms_sku_image
                skuImagesService.saveBatch(imagesEntities);
                //TODO 没有图片路径的无需保存

                List<Attr> attr = item.getAttr();
                List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attr.stream().map(a -> {
                    SkuSaleAttrValueEntity attrValueEntity = new SkuSaleAttrValueEntity();
                    BeanUtils.copyProperties(a, attrValueEntity);
                    attrValueEntity.setSkuId(skuId);

                    return attrValueEntity;
                }).collect(Collectors.toList());
                //5.3)、sku的销售属性信息:pms_sku_sale_attr_value
                skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);

                // //5.4)、sku的优惠、满减等信息;gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price
                SkuReductionTo skuReductionTo = new SkuReductionTo();
                BeanUtils.copyProperties(item,skuReductionTo);
                skuReductionTo.setSkuId(skuId);
                if(skuReductionTo.getFullCount() >0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0")) == 1){
                    R r1 = couponFeignService.saveSkuReduction(skuReductionTo);
                    if(r1.getCode() != 0){
                        log.error("远程保存sku优惠信息失败");
                    }
                }



            });
        }
    }
接口,为了调用远程服务
package com.atguigu.gulimall.product.feign;

import com.atguigu.common.to.SkuReductionTo;
import com.atguigu.common.to.SpuBoundTo;
import com.atguigu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient("gulimall-coupon")
public interface CouponFeignService {


    /**
     * 1、CouponFeignService.saveSpuBounds(spuBoundTo);
     *      1)、@RequestBody将这个对象转为json。
     *      2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。
     *          将上一步转的json放在请求体位置,发送请求;
     *      3)、对方服务收到请求。请求体里有json数据。
     *          (@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;
     * 只要json数据模型是兼容的。双方服务无需使用同一个to
     * @param spuBoundTo
     * @return
     */
    @PostMapping("/coupon/spubounds/save")
    R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);


    @PostMapping("/coupon/skufullreduction/saveinfo")
    R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
}

SkuFullReductionServiceImpl
    @Override
    public void saveSkuReduction(SkuReductionTo skuReductionTo) {

        SkuLadderEntity skuLadderEntity = new SkuLadderEntity();
        skuLadderEntity.setSkuId(skuReductionTo.getSkuId());
        skuLadderEntity.setDiscount(skuReductionTo.getDiscount());
        skuLadderEntity.setAddOther(skuReductionTo.getCountStatus());
        skuLadderEntity.setFullCount(skuReductionTo.getFullCount());

        SkuFullReductionEntity skuFullReductionEntity = new SkuFullReductionEntity();
        BeanUtils.copyProperties(skuReductionTo,skuFullReductionEntity);
        this.save(skuFullReductionEntity);

        List<MemberPrice> memberPrices = skuReductionTo.getMemberPrice();

        List<MemberPriceEntity> memberPriceEntities = memberPrices.stream().map(memberPrice -> {
            MemberPriceEntity memberPriceEntity = new MemberPriceEntity();
            memberPriceEntity.setAddOther(1);
            memberPriceEntity.setMemberLevelName(memberPrice.getName());
            memberPriceEntity.setMemberPrice(memberPrice.getPrice());
            memberPriceEntity.setMemberLevelId(memberPrice.getId());
            memberPriceEntity.setSkuId(skuReductionTo.getSkuId());

            return memberPriceEntity;
        }).filter(item ->{
            return item.getMemberPrice().compareTo(new BigDecimal("0")) == 1;
        }).collect(Collectors.toList());

        memberPriceService.saveBatch(memberPriceEntities);
    }

3.测试

添加compound用于一次性批量启动

设置内存

开始新增

基本信息

基本参数

设置sku信息

折扣积分啥的

后台接收到的vo

数据库中为了查看未提交的数据,可修改隔离级别为读未提交

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战 本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。 阅读详情

相关推荐

基于陀螺仪航向反馈的轮式机器人PID直线控制

航向角控制是移动机器人实现稳定直线运动的基础技术,其本质是通过实时感知机体朝向偏差并动态调节驱动输出,以抵消机械不对称、轮径误差等固有扰动。该方法依托陀螺仪测量角速度并积分解算航向角,结合离散化PID算法生成补偿性PWM指令,在嵌入式平台(如STM32)上构建低延迟闭环。相比依赖编码器的速度闭环,它规避了轮径标定与安装偏心等误差源,显著提升低成本平台的工程鲁棒性与部署效率。典型应用场景包括教育机器人直线循迹、AGV基础导航模块开发及IMU-PID融合控制原型验证。

web39explorer的博客 1110

商品管理系统——商品新增远程调用保存实现部分

一 SpuInfoServiceImpl.java /** * 功能描述:保存商品信息 * * @param vo 待保存的商品信息 * @author cakin * @date 2020/11/8 */ @Transactional @Override public void saveSpuInfo(SpuSaveVo vo) { // 1 保存spu基本信息 pms_spu_info SpuInfoEntity infoEntity = new SpuInfoEntity();

实践求真知 818

机器学习-深嵌交叉验证(Nested Cross-Validation)

Section I: Code and Analyses 第一部分:代码 from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from...

Santorinisu Blogs 2716

谷粒商城笔记+踩坑(7)——新增商品,请求参数转vo类

效果展示、配置、启动会员模块、获取当前分类关联的品牌(不用分页)、获取当前分类下的分组及其关联的属性、新增商品、添加复合配置、限制内存、报错loadbalancer解决

种一棵树最好的时间是十年前,其次是现在 3656

【DDSCAT——离散偶极近似仿真程序05】模型设计Matlab代码:多核壳球 、多核壳圆柱

简洁明了,后面及部分给出的都是模型设计的Matlab代码,这些代码都来自于一篇文章:Chin C W S. Localized Surface Plasmon Resonance with the use of Silver and Titanium Oxide Nanostructures[J]. 2011. 一、设计多个核壳球形结构 1)Matlab代码 ...

XD_Yangf的博客 4260

jetson agx orin开箱及接口介绍

jetson agx orin开箱及接口介绍

qq_58728069的博客 1万+

谷粒商城--秒杀服务--高级篇笔记十二

谷粒商城–秒杀服务–高级篇笔记十二 1.后台添加秒杀商品 未配置秒杀服务相关网关 1.1 配置网关 - id: coupon_route uri: lb://gulimall-coupon predicates: - Path=/api/coupon/** filters: - RewritePath=/api/(?<segment>.*),/$\{segment}

qq_31745863的博客 3291

操作系統恐龍書第十版課後答案CH10

課後

apple_72111807的博客 4046

java商品新增怎麽弄_网上商城新增商品功能的实现

新增商品功能的实现分析:从上面我们可以看到,商品的添加分为商品的类目选择,商品的图片上传,商品的信息保存功能。一、商品的类目选择,即添加的商品属于哪一类具体分析步骤:(1)首先我们看下商品类目对应数据库中的哪个表然后看下jsp页面是怎么设计的找到跳转的js:ctrl+H,搜索js找到url,我们可以看到显示列表采用的是easyui的tree控件来进行操作的,这是一个异步tree的使用;展开是这种形...

weixin_36044132的博客 913

Altium Designer 16来自原理图/PCB的各种报错 (持续更新):

NO1.Nets with only one pin: 根本原因: 在BGA的原理图绘制时,我一般习惯拉出该元件的所有IO的网络,这方便利于我开发其他款板卡。同样也会因为不同板卡的需求不同而造成有些IO并没有使用到,也就是整个原理图中only one pin。 解决方案: 鼠标右键工程文件>工程参数>下图圈中的选项将“错误”更改为“警告/不报告” ...

优快云@猿谷攻城狮 1万+

MATLAB算法实战应用案例精讲-【数模应用】装箱问题

装箱问题可以根据不同的维度进行分类。以下是一些常见的装箱问题二维装箱问题:二维装箱问题假设所有物品都是平面上的矩形,并且需要将它们放入平面上的容器中。这个问题的目标是找到一种装箱方案,使得物品不重叠并占据的总面积最小。三维装箱问题:三维装箱问题考虑到物品可以具有高度,并且需要将它们放入三维容器(如箱子或货柜)中。目标是找到一种装箱方案,使得物品不重叠且总体积最小。多维装箱问题:多维装箱问题是指在更高维度空间中进行装箱的问题。除了长度和宽度之外,物品可能具有其他属性,如高度、重量、形状等。

qq_36130719的博客 1572

谷粒商城项目篇6_分布式基础完结篇_商品服务模块(品牌管理、平台属性、新增商品)、仓储服务模块(仓库管理)

目录 商品服务模块 品牌管理 平台属性 新增商品 仓储服务模块 仓库管理 一、品牌管理 1.品牌对应三级分类的增删改查 点击关联查询,查出该品牌对应的三级分类list /** * 自定义查询方法 * 根据 品牌id 查询关联的 category分类 * * @return */ @Override public List<CategoryBrandRelationEntity> queryByBrandId(L

xiaosi的博客 1270

《计算机视觉:从入门到精通》技术手册 第1章 计算机视觉概述与历史演进

视觉感知与机器视觉在工程实践中常被混用,但二者存在本质差异。视觉感知强调对光学信号的语义理解与场景解释,核心在于从二维投影重建三维世界的物理与语义属性。该领域关注遮挡处理、光照变化、材质反射等复杂因素的建模,其目标是实现类似人类视觉系统的场景理解能力。机器视觉则侧重于工业场景中的精密测量与控制,通常基于结构化光源、已知几何约束与标定参数,执行边缘检测、尺寸测量、位置定位等任务。前者面向开放环境的通用理解,后者面向受控环境的精确执行。

u012133341的博客 269

实战 - 谷粒商城项目:高级上篇First

文章目录SpringCloud 商城项目 - 高级篇1. ElaticSearch全文检索1.1 docker安装elasticsearch和kibana1.2 elasticsearch入门1.3 elasticsearch进阶1.4 Elasticsearch-Rest-Client2. 商城业务 - 商品上架2.1 构造基本数据2.2 查询当前sku可以被用来检索的规格属性2.3 远程调用gulimall-ware服务查询是否有库存2.4 远程调用gulimall-search将数据放在es保存实现上

你今天真好看呀 2902

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

谷粒商城 高级篇 (五) --------- 商品上架

谷粒商城 商品上架相关编写

在森林里麋了鹿 1136

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

谷粒商城P91~92【商品系统】-> 【商品维护】->【发布商品】~ 保存商品信息功能调试修改

设置批量启动

爱吃小香葱的博客 496

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

谷粒商城仓储服务启动失败,提示ProductFeignService‘ that could not be found

谷粒商城仓储服务启动失败。

weixin_40918783的博客 505

Field adminMapper in com.atguigu.ssm.service.impl.AdminServiceimpl required a bean of type ‘com.atgu

Description: Field adminMapper in com.atguigu.ssm.service.impl.AdminServiceimpl required a bean of type ‘com.atguigu.ssm.mapper.TAdminMapper’ that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.a

weixin_44295084的博客 2223

谷粒商城项目8——商品上架 上架商品sku保存到es nginx配置

接下来对ES的存储结构进行分析首先分析需求分析存储结构所以,我们如下设计,这样才是文档区别于关系型数据库的地方,宽表设计,不能去考虑数据库范式。index: 默认 true,如果为 false,表示该字段不会被索引,但是检索结果里面有,但字段本身不能 当做检索条件。 我们注意到 attrs 的数据类型为 “nested”,nested 是用来解决Es-数组的扁平化处理问题的。nested 类型(嵌套字段类型)是对象数据类型的专用版本,它允许以一种可以独立查询的方式对对象数据进行索引。Elasticsearc

想去很远地方 1149

【尚庭公寓SpringBoot + Vue 项目实战】房间管理(十二)

房间管理共有六个接口,分别是保存或更新房间信息根据条件分页查询详细信息根据ID获取房间详情信息根据ID删除房间信息根据ID修改房间发布状态根据公寓ID查询房间信息列表查看接口代码开发查看请求的数据结构查看web-admin模块中的,内容如下@Data@Schema(description = "房间信息")@Schema(description = "图片列表")@Schema(description = "属性信息列表")

小林的博客 1593

仓储服务-完成采购

1.接口文档 2.抽取VO 2.1.PurchaseDoneVo package com.atguigu.gulimall.ware.vo; import lombok.Data; import javax.validation.constraints.NotNull; import java.util.List; @Data public class PurchaseDoneVo { /** * 采购单id */ @NotNull private Lo

小生不才的博客 497

谷粒商城 P91 memberPrice为空

2、定位到 gulimall-coupon 的 SkuFullReductionServiceImpl 的 saveSkuReduction() 方法中的 List<MemberPrice> memberPrices = skuReductionTo.getMemberPrice();5、遍历迭代器,发现其他参数的 isAssignable 都是 true,而 memberPrice 的是 false。4、单步调试,进入 BeanUtils.copyProperties() 方法。

m0_51614605的博客 282

通过源码解决Field xxxMapper in xxx required a bean of type ‘xxxMapper‘ that could not be found.

项目中我们经常会遇到这样的错误:`Field userMapper in com.shiqi.mybatis.bug.demo.service.impl.UserServiceImpl required a bean of type 'com.shiqi.mybatis.bug.demo.mapper.UserMapper' that could not be found.` 今天我们就一起通过源码来探究下产生的原因。

Hi_alan的博客 667

分布式组件之Feign

以gulimall-member和gulimall-coupon为例,想要获取当前会员领取到的所有优惠券。先去注册中心找优惠券服务, 注册中心调一台优惠券服务器给会员,会员服务器发送请求给这台优 惠券服务器,然后对方响应。 声明式远程调用 feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。 给远程服务发的是HTTP请求。 会员服务想要远程调用优惠券服务,只需要给会员服务里引入 openfeign依赖,他就有了远程调用其他服务的能力。 <dependency>

m0_55336071的博客 351

Field rightsService in com.jt.controller.RightsController required a bean of type ‘com.jt.service.R

问题处理

m0_47943986的博客 306

Field deptMapper in DeptServiceImpl required a bean of type ‘mapper‘有效解决

黑马最新javaweb教程136查询功能实现问题

qq_42181332的博客 497
上一篇: 谷粒商城day60-使用feign调用远程服务要保证的几个点
下一篇: 谷粒商城day62-商品服务-API-新增商品-SPU与SKU检索
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我才是真的封不觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值