Ver Fonte

产品管理相关

yzc há 2 anos atrás
pai
commit
1308beb7c4
25 ficheiros alterados com 956 adições e 23 exclusões
  1. 24 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/vo/TableBottom.java
  2. 29 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/vo/TableStatisticRes.java
  3. 33 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/vo/TableTop.java
  4. 5 0
      sckw-modules/sckw-product/pom.xml
  5. 63 6
      sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java
  6. 11 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dao/KwpGoodsAttributeMapper.java
  7. 11 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dao/KwpGoodsImageMapper.java
  8. 11 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dao/KwpGoodsPriceRangeMapper.java
  9. 15 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/KwpGoods.java
  10. 1 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/KwpGoodsImage.java
  11. 11 5
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/AddGoodsParam.java
  12. 78 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/AddressInfo.java
  13. 51 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsListParam.java
  14. 1 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsPriceRanges.java
  15. 52 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/SelectGoodsListParam.java
  16. 165 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/res/GoodsDetail.java
  17. 18 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/res/GoodsList.java
  18. 26 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsAddressService.java
  19. 28 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsAttributeService.java
  20. 29 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsImageService.java
  21. 29 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsPriceRangeService.java
  22. 150 8
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java
  23. 37 0
      sckw-modules/sckw-product/src/main/resources/mapper/KwpGoodsAttributeMapper.xml
  24. 37 0
      sckw-modules/sckw-product/src/main/resources/mapper/KwpGoodsImageMapper.xml
  25. 41 0
      sckw-modules/sckw-product/src/main/resources/mapper/KwpGoodsPriceRangeMapper.xml

+ 24 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/vo/TableBottom.java

@@ -0,0 +1,24 @@
+package com.sckw.core.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: 表格底部对象
+ * @author: yzc
+ * @date: 2023-07-05 17:50
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TableBottom {
+
+    /**
+     * 统计数据
+     */
+    private Integer total;
+
+}

+ 29 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/vo/TableStatisticRes.java

@@ -0,0 +1,29 @@
+package com.sckw.core.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: 表格统计对象
+ * @author: yzc
+ * @date: 2023-07-05 17:50
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TableStatisticRes {
+
+    /**
+     * 表格顶部对象
+     */
+    private TableTop tableTop;
+
+    /**
+     * 表格底部对象
+     */
+    private TableBottom tableBottom;
+
+}

+ 33 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/vo/TableTop.java

@@ -0,0 +1,33 @@
+package com.sckw.core.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: 表格顶部对象
+ * @author: yzc
+ * @date: 2023-07-05 17:50
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TableTop {
+
+    /**
+     * tab名称
+     */
+    private String name;
+
+    /**
+     * 状态值
+     */
+    private Integer value;
+
+    /**
+     * 统计数据
+     */
+    private Integer total;
+}

+ 5 - 0
sckw-modules/sckw-product/pom.xml

@@ -63,6 +63,11 @@
             <artifactId>sckw-system-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-redis</artifactId>
+        </dependency>
+
     </dependencies>
 
     <build>

+ 63 - 6
sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java

@@ -1,15 +1,23 @@
 package com.sckw.product.controller;
 
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.sckw.core.model.page.PageHelperUtil;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.core.model.vo.TableStatisticRes;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.product.model.vo.req.AddGoodsParam;
+import com.sckw.product.model.vo.req.GoodsListParam;
+import com.sckw.product.model.vo.req.SelectGoodsListParam;
+import com.sckw.product.model.vo.res.GoodsDetail;
+import com.sckw.product.model.vo.res.GoodsList;
 import com.sckw.product.service.KwpGoodsService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * @desc: 商品管理
@@ -23,16 +31,65 @@ public class KwpGoodsController {
 
     private final KwpGoodsService kwpGoodsService;
 
+    /**
+     * @desc: 添加商品草稿
+     * @author: yzc
+     * @date: 2023-07-05 10:54
+     * @Param addGoodsParam:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
     @PostMapping(value = "/addDraft", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult addDraft(@RequestBody AddGoodsParam addGoodsParam){
+    public HttpResult addDraft(@RequestBody AddGoodsParam addGoodsParam) {
         kwpGoodsService.addDraft(addGoodsParam);
         return HttpResult.ok();
     }
 
+    /**
+     * @desc: 添加商品上架
+     * @author: yzc
+     * @date: 2023-07-05 10:54
+     * @Param addGoodsParam:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
     @PostMapping(value = "/addShelves", produces = MediaType.APPLICATION_JSON_VALUE)
-    public HttpResult addShelves(@RequestBody @Validated AddGoodsParam addGoodsParam){
+    public HttpResult addShelves(@RequestBody @Validated AddGoodsParam addGoodsParam) {
         kwpGoodsService.addShelves(addGoodsParam);
         return HttpResult.ok();
     }
 
+    /**
+     * @desc: 商品详情
+     * @author: yzc
+     * @date: 2023-07-05 11:50
+     * @Param id:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @GetMapping("/detail")
+    public HttpResult detail(@RequestParam Long id) {
+        GoodsDetail goodsDetail = kwpGoodsService.detail(id);
+        return HttpResult.ok(goodsDetail);
+    }
+
+
+    /**
+     * @desc: 分页查询商品列表
+     * @author: yzc
+     * @date: 2023-07-05 11:55
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/select", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult select(@RequestBody SelectGoodsListParam params) {
+        PageHelper.startPage(params.getPage(), params.getPageSize());
+        List<GoodsList> list = kwpGoodsService.select(params);
+        PageResult result = PageHelperUtil.getPageResult(new PageInfo<>(list));
+        return HttpResult.ok(result);
+    }
+
+    @PostMapping(value = "/statistic", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult statistic(@RequestBody GoodsListParam params) {
+        TableStatisticRes tableStatisticRes = kwpGoodsService.statistic(params);
+        return HttpResult.ok(tableStatisticRes);
+    }
+
 }

+ 11 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dao/KwpGoodsAttributeMapper.java

@@ -3,6 +3,9 @@ package com.sckw.product.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.product.model.KwpGoodsAttribute;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @desc: 商品-参数类目mapper
@@ -12,4 +15,12 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KwpGoodsAttributeMapper extends BaseMapper<KwpGoodsAttribute> {
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-07-05 11:21
+     * @Param list:
+     * @return: void
+     */
+    void insertBatch(@Param(value = "list") List<KwpGoodsAttribute> list);
 }

+ 11 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dao/KwpGoodsImageMapper.java

@@ -3,6 +3,9 @@ package com.sckw.product.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.product.model.KwpGoodsImage;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @desc: 商品-图片mapper
@@ -12,4 +15,12 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KwpGoodsImageMapper extends BaseMapper<KwpGoodsImage> {
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-07-05 11:34
+     * @Param list:
+     * @return: void
+     */
+    void insertBatch(@Param(value = "list") List<KwpGoodsImage> list);
 }

+ 11 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dao/KwpGoodsPriceRangeMapper.java

@@ -3,6 +3,9 @@ package com.sckw.product.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.product.model.KwpGoodsPriceRange;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * @desc: 商品-价格段mapper
@@ -12,4 +15,12 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface KwpGoodsPriceRangeMapper extends BaseMapper<KwpGoodsPriceRange> {
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-07-05 11:24
+     * @Param list:
+     * @return: void
+     */
+    void insertBatch(@Param(value = "list") List<KwpGoodsPriceRange> list);
 }

+ 15 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/KwpGoods.java

@@ -1,6 +1,7 @@
 package com.sckw.product.model;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.core.model.base.BaseModel;
 import lombok.Getter;
 import lombok.Setter;
@@ -8,6 +9,7 @@ import lombok.ToString;
 import lombok.experimental.Accessors;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * @desc: 商品表
@@ -94,6 +96,18 @@ public class KwpGoods extends BaseModel {
     /**
      * 缩略图
      */
-    private String image;
+    private String thumb;
+
+    /**
+     * 上架时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addedTime;
+
+    /**
+     * 下架时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date shelfTime;
 
 }

+ 1 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/KwpGoodsImage.java

@@ -27,7 +27,7 @@ public class KwpGoodsImage extends BaseModel {
     /**
      * 图片地址
      */
-    private String url;
+    private String image;
 
     /**
      * 图片排序

+ 11 - 5
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/AddGoodsParam.java

@@ -90,10 +90,11 @@ public class AddGoodsParam {
     private Long supplyEntId;
 
     /**
-     * 地址id
+     * 地址信息
      */
-    @NotNull(message = "地址不能为空")
-    private Long addressId;
+    @NotNull(message = "地址信息不能为空")
+    @Valid
+    private AddressInfo addressInfo;
 
     /**
      * 专属客户经理(用户ID)
@@ -108,9 +109,14 @@ public class AddGoodsParam {
     private String remark;
 
     /**
-     * 商品图片
+     * 商品缩略图
+     */
+    private String thumb;
+
+    /**
+     * 商品详情图片
      */
-    @Size(max = 6, message = "商品图片最多支持6张")
+    @Size(max = 5, message = "商品详情图片最多支持5张")
     private List<GoodsImages> images;
 
 }

+ 78 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/AddressInfo.java

@@ -0,0 +1,78 @@
+package com.sckw.product.model.vo.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank;
+
+/**
+ * @desc: 地址信息
+ * @author: yzc
+ * @date: 2023-07-05 10:57
+ */
+@Getter
+@Setter
+@ToString
+public class AddressInfo {
+
+    /**
+     * 地址名称
+     */
+    @NotBlank(message = "地址名称不能为空")
+    private String name;
+
+    /**
+     * 地址类型
+     */
+    @NotNull(message = "地址类型不能为空")
+    private Long type;
+
+    /**
+     * 联系人
+     */
+    @NotBlank(message = "联系人不能为空")
+    private String contacts;
+
+    /**
+     * 联系电话
+     */
+    @NotBlank(message = "联系电话不能为空")
+    private String phone;
+
+    /**
+     * 所在地区
+     */
+    @NotNull(message = "所在地区code不能为空")
+    private Long cityCode;
+
+    /**
+     * 所属区域名称
+     */
+    @NotBlank(message = "所属区域名称不能为空")
+    private String cityName;
+
+    /**
+     * 详细地址
+     */
+    @NotBlank(message = "详细地址不能为空")
+    private String detailAddress;
+
+    /**
+     * 纬度
+     */
+    @NotBlank(message = "纬度不能为空")
+    private String lat;
+
+    /**
+     * 经度
+     */
+    @NotBlank(message = "经度不能为空")
+    private String lng;
+
+    /**
+     * 电子围栏
+     */
+    private String fence;
+
+}

+ 51 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsListParam.java

@@ -0,0 +1,51 @@
+package com.sckw.product.model.vo.req;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @desc: 查询商品列表请求参数
+ * @author: yzc
+ * @date: 2023-07-05 11:52
+ */
+@Getter
+@Setter
+@ToString
+public class GoodsListParam {
+
+    /**
+     * 商品名称、企业名称(共用模糊匹配)
+     */
+    private String keywords;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd)
+     */
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd)
+     */
+    private Date endCreateTime;
+
+    /**
+     * 状态集合
+     */
+    private List<Integer> status;
+
+    /**
+     * 商品类型集合
+     */
+    private List<Long> typeIds;
+
+    /**
+     * 交易方式集合
+     */
+    private List<Long> tradings;
+
+
+}

+ 1 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsPriceRanges.java

@@ -37,6 +37,6 @@ public class GoodsPriceRanges {
     /**
      * 序号
      */
-    @NotNull(message = "梯度能为空")
+    @NotNull(message = "梯度顺序不能为空")
     private Integer sort;
 }

+ 52 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/SelectGoodsListParam.java

@@ -0,0 +1,52 @@
+package com.sckw.product.model.vo.req;
+
+import com.sckw.core.model.page.PageRequest;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @desc: 分页查询商品列表请求参数
+ * @author: yzc
+ * @date: 2023-07-05 11:52
+ */
+@Getter
+@Setter
+@ToString
+public class SelectGoodsListParam extends PageRequest {
+
+    /**
+     * 商品名称、企业名称(共用模糊匹配)
+     */
+    private String keywords;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd)
+     */
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd)
+     */
+    private Date endCreateTime;
+
+    /**
+     * 状态集合
+     */
+    private List<Integer> status;
+
+    /**
+     * 商品类型集合
+     */
+    private List<Long> typeIds;
+
+    /**
+     * 交易方式集合
+     */
+    private List<Long> tradings;
+
+
+}

+ 165 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/res/GoodsDetail.java

@@ -0,0 +1,165 @@
+package com.sckw.product.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.product.model.vo.req.AddressInfo;
+import com.sckw.product.model.vo.req.GoodsAttributes;
+import com.sckw.product.model.vo.req.GoodsImages;
+import com.sckw.product.model.vo.req.GoodsPriceRanges;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @desc: 商品详情响应
+ * @author: yzc
+ * @date: 2023-07-05 11:49
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class GoodsDetail {
+
+    /**
+     * 商品id
+     */
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 企业名称
+     */
+    private String ent;
+
+    /**
+     * 供应单位id
+     */
+    private Long supplyEntId;
+
+    /**
+     * 供应单位名称
+     */
+    private String supplyEnt;
+
+    /**
+     * 商品编号
+     */
+    private String code;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品类型id
+     */
+    private Long typeId;
+
+    /**
+     * 商品类型
+     */
+    private String type;
+
+    /**
+     * 库存数量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 单位(吨、方、件、箱、其他)
+     */
+    private String unit;
+
+    /**
+     * 尺寸大小
+     */
+    private String spec;
+
+    /**
+     * 发票税率(%)
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 交易方式(合同采购、直接采购、预付款、货到付款、到款发货)
+     */
+    private String trading;
+
+    /**
+     * 预付款最低限额
+     */
+    private BigDecimal advancePrice;
+
+    /**
+     * 专属客户经理
+     */
+    private String manager;
+
+    /**
+     * 专属客户经理电话
+     */
+    private String managerPhone;
+
+    /**
+     * 成交量
+     */
+    private BigDecimal performedAmount;
+
+    /**
+     * 缩略图
+     */
+    private String thumb;
+
+    /**
+     * 上架时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date addedTime;
+
+    /**
+     * 下架时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date shelfTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 状态:0草稿/1上架/2下架
+     */
+    private Integer status;
+
+    /**
+     * 商品详情图片
+     */
+    private List<GoodsImages> images;
+
+    /**
+     * 地址信息
+     */
+    private AddressInfo addressInfo;
+
+    /**
+     * 价格梯度
+     */
+    private List<GoodsPriceRanges> priceRanges;
+
+    /**
+     * 参数目录
+     */
+    private List<GoodsAttributes> attributes;
+
+}

+ 18 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/res/GoodsList.java

@@ -0,0 +1,18 @@
+package com.sckw.product.model.vo.res;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: 商品列表
+ * @author: yzc
+ * @date: 2023-07-05 11:54
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class GoodsList {
+}

+ 26 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsAddressService.java

@@ -1,6 +1,9 @@
 package com.sckw.product.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.model.constant.Global;
 import com.sckw.product.dao.KwpGoodsAddressMapper;
+import com.sckw.product.model.KwpGoodsAddress;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -17,4 +20,27 @@ public class KwpGoodsAddressService {
 
     private KwpGoodsAddressMapper kwpGoodsAddressMapper;
 
+    /**
+     * @desc: 添加商品地址信息
+     * @author: yzc
+     * @date: 2023-07-05 11:16
+     * @Param address:
+     * @return: void
+     */
+    public void insert(KwpGoodsAddress address) {
+        kwpGoodsAddressMapper.insert(address);
+    }
+
+    /**
+     * @desc: 通过商品id获取
+     * @author: yzc
+     * @date: 2023-07-05 14:45
+     * @Param goodsId:
+     * @return: java.util.List<com.sckw.product.model.KwpGoodsAddress>
+     */
+    public KwpGoodsAddress getByGoodsId(Long goodsId) {
+        LambdaQueryWrapper<KwpGoodsAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpGoodsAddress::getGoodsId, goodsId).eq(KwpGoodsAddress::getDelFlag, Global.NO).last("LIMIT 1");
+        return kwpGoodsAddressMapper.selectOne(wrapper);
+    }
 }

+ 28 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsAttributeService.java

@@ -1,10 +1,15 @@
 package com.sckw.product.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.model.constant.Global;
 import com.sckw.product.dao.KwpGoodsAttributeMapper;
+import com.sckw.product.model.KwpGoodsAttribute;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @desc: 商品-参数类目service
  * @author: yzc
@@ -17,4 +22,27 @@ public class KwpGoodsAttributeService {
 
     private KwpGoodsAttributeMapper kwpGoodsAttributeMapper;
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-07-05 11:21
+     * @Param list:
+     * @return: void
+     */
+    public void insertBatch(List<KwpGoodsAttribute> list) {
+        kwpGoodsAttributeMapper.insertBatch(list);
+    }
+
+    /**
+     * @desc: 通过商品id获取
+     * @author: yzc
+     * @date: 2023-07-05 14:44
+     * @Param id:
+     * @return: java.util.List<com.sckw.product.model.KwpGoodsAttribute>
+     */
+    public List<KwpGoodsAttribute> getByGoodsId(Long goodsId) {
+        LambdaQueryWrapper<KwpGoodsAttribute> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpGoodsAttribute::getGoodsId, goodsId).eq(KwpGoodsAttribute::getDelFlag, Global.NO);
+        return kwpGoodsAttributeMapper.selectList(wrapper);
+    }
 }

+ 29 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsImageService.java

@@ -1,11 +1,15 @@
 package com.sckw.product.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.model.constant.Global;
 import com.sckw.product.dao.KwpGoodsImageMapper;
-import com.sckw.product.dao.KwpGoodsMapper;
+import com.sckw.product.model.KwpGoodsImage;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @desc: 商品-图片service
  * @author: yzc
@@ -18,4 +22,28 @@ public class KwpGoodsImageService {
 
     private KwpGoodsImageMapper kwpGoodsImageMapper;
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-07-05 14:31
+     * @Param list:
+     * @return: void
+     */
+    public void insertBatch(List<KwpGoodsImage> list) {
+        kwpGoodsImageMapper.insertBatch(list);
+    }
+
+    /**
+     * @desc: 通过商品id获取
+     * @author: yzc
+     * @date: 2023-07-05 14:34
+     * @Param goodsId:
+     * @return: java.util.List<com.sckw.product.model.KwpGoodsImage>
+     */
+    public List<KwpGoodsImage> getByGoodsId(Long goodsId) {
+        LambdaQueryWrapper<KwpGoodsImage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpGoodsImage::getGoodsId, goodsId).eq(KwpGoodsImage::getDelFlag, Global.NO)
+                .orderByAsc(KwpGoodsImage::getSort);
+        return kwpGoodsImageMapper.selectList(wrapper);
+    }
 }

+ 29 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsPriceRangeService.java

@@ -1,10 +1,15 @@
 package com.sckw.product.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.model.constant.Global;
 import com.sckw.product.dao.KwpGoodsPriceRangeMapper;
+import com.sckw.product.model.KwpGoodsPriceRange;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @desc: 商品-价格段service
  * @author: yzc
@@ -17,4 +22,28 @@ public class KwpGoodsPriceRangeService {
 
     private KwpGoodsPriceRangeMapper kwpGoodsPriceRangeMapper;
 
+    /**
+     * @desc: 批量插入
+     * @author: yzc
+     * @date: 2023-07-05 11:24
+     * @Param list:
+     * @return: void
+     */
+    public void insertBatch(List<KwpGoodsPriceRange> list) {
+        kwpGoodsPriceRangeMapper.insertBatch(list);
+    }
+
+    /**
+     * @desc: 通过商品id获取
+     * @author: yzc
+     * @date: 2023-07-05 14:42
+     * @Param goodsId:
+     * @return: java.util.List<com.sckw.product.model.KwpGoodsPriceRange>
+     */
+    public List<KwpGoodsPriceRange> getByGoodsId(Long goodsId) {
+        LambdaQueryWrapper<KwpGoodsPriceRange> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpGoodsPriceRange::getGoodsId, goodsId).eq(KwpGoodsPriceRange::getDelFlag, Global.NO)
+                .orderByAsc(KwpGoodsPriceRange::getSort);
+        return kwpGoodsPriceRangeMapper.selectList(wrapper);
+    }
 }

+ 150 - 8
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -1,14 +1,26 @@
 package com.sckw.product.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.sckw.core.exception.BusinessException;
+import com.sckw.core.model.constant.Global;
+import com.sckw.core.model.vo.TableStatisticRes;
 import com.sckw.core.utils.BeanUtils;
+import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.web.context.LoginUserHolder;
-import com.sckw.core.web.model.LoginUserInfo;
 import com.sckw.product.dao.KwpGoodsMapper;
-import com.sckw.product.model.KwpGoods;
-import com.sckw.product.model.vo.req.AddGoodsParam;
+import com.sckw.product.model.*;
+import com.sckw.product.model.vo.req.*;
+import com.sckw.product.model.vo.res.GoodsDetail;
+import com.sckw.product.model.vo.res.GoodsList;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * @desc: 商品service
@@ -21,6 +33,10 @@ import org.springframework.stereotype.Service;
 public class KwpGoodsService {
 
     private final KwpGoodsMapper kwpGoodsMapper;
+    private final KwpGoodsAddressService kwpGoodsAddressService;
+    private final KwpGoodsAttributeService kwpGoodsAttributeService;
+    private final KwpGoodsImageService kwpGoodsImageService;
+    private final KwpGoodsPriceRangeService kwpGoodsPriceRangeService;
 
     /**
      * @desc: 添加草稿商品
@@ -29,12 +45,14 @@ public class KwpGoodsService {
      * @Param addGoodsParam:
      * @return: void
      */
+    @Transactional(rollbackFor = Exception.class)
     public void addDraft(AddGoodsParam addGoodsParam) {
-        KwpGoods kwpGoods = new KwpGoods();
-        BeanUtils.copyProperties(addGoodsParam, kwpGoods);
-        LoginUserInfo userInfo = LoginUserHolder.get();
-        kwpGoods.setEntId(LoginUserHolder.getEntId());
-        kwpGoodsMapper.insert(kwpGoods);
+        Long entId = LoginUserHolder.getEntId();
+        //添加商品信息
+        KwpGoods goods = BeanUtils.copyProperties(addGoodsParam, KwpGoods.class);
+        goods.setEntId(entId).setStatus(0);
+        kwpGoodsMapper.insert(goods);
+        addGoodsOtherInfo(goods.getId(), addGoodsParam);
     }
 
     /**
@@ -44,7 +62,131 @@ public class KwpGoodsService {
      * @Param addGoodsParam:
      * @return: void
      */
+    @Transactional(rollbackFor = Exception.class)
     public void addShelves(AddGoodsParam addGoodsParam) {
+        Long entId = LoginUserHolder.getEntId();
+        //添加商品信息
+        KwpGoods goods = BeanUtils.copyProperties(addGoodsParam, KwpGoods.class);
+        goods.setEntId(entId).setShelfTime(new Date()).setStatus(1);
+        kwpGoodsMapper.insert(goods);
+        addGoodsOtherInfo(goods.getId(), addGoodsParam);
+    }
+
+    /**
+     * @desc: 添加商品其他信息
+     * @author: yzc
+     * @date: 2023-07-05 11:45
+     * @Param goodsId:
+     * @Param addGoodsParam:
+     * @return: void
+     */
+    private void addGoodsOtherInfo(Long goodsId, AddGoodsParam addGoodsParam) {
+        //添加商品地址信息
+        KwpGoodsAddress address = BeanUtils.copyProperties(addGoodsParam.getAddressInfo(), KwpGoodsAddress.class);
+        address.setGoodsId(goodsId);
+        kwpGoodsAddressService.insert(address);
+        //添加商品属性信息
+        List<GoodsAttributes> attributes = addGoodsParam.getAttributes();
+        if (CollectionUtils.isNotEmpty(attributes)) {
+            List<KwpGoodsAttribute> list = new ArrayList<>(attributes.size());
+            attributes.forEach(e -> {
+                KwpGoodsAttribute attribute = BeanUtils.copyProperties(e, KwpGoodsAttribute.class);
+                attribute.setGoodsId(goodsId);
+                list.add(attribute);
+            });
+            kwpGoodsAttributeService.insertBatch(list);
+        }
+        //添加商品图片信息
+        List<GoodsImages> images = addGoodsParam.getImages();
+        if (CollectionUtils.isNotEmpty(images)) {
+            List<KwpGoodsImage> list = new ArrayList<>(images.size());
+            images.forEach(e -> {
+                KwpGoodsImage image = BeanUtils.copyProperties(e, KwpGoodsImage.class);
+                image.setGoodsId(goodsId);
+                list.add(image);
+            });
+            kwpGoodsImageService.insertBatch(list);
+        }
+        //添加商品价格梯度信息
+        List<GoodsPriceRanges> priceRanges = addGoodsParam.getPriceRanges();
+        if (CollectionUtils.isNotEmpty(priceRanges)) {
+            List<KwpGoodsPriceRange> list = new ArrayList<>(priceRanges.size());
+            priceRanges.forEach(e -> {
+                KwpGoodsPriceRange priceRange = BeanUtils.copyProperties(e, KwpGoodsPriceRange.class);
+                priceRange.setGoodsId(goodsId);
+                list.add(priceRange);
+            });
+            kwpGoodsPriceRangeService.insertBatch(list);
+        }
+    }
+
+    /**
+     * @desc: 获取商品详情
+     * @author: yzc
+     * @date: 2023-07-05 11:57
+     * @Param id:
+     * @return: com.sckw.product.model.vo.res.GoodsDetail
+     */
+    public GoodsDetail detail(Long id) {
+        Long entId = LoginUserHolder.getEntId();
+        LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwpGoods::getId, id);
+        KwpGoods goods = getGoods(wrapper);
+        if (Objects.isNull(goods)) {
+            throw new BusinessException("当前商品信息为空!");
+        }
+        GoodsDetail detail = BeanUtils.copyProperties(goods, GoodsDetail.class);
+
+
+        List<KwpGoodsImage> goodsImages = kwpGoodsImageService.getByGoodsId(id);
+        List<GoodsImages> images = BeanUtils.copyToList(goodsImages, GoodsImages.class);
+
+        List<KwpGoodsPriceRange> priceRanges = kwpGoodsPriceRangeService.getByGoodsId(id);
+        List<GoodsPriceRanges> ranges = BeanUtils.copyToList(priceRanges, GoodsPriceRanges.class);
+
+        List<KwpGoodsAttribute> attributesList = kwpGoodsAttributeService.getByGoodsId(id);
+        List<GoodsAttributes> attributes = BeanUtils.copyToList(attributesList, GoodsAttributes.class);
 
+        KwpGoodsAddress goodsAddress = kwpGoodsAddressService.getByGoodsId(id);
+        AddressInfo addressInfo = BeanUtils.copyProperties(goodsAddress, AddressInfo.class);
+
+        detail.setImages(images).setPriceRanges(ranges).setAttributes(attributes).setAddressInfo(addressInfo);
+
+        return detail;
+    }
+
+    /**
+     * @desc: 分页查询商品信息
+     * @author: yzc
+     * @date: 2023-07-05 11:58
+     * @Param params:
+     * @return: java.util.List<com.sckw.product.model.vo.res.GoodsList>
+     */
+    public List<GoodsList> select(SelectGoodsListParam params) {
+        return null;
+    }
+
+    /**
+     * @desc: 条件获取商品信息
+     * @author: yzc
+     * @date: 2023-07-05 14:25
+     * @Param wrapper:
+     * @return: com.sckw.product.model.KwpGoods
+     */
+    public KwpGoods getGoods(LambdaQueryWrapper<KwpGoods> wrapper) {
+        LambdaQueryWrapper<KwpGoods> last = wrapper.eq(KwpGoods::getEntId, LoginUserHolder.getEntId())
+                .eq(KwpGoods::getDelFlag, Global.NO).last("LIMIT 1");
+        return kwpGoodsMapper.selectOne(last);
+    }
+
+    /**
+     * @desc: TODO
+     * @author: yzc
+     * @date: 2023-07-05 17:55
+     * @Param params:
+     * @return: com.sckw.core.model.vo.TableRes
+     */
+    public TableStatisticRes statistic(GoodsListParam params) {
+        return null;
     }
 }

+ 37 - 0
sckw-modules/sckw-product/src/main/resources/mapper/KwpGoodsAttributeMapper.xml

@@ -0,0 +1,37 @@
+<?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.sckw.product.dao.KwpGoodsAttributeMapper">
+
+    <insert id="insertBatch">
+        insert into kwp_goods_attribute
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            id,
+            goods_id,
+            name,
+            val,
+            remark,
+            status,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            del_flag
+        </trim>
+        values
+        <foreach collection="list" item="item" separator=",">
+            <trim prefix="(" suffix=")" suffixOverrides=",">
+                #{item.id,jdbcType=BIGINT},
+                #{item.goodsId,jdbcType=BIGINT},
+                #{item.name,jdbcType=VARCHAR},
+                #{item.val,jdbcType=VARCHAR},
+                #{item.remark,jdbcType=VARCHAR},
+                #{item.status,jdbcType=INTEGER},
+                #{item.createBy,jdbcType=BIGINT},
+                #{item.createTime,jdbcType=TIMESTAMP},
+                #{item.updateBy,jdbcType=BIGINT},
+                #{item.updateTime,jdbcType=TIMESTAMP},
+                #{item.delFlag,jdbcType=INTEGER}
+            </trim>
+        </foreach>
+    </insert>
+</mapper>

+ 37 - 0
sckw-modules/sckw-product/src/main/resources/mapper/KwpGoodsImageMapper.xml

@@ -0,0 +1,37 @@
+<?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.sckw.product.dao.KwpGoodsImageMapper">
+
+    <insert id="insertBatch">
+        insert into kwp_goods_image
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            id,
+            goods_id,
+            image,
+            sort,
+            remark,
+            status,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            del_flag
+        </trim>
+        values
+        <foreach collection="list" item="item" separator=",">
+            <trim prefix="(" suffix=")" suffixOverrides=",">
+                #{item.id,jdbcType=BIGINT},
+                #{item.goodsId,jdbcType=BIGINT},
+                #{item.image,jdbcType=VARCHAR},
+                #{item.sort,jdbcType=INTEGER},
+                #{item.remark,jdbcType=VARCHAR},
+                #{item.status,jdbcType=INTEGER},
+                #{item.createBy,jdbcType=BIGINT},
+                #{item.createTime,jdbcType=TIMESTAMP},
+                #{item.updateBy,jdbcType=BIGINT},
+                #{item.updateTime,jdbcType=TIMESTAMP},
+                #{item.delFlag,jdbcType=INTEGER}
+            </trim>
+        </foreach>
+    </insert>
+</mapper>

+ 41 - 0
sckw-modules/sckw-product/src/main/resources/mapper/KwpGoodsPriceRangeMapper.xml

@@ -0,0 +1,41 @@
+<?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.sckw.product.dao.KwpGoodsPriceRangeMapper">
+
+    <insert id="insertBatch">
+        insert into kwp_goods_price_range
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            id,
+            goods_id,
+            start_amount,
+            end_amount,
+            price,
+            sort,
+            remark,
+            status,
+            create_by,
+            create_time,
+            update_by,
+            update_time,
+            del_flag
+        </trim>
+        values
+        <foreach collection="list" item="item" separator=",">
+            <trim prefix="(" suffix=")" suffixOverrides=",">
+                #{item.id,jdbcType=BIGINT},
+                #{item.goodsId,jdbcType=BIGINT},
+                #{item.startAmount,jdbcType=DECIMAL},
+                #{item.endAmount,jdbcType=DECIMAL},
+                #{item.price,jdbcType=DECIMAL},
+                #{item.sort,jdbcType=INTEGER},
+                #{item.remark,jdbcType=VARCHAR},
+                #{item.status,jdbcType=INTEGER},
+                #{item.createBy,jdbcType=BIGINT},
+                #{item.createTime,jdbcType=TIMESTAMP},
+                #{item.updateBy,jdbcType=BIGINT},
+                #{item.updateTime,jdbcType=TIMESTAMP},
+                #{item.delFlag,jdbcType=INTEGER}
+            </trim>
+        </foreach>
+    </insert>
+</mapper>