Ver Fonte

feat:新增商品

zhangwei há 1 semana atrás
pai
commit
c89aa5ee6b
25 ficheiros alterados com 494 adições e 18 exclusões
  1. 13 7
      edu-travel-common/edu-travel-common-openfeign/src/main/java/edu/travel/config/FeignConfig.java
  2. 16 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/FIleDto.java
  3. 79 1
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductDto.java
  4. 22 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductParametersDto.java
  5. 65 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductSkuDto.java
  6. 32 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductSpecDto.java
  7. 20 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/SkuValueDto.java
  8. 15 0
      edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/SpecValueDto.java
  9. 1 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/entity/ShopProductImage.java
  10. 0 5
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/entity/ShopProductParameters.java
  11. 5 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductImageService.java
  12. 6 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductParametersService.java
  13. 3 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductService.java
  14. 4 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSkuService.java
  15. 4 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSpecService.java
  16. 2 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopSpecService.java
  17. 20 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductImageServiceImpl.java
  18. 19 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductParametersServiceImpl.java
  19. 41 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductServiceImpl.java
  20. 55 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java
  21. 31 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSpecServiceImpl.java
  22. 6 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopSpecServiceImpl.java
  23. 14 0
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/utils/IdUtils.java
  24. 20 1
      edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductController.java
  25. 1 1
      edu-travel-service/edu-travel-service-commodity/src/main/resources/mapper/ShopProductImageMapper.xml

+ 13 - 7
edu-travel-common/edu-travel-common-openfeign/src/main/java/edu/travel/config/FeignConfig.java

@@ -1,17 +1,23 @@
 //package edu.travel.config;
 //
-//import org.apache.http.client.HttpClient;
-//import org.apache.http.impl.client.HttpClientBuilder;
+//
+//import feign.codec.Encoder;
+//import feign.form.spring.SpringFormEncoder;
+//import org.springframework.beans.factory.ObjectFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+//import org.springframework.cloud.openfeign.support.SpringEncoder;
 //import org.springframework.context.annotation.Bean;
 //import org.springframework.context.annotation.Configuration;
 //
 //@Configuration
 //public class FeignConfig {
+//    @Autowired
+//    private ObjectFactory<HttpMessageConverters> messageConverters;
+//
 //    @Bean
-//    public HttpClient apacheHttpClient() {
-//        return HttpClientBuilder.create()
-//                .setMaxConnTotal(1000)          // 最大连接数
-//                .setMaxConnPerRoute(1000)         // 每个路由的最大连接数
-//                .build();
+//    public Encoder feignEncoder() {
+//        return new SpringFormEncoder(new SpringEncoder(messageConverters));
 //    }
+//
 //}

+ 16 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/FIleDto.java

@@ -0,0 +1,16 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+@Data
+public class FIleDto {
+    /**
+     * 文件路径
+     */
+    private String filePath;
+
+    /**
+     * 文件类型
+     */
+    private String fileType;
+}

+ 79 - 1
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductDto.java

@@ -1,12 +1,90 @@
 package edu.travel.remote.dto;
 
+
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 类功能描述:
+ *  新增商品
+ * @author 大春
+ * @date 2025/03/08
+ */
+
 @Data
 public class InsertProductDto {
 
+    /**
+     * 类型ID
+     */
+    private String categoryId;
 
+    /**
+     * 类型名
+     */
+    private String categoryName;
 
+    /**
+     * 商品名称
+     */
     private String productName;
-//    private String productName;
+
+    /**
+     * 商品描述
+     */
+    private String description;
+
+    /**
+     * 热度值
+     */
+    private Integer heatValue;
+
+    /**
+     * 销量
+     */
+    private Integer salesVolume;
+
+    /**
+     * 0 上架 1 下架
+     */
+    private Integer status;
+
+    /**
+     * 价格
+     */
+    private BigDecimal defaultPrice;
+
+    /**
+     * 库房id
+     */
+    private Long warehouseId;
+
+    /**
+     * 国家ID
+     */
+    private Integer countryId;
+
+    /**
+     * 评分满分五分
+     */
+    private Integer scoring;
+    /**
+     * 图片
+     */
+    private List<FIleDto> images;
+    /**
+     *商品规格
+     */
+    private List<InsertProductSpecDto> specs;
+
+    /**
+     * 商品Sku
+     */
+    private List<InsertProductSkuDto> skus;
+    /**
+     * 商品参数
+     */
+    private List<InsertProductParametersDto> parameters;
 }

+ 22 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductParametersDto.java

@@ -0,0 +1,22 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+/**
+ * 类功能描述:
+ *  商品参数
+ * @author 大春
+ * @date 2025/03/08
+ */
+
+@Data
+public class InsertProductParametersDto {
+    /**
+     * 参数ID
+     */
+    private String parametersId;
+    /**
+     * 参数值
+     */
+    private String parameterName;
+}

+ 65 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductSkuDto.java

@@ -0,0 +1,65 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 类功能描述:
+ *  新增商品SKU
+ * @author 大春
+ * @date 2025/03/08
+ */
+
+@Data
+public class InsertProductSkuDto {
+
+    /**
+     * SKU
+     */
+    private String skuId;
+
+    /**
+     * 库房ID
+     */
+    private String warehouseId;
+    /**
+     * 库存
+     */
+    private Integer inventory;
+
+    /**
+     * 0 上架 1 下架
+     */
+    private Integer status;
+
+    /**
+     * 价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 商品SKU图片
+     */
+    private List<String> imageUrl;
+    /**
+     * 销量
+     */
+    private Integer salesVolume;
+
+    /**
+     * 条码
+     */
+    private Integer barcodes;
+    /**
+     * 成本价格
+     */
+    private BigDecimal costPrice;
+    /**
+     * 计件单位id
+     */
+    private String unitId;
+
+    private List<SkuValueDto> skuValues;
+}

+ 32 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/InsertProductSpecDto.java

@@ -0,0 +1,32 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 类功能描述:
+ *  新增商品规格
+ * @author 大春
+ * @date 2025/03/08
+ */
+
+@Data
+public class InsertProductSpecDto {
+    /**
+     * 规格ID
+     */
+    private String specId;
+    /**
+     * 商品规格名称
+     */
+    private String specName;
+    /**
+     * 权重
+     */
+    private Integer sortOrder;
+    /**
+     * 规格值
+     */
+    private List<SpecValueDto> specValues;
+}

+ 20 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/SkuValueDto.java

@@ -0,0 +1,20 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+@Data
+public class SkuValueDto {
+    /**
+     * 规格ID
+     */
+    private String specId;
+    /**
+     * 规格名称
+     */
+    private String specName;
+    /**
+     * 规格值名称
+     */
+    private String specValueName;
+
+}

+ 15 - 0
edu-travel-remote/edu-travel-remote-commodity/src/main/java/edu/travel/remote/dto/SpecValueDto.java

@@ -0,0 +1,15 @@
+package edu.travel.remote.dto;
+
+import lombok.Data;
+
+@Data
+public class SpecValueDto {
+    /**
+     * 规格值ID
+     */
+    private String specValueId;
+    /**
+     * 规格值
+     */
+    private String specValueName;
+}

+ 1 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/entity/ShopProductImage.java

@@ -47,7 +47,7 @@ public class ShopProductImage extends BaseEntity {
      * 判断图片/视频,默认0,0图片,1视频
      */
     @TableField(value = "url_type")
-    private Integer urlType;
+    private String urlType;
 
     /**
      * 权重排序

+ 0 - 5
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/entity/ShopProductParameters.java

@@ -43,9 +43,4 @@ public class ShopProductParameters extends BaseEntity {
     @TableField(value = "parameters_value")
     private String parametersValue;
 
-    /**
-     * 国家ID
-     */
-    @TableField(value = "country_id")
-    private Long countryId;
 }

+ 5 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductImageService.java

@@ -2,7 +2,11 @@ package edu.travel.commodity.service;
 
 import edu.travel.commodity.entity.ShopProductImage;
 import com.baomidou.mybatisplus.extension.service.IService;
-public interface ShopProductImageService extends IService<ShopProductImage>{
+import edu.travel.remote.dto.FIleDto;
+
+import java.util.List;
 
+public interface ShopProductImageService extends IService<ShopProductImage>{
 
+    public boolean saveProductImage(Long productId, List<FIleDto> images);
 }

+ 6 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductParametersService.java

@@ -1,8 +1,14 @@
 package edu.travel.commodity.service;
 
+import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.entity.ShopProductParameters;
 import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.remote.dto.InsertProductParametersDto;
+
+import java.util.List;
+
 public interface ShopProductParametersService extends IService<ShopProductParameters>{
 
 
+    boolean insertProductParameters(List<InsertProductParametersDto> parameters, ShopProduct bean);
 }

+ 3 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import edu.travel.commodity.entity.ShopProduct;
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.remote.dto.GetProductByTypeDto;
+import edu.travel.remote.dto.InsertProductDto;
 import edu.travel.remote.dto.SearchProductDto;
 import edu.travel.remote.vo.ShopProductVo;
 
@@ -15,4 +16,6 @@ public interface ShopProductService extends IService<ShopProduct>{
     Page<ShopProductVo> getHotProduct(GetProductByTypeDto param);
 
     Page<ShopProductVo> searchProduct(SearchProductDto param) throws IOException;
+
+    void insertProduct(InsertProductDto params);
 }

+ 4 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSkuService.java

@@ -1,8 +1,11 @@
 package edu.travel.commodity.service;
 
+import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.entity.ShopProductSku;
 import com.baomidou.mybatisplus.extension.service.IService;
 import edu.travel.remote.dto.AddShopOrderDto;
+import edu.travel.remote.dto.InsertProductSkuDto;
+import edu.travel.remote.dto.InsertProductSpecDto;
 import edu.travel.remote.vo.ShopSkuSpecValueVo;
 
 import java.util.List;
@@ -16,4 +19,5 @@ public interface ShopProductSkuService extends IService<ShopProductSku>{
 
     void shopProductSku(AddShopOrderDto params);
 
+    boolean insertProductSku(List<InsertProductSpecDto> specs,List<InsertProductSkuDto> skus, ShopProduct id);
 }

+ 4 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopProductSpecService.java

@@ -1,7 +1,9 @@
 package edu.travel.commodity.service;
 
+import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.entity.ShopProductSpec;
 import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.remote.dto.InsertProductSpecDto;
 import edu.travel.remote.dto.ProductSpecDto;
 import edu.travel.remote.vo.ProductSpecVo;
 import edu.travel.remote.vo.SpecSortVo;
@@ -14,4 +16,6 @@ public interface ShopProductSpecService extends IService<ShopProductSpec>{
     ProductSpecVo getShopSpec(ProductSpecDto param);
 
     List<SpecSortVo> getSpecSortVoList(String productId);
+
+    boolean insertProductSpec(List<InsertProductSpecDto> specs, ShopProduct bean);
 }

+ 2 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/ShopSpecService.java

@@ -2,6 +2,8 @@ package edu.travel.commodity.service;
 
 import edu.travel.commodity.entity.ShopSpec;
 import com.baomidou.mybatisplus.extension.service.IService;
+
+
 public interface ShopSpecService extends IService<ShopSpec>{
 
 

+ 20 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductImageServiceImpl.java

@@ -4,9 +4,29 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import edu.travel.commodity.entity.ShopProductImage;
 import edu.travel.commodity.mapper.ShopProductImageMapper;
 import edu.travel.commodity.service.ShopProductImageService;
+import edu.travel.remote.dto.FIleDto;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
 public class ShopProductImageServiceImpl extends ServiceImpl<ShopProductImageMapper, ShopProductImage> implements ShopProductImageService {
 
+    @Override
+    @Transactional
+    public boolean saveProductImage(Long productId, List<FIleDto> images) {
+        ArrayList<ShopProductImage> shopProductImages = new ArrayList<>();
+
+        for (FIleDto fIleDto : images) {
+            ShopProductImage shopProductImage = new ShopProductImage();
+            shopProductImage.setProductId(productId);
+            shopProductImage.setUrl(fIleDto.getFilePath());
+            shopProductImage.setUrlType(fIleDto.getFileType());
+            shopProductImages.add(shopProductImage);
+        }
+        return saveBatch(shopProductImages);
+    }
 }

+ 19 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductParametersServiceImpl.java

@@ -1,12 +1,31 @@
 package edu.travel.commodity.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.entity.ShopProductParameters;
 import edu.travel.commodity.mapper.ShopProductParametersMapper;
 import edu.travel.commodity.service.ShopProductParametersService;
+import edu.travel.remote.dto.InsertProductParametersDto;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Service
 public class ShopProductParametersServiceImpl extends ServiceImpl<ShopProductParametersMapper, ShopProductParameters> implements ShopProductParametersService {
 
+    @Override
+    @Transactional
+    public boolean insertProductParameters(List<InsertProductParametersDto> parameters, ShopProduct bean) {
+        ArrayList<ShopProductParameters> list = new ArrayList<>();
+        for (InsertProductParametersDto parameter : parameters) {
+            ShopProductParameters shopProductParameters = new ShopProductParameters();
+            shopProductParameters.setParametersId(Long.valueOf(parameter.getParametersId()));
+            shopProductParameters.setParametersValue(parameter.getParameterName());
+            shopProductParameters.setProductId(bean.getId());
+            list.add(shopProductParameters);
+        }
+        return this.saveBatch(list);
+    }
 }

+ 41 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductServiceImpl.java

@@ -1,5 +1,6 @@
 package edu.travel.commodity.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -8,18 +9,34 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import edu.travel.commodity.constant.BaseConstant;
 import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.mapper.ShopProductMapper;
-import edu.travel.commodity.service.ShopProductService;
+import edu.travel.commodity.service.*;
+import edu.travel.commodity.utils.ObjectUtils;
 import edu.travel.commodity.utils.PageUtil;
 import edu.travel.remote.dto.GetProductByTypeDto;
+import edu.travel.remote.dto.InsertProductDto;
 import edu.travel.remote.dto.SearchProductDto;
+import edu.travel.remote.dto.FIleDto;
 import edu.travel.remote.vo.ShopProductVo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
+import java.util.List;
 
 @Service
 public class ShopProductServiceImpl extends ServiceImpl<ShopProductMapper, ShopProduct> implements ShopProductService {
+    @Autowired
+    private ShopProductImageService shopProductImageService;
 
+    @Autowired
+    private ShopProductSkuService shopProductSkuService;
+
+    @Autowired
+    private ShopProductSpecService shopProductSpecService;
+
+    @Autowired
+    private ShopProductParametersService shopProductParametersService;
 
     @Override
     public Page<ShopProductVo> getHotProduct(GetProductByTypeDto type) {
@@ -41,4 +58,27 @@ public class ShopProductServiceImpl extends ServiceImpl<ShopProductMapper, ShopP
 
         return null;
     }
+
+    @Override
+    @Transactional
+    public void insertProduct(InsertProductDto params) {
+        ShopProduct bean = BeanUtil.toBean(params, ShopProduct.class);
+
+        List<FIleDto> imageList = ObjectUtils.castList(params.getImages(), FIleDto.class);
+        bean.setMainImageUrl(imageList.get(0).getFilePath());
+        //保存商品
+        this.save(bean);
+        //保存商品规格和规格值
+        boolean b1 = shopProductSpecService.insertProductSpec(params.getSpecs(), bean);
+
+        //保存商品图片
+        boolean b2 = shopProductImageService.saveProductImage(bean.getId(), imageList);
+
+        //添加一个空的sku
+        boolean b3 = shopProductSkuService.insertProductSku(params.getSpecs(),params.getSkus(), bean);
+
+        //保存商品参数
+        boolean b4 = shopProductParametersService.insertProductParameters(params.getParameters(), bean);
+
+    }
 }

+ 55 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSkuServiceImpl.java

@@ -15,12 +15,15 @@ import edu.travel.commodity.constant.RedisKey;
 import edu.travel.commodity.entity.ShopAddress;
 import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.entity.ShopProductSku;
+import edu.travel.commodity.entity.ShopSkuSpecValue;
 import edu.travel.commodity.enums.OrderStateEnum;
 import edu.travel.commodity.mapper.ShopProductSkuMapper;
 import edu.travel.commodity.mapper.ShopProductSpecMapper;
 import edu.travel.commodity.service.ShopAddressService;
 import edu.travel.commodity.service.ShopProductService;
 import edu.travel.commodity.service.ShopProductSkuService;
+import edu.travel.commodity.service.ShopSkuSpecValueService;
+import edu.travel.commodity.utils.StringUtil;
 import edu.travel.commodity.utils.TokenData;
 import edu.travel.exception.BaseException;
 import edu.travel.remote.dto.*;
@@ -31,10 +34,12 @@ import edu.travel.rpc.RPCBaseResponse;
 import edu.travel.vo.BaseCountryServeVo;
 import edu.travel.vo.ShopCurrencyVo;
 import io.seata.spring.annotation.GlobalTransactional;
+import org.checkerframework.checker.units.qual.C;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -71,6 +76,8 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
     private ShopOrderLogAdapter shopOrderLogAdapter;
     @Autowired
     private ShopProductSkuService shopProductSkuService;
+    @Autowired
+    private ShopSkuSpecValueService shopSkuSpecValueService;
     /**
      *  查询SKU下的规格和对应的规格值 规格 排序  规格值排序
      *  sku -> 规格 ->规格值
@@ -209,6 +216,54 @@ public class ShopProductSkuServiceImpl extends ServiceImpl<ShopProductSkuMapper,
         }
     }
 
+    @Override
+    @Transactional
+    public boolean insertProductSku(List<InsertProductSpecDto> specs,List<InsertProductSkuDto> skus, ShopProduct product) {
+        ArrayList<ShopProductSku> shopProductSkus = new ArrayList<>();
+        ArrayList<ShopSkuSpecValue> shopSkuSpecValues = new ArrayList<>();
+        if(ObjectUtil.isEmpty(skus)){
+            ShopProductSku bean = new ShopProductSku();
+            bean.setProductId(product.getId());
+            Snowflake snowflake = IdUtil.createSnowflake(1, 1);
+            long sku = snowflake.nextId();
+            bean.setSkuId(sku);
+            bean.setPrice(product.getDefaultPrice());
+            bean.setImageUrl(product.getMainImageUrl());
+            shopProductSkus.add(bean);
+            ShopSkuSpecValue skuValue = new ShopSkuSpecValue();
+            skuValue.setSkuId(sku);
+            skuValue.setSpecValueId(-1L);
+            skuValue.setSpecId(-1L);
+            shopSkuSpecValues.add(skuValue);
+        }else {
+            for (InsertProductSkuDto insertProductSkuDto : skus) {
+                ShopProductSku bean = BeanUtil.toBean(insertProductSkuDto, ShopProductSku.class);
+                bean.setProductId(product.getId());
+                bean.setImageUrl(StringUtil.toListString(insertProductSkuDto.getImageUrl()));
+                shopProductSkus.add(bean);
+                for (SkuValueDto skuValues : insertProductSkuDto.getSkuValues()) {
+                    ShopSkuSpecValue skuValue = new ShopSkuSpecValue();
+                    skuValue.setSkuId(bean.getSkuId());
+                    skuValue.setSpecId(Long.valueOf(skuValues.getSpecId()));
+                    List<InsertProductSpecDto> collect = specs.stream().filter(spec -> spec.getSpecId().equals(skuValues.getSpecId()))
+                            .collect(Collectors.toList());
+                    if(ObjectUtil.isEmpty(collect)){
+                       throw new BaseException("规格不存在");
+                    }
+                    InsertProductSpecDto insertProductSpecDto = collect.get(0);
+
+                    List<SpecValueDto> collect1 = insertProductSpecDto.getSpecValues().stream()
+                            .filter(specValue -> specValue.getSpecValueName().equals(skuValues.getSpecValueName())).collect(Collectors.toList());
+                    skuValue.setSpecValueId(Long.valueOf(collect1.get(0).getSpecValueId()));
+
+                    shopSkuSpecValues.add(skuValue);
+                }
+            }
+        }
+        shopSkuSpecValueService.saveBatch(shopSkuSpecValues);
+        return saveBatch(shopProductSkus);
+    }
+
 
     //获取商品快照信息
     public Map<String,ShopSnapshotVo> getSnapshot(List<AddShopProductOrderDto> products) {

+ 31 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopProductSpecServiceImpl.java

@@ -9,10 +9,14 @@ import edu.travel.commodity.constant.BaseConstant;
 import edu.travel.commodity.entity.*;
 import edu.travel.commodity.mapper.ShopProductSpecMapper;
 import edu.travel.commodity.service.*;
+import edu.travel.commodity.utils.IdUtils;
+import edu.travel.remote.dto.InsertProductSpecDto;
 import edu.travel.remote.dto.ProductSpecDto;
+import edu.travel.remote.dto.SpecValueDto;
 import edu.travel.remote.vo.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
@@ -107,6 +111,33 @@ public class ShopProductSpecServiceImpl extends ServiceImpl<ShopProductSpecMappe
         return list;
     }
 
+    @Override
+    @Transactional
+    public boolean insertProductSpec(List<InsertProductSpecDto> specs, ShopProduct bean) {
+        ArrayList<ShopProductSpec> list = new ArrayList<>();
+        ArrayList<ShopSpecValue> shopSpecValues = new ArrayList<>();
+        for (InsertProductSpecDto spec : specs) {
+            ShopProductSpec shopProductSpec = new ShopProductSpec();
+            long id = IdUtils.getSnowflakeId();
+            shopProductSpec.setId(id);
+            shopProductSpec.setProductId(bean.getId());
+            shopProductSpec.setSpecName(spec.getSpecName());
+            shopProductSpec.setSpecId(Long.valueOf(spec.getSpecId()));
+            list.add(shopProductSpec);
+            //规格值
+            for (SpecValueDto specValue : spec.getSpecValues()) {
+                ShopSpecValue shopSpecValue = new ShopSpecValue();
+                long valueId = IdUtils.getSnowflakeId();
+                specValue.setSpecValueId(valueId+"");
+                shopSpecValue.setId(valueId);
+                shopSpecValue.setProductSpecId(id);
+                shopSpecValue.setSpecValue(specValue.getSpecValueName());
+                shopSpecValues.add(shopSpecValue);
+            }
+        }
+        this.saveBatch(list);
+        return shopSpecValueService.saveBatch(shopSpecValues);
+    }
 
 
 }

+ 6 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/service/impl/ShopSpecServiceImpl.java

@@ -1,12 +1,18 @@
 package edu.travel.commodity.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.commodity.entity.ShopProduct;
 import edu.travel.commodity.entity.ShopSpec;
 import edu.travel.commodity.mapper.ShopSpecMapper;
 import edu.travel.commodity.service.ShopSpecService;
+import edu.travel.remote.dto.InsertProductSpecDto;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 @Service
 public class ShopSpecServiceImpl extends ServiceImpl<ShopSpecMapper, ShopSpec> implements ShopSpecService {
 
+
 }

+ 14 - 0
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/utils/IdUtils.java

@@ -0,0 +1,14 @@
+package edu.travel.commodity.utils;
+
+import cn.hutool.core.lang.Singleton;
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
+import lombok.Data;
+
+@Data
+public class IdUtils {
+    public static long getSnowflakeId() {
+        Snowflake snowflake = Singleton.get(Snowflake.class, 1L, 1L, true);
+        return  snowflake.nextId();
+    }
+}

+ 20 - 1
edu-travel-service/edu-travel-service-commodity/src/main/java/edu/travel/commodity/web/ShopProductController.java

@@ -2,6 +2,7 @@ package edu.travel.commodity.web;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileTypeUtil;
+import cn.hutool.core.lang.Snowflake;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -102,10 +103,28 @@ public class ShopProductController extends BaseController<ShopProduct> {
     }
 
 
+    /**
+     *  新增商品
+     * @param params
+     * @return {@link RPCBaseResponse }<{@link Void }>
+     */
 
     @PostMapping("/insertProduct")
     public RPCBaseResponse<Void> insertProduct(@RequestBody InsertProductDto params){
-        return null;
+        shopProductService.insertProduct(params);
+        return success();
     }
 
+    /**
+     *  获取SkuId
+     * @param params
+     * @return {@link RPCBaseResponse }<{@link String }>
+     */
+
+    @GetMapping("/getSkuId")
+    public RPCBaseResponse<String> getSkuId(@RequestBody InsertProductDto params){
+        Snowflake snowflake = IdUtil.createSnowflake(1, 1);
+        long orderNum = snowflake.nextId();
+        return success(orderNum+"");
+    }
 }

+ 1 - 1
edu-travel-service/edu-travel-service-commodity/src/main/resources/mapper/ShopProductImageMapper.xml

@@ -8,7 +8,7 @@
     <result column="sku_id" jdbcType="BIGINT" property="skuId" />
     <result column="product_id" jdbcType="BIGINT" property="productId" />
     <result column="url" jdbcType="VARCHAR" property="url" />
-    <result column="url_type" jdbcType="INTEGER" property="urlType" />
+    <result column="url_type" jdbcType="VARCHAR" property="urlType" />
     <result column="sort_order" jdbcType="INTEGER" property="sortOrder" />
     <result column="project" jdbcType="VARCHAR" property="project" />
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />