Merge remote-tracking branch 'origin/master'
commit
70bdb63759
|
@ -82,7 +82,7 @@ public class AdminController {
|
||||||
@GetMapping("/page")
|
@GetMapping("/page")
|
||||||
@ApiOperation(value = "管理员分页")
|
@ApiOperation(value = "管理员分页")
|
||||||
@ApiImplicitParams({
|
@ApiImplicitParams({
|
||||||
@ApiImplicitParam(name = "nickname", value = "昵称,模糊匹配", required = true, example = "小王"),
|
@ApiImplicitParam(name = "nickname", value = "昵称,模糊匹配", example = "小王"),
|
||||||
@ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"),
|
@ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"),
|
||||||
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
|
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
package cn.iocoder.mall.admin.api.dto;
|
package cn.iocoder.mall.admin.api.dto;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
public class AdminPageDTO {
|
public class AdminPageDTO {
|
||||||
|
|
||||||
private String nickname;
|
private String nickname;
|
||||||
|
|
||||||
|
@NotNull(message = "页码不能为空")
|
||||||
private Integer pageNo;
|
private Integer pageNo;
|
||||||
|
@NotNull(message = "每页条数不能为空")
|
||||||
private Integer pageSize;
|
private Integer pageSize;
|
||||||
|
|
||||||
public Integer getPageNo() {
|
public Integer getPageNo() {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package cn.iocoder.common.framework.util;
|
||||||
|
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -17,4 +18,13 @@ public class StringUtil {
|
||||||
return Arrays.asList(stringArray);
|
return Arrays.asList(stringArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Integer> splitToInt(String toSplit, String delim) {
|
||||||
|
String[] stringArray = StringUtils.tokenizeToStringArray(toSplit, delim);
|
||||||
|
List<Integer> array = new ArrayList<>(stringArray.length);
|
||||||
|
for (String string : stringArray) {
|
||||||
|
array.add(Integer.valueOf(string));
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -4,9 +4,10 @@ import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
|
import cn.iocoder.mall.admin.sdk.context.AdminSecurityContextHolder;
|
||||||
import cn.iocoder.mall.product.api.ProductSpuService;
|
import cn.iocoder.mall.product.api.ProductSpuService;
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO;
|
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
||||||
|
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
||||||
import cn.iocoder.mall.product.application.convert.ProductSpuConvert;
|
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.AdminsProductSpuDetailVO;
|
||||||
|
@ -57,7 +58,7 @@ public class AdminsProductSpuController {
|
||||||
// 创建 ProductSpuAddDTO 对象
|
// 创建 ProductSpuAddDTO 对象
|
||||||
ProductSpuAddDTO productSpuAddDTO = new ProductSpuAddDTO().setName(name).setSellPoint(sellPoint)
|
ProductSpuAddDTO productSpuAddDTO = new ProductSpuAddDTO().setName(name).setSellPoint(sellPoint)
|
||||||
.setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible)
|
.setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible)
|
||||||
.setSkus(parseSkus(skuStr, ProductSkuAddDTO.class));
|
.setSkus(parseSkus(skuStr, ProductSkuAddOrUpdateDTO.class));
|
||||||
// 保存商品
|
// 保存商品
|
||||||
CommonResult<ProductSpuDetailBO> result = productSpuService.addProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuAddDTO);
|
CommonResult<ProductSpuDetailBO> result = productSpuService.addProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuAddDTO);
|
||||||
// 返回结果
|
// 返回结果
|
||||||
|
@ -88,7 +89,7 @@ public class AdminsProductSpuController {
|
||||||
// 创建 ProductSpuUpdateDTO 对象
|
// 创建 ProductSpuUpdateDTO 对象
|
||||||
ProductSpuUpdateDTO productSpuUpdateDTO = new ProductSpuUpdateDTO().setId(id).setName(name).setSellPoint(sellPoint)
|
ProductSpuUpdateDTO productSpuUpdateDTO = new ProductSpuUpdateDTO().setId(id).setName(name).setSellPoint(sellPoint)
|
||||||
.setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible)
|
.setDescription(description).setCid(cid).setPicUrls(picUrls).setVisible(visible)
|
||||||
.setSkus(parseSkus(skuStr, ProductSkuUpdateDTO.class));
|
.setSkus(parseSkus(skuStr, ProductSkuAddOrUpdateDTO.class));
|
||||||
// 更新商品
|
// 更新商品
|
||||||
return productSpuService.updateProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuUpdateDTO);
|
return productSpuService.updateProductSpu(AdminSecurityContextHolder.getContext().getAdminId(), productSpuUpdateDTO);
|
||||||
}
|
}
|
||||||
|
@ -97,19 +98,32 @@ public class AdminsProductSpuController {
|
||||||
@ApiOperation("更新商品的排序")
|
@ApiOperation("更新商品的排序")
|
||||||
public CommonResult<Boolean> updateSort(@RequestParam("id") Integer id,
|
public CommonResult<Boolean> updateSort(@RequestParam("id") Integer id,
|
||||||
@RequestParam("sort") Integer sort) {
|
@RequestParam("sort") Integer sort) {
|
||||||
return null;
|
return productSpuService.updateProductSpuSort(AdminSecurityContextHolder.getContext().getAdminId(), id, sort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO 芋艿,删除功能暂时不做。主要原因是,关联的数据太多。删除带来的问题会比较大
|
||||||
|
|
||||||
@GetMapping("/spu/page")
|
@GetMapping("/spu/page")
|
||||||
@ApiOperation("商品 SPU 分页列表")
|
@ApiOperation("商品 SPU 分页列表")
|
||||||
public CommonResult<AdminsProductSpuPageVO> spuPage() {
|
@ApiImplicitParams({
|
||||||
return null;
|
@ApiImplicitParam(name = "name", value = "商品名称,模糊匹配", example = "小王"),
|
||||||
|
@ApiImplicitParam(name = "pageNo", value = "页码,从 0 开始", example = "0"),
|
||||||
|
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
|
||||||
|
})
|
||||||
|
public CommonResult<AdminsProductSpuPageVO> spuPage(@RequestParam(value = "name", required = false) String name,
|
||||||
|
@RequestParam(value = "pageNo", defaultValue = "0") Integer pageNo,
|
||||||
|
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
|
||||||
|
// 创建 ProductSpuPageDTO 对象
|
||||||
|
ProductSpuPageDTO productSpuPageDTO = new ProductSpuPageDTO().setName(name).setPageNo(pageNo).setPageSize(pageSize);
|
||||||
|
CommonResult<ProductSpuPageBO> result = productSpuService.getProductSpuPage(productSpuPageDTO);
|
||||||
|
return ProductSpuConvert.INSTANCE.convert2(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/spu/info")
|
@GetMapping("/spu/info")
|
||||||
@ApiOperation("商品 SPU 明细")
|
@ApiOperation("商品 SPU 明细")
|
||||||
public CommonResult<AdminsProductSpuDetailVO> info() {
|
@ApiImplicitParam(name = "id", value = "SPU 编号", required = true, example = "100")
|
||||||
return null;
|
public CommonResult<AdminsProductSpuDetailVO> info(@RequestParam("id") Integer id) {
|
||||||
|
return ProductSpuConvert.INSTANCE.convert(productSpuService.getProductSpu(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> List<T> parseSkus(String skuStr, Class<T> clazz) {
|
private <T> List<T> parseSkus(String skuStr, Class<T> clazz) {
|
||||||
|
|
|
@ -19,7 +19,8 @@ public class ProductSpuController {
|
||||||
// TODO 详情
|
// TODO 详情
|
||||||
@GetMapping("/info")
|
@GetMapping("/info")
|
||||||
public ProductSpuBO info(@RequestParam("id") Integer id) {
|
public ProductSpuBO info(@RequestParam("id") Integer id) {
|
||||||
return productSpuService.getProductSpu(id);
|
// return productSpuService.getProductSpu(id);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO 分页
|
// TODO 分页
|
||||||
|
|
|
@ -2,7 +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.ProductSpuDetailBO;
|
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
||||||
|
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
|
||||||
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO;
|
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuDetailVO;
|
||||||
|
import cn.iocoder.mall.product.application.vo.admins.AdminsProductSpuPageVO;
|
||||||
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;
|
||||||
|
@ -18,4 +20,7 @@ public interface ProductSpuConvert {
|
||||||
@Mappings({})
|
@Mappings({})
|
||||||
CommonResult<AdminsProductSpuDetailVO> convert(CommonResult<ProductSpuDetailBO> result);
|
CommonResult<AdminsProductSpuDetailVO> convert(CommonResult<ProductSpuDetailBO> result);
|
||||||
|
|
||||||
|
@Mappings({})
|
||||||
|
CommonResult<AdminsProductSpuPageVO> convert2(CommonResult<ProductSpuPageBO> result);
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,10 +1,104 @@
|
||||||
package cn.iocoder.mall.product.application.vo.admins;
|
package cn.iocoder.mall.product.application.vo.admins;
|
||||||
|
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@ApiModel(value = "商品 SPU VO", description = "不包括 SKU 信息 VO")
|
@ApiModel(value = "商品 SPU VO", description = "不包括 SKU 信息 VO")
|
||||||
public class AdminsProductSpuVO {
|
public class AdminsProductSpuVO {
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "SPU 编号", required = true, example = "1")
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
// ========== 基本信息 =========
|
||||||
|
@ApiModelProperty(value = "SPU 名字", required = true, example = "厮大牛逼")
|
||||||
|
private String name;
|
||||||
|
@ApiModelProperty(value = "卖点", required = true, example = "各种 MQ 骚操作")
|
||||||
|
private String sellPoint;
|
||||||
|
@ApiModelProperty(value = "描述", required = true, example = "你就说强不强")
|
||||||
|
private String description;
|
||||||
|
@ApiModelProperty(value = "分类编号", required = true, example = "反正我是信了")
|
||||||
|
private Integer cid;
|
||||||
|
@ApiModelProperty(value = "商品主图地址的数组", required = true, example = "http://www.iocoder.cn")
|
||||||
|
private List<String> picUrls;
|
||||||
|
|
||||||
|
// ========== 其他信息 =========
|
||||||
|
@ApiModelProperty(value = "是否上架商品(是否可见)", required = true, example = "true")
|
||||||
|
private Boolean visible;
|
||||||
|
@ApiModelProperty(value = "排序字段", required = true, example = "10")
|
||||||
|
private Integer sort;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSellPoint() {
|
||||||
|
return sellPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setSellPoint(String sellPoint) {
|
||||||
|
this.sellPoint = sellPoint;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCid() {
|
||||||
|
return cid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setCid(Integer cid) {
|
||||||
|
this.cid = cid;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getPicUrls() {
|
||||||
|
return picUrls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setPicUrls(List<String> picUrls) {
|
||||||
|
this.picUrls = picUrls;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getVisible() {
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setVisible(Boolean visible) {
|
||||||
|
this.visible = visible;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSort() {
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AdminsProductSpuVO setSort(Integer sort) {
|
||||||
|
this.sort = sort;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,19 +1,22 @@
|
||||||
package cn.iocoder.mall.product.api;
|
package cn.iocoder.mall.product.api;
|
||||||
|
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
import cn.iocoder.common.framework.vo.CommonResult;
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSpuBO;
|
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
||||||
|
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
||||||
|
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
||||||
|
|
||||||
public interface ProductSpuService {
|
public interface ProductSpuService {
|
||||||
|
|
||||||
ProductSpuBO getProductSpu(Integer id);
|
CommonResult<ProductSpuDetailBO> getProductSpu(Integer id);
|
||||||
|
|
||||||
CommonResult<ProductSpuDetailBO> addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO);
|
CommonResult<ProductSpuDetailBO> addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO);
|
||||||
|
|
||||||
CommonResult<Boolean> updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO);
|
CommonResult<Boolean> updateProductSpu(Integer adminId, ProductSpuUpdateDTO productSpuUpdateDTO);
|
||||||
|
|
||||||
|
CommonResult<Boolean> updateProductSpuSort(Integer adminId, Integer spuId, Integer sort);
|
||||||
|
|
||||||
|
CommonResult<ProductSpuPageBO> getProductSpuPage(ProductSpuPageDTO productSpuPageDTO);
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,15 +1,123 @@
|
||||||
package cn.iocoder.mall.product.api.bo;
|
package cn.iocoder.mall.product.api.bo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class ProductSpuBO {
|
public class ProductSpuBO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SPU 编号
|
||||||
|
*/
|
||||||
private Integer id;
|
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 sort;
|
||||||
|
|
||||||
public Integer getId() {
|
public Integer getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Integer id) {
|
public ProductSpuBO setId(Integer id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSellPoint() {
|
||||||
|
return sellPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setSellPoint(String sellPoint) {
|
||||||
|
this.sellPoint = sellPoint;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCid() {
|
||||||
|
return cid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setCid(Integer cid) {
|
||||||
|
this.cid = cid;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getPicUrls() {
|
||||||
|
return picUrls;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setPicUrls(List<String> picUrls) {
|
||||||
|
this.picUrls = picUrls;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getVisible() {
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setVisible(Boolean visible) {
|
||||||
|
this.visible = visible;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getSort() {
|
||||||
|
return sort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuBO setSort(Integer sort) {
|
||||||
|
this.sort = sort;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package cn.iocoder.mall.product.api.bo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ProductSpuPageBO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Spu 数组
|
||||||
|
*/
|
||||||
|
private List<ProductSpuBO> spus;
|
||||||
|
/**
|
||||||
|
* 总量
|
||||||
|
*/
|
||||||
|
private Integer count;
|
||||||
|
|
||||||
|
public List<ProductSpuBO> getSpus() {
|
||||||
|
return spus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuPageBO setSpus(List<ProductSpuBO> spus) {
|
||||||
|
this.spus = spus;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCount() {
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuPageBO setCount(Integer count) {
|
||||||
|
this.count = count;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,30 +1,37 @@
|
||||||
package cn.iocoder.mall.product.api.dto;
|
package cn.iocoder.mall.product.api.dto;
|
||||||
|
|
||||||
|
import javax.validation.constraints.Min;
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商品 Sku 添加 DTO
|
* 商品 Sku 添加 DTO
|
||||||
*/
|
*/
|
||||||
public class ProductSkuAddDTO {
|
public class ProductSkuAddOrUpdateDTO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 规格值数组
|
* 规格值数组
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "规格值数组不能为空")
|
||||||
private List<Integer> attrs;
|
private List<Integer> attrs;
|
||||||
/**
|
/**
|
||||||
* 价格,单位:分
|
* 价格,单位:分
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "价格不能为空")
|
||||||
|
@Min(value = 1L, message = "最小价格为 1")
|
||||||
private Integer price;
|
private Integer price;
|
||||||
/**
|
/**
|
||||||
* 库存数量
|
* 库存数量
|
||||||
*/
|
*/
|
||||||
|
@NotNull(message = "库存数量不能为空")
|
||||||
|
@Min(value = 1L, message = "最小库存为 1")
|
||||||
private Integer quantity;
|
private Integer quantity;
|
||||||
|
|
||||||
public List<Integer> getAttrs() {
|
public List<Integer> getAttrs() {
|
||||||
return attrs;
|
return attrs;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProductSkuAddDTO setAttrs(List<Integer> attrs) {
|
public ProductSkuAddOrUpdateDTO setAttrs(List<Integer> attrs) {
|
||||||
this.attrs = attrs;
|
this.attrs = attrs;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -33,7 +40,7 @@ public class ProductSkuAddDTO {
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProductSkuAddDTO setPrice(Integer price) {
|
public ProductSkuAddOrUpdateDTO setPrice(Integer price) {
|
||||||
this.price = price;
|
this.price = price;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +49,7 @@ public class ProductSkuAddDTO {
|
||||||
return quantity;
|
return quantity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProductSkuAddDTO setQuantity(Integer quantity) {
|
public ProductSkuAddOrUpdateDTO setQuantity(Integer quantity) {
|
||||||
this.quantity = quantity;
|
this.quantity = quantity;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
|
@ -1,50 +0,0 @@
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -52,7 +52,7 @@ public class ProductSpuAddDTO {
|
||||||
* SKU 数组
|
* SKU 数组
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "SKU 不能为空")
|
@NotNull(message = "SKU 不能为空")
|
||||||
private List<ProductSkuAddDTO> skus;
|
private List<ProductSkuAddOrUpdateDTO> skus;
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
|
@ -108,11 +108,11 @@ public class ProductSpuAddDTO {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ProductSkuAddDTO> getSkus() {
|
public List<ProductSkuAddOrUpdateDTO> getSkus() {
|
||||||
return skus;
|
return skus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProductSpuAddDTO setSkus(List<ProductSkuAddDTO> skus) {
|
public ProductSpuAddDTO setSkus(List<ProductSkuAddOrUpdateDTO> skus) {
|
||||||
this.skus = skus;
|
this.skus = skus;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
package cn.iocoder.mall.product.api.dto;
|
||||||
|
|
||||||
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
|
public class ProductSpuPageDTO {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@NotNull(message = "页码不能为空")
|
||||||
|
private Integer pageNo;
|
||||||
|
@NotNull(message = "每页条数不能为空")
|
||||||
|
private Integer pageSize;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuPageDTO setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPageNo() {
|
||||||
|
return pageNo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuPageDTO setPageNo(Integer pageNo) {
|
||||||
|
this.pageNo = pageNo;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getPageSize() {
|
||||||
|
return pageSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProductSpuPageDTO setPageSize(Integer pageSize) {
|
||||||
|
this.pageSize = pageSize;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -58,7 +58,7 @@ public class ProductSpuUpdateDTO {
|
||||||
* SKU 数组
|
* SKU 数组
|
||||||
*/
|
*/
|
||||||
@NotNull(message = "SKU 不能为空")
|
@NotNull(message = "SKU 不能为空")
|
||||||
private List<ProductSkuUpdateDTO> skus;
|
private List<ProductSkuAddOrUpdateDTO> skus;
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
|
@ -114,11 +114,11 @@ public class ProductSpuUpdateDTO {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ProductSkuUpdateDTO> getSkus() {
|
public List<ProductSkuAddOrUpdateDTO> getSkus() {
|
||||||
return skus;
|
return skus;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProductSpuUpdateDTO setSkus(List<ProductSkuUpdateDTO> skus) {
|
public ProductSpuUpdateDTO setSkus(List<ProductSkuAddOrUpdateDTO> skus) {
|
||||||
this.skus = skus;
|
this.skus = skus;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,7 @@ import cn.iocoder.mall.product.api.bo.ProductAttrDetailBO;
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSkuDetailBO;
|
import cn.iocoder.mall.product.api.bo.ProductSkuDetailBO;
|
||||||
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.bo.ProductSpuDetailBO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO;
|
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
||||||
import cn.iocoder.mall.product.dataobject.ProductSkuDO;
|
import cn.iocoder.mall.product.dataobject.ProductSkuDO;
|
||||||
|
@ -14,6 +13,7 @@ import cn.iocoder.mall.product.dataobject.ProductSpuDO;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.Mapping;
|
import org.mapstruct.Mapping;
|
||||||
import org.mapstruct.Mappings;
|
import org.mapstruct.Mappings;
|
||||||
|
import org.mapstruct.Named;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -26,9 +26,14 @@ public interface ProductSpuConvert {
|
||||||
|
|
||||||
ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class);
|
ProductSpuConvert INSTANCE = Mappers.getMapper(ProductSpuConvert.class);
|
||||||
|
|
||||||
@Mappings({})
|
@Mappings({
|
||||||
|
@Mapping(source = "picUrls", target = "picUrls", qualifiedByName = "translatePicUrlsFromString")
|
||||||
|
})
|
||||||
ProductSpuBO convert(ProductSpuDO spu);
|
ProductSpuBO convert(ProductSpuDO spu);
|
||||||
|
|
||||||
|
@Mappings({})
|
||||||
|
List<ProductSpuBO> convert(List<ProductSpuDO> spus);
|
||||||
|
|
||||||
@Mappings({
|
@Mappings({
|
||||||
@Mapping(source = "picUrls", target = "picUrls", ignore = true)
|
@Mapping(source = "picUrls", target = "picUrls", ignore = true)
|
||||||
})
|
})
|
||||||
|
@ -37,7 +42,7 @@ public interface ProductSpuConvert {
|
||||||
@Mappings({
|
@Mappings({
|
||||||
@Mapping(source = "attrs", target = "attrs", ignore = true)
|
@Mapping(source = "attrs", target = "attrs", ignore = true)
|
||||||
})
|
})
|
||||||
ProductSkuDO convert(ProductSkuAddDTO productSkuAddDTO);
|
ProductSkuDO convert(ProductSkuAddOrUpdateDTO productSkuAddDTO);
|
||||||
|
|
||||||
|
|
||||||
@Mappings({
|
@Mappings({
|
||||||
|
@ -45,11 +50,6 @@ public interface ProductSpuConvert {
|
||||||
})
|
})
|
||||||
ProductSpuDO convert(ProductSpuUpdateDTO productSpuUpdateDTO);
|
ProductSpuDO convert(ProductSpuUpdateDTO productSpuUpdateDTO);
|
||||||
|
|
||||||
@Mappings({
|
|
||||||
@Mapping(source = "attrs", target = "attrs", ignore = true)
|
|
||||||
})
|
|
||||||
ProductSkuDO convert(ProductSkuUpdateDTO productSkuUpdateDTO);
|
|
||||||
|
|
||||||
@Mappings({})
|
@Mappings({})
|
||||||
ProductSpuDetailBO convert(ProductSpuBO spu);
|
ProductSpuDetailBO convert(ProductSpuBO spu);
|
||||||
|
|
||||||
|
@ -85,4 +85,9 @@ public interface ProductSpuConvert {
|
||||||
return spuDetail;
|
return spuDetail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Named("translatePicUrlsFromString")
|
||||||
|
default List<String> translatePicUrlsFromString(String picUrls) {
|
||||||
|
return StringUtil.split(picUrls, ",");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,8 +1,11 @@
|
||||||
package cn.iocoder.mall.product.dao;
|
package cn.iocoder.mall.product.dao;
|
||||||
|
|
||||||
import cn.iocoder.mall.product.dataobject.ProductSpuDO;
|
import cn.iocoder.mall.product.dataobject.ProductSpuDO;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface ProductSpuMapper {
|
public interface ProductSpuMapper {
|
||||||
|
|
||||||
|
@ -12,4 +15,10 @@ public interface ProductSpuMapper {
|
||||||
|
|
||||||
void update(ProductSpuDO productSpuDO);
|
void update(ProductSpuDO productSpuDO);
|
||||||
|
|
||||||
|
List<ProductSpuDO> selectListByNameLikeOrderBySortAsc(@Param("name") String name,
|
||||||
|
@Param("offset") Integer offset,
|
||||||
|
@Param("limit") Integer limit);
|
||||||
|
|
||||||
|
Integer selectCountByNameLike(@Param("name") String name);
|
||||||
|
|
||||||
}
|
}
|
|
@ -61,8 +61,9 @@ public class ProductSpuDO extends BaseDO {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Integer id) {
|
public ProductSpuDO setId(Integer id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
@ -127,7 +128,4 @@ public class ProductSpuDO extends BaseDO {
|
||||||
this.sort = sort;
|
this.sort = sort;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -7,13 +7,13 @@ import cn.iocoder.common.framework.util.StringUtil;
|
||||||
import cn.iocoder.common.framework.vo.CommonResult;
|
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.ProductAttrDetailBO;
|
import cn.iocoder.mall.product.api.bo.ProductAttrDetailBO;
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSpuBO;
|
|
||||||
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
||||||
|
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
|
||||||
import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum;
|
import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum;
|
||||||
import cn.iocoder.mall.product.api.constant.ProductSpuConstants;
|
import cn.iocoder.mall.product.api.constant.ProductSpuConstants;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSkuAddDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSkuUpdateDTO;
|
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
||||||
|
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
|
||||||
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
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.ProductSkuMapper;
|
import cn.iocoder.mall.product.dao.ProductSkuMapper;
|
||||||
|
@ -42,11 +42,31 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ProductAttrServiceImpl productAttrService;
|
private ProductAttrServiceImpl productAttrService;
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public ProductSpuBO getProductSpu(Integer id) {
|
||||||
|
// ProductSpuDO productSpuDO = productSpuMapper.selectById(id);
|
||||||
|
// // 转换成 BO
|
||||||
|
// return ProductSpuConvert.INSTANCE.convert(productSpuDO);
|
||||||
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ProductSpuBO getProductSpu(Integer id) {
|
public CommonResult<ProductSpuDetailBO> getProductSpu(Integer id) {
|
||||||
ProductSpuDO productSpuDO = productSpuMapper.selectById(id);
|
// 校验商品 spu 存在
|
||||||
// 转换成 BO
|
ProductSpuDO spu = productSpuMapper.selectById(id);
|
||||||
return ProductSpuConvert.INSTANCE.convert(productSpuDO);
|
if (spu == null) {
|
||||||
|
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SPU_NOT_EXISTS.getCode());
|
||||||
|
}
|
||||||
|
// 获得商品 sku 数组
|
||||||
|
List<ProductSkuDO> skus = productSkuMapper.selectListBySpuIdAndStatus(id, ProductSpuConstants.SKU_STATUS_ENABLE);
|
||||||
|
// 获得规格
|
||||||
|
Set<Integer> productAttrValueIds = new HashSet<>();
|
||||||
|
skus.forEach(sku -> productAttrValueIds.addAll(StringUtil.splitToInt(sku.getAttrs(), ",")));
|
||||||
|
CommonResult<List<ProductAttrDetailBO>> validAttrResult = productAttrService.validProductAttrAndValue(productAttrValueIds);
|
||||||
|
if (validAttrResult.isError()) {
|
||||||
|
return CommonResult.error(validAttrResult);
|
||||||
|
}
|
||||||
|
// 返回成功
|
||||||
|
return CommonResult.success(ProductSpuConvert.INSTANCE.convert2(spu, skus, validAttrResult.getData()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("Duplicates")
|
@SuppressWarnings("Duplicates")
|
||||||
|
@ -110,6 +130,11 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||||
if (validAttrResult.isError()) {
|
if (validAttrResult.isError()) {
|
||||||
return CommonResult.error(validAttrResult);
|
return CommonResult.error(validAttrResult);
|
||||||
}
|
}
|
||||||
|
// 校验 Sku 规格
|
||||||
|
CommonResult<Boolean> validProductSkuResult = validProductSku(productSpuUpdateDTO.getSkus(), validAttrResult.getData());
|
||||||
|
if (validProductSkuResult.isError()) {
|
||||||
|
return CommonResult.error(validProductSkuResult);
|
||||||
|
}
|
||||||
// 更新 Spu
|
// 更新 Spu
|
||||||
ProductSpuDO updateSpu = ProductSpuConvert.INSTANCE.convert(productSpuUpdateDTO)
|
ProductSpuDO updateSpu = ProductSpuConvert.INSTANCE.convert(productSpuUpdateDTO)
|
||||||
.setPicUrls(StringUtil.join(productSpuUpdateDTO.getPicUrls(), ","));
|
.setPicUrls(StringUtil.join(productSpuUpdateDTO.getPicUrls(), ","));
|
||||||
|
@ -119,7 +144,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||||
List<ProductSkuDO> insertSkus = new ArrayList<>(0); // 1、找不到,进行插入
|
List<ProductSkuDO> insertSkus = new ArrayList<>(0); // 1、找不到,进行插入
|
||||||
List<Integer> deleteSkus = new ArrayList<>(0); // 2、多余的,删除
|
List<Integer> deleteSkus = new ArrayList<>(0); // 2、多余的,删除
|
||||||
List<ProductSkuDO> updateSkus = new ArrayList<>(0); // 3、找的到,进行更新。
|
List<ProductSkuDO> updateSkus = new ArrayList<>(0); // 3、找的到,进行更新。
|
||||||
for (ProductSkuUpdateDTO skuUpdateDTO : productSpuUpdateDTO.getSkus()) {
|
for (ProductSkuAddOrUpdateDTO skuUpdateDTO : productSpuUpdateDTO.getSkus()) {
|
||||||
ProductSkuDO existsSku = findProductSku(skuUpdateDTO.getAttrs(), existsSkus);
|
ProductSkuDO existsSku = findProductSku(skuUpdateDTO.getAttrs(), existsSkus);
|
||||||
// 3、找的到,进行更新。
|
// 3、找的到,进行更新。
|
||||||
if (existsSku != null) {
|
if (existsSku != null) {
|
||||||
|
@ -149,19 +174,41 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||||
if (!deleteSkus.isEmpty()) {
|
if (!deleteSkus.isEmpty()) {
|
||||||
productSkuMapper.updateToDeleted(deleteSkus);
|
productSkuMapper.updateToDeleted(deleteSkus);
|
||||||
}
|
}
|
||||||
// if (true) {
|
|
||||||
// throw new RuntimeException("test");
|
|
||||||
// }
|
|
||||||
// 校验 Sku 规格
|
|
||||||
return CommonResult.success(true);
|
return CommonResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
private CommonResult<Boolean> validProductSku(List<ProductSkuAddDTO> productSkuAddDTOs, List<ProductAttrDetailBO> productAttrDetailBOs) {
|
@Override
|
||||||
|
public CommonResult<Boolean> updateProductSpuSort(Integer adminId, Integer spuId, Integer sort) {
|
||||||
|
// 校验 Spu 是否存在
|
||||||
|
if (productSpuMapper.selectById(spuId) == null) {
|
||||||
|
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SPU_NOT_EXISTS.getCode());
|
||||||
|
}
|
||||||
|
// 更新排序
|
||||||
|
ProductSpuDO updateSpu = new ProductSpuDO().setId(spuId).setSort(sort);
|
||||||
|
productSpuMapper.update(updateSpu);
|
||||||
|
// 返回成功
|
||||||
|
return CommonResult.success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CommonResult<ProductSpuPageBO> getProductSpuPage(ProductSpuPageDTO productSpuPageDTO) {
|
||||||
|
ProductSpuPageBO productSpuPage = new ProductSpuPageBO();
|
||||||
|
// 查询分页数据
|
||||||
|
int offset = productSpuPageDTO.getPageNo() * productSpuPageDTO.getPageSize();
|
||||||
|
productSpuPage.setSpus(ProductSpuConvert.INSTANCE.convert(productSpuMapper.selectListByNameLikeOrderBySortAsc(productSpuPageDTO.getName(),
|
||||||
|
offset, productSpuPageDTO.getPageSize())));
|
||||||
|
// 查询分页总数
|
||||||
|
productSpuPage.setCount(productSpuMapper.selectCountByNameLike(productSpuPageDTO.getName()));
|
||||||
|
// 返回结果
|
||||||
|
return CommonResult.success(productSpuPage);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CommonResult<Boolean> validProductSku(List<ProductSkuAddOrUpdateDTO> productSkuAddDTOs, List<ProductAttrDetailBO> productAttrDetailBOs) {
|
||||||
// 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
|
// 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
|
||||||
Map<Integer, ProductAttrDetailBO> productAttrDetailBOMap = productAttrDetailBOs.stream().collect(
|
Map<Integer, ProductAttrDetailBO> productAttrDetailBOMap = productAttrDetailBOs.stream().collect(
|
||||||
Collectors.toMap(ProductAttrDetailBO::getAttrValueId, productAttrDetailBO -> productAttrDetailBO));
|
Collectors.toMap(ProductAttrDetailBO::getAttrValueId, productAttrDetailBO -> productAttrDetailBO));
|
||||||
// 1. 先校验,一个 Sku 下,没有重复的规格。校验方式是,遍历每个 Sku ,看看是否有重复的规格 attrId
|
// 1. 先校验,一个 Sku 下,没有重复的规格。校验方式是,遍历每个 Sku ,看看是否有重复的规格 attrId
|
||||||
for (ProductSkuAddDTO sku : productSkuAddDTOs) {
|
for (ProductSkuAddOrUpdateDTO sku : productSkuAddDTOs) {
|
||||||
Set<Integer> attrIds = sku.getAttrs().stream().map(attrValueId -> productAttrDetailBOMap.get(attrValueId).getAttrId()).collect(Collectors.toSet());
|
Set<Integer> attrIds = sku.getAttrs().stream().map(attrValueId -> productAttrDetailBOMap.get(attrValueId).getAttrId()).collect(Collectors.toSet());
|
||||||
if (attrIds.size() != sku.getAttrs().size()) {
|
if (attrIds.size() != sku.getAttrs().size()) {
|
||||||
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SKU_ATTR_CANT_NOT_DUPLICATE.getCode());
|
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SKU_ATTR_CANT_NOT_DUPLICATE.getCode());
|
||||||
|
@ -176,7 +223,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||||
}
|
}
|
||||||
// 3. 最后校验,每个 Sku 之间不是重复的
|
// 3. 最后校验,每个 Sku 之间不是重复的
|
||||||
Set<Set<Integer>> skuAttrValues = new HashSet<>(); // 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的.
|
Set<Set<Integer>> skuAttrValues = new HashSet<>(); // 每个元素,都是一个 Sku 的 attrValueId 集合。这样,通过最外层的 Set ,判断是否有重复的.
|
||||||
for (ProductSkuAddDTO sku : productSkuAddDTOs) {
|
for (ProductSkuAddOrUpdateDTO sku : productSkuAddDTOs) {
|
||||||
if (!skuAttrValues.add(new HashSet<>(sku.getAttrs()))) { // 添加失败,说明重复
|
if (!skuAttrValues.add(new HashSet<>(sku.getAttrs()))) { // 添加失败,说明重复
|
||||||
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SPU_SKU__NOT_DUPLICATE.getCode());
|
return ServiceExceptionUtil.error(ProductErrorCodeEnum.PRODUCT_SPU_SKU__NOT_DUPLICATE.getCode());
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,11 +2,17 @@
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="cn.iocoder.mall.product.dao.ProductSpuMapper">
|
<mapper namespace="cn.iocoder.mall.product.dao.ProductSpuMapper">
|
||||||
|
|
||||||
|
<sql id="FIELDS">
|
||||||
|
id, name, sell_point, description, cid,
|
||||||
|
pic_urls, visible, sort, create_time
|
||||||
|
</sql>
|
||||||
|
|
||||||
<select id="selectById" parameterType="Integer" resultType="ProductSpuDO">
|
<select id="selectById" parameterType="Integer" resultType="ProductSpuDO">
|
||||||
SELECT
|
SELECT
|
||||||
id
|
<include refid="FIELDS" />
|
||||||
FROM product_spu
|
FROM product_spu
|
||||||
WHERE id = #{id}
|
WHERE id = #{id}
|
||||||
|
AND deleted = 0
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<insert id="insert" parameterType="ProductSpuDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
<insert id="insert" parameterType="ProductSpuDO" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
||||||
|
@ -50,4 +56,30 @@
|
||||||
WHERE id = #{id}
|
WHERE id = #{id}
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
|
<select id="selectListByNameLikeOrderBySortAsc" resultType="ProductSpuDO">
|
||||||
|
SELECT
|
||||||
|
<include refid="FIELDS" />
|
||||||
|
FROM product_spu
|
||||||
|
<where>
|
||||||
|
<if test="name != null">
|
||||||
|
name LIKE "%"#{name}"%"
|
||||||
|
</if>
|
||||||
|
AND deleted = 0
|
||||||
|
</where>
|
||||||
|
ORDER BY sort ASC
|
||||||
|
LIMIT #{offset}, #{limit}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectCountByNameLike" resultType="Integer">
|
||||||
|
SELECT
|
||||||
|
COUNT(1)
|
||||||
|
FROM product_spu
|
||||||
|
<where>
|
||||||
|
<if test="name != null">
|
||||||
|
name LIKE "%"#{name}"%"
|
||||||
|
</if>
|
||||||
|
AND deleted = 0
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
Loading…
Reference in New Issue