diff --git a/sql/optional/mall/mall.sql b/sql/optional/mall/mall.sql index 5dc572350..41c495a53 100644 --- a/sql/optional/mall/mall.sql +++ b/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); --- 商品菜单 SQL -INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status) -VALUES ('商品管理', '', 2, 2, 2001, 'spu', '', 'mall/product/spu/index', 0); - --- 按钮父菜单ID -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -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; --- spu -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; - - --- sku -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 diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java index 132d68d94..e34fba089 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/sku/ProductSkuController.java +++ b/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; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java index 232ce3178..a2904384f 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/sku/ProductSkuConvert.java +++ b/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 diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java index 513e5e50b..30bc4a0fe 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/spu/ProductSpuConvert.java +++ b/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 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 org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +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 convertList(List list); PageResult convertPage(PageResult 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 translatePicUrlsArrayFromString(String picUrls) { - return Arrays.asList(StringUtils.tokenizeToStringArray(picUrls, ",")); - } - - @Named("translatePicUrlsFromStringList") - default String translatePicUrlsFromList(List picUrls) { - return StringUtils.collectionToCommaDelimitedString(picUrls); - } } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/group/ProductGroupDO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/group/ProductGroupDO.java new file mode 100644 index 000000000..cf5adcf36 --- /dev/null +++ b/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 芋艿:字段补全 + +} diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSkuDO.java similarity index 95% rename from yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java rename to yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSkuDO.java index 1ffaaeef2..cfa8a52bb 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/sku/ProductSkuDO.java +++ b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/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; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java index 2da638077..e7c27514f 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/spu/ProductSpuDO.java +++ b/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()} */ - // TODO franky:List。可以参考别的模块,怎么处理这种类型的哈 - private String picUrls; + private Long brandId; + /** + * 商品分组编号数组 + * + * 关联 {@link ProductGroupDO#getId()} + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List groupIds; + /** + * 商品图片地址数组 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List 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 芋艿:运费设置;如果选择了 “商家配送” 配送方式,则选择「运费设置」编号 } diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java index 2f2ced33c..c3aa3c883 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java +++ b/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; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java index 0396506ef..e5e436804 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java +++ b/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; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java index 91a60929b..2bec682db 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java +++ b/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; diff --git a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java b/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java index ea4afb2e7..bd18abfd2 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java +++ b/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; diff --git a/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java b/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java index 42eb96fd8..2f9631cbe 100755 --- a/yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/sku/SkuServiceImplTest.java +++ b/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} 的单元测试类