Browse Source

mall:调整部分 SPU、SKU 的表设计

YunaiV 2 years atrás
parent
commit
2340f09c68
12 changed files with 88 additions and 114 deletions
  1. 0 61
      sql/optional/mall/mall.sql
  2. 1 1
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java
  3. 1 2
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java
  4. 4 24
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java
  5. 32 0
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/group/ProductGroupDO.java
  6. 1 1
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java
  7. 44 15
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java
  8. 1 1
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java
  9. 1 1
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java
  10. 1 1
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
  11. 1 1
      yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
  12. 1 6
      yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java

+ 0 - 61
sql/optional/mall/mall.sql

@@ -71,24 +71,6 @@ INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, com
 VALUES ('规格导出', 'product:property:export', 3, 5, @parentId, '', '', '', 0);
 
 
-INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-VALUES ('商品管理', '', 2, 2, 2001, 'spu', '', 'mall/product/spu/index', 0);
-
-SELECT @parentId := LAST_INSERT_ID();
-
-INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-VALUES ('商品查询', 'product:spu:query', 3, 1, @parentId, '', '', '', 0);
-INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-VALUES ('商品创建', 'product:spu:create', 3, 2, @parentId, '', '', '', 0);
-INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-VALUES ('商品更新', 'product:spu:update', 3, 3, @parentId, '', '', '', 0);
-INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-VALUES ('商品删除', 'product:spu:delete', 3, 4, @parentId, '', '', '', 0);
-INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-VALUES ('商品导出', 'product:spu:export', 3, 5, @parentId, '', '', '', 0);
 
 
 -- 规格名称表
@@ -127,54 +109,6 @@ create table product_property_value
 ) comment '规格值' character set utf8mb4
                 collate utf8mb4_general_ci;
 
-drop table if exists product_spu;
-create table product_spu
-(
-    id          bigint        NOT NULL AUTO_INCREMENT COMMENT '主键',
-    name        varchar(128) comment '商品名称',
-    sell_point  varchar(128)  not null comment '卖点',
-    description text          not null comment '描述',
-    category_id bigint        not null comment '分类id',
-    pic_urls    varchar(1024) not null default '' comment '商品主图地址\n     *\n     * 数组,以逗号分隔\n 最多上传15张',
-    sort        int           not null default 0 comment '排序字段',
-    like_count  int comment '点赞初始人数',
-    price       int comment '价格 单位使用:分',
-    quantity    int comment '库存数量',
-    status      bit(1) comment '上下架状态: 0 上架(开启) 1 下架(禁用)',
-    create_time datetime               default current_timestamp comment '创建时间',
-    update_time datetime               default current_timestamp on update current_timestamp comment '更新时间',
-    creator     varchar(64) comment '创建人',
-    updater     varchar(64) comment '更新人',
-    tenant_id   bigint        NOT NULL DEFAULT '0' COMMENT '租户编号',
-    deleted   bit(1)        NOT NULL DEFAULT b'0' COMMENT '是否删除',
-    primary key (id)
-) comment '商品spu' character set utf8mb4
-                  collate utf8mb4_general_ci;
-
-
-drop table if exists product_sku;
-create table product_sku
-(
-    id             bigint       NOT NULL AUTO_INCREMENT COMMENT '主键',
-    spu_id         bigint       not null comment 'spu编号',
-    properties     varchar(64)  not null comment '规格值数组-json格式, [{propertId: , valueId: }, {propertId: , valueId: }]',
-    price          int          not null DEFAULT -1 comment '销售价格,单位:分',
-    original_price int          not null DEFAULT -1 comment '原价, 单位: 分',
-    cost_price     int          not null DEFAULT -1 comment '成本价,单位: 分',
-    bar_code       varchar(64)  not null comment '条形码',
-    pic_url        VARCHAR(128) not null comment '图片地址',
-    status         tinyint comment '状态: 0-正常 1-禁用',
-    create_time    datetime              default current_timestamp comment '创建时间',
-    update_time    datetime              default current_timestamp on update current_timestamp comment '更新时间',
-    creator        varchar(64) comment '创建人',
-    updater        varchar(64) comment '更新人',
-    tenant_id      bigint       NOT NULL DEFAULT '0' COMMENT '租户编号',
-    deleted      bit(1)       NOT NULL DEFAULT b'0' COMMENT '是否删除',
-    primary key (id)
-) comment '商品sku' character set utf8mb4
-                  collate utf8mb4_general_ci;
 
 
 ---Market-Banner管理SQL

+ 1 - 1
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java

@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*;
 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;

+ 1 - 2
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java

@@ -10,8 +10,7 @@ import org.mapstruct.Mapping;
 import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
-import org.springframework.util.StringUtils;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 
 /**
  * 商品sku Convert

+ 4 - 24
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java

@@ -1,18 +1,14 @@
 package cn.iocoder.yudao.module.product.convert.spu;
 
-import java.util.*;
-
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-
+import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppSpuPageReqVO;
 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppSpuPageRespVO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
 import org.mapstruct.Mapper;
-import org.mapstruct.Mapping;
-import org.mapstruct.Named;
 import org.mapstruct.factory.Mappers;
-import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
-import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
-import org.springframework.util.StringUtils;
+
+import java.util.List;
 
 /**
  * 商品spu Convert
@@ -24,18 +20,12 @@ public interface ProductSpuConvert {
 
     ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class);
 
-    @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "translatePicUrlsFromStringList")
     ProductSpuDO convert(ProductSpuCreateReqVO bean);
 
-    @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "translatePicUrlsFromStringList")
     ProductSpuDO convert(SpuUpdateReqVO bean);
 
-    @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "tokenizeToStringArray")
     SpuRespVO convert(ProductSpuDO bean);
 
-    @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "tokenizeToStringArray")
-    SpuExcelVO convertToExcelVO(ProductSpuDO bean);
-
     List<SpuRespVO> convertList(List<ProductSpuDO> list);
 
     PageResult<SpuRespVO> convertPage(PageResult<ProductSpuDO> page);
@@ -44,16 +34,6 @@ public interface ProductSpuConvert {
 
     SpuPageReqVO convert(AppSpuPageReqVO bean);
 
-    @Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "tokenizeToStringArray")
     AppSpuPageRespVO convertAppResp(ProductSpuDO list);
 
-    @Named("tokenizeToStringArray")
-    default List<String> translatePicUrlsArrayFromString(String picUrls) {
-        return Arrays.asList(StringUtils.tokenizeToStringArray(picUrls, ","));
-    }
-
-    @Named("translatePicUrlsFromStringList")
-    default String translatePicUrlsFromList(List<String> picUrls) {
-        return StringUtils.collectionToCommaDelimitedString(picUrls);
-    }
 }

+ 32 - 0
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/group/ProductGroupDO.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.product.dal.dataobject.group;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 商品分组 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("product_group")
+@KeySequence("product_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProductGroupDO extends BaseDO {
+
+    /**
+     * 商品分组编号,自增
+     */
+    @TableId
+    private Long id;
+
+    // TODO 芋艿:字段补全
+
+}

+ 1 - 1
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.product.dal.dataobject.sku;
+package cn.iocoder.yudao.module.product.dal.dataobject.spu;
 
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;

+ 44 - 15
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java

@@ -1,13 +1,21 @@
 package cn.iocoder.yudao.module.product.dal.dataobject.spu;
 
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.brand.ProductBrandDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.group.ProductGroupDO;
 import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.*;
 
+import java.util.List;
+
 /**
- * 商品spu DO
+ * 商品 SPU DO
  *
  * @author 芋道源码
  */
@@ -22,7 +30,7 @@ import lombok.*;
 public class ProductSpuDO extends BaseDO {
 
     /**
-     * 主键
+     * 商品 SPU 编号,自增
      */
     @TableId
     private Long id;
@@ -31,41 +39,62 @@ public class ProductSpuDO extends BaseDO {
      */
     private String name;
     /**
-     * 卖点
+     * 商品卖点
      */
     private String sellPoint;
     /**
-     * 描述
+     * 商品详情
      */
     private String description;
     /**
-     * 分类id
+     * 商品分类编号
+     *
+     * 关联 {@link ProductCategoryDO#getId()}
      */
     private Long categoryId;
     /**
-     * 商品主图地址,* 数组,以逗号分隔,最多上传15张
+     * 商品品牌编号
+     *
+     * 关联 {@link ProductBrandDO#getId()}
+     */
+    private Long brandId;
+    /**
+     * 商品分组编号数组
+     *
+     * 关联 {@link ProductGroupDO#getId()}
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<Long> groupIds;
+    /**
+     * 商品图片地址数组
      */
-    // TODO franky:List<String>。可以参考别的模块,怎么处理这种类型的哈
-    private String picUrls;
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<String> picUrls;
     /**
      * 排序字段
      */
     private Integer sort;
     /**
-     * 点赞初始人数
+     * 商品状态
+     *
+     * 枚举 {@link CommonStatusEnum}
      */
-    private Integer likeCount;
+    private Integer status;
     /**
-     * 价格 单位使用:分
+     * 价格,单位使用:分
+     *
+     * 基于其对应的 {@link ProductSkuDO#getPrice()} 最小值
      */
     private Integer price;
     /**
      * 库存数量
+     *
+     * 基于其对应的 {@link ProductSkuDO#getPrice()} 求和
      */
     private Integer quantity;
-    /**
-     * 上下架状态: 0 上架(开启) 1 下架(禁用)
-     */
-    private Boolean status;
+
+
+    // TODO 芋艿:配送方式:商家配送、商家自提
+    // TODO 芋艿:运费设置;如果选择了 “商家配送” 配送方式,则选择「运费设置」编号
 
 }

+ 1 - 1
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java

@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuExportReqVO;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuPageReqVO;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;

+ 1 - 1
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java

@@ -5,7 +5,7 @@ import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateR
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuExportReqVO;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuPageReqVO;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuUpdateReqVO;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 
 import javax.validation.Valid;
 import java.util.Collection;

+ 1 - 1
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java

@@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.product.controller.admin.property.vo.ProductPrope
 import cn.iocoder.yudao.module.product.controller.admin.propertyvalue.vo.ProductPropertyValueRespVO;
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*;
 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper;
 import cn.iocoder.yudao.module.product.enums.ErrorCodeConstants;
 import cn.iocoder.yudao.module.product.service.property.ProductPropertyService;

+ 1 - 1
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java

@@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppSpuPageReqVO;
 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppSpuPageRespVO;
 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;

+ 1 - 6
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java

@@ -2,29 +2,24 @@ package cn.iocoder.yudao.module.product.service.sku;
 
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.mock.mockito.MockBean;
 
 import javax.annotation.Resource;
 
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 
 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.*;
-import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
+import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSkuDO;
 import cn.iocoder.yudao.module.product.dal.mysql.sku.ProductSkuMapper;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 
-import javax.annotation.Resource;
 import org.springframework.context.annotation.Import;
 import java.util.*;
 
-import static cn.hutool.core.util.RandomUtil.*;
 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
 import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;
 import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.*;
 
 /**
 * {@link ProductSkuServiceImpl} 的单元测试类