mall:调整部分 SPU、SKU 的表设计
parent
fa9823161e
commit
2340f09c68
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,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;
|
|
@ -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<String>。可以参考别的模块,怎么处理这种类型的哈
|
||||
private String picUrls;
|
||||
private Long brandId;
|
||||
/**
|
||||
* 商品分组编号数组
|
||||
*
|
||||
* 关联 {@link ProductGroupDO#getId()}
|
||||
*/
|
||||
@TableField(typeHandler = JacksonTypeHandler.class)
|
||||
private List<Long> groupIds;
|
||||
/**
|
||||
* 商品图片地址数组
|
||||
*/
|
||||
@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 芋艿:运费设置;如果选择了 “商家配送” 配送方式,则选择「运费设置」编号
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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} 的单元测试类
|
||||
|
|
Loading…
Reference in New Issue