商品 Spu + Sku 部分 API 提交

This commit is contained in:
YunaiV 2019-03-04 23:10:48 +08:00
parent 5192472ed5
commit abf1f25033
23 changed files with 859 additions and 88 deletions

View File

@ -8,8 +8,8 @@ import cn.iocoder.mall.product.api.constant.ProductCategoryConstants;
import cn.iocoder.mall.product.api.dto.ProductCategoryAddDTO; import cn.iocoder.mall.product.api.dto.ProductCategoryAddDTO;
import cn.iocoder.mall.product.api.dto.ProductCategoryUpdateDTO; import cn.iocoder.mall.product.api.dto.ProductCategoryUpdateDTO;
import cn.iocoder.mall.product.application.convert.ProductCategoryConvert; import cn.iocoder.mall.product.application.convert.ProductCategoryConvert;
import cn.iocoder.mall.product.application.vo.ProductCategoryTreeNodeVO; import cn.iocoder.mall.product.application.vo.admins.AdminProductCategoryTreeNodeVO;
import cn.iocoder.mall.product.application.vo.ProductCategoryVO; import cn.iocoder.mall.product.application.vo.admins.AdminsProductCategoryVO;
import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.annotation.Reference;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
@ -33,16 +33,16 @@ public class AdminsProductCategoryController {
@GetMapping("/tree") @GetMapping("/tree")
@ApiOperation("获得分类树结构") @ApiOperation("获得分类树结构")
public CommonResult<List<ProductCategoryTreeNodeVO>> tree() { public CommonResult<List<AdminProductCategoryTreeNodeVO>> tree() {
List<ProductCategoryBO> productCategories = productCategoryService.getAll().getData(); List<ProductCategoryBO> productCategories = productCategoryService.getAll().getData();
// 创建 ProductCategoryTreeNodeVO Map // 创建 ProductCategoryTreeNodeVO Map
Map<Integer, ProductCategoryTreeNodeVO> treeNodeMap = productCategories.stream().collect(Collectors.toMap(ProductCategoryBO::getId, ProductCategoryConvert.INSTANCE::convert)); Map<Integer, AdminProductCategoryTreeNodeVO> treeNodeMap = productCategories.stream().collect(Collectors.toMap(ProductCategoryBO::getId, ProductCategoryConvert.INSTANCE::convert));
// 处理父子关系 // 处理父子关系
treeNodeMap.values().stream() treeNodeMap.values().stream()
.filter(node -> !node.getPid().equals(ProductCategoryConstants.PID_ROOT)) .filter(node -> !node.getPid().equals(ProductCategoryConstants.PID_ROOT))
.forEach((childNode) -> { .forEach((childNode) -> {
// 获得父节点 // 获得父节点
ProductCategoryTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid()); AdminProductCategoryTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid());
if (parentNode.getChildren() == null) { // 初始化 children 数组 if (parentNode.getChildren() == null) { // 初始化 children 数组
parentNode.setChildren(new ArrayList<>()); parentNode.setChildren(new ArrayList<>());
} }
@ -50,9 +50,9 @@ public class AdminsProductCategoryController {
parentNode.getChildren().add(childNode); parentNode.getChildren().add(childNode);
}); });
// 获得到所有的根节点 // 获得到所有的根节点
List<ProductCategoryTreeNodeVO> rootNodes = treeNodeMap.values().stream() List<AdminProductCategoryTreeNodeVO> rootNodes = treeNodeMap.values().stream()
.filter(node -> node.getPid().equals(ProductCategoryConstants.PID_ROOT)) .filter(node -> node.getPid().equals(ProductCategoryConstants.PID_ROOT))
.sorted(Comparator.comparing(ProductCategoryTreeNodeVO::getSort)) .sorted(Comparator.comparing(AdminProductCategoryTreeNodeVO::getSort))
.collect(Collectors.toList()); .collect(Collectors.toList());
return CommonResult.success(rootNodes); return CommonResult.success(rootNodes);
} }
@ -66,7 +66,7 @@ public class AdminsProductCategoryController {
@ApiImplicitParam(name = "picUrl", value = "分类图片", example = "http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg/"), @ApiImplicitParam(name = "picUrl", value = "分类图片", example = "http://www.iocoder.cn/images/common/wechat_mp_2017_07_31_bak.jpg/"),
@ApiImplicitParam(name = "sort", value = "排序", required = true, example = "1"), @ApiImplicitParam(name = "sort", value = "排序", required = true, example = "1"),
}) })
public CommonResult<ProductCategoryVO> add(@RequestParam("pid") Integer pid, public CommonResult<AdminsProductCategoryVO> add(@RequestParam("pid") Integer pid,
@RequestParam("name") String name, @RequestParam("name") String name,
@RequestParam("description") String description, @RequestParam("description") String description,
@RequestParam(value = "picUrl", required = false) String picUrl, @RequestParam(value = "picUrl", required = false) String picUrl,

View File

@ -0,0 +1,101 @@
package cn.iocoder.mall.product.application.controller.admins;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
import cn.iocoder.mall.product.api.ProductSpuService;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
import cn.iocoder.mall.product.application.convert.ProductSpuConvert;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuPageVO;
import com.alibaba.dubbo.config.annotation.Reference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
@RestController
@RequestMapping("admins")
@Api("商品 SPU + SKU")
public class AdminsProductSpuController {
@Reference(validation = "true")
private ProductSpuService productSpuService;
@Autowired
private ObjectMapper objectMapper; // jackson 解析
@PostMapping("/spu/add")
@ApiOperation("创建商品")
public CommonResult<AdminsProductSpuDetailVO> add(@RequestParam("name") String name,
@RequestParam("sellPoint") String sellPoint,
@RequestParam("description") String description,
@RequestParam("cid") Integer cid,
@RequestParam("picURLs") List<String> picUrls,
@RequestParam("visible") Boolean visible,
@RequestParam("skuStr") String skuStr) { // TODO 芋艿因为考虑不使用 json 接受参数所以这里手动转
// 创建 ProductSpuAddDTO 对象
ProductSpuAddDTO productSpuAddDTO = new ProductSpuAddDTO().setName(name).setSellPoint(sellPoint)
.setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible)
.setSkus(parseSkus(skuStr, ProductSkuAddDTO.class));
// 保存商品
CommonResult<ProductSpuDetailBO> result = productSpuService.addProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuAddDTO);
// 返回结果
return ProductSpuConvert.INSTANCE.convert(result);
}
@PostMapping("/spu/update")
@ApiOperation("更新商品")
public CommonResult<Boolean> update(@RequestParam("id") Integer id,
@RequestParam("name") String name,
@RequestParam("sellPoint") String sellPoint,
@RequestParam("description") String description,
@RequestParam("cid") Integer cid,
@RequestParam("picURLs") List<String> picUrls,
@RequestParam("visible") Boolean visible,
@RequestParam("skuStr") String skuStr) { // TODO 芋艿因为考虑不使用 json 接受参数所以这里手动转
// 创建 ProductSpuUpdateDTO 对象
ProductSpuUpdateDTO productSpuUpdateDTO = new ProductSpuUpdateDTO().setId(id).setName(name).setSellPoint(sellPoint)
.setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible)
.setSkus(parseSkus(skuStr, ProductSkuUpdateDTO.class));
// 更新商品
return productSpuService.updateProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuUpdateDTO);
}
@PostMapping("/spu/update_sort")
@ApiOperation("更新商品的排序")
public CommonResult<Boolean> updateSort(@RequestParam("id") Integer id,
@RequestParam("sort") Integer sort) {
return null;
}
@GetMapping("/spu/page")
@ApiOperation("商品 SPU 分页列表")
public CommonResult<AdminsProductSpuPageVO> spuPage() {
return null;
}
@GetMapping("/spu/info")
@ApiOperation("商品 SPU 明细")
public CommonResult<AdminsProductSpuDetailVO> info() {
return null;
}
private <T> List<T> parseSkus(String skuStr, Class<T> clazz) {
JavaType type = objectMapper.getTypeFactory().constructParametricType(List.class, clazz);
try {
return objectMapper.readValue(skuStr, type);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -3,7 +3,7 @@ package cn.iocoder.mall.product.application.controller.users;
import cn.iocoder.mall.product.api.ProductCategoryService; import cn.iocoder.mall.product.api.ProductCategoryService;
import cn.iocoder.mall.product.api.bo.ProductCategoryBO; import cn.iocoder.mall.product.api.bo.ProductCategoryBO;
import cn.iocoder.mall.product.application.convert.ProductCategoryConvert; import cn.iocoder.mall.product.application.convert.ProductCategoryConvert;
import cn.iocoder.mall.product.application.vo.ProductCategorySimpleVO; import cn.iocoder.mall.product.application.vo.users.UsersProductCategoryVO;
import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.dubbo.config.annotation.Reference;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
@ -26,7 +26,7 @@ public class ProductCategoryController {
@GetMapping @GetMapping
@ApiOperation("获得指定编号下的子分类的数组") @ApiOperation("获得指定编号下的子分类的数组")
@ApiImplicitParam(name = "pid", value = "指定分类编号", required = true, example = "0") @ApiImplicitParam(name = "pid", value = "指定分类编号", required = true, example = "0")
public List<ProductCategorySimpleVO> list(@RequestParam("pid") Integer pid) { public List<UsersProductCategoryVO> list(@RequestParam("pid") Integer pid) {
List<ProductCategoryBO> result = productCategoryService.getListByPid(pid); List<ProductCategoryBO> result = productCategoryService.getListByPid(pid);
return ProductCategoryConvert.INSTANCE.convertToVO(result); return ProductCategoryConvert.INSTANCE.convertToVO(result);
} }

View File

@ -2,9 +2,9 @@ package cn.iocoder.mall.product.application.convert;
import cn.iocoder.common.framework.vo.CommonResult; import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.api.bo.ProductCategoryBO; import cn.iocoder.mall.product.api.bo.ProductCategoryBO;
import cn.iocoder.mall.product.application.vo.ProductCategorySimpleVO; import cn.iocoder.mall.product.application.vo.users.UsersProductCategoryVO;
import cn.iocoder.mall.product.application.vo.ProductCategoryTreeNodeVO; import cn.iocoder.mall.product.application.vo.admins.AdminProductCategoryTreeNodeVO;
import cn.iocoder.mall.product.application.vo.ProductCategoryVO; import cn.iocoder.mall.product.application.vo.admins.AdminsProductCategoryVO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mappings; import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
@ -17,12 +17,12 @@ public interface ProductCategoryConvert {
ProductCategoryConvert INSTANCE = Mappers.getMapper(ProductCategoryConvert.class); ProductCategoryConvert INSTANCE = Mappers.getMapper(ProductCategoryConvert.class);
@Mappings({}) @Mappings({})
ProductCategorySimpleVO convertToVO(ProductCategoryBO category); UsersProductCategoryVO convertToVO(ProductCategoryBO category);
List<ProductCategorySimpleVO> convertToVO(List<ProductCategoryBO> categoryList); List<UsersProductCategoryVO> convertToVO(List<ProductCategoryBO> categoryList);
ProductCategoryTreeNodeVO convert(ProductCategoryBO category); AdminProductCategoryTreeNodeVO convert(ProductCategoryBO category);
CommonResult<ProductCategoryVO> convert(CommonResult<ProductCategoryBO> result); CommonResult<AdminsProductCategoryVO> convert(CommonResult<ProductCategoryBO> result);
} }

View File

@ -0,0 +1,21 @@
package cn.iocoder.mall.product.application.convert;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper
public interface ProductSpuConvert {
ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class);
@Mappings({})
AdminsProductSpuDetailVO convert(ProductSpuDetailBO productSpuDetailBO);
@Mappings({})
CommonResult<AdminsProductSpuDetailVO> convert(CommonResult<ProductSpuDetailBO> result);
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.product.application.vo; package cn.iocoder.mall.product.application.vo.admins;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -7,7 +7,7 @@ import java.util.Date;
import java.util.List; import java.util.List;
@ApiModel("产品分类树节点 VO") @ApiModel("产品分类树节点 VO")
public class ProductCategoryTreeNodeVO { public class AdminProductCategoryTreeNodeVO {
@ApiModelProperty(value = "分类编号", required = true, example = "1") @ApiModelProperty(value = "分类编号", required = true, example = "1")
private Integer id; private Integer id;
@ -26,13 +26,13 @@ public class ProductCategoryTreeNodeVO {
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳") @ApiModelProperty(value = "创建时间", required = true, example = "时间戳")
private Date createTime; private Date createTime;
@ApiModelProperty(value = "子节点数组") @ApiModelProperty(value = "子节点数组")
private List<ProductCategoryTreeNodeVO> children; private List<AdminProductCategoryTreeNodeVO> children;
public Integer getId() { public Integer getId() {
return id; return id;
} }
public ProductCategoryTreeNodeVO setId(Integer id) { public AdminProductCategoryTreeNodeVO setId(Integer id) {
this.id = id; this.id = id;
return this; return this;
} }
@ -41,7 +41,7 @@ public class ProductCategoryTreeNodeVO {
return pid; return pid;
} }
public ProductCategoryTreeNodeVO setPid(Integer pid) { public AdminProductCategoryTreeNodeVO setPid(Integer pid) {
this.pid = pid; this.pid = pid;
return this; return this;
} }
@ -50,7 +50,7 @@ public class ProductCategoryTreeNodeVO {
return name; return name;
} }
public ProductCategoryTreeNodeVO setName(String name) { public AdminProductCategoryTreeNodeVO setName(String name) {
this.name = name; this.name = name;
return this; return this;
} }
@ -59,7 +59,7 @@ public class ProductCategoryTreeNodeVO {
return description; return description;
} }
public ProductCategoryTreeNodeVO setDescription(String description) { public AdminProductCategoryTreeNodeVO setDescription(String description) {
this.description = description; this.description = description;
return this; return this;
} }
@ -68,7 +68,7 @@ public class ProductCategoryTreeNodeVO {
return picUrl; return picUrl;
} }
public ProductCategoryTreeNodeVO setPicUrl(String picUrl) { public AdminProductCategoryTreeNodeVO setPicUrl(String picUrl) {
this.picUrl = picUrl; this.picUrl = picUrl;
return this; return this;
} }
@ -77,7 +77,7 @@ public class ProductCategoryTreeNodeVO {
return sort; return sort;
} }
public ProductCategoryTreeNodeVO setSort(Integer sort) { public AdminProductCategoryTreeNodeVO setSort(Integer sort) {
this.sort = sort; this.sort = sort;
return this; return this;
} }
@ -86,7 +86,7 @@ public class ProductCategoryTreeNodeVO {
return status; return status;
} }
public ProductCategoryTreeNodeVO setStatus(Integer status) { public AdminProductCategoryTreeNodeVO setStatus(Integer status) {
this.status = status; this.status = status;
return this; return this;
} }
@ -95,16 +95,16 @@ public class ProductCategoryTreeNodeVO {
return createTime; return createTime;
} }
public ProductCategoryTreeNodeVO setCreateTime(Date createTime) { public AdminProductCategoryTreeNodeVO setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
return this; return this;
} }
public List<ProductCategoryTreeNodeVO> getChildren() { public List<AdminProductCategoryTreeNodeVO> getChildren() {
return children; return children;
} }
public ProductCategoryTreeNodeVO setChildren(List<ProductCategoryTreeNodeVO> children) { public AdminProductCategoryTreeNodeVO setChildren(List<AdminProductCategoryTreeNodeVO> children) {
this.children = children; this.children = children;
return this; return this;
} }

View File

@ -1,4 +1,4 @@
package cn.iocoder.mall.product.application.vo; package cn.iocoder.mall.product.application.vo.admins;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ -6,7 +6,7 @@ import io.swagger.annotations.ApiModelProperty;
import java.util.Date; import java.util.Date;
@ApiModel("产品分类 VO") @ApiModel("产品分类 VO")
public class ProductCategoryVO { public class AdminsProductCategoryVO {
@ApiModelProperty(value = "分类编号", required = true, example = "1") @ApiModelProperty(value = "分类编号", required = true, example = "1")
private Integer id; private Integer id;
@ -29,7 +29,7 @@ public class ProductCategoryVO {
return id; return id;
} }
public ProductCategoryVO setId(Integer id) { public AdminsProductCategoryVO setId(Integer id) {
this.id = id; this.id = id;
return this; return this;
} }
@ -38,7 +38,7 @@ public class ProductCategoryVO {
return pid; return pid;
} }
public ProductCategoryVO setPid(Integer pid) { public AdminsProductCategoryVO setPid(Integer pid) {
this.pid = pid; this.pid = pid;
return this; return this;
} }
@ -47,7 +47,7 @@ public class ProductCategoryVO {
return name; return name;
} }
public ProductCategoryVO setName(String name) { public AdminsProductCategoryVO setName(String name) {
this.name = name; this.name = name;
return this; return this;
} }
@ -56,7 +56,7 @@ public class ProductCategoryVO {
return description; return description;
} }
public ProductCategoryVO setDescription(String description) { public AdminsProductCategoryVO setDescription(String description) {
this.description = description; this.description = description;
return this; return this;
} }
@ -65,7 +65,7 @@ public class ProductCategoryVO {
return picUrl; return picUrl;
} }
public ProductCategoryVO setPicUrl(String picUrl) { public AdminsProductCategoryVO setPicUrl(String picUrl) {
this.picUrl = picUrl; this.picUrl = picUrl;
return this; return this;
} }
@ -74,7 +74,7 @@ public class ProductCategoryVO {
return sort; return sort;
} }
public ProductCategoryVO setSort(Integer sort) { public AdminsProductCategoryVO setSort(Integer sort) {
this.sort = sort; this.sort = sort;
return this; return this;
} }
@ -83,7 +83,7 @@ public class ProductCategoryVO {
return status; return status;
} }
public ProductCategoryVO setStatus(Integer status) { public AdminsProductCategoryVO setStatus(Integer status) {
this.status = status; this.status = status;
return this; return this;
} }
@ -92,7 +92,7 @@ public class ProductCategoryVO {
return createTime; return createTime;
} }
public ProductCategoryVO setCreateTime(Date createTime) { public AdminsProductCategoryVO setCreateTime(Date createTime) {
this.createTime = createTime; this.createTime = createTime;
return this; return this;
} }

View File

@ -0,0 +1,10 @@
package cn.iocoder.mall.product.application.vo.admins;
import io.swagger.annotations.ApiModel;
@ApiModel(value = "商品 SPU 详细 VO", description = "包括 SKU 信息 VO")
public class AdminsProductSpuDetailVO {
}

View File

@ -0,0 +1,37 @@
package cn.iocoder.mall.product.application.vo.admins;
import io.swagger.annotations.ApiModel;
import java.util.List;
@ApiModel("商品 SPU 分页 VO")
public class AdminsProductSpuPageVO {
/**
* spu 数组
*/
private List<AdminsProductSpuVO> spus;
/**
* 总数
*/
private Integer count;
public List<AdminsProductSpuVO> getSpus() {
return spus;
}
public AdminsProductSpuPageVO setSpus(List<AdminsProductSpuVO> spus) {
this.spus = spus;
return this;
}
public Integer getCount() {
return count;
}
public AdminsProductSpuPageVO setCount(Integer count) {
this.count = count;
return this;
}
}

View File

@ -0,0 +1,10 @@
package cn.iocoder.mall.product.application.vo.admins;
import io.swagger.annotations.ApiModel;
@ApiModel(value = "商品 SPU VO", description = "不包括 SKU 信息 VO")
public class AdminsProductSpuVO {
}

View File

@ -1,10 +1,10 @@
package cn.iocoder.mall.product.application.vo; package cn.iocoder.mall.product.application.vo.users;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
@ApiModel("商品分类(简单)") @ApiModel("商品分类(简单)")
public class ProductCategorySimpleVO { public class UsersProductCategoryVO {
@ApiModelProperty(value = "分类编号", required = true, example = "1") @ApiModelProperty(value = "分类编号", required = true, example = "1")
private Integer id; private Integer id;

View File

@ -1,9 +1,17 @@
package cn.iocoder.mall.product.api; package cn.iocoder.mall.product.api;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.api.bo.ProductSpuBO; import cn.iocoder.mall.product.api.bo.ProductSpuBO;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
public interface ProductSpuService { public interface ProductSpuService {
ProductSpuBO getProductSpu(Integer id); ProductSpuBO getProductSpu(Integer id);
CommonResult<ProductSpuDetailBO> addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO);
CommonResult<Boolean> updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO);
} }

View File

@ -0,0 +1,61 @@
package cn.iocoder.mall.product.api.bo;
/**
* 商品规格 BO
*/
public class ProductAttrBO {
/**
* 规格编号
*/
private Integer attrId;
/**
* 规格名
*/
private String attrName;
/**
* 规格值
*/
private Integer attrValueId;
/**
* 规格值名
*/
private String attrValueName;
public Integer getAttrId() {
return attrId;
}
public ProductAttrBO setAttrId(Integer attrId) {
this.attrId = attrId;
return this;
}
public String getAttrName() {
return attrName;
}
public ProductAttrBO setAttrName(String attrName) {
this.attrName = attrName;
return this;
}
public Integer getAttrValueId() {
return attrValueId;
}
public ProductAttrBO setAttrValueId(Integer attrValueId) {
this.attrValueId = attrValueId;
return this;
}
public String getAttrValueName() {
return attrValueName;
}
public ProductAttrBO setAttrValueName(String attrValueName) {
this.attrValueName = attrValueName;
return this;
}
}

View File

@ -0,0 +1,45 @@
package cn.iocoder.mall.product.api.bo;
import java.util.List;
/**
* 商品 Sku 明细 BO
*/
public class ProductSkuDetailBO {
/**
* sku 编号
*/
private Integer id;
/**
* 商品编号
*/
private Integer itemId;
// TODO 店铺编号
/**
* 状态
*
* 1-正常
* 2-禁用
*/
private Integer status;
/**
* 图片地址
*/
private String picURL;
/**
* 规格值数组
*/
private List<ProductAttrBO> attrs;
/**
* 价格单位
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
}

View File

@ -0,0 +1,65 @@
package cn.iocoder.mall.product.api.bo;
import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO;
import java.util.List;
/**
* 商品 Spu 明细 BO包括 Sku 明细
*/
public class ProductSpuDetailBO {
/**
* SPU 编号
*/
private Integer id;
// ========== 基本信息 =========
/**
* SPU 名字
*/
private String name;
/**
* 卖点
*/
private String sellPoint;
/**
* 描述
*/
private String description;
/**
* 分类编号
*/
private Integer cid;
/**
* 商品主图地址
*
* 数组以逗号分隔
*
* 建议尺寸800*800像素你可以拖拽图片调整顺序最多上传15张
*/
private List<String> picUrls;
// ========== 其他信息 =========
/**
* 是否上架商品是否可见
*
* true 为已上架
* false 为已下架
*/
private Boolean visible;
/**
* 排序字段
*/
private Integer order;
//
// ========== SKU =========
/**
* SKU 数组
*/
private List<ProductSkuAddDTO> skus;
}

View File

@ -0,0 +1,50 @@
package cn.iocoder.mall.product.api.dto;
import java.util.List;
/**
* 商品 Sku 添加 DTO
*/
public class ProductSkuAddDTO {
/**
* 规格值数组
*/
private List<Integer> attrs;
/**
* 价格单位
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
public List<Integer> getAttrs() {
return attrs;
}
public ProductSkuAddDTO setAttrs(List<Integer> attrs) {
this.attrs = attrs;
return this;
}
public Integer getPrice() {
return price;
}
public ProductSkuAddDTO setPrice(Integer price) {
this.price = price;
return this;
}
public Integer getQuantity() {
return quantity;
}
public ProductSkuAddDTO setQuantity(Integer quantity) {
this.quantity = quantity;
return this;
}
}

View File

@ -0,0 +1,50 @@
package cn.iocoder.mall.product.api.dto;
import java.util.List;
/**
* 商品 Sku 更新 DTO
*/
public class ProductSkuUpdateDTO {
/**
* 规格值数组
*/
private List<Integer> attrs;
/**
* 价格单位
*/
private Integer price;
/**
* 库存数量
*/
private Integer quantity;
public List<Integer> getAttrs() {
return attrs;
}
public ProductSkuUpdateDTO setAttrs(List<Integer> attrs) {
this.attrs = attrs;
return this;
}
public Integer getPrice() {
return price;
}
public ProductSkuUpdateDTO setPrice(Integer price) {
this.price = price;
return this;
}
public Integer getQuantity() {
return quantity;
}
public ProductSkuUpdateDTO setQuantity(Integer quantity) {
this.quantity = quantity;
return this;
}
}

View File

@ -0,0 +1,120 @@
package cn.iocoder.mall.product.api.dto;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 商品 SPU + SKU 添加 DTO
*/
public class ProductSpuAddDTO {
// ========== 基本信息 =========
/**
* SPU 名字
*/
@NotEmpty(message = "SPU 名字不能为空")
private String name;
/**
* 卖点
*/
@NotEmpty(message = "卖点不能为空")
private String sellPoint;
/**
* 描述
*/
@NotEmpty(message = "描述不能为空")
private String description;
/**
* 分类编号
*/
@NotEmpty(message = "分类不能为空")
private Integer cid;
/**
* 商品主图地址
*/
@NotNull(message = "商品主图不能为空")
private List<String> picUrls;
// ========== 其他信息 =========
/**
* 是否上架商品是否可见
*
* true 为已上架
* false 为已下架
*/
@NotNull(message = "是否上架不能为空")
private Boolean visible;
// ========== SKU =========
/**
* SKU 数组
*/
@NotNull(message = "SKU 不能为空")
private List<ProductSkuAddDTO> skus;
public String getName() {
return name;
}
public ProductSpuAddDTO setName(String name) {
this.name = name;
return this;
}
public String getSellPoint() {
return sellPoint;
}
public ProductSpuAddDTO setSellPoint(String sellPoint) {
this.sellPoint = sellPoint;
return this;
}
public String getDescription() {
return description;
}
public ProductSpuAddDTO setDescription(String description) {
this.description = description;
return this;
}
public Integer getCid() {
return cid;
}
public ProductSpuAddDTO setCid(Integer cid) {
this.cid = cid;
return this;
}
public List<String> getPicUrls() {
return picUrls;
}
public ProductSpuAddDTO setPicUrls(List<String> picUrls) {
this.picUrls = picUrls;
return this;
}
public Boolean getVisible() {
return visible;
}
public ProductSpuAddDTO setVisible(Boolean visible) {
this.visible = visible;
return this;
}
public List<ProductSkuAddDTO> getSkus() {
return skus;
}
public ProductSpuAddDTO setSkus(List<ProductSkuAddDTO> skus) {
this.skus = skus;
return this;
}
}

View File

@ -0,0 +1,134 @@
package cn.iocoder.mall.product.api.dto;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 商品 SPU + SKU 更新 DTO
*/
public class ProductSpuUpdateDTO {
/**
* Spu 编号
*/
@NotNull(message = "SPU 编号不能为空")
private Integer id;
// ========== 基本信息 =========
/**
* SPU 名字
*/
@NotEmpty(message = "SPU 名字不能为空")
private String name;
/**
* 卖点
*/
@NotEmpty(message = "卖点不能为空")
private String sellPoint;
/**
* 描述
*/
@NotEmpty(message = "描述不能为空")
private String description;
/**
* 分类编号
*/
@NotEmpty(message = "分类不能为空")
private Integer cid;
/**
* 商品主图地址
*/
@NotNull(message = "商品主图不能为空")
private List<String> picUrls;
// ========== 其他信息 =========
/**
* 是否上架商品是否可见
*
* true 为已上架
* false 为已下架
*/
@NotNull(message = "是否上架不能为空")
private Boolean visible;
// ========== SKU =========
/**
* SKU 数组
*/
@NotNull(message = "SKU 不能为空")
private List<ProductSkuUpdateDTO> skus;
public String getName() {
return name;
}
public ProductSpuUpdateDTO setName(String name) {
this.name = name;
return this;
}
public String getSellPoint() {
return sellPoint;
}
public ProductSpuUpdateDTO setSellPoint(String sellPoint) {
this.sellPoint = sellPoint;
return this;
}
public String getDescription() {
return description;
}
public ProductSpuUpdateDTO setDescription(String description) {
this.description = description;
return this;
}
public Integer getCid() {
return cid;
}
public ProductSpuUpdateDTO setCid(Integer cid) {
this.cid = cid;
return this;
}
public List<String> getPicUrls() {
return picUrls;
}
public ProductSpuUpdateDTO setPicUrls(List<String> picUrls) {
this.picUrls = picUrls;
return this;
}
public Boolean getVisible() {
return visible;
}
public ProductSpuUpdateDTO setVisible(Boolean visible) {
this.visible = visible;
return this;
}
public List<ProductSkuUpdateDTO> getSkus() {
return skus;
}
public ProductSpuUpdateDTO setSkus(List<ProductSkuUpdateDTO> skus) {
this.skus = skus;
return this;
}
public Integer getId() {
return id;
}
public ProductSpuUpdateDTO setId(Integer id) {
this.id = id;
return this;
}
}

View File

@ -1,11 +1,11 @@
package cn.iocoder.mall.product.dataobject; package cn.iocoder.mall.product.dataobject;
import java.util.Date; import cn.iocoder.common.framework.dataobject.BaseDO;
/** /**
* 商品 SKU * 商品 SKU
*/ */
public class ProductSkuDO { public class ProductSkuDO extends BaseDO {
/** /**
* sku 编号 * sku 编号
@ -22,7 +22,7 @@ public class ProductSkuDO {
* 状态 * 状态
* *
* 1-正常 * 1-正常
* 2-删除 * 2-禁用
*/ */
private Integer status; private Integer status;
/** /**
@ -36,24 +36,20 @@ public class ProductSkuDO {
*/ */
private String attrs; private String attrs;
/** /**
* 价格单位 * 价格单位
*/ */
private Integer price; private Integer price;
/** /**
* 商品在付款减库存的状态下该Sku上未付款的订单数量 * 库存数量
*/ */
private Integer withHoldQuantity; private Integer quantity;
/** // /**
* 销量 // * 商品在付款减库存的状态下该Sku上未付款的订单数量
*/ // */
private Integer soldNum; // private Integer withHoldQuantity;
/** // /**
* 创建时间 // * 销量
*/ // */
private Date createTime; // private Integer soldNum;
/**
* 更新时间
*/
private Date updateTime;
} }

View File

@ -1,36 +1,18 @@
package cn.iocoder.mall.product.dataobject; package cn.iocoder.mall.product.dataobject;
import java.util.Date; import cn.iocoder.common.framework.dataobject.BaseDO;
/** /**
* 商品 SPU * 商品 SPU
*/ */
public class ProductSpuDO { public class ProductSpuDO extends BaseDO {
// ========== 基础字段 =========
/** /**
* SPU 编号 * SPU 编号
*/ */
private Integer id; private Integer id;
// TODO 店铺编号 // TODO 店铺编号 先不考虑因为第一个版本不做 B2B2C
/**
* 创建时间
*/
private Date createTime;
/**
* 最后更新时间
*/
private Date updateTime;
/**
* 状态
*
* 1-正常
* 2-删除
*/
private Integer status;
// ========== 基本信息 ========= // ========== 基本信息 =========
/** /**
@ -38,9 +20,13 @@ public class ProductSpuDO {
*/ */
private String name; private String name;
/** /**
* SPU 描述 * 卖点
*/ */
private String descrption; private String sellPoint;
/**
* 描述
*/
private String description;
/** /**
* 分类编号 * 分类编号
*/ */
@ -52,7 +38,7 @@ public class ProductSpuDO {
* *
* 建议尺寸800*800像素你可以拖拽图片调整顺序最多上传15张 * 建议尺寸800*800像素你可以拖拽图片调整顺序最多上传15张
*/ */
private String picURLs; private String picUrls;
// TODO 价格库存 // TODO 价格库存
@ -79,4 +65,66 @@ public class ProductSpuDO {
this.id = id; this.id = id;
} }
public String getName() {
return name;
}
public ProductSpuDO setName(String name) {
this.name = name;
return this;
}
public String getSellPoint() {
return sellPoint;
}
public ProductSpuDO setSellPoint(String sellPoint) {
this.sellPoint = sellPoint;
return this;
}
public String getDescription() {
return description;
}
public ProductSpuDO setDescription(String description) {
this.description = description;
return this;
}
public Integer getCid() {
return cid;
}
public ProductSpuDO setCid(Integer cid) {
this.cid = cid;
return this;
}
public String getPicUrls() {
return picUrls;
}
public ProductSpuDO setPicUrls(String picUrls) {
this.picUrls = picUrls;
return this;
}
public Boolean getVisible() {
return visible;
}
public ProductSpuDO setVisible(Boolean visible) {
this.visible = visible;
return this;
}
public Integer getOrder() {
return order;
}
public ProductSpuDO setOrder(Integer order) {
this.order = order;
return this;
}
} }

View File

@ -5,6 +5,7 @@ import java.util.Date;
/** /**
* Product 库存 * Product 库存
*/ */
@Deprecated // TODO 芋艿咱暂时不加库存表和库存服务
public class ProductStockDO { public class ProductStockDO {
/** /**

View File

@ -1,7 +1,11 @@
package cn.iocoder.mall.product.service; package cn.iocoder.mall.product.service;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.product.api.ProductSpuService; import cn.iocoder.mall.product.api.ProductSpuService;
import cn.iocoder.mall.product.api.bo.ProductSpuBO; import cn.iocoder.mall.product.api.bo.ProductSpuBO;
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
import cn.iocoder.mall.product.convert.ProductSpuConvert; import cn.iocoder.mall.product.convert.ProductSpuConvert;
import cn.iocoder.mall.product.dao.ProductSpuMapper; import cn.iocoder.mall.product.dao.ProductSpuMapper;
import cn.iocoder.mall.product.dataobject.ProductSpuDO; import cn.iocoder.mall.product.dataobject.ProductSpuDO;
@ -22,4 +26,14 @@ public class ProductSpuServiceImpl implements ProductSpuService {
return ProductSpuConvert.INSTANCE.convert(productSpuDO); return ProductSpuConvert.INSTANCE.convert(productSpuDO);
} }
@Override
public CommonResult<ProductSpuDetailBO> addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO) {
return null;
}
@Override
public CommonResult<Boolean> updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO) {
return null;
}
} }