后端:商品确认下单的信息 api 接口,后续需要结合促销,完善这个接口。
This commit is contained in:
@@ -123,7 +123,7 @@ public class AdminsProductSpuController {
|
||||
@ApiOperation("商品 SPU 明细")
|
||||
@ApiImplicitParam(name = "id", value = "SPU 编号", required = true, example = "100")
|
||||
public CommonResult<AdminsProductSpuDetailVO> info(@RequestParam("id") Integer id) {
|
||||
return ProductSpuConvert.INSTANCE.convert(productSpuService.getProductSpu(id));
|
||||
return ProductSpuConvert.INSTANCE.convert(productSpuService.getProductSpuDetail(id));
|
||||
}
|
||||
|
||||
private <T> List<T> parseSkus(String skuStr, Class<T> clazz) {
|
||||
@@ -135,4 +135,4 @@ public class AdminsProductSpuController {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ public class UsersProductSpuController {
|
||||
@ApiOperation("商品 SPU 明细")
|
||||
@ApiImplicitParam(name = "id", value = "SPU 编号", required = true, example = "100")
|
||||
public CommonResult<UsersProductSpuDetailVO> info(@RequestParam("id") Integer id) {
|
||||
return ProductSpuConvert.INSTANCE.convert4(productSpuService.getProductSpu(id));
|
||||
return ProductSpuConvert.INSTANCE.convert4(productSpuService.getProductSpuDetail(id));
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@@ -51,4 +51,4 @@ public class UsersProductSpuController {
|
||||
return ProductSpuConvert.INSTANCE.convert3(result);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
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.ProductSpuDetailBO;
|
||||
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
|
||||
import cn.iocoder.mall.product.api.bo.*;
|
||||
import cn.iocoder.mall.product.api.dto.ProductSpuAddDTO;
|
||||
import cn.iocoder.mall.product.api.dto.ProductSpuPageDTO;
|
||||
import cn.iocoder.mall.product.api.dto.ProductSpuUpdateDTO;
|
||||
@@ -13,7 +11,13 @@ import java.util.List;
|
||||
|
||||
public interface ProductSpuService {
|
||||
|
||||
CommonResult<ProductSpuDetailBO> getProductSpu(Integer id);
|
||||
CommonResult<ProductSpuDetailBO> getProductSpuDetail(Integer id);
|
||||
|
||||
CommonResult<ProductSpuPageBO> getProductSpuPage(ProductSpuPageDTO productSpuPageDTO);
|
||||
|
||||
CommonResult<List<ProductSpuBO>> getProductSpuList(Collection<Integer> ids);
|
||||
|
||||
CommonResult<List<ProductSkuDetailBO>> getProductSkuDetailList(Collection<Integer> ids);
|
||||
|
||||
CommonResult<ProductSpuDetailBO> addProductSpu(Integer adminId, ProductSpuAddDTO productSpuAddDTO);
|
||||
|
||||
@@ -21,8 +25,4 @@ public interface ProductSpuService {
|
||||
|
||||
CommonResult<Boolean> updateProductSpuSort(Integer adminId, Integer spuId, Integer sort);
|
||||
|
||||
CommonResult<ProductSpuPageBO> getProductSpuPage(ProductSpuPageDTO productSpuPageDTO);
|
||||
|
||||
CommonResult<List<ProductSpuBO>> getProductSpuList(Collection<Integer> ids);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 商品 Sku 明细 BO
|
||||
* 商品 Sku 明细 BO(包括 Spu 明细)
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@@ -18,9 +18,9 @@ public class ProductSkuDetailBO implements Serializable {
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 商品编号
|
||||
* SPU 信息
|
||||
*/
|
||||
private Integer spuId;
|
||||
private Spu spu;
|
||||
/**
|
||||
* 图片地址
|
||||
*/
|
||||
@@ -38,4 +38,54 @@ public class ProductSkuDetailBO implements Serializable {
|
||||
*/
|
||||
private Integer quantity;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Spu implements Serializable {
|
||||
|
||||
/**
|
||||
* 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 sort;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,6 +62,40 @@ public class ProductSpuDetailBO implements Serializable {
|
||||
/**
|
||||
* SKU 数组
|
||||
*/
|
||||
private List<ProductSkuDetailBO> skus;
|
||||
private List<Sku> skus;
|
||||
|
||||
/**
|
||||
* 商品 Sku 明细 BO
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Sku implements Serializable {
|
||||
|
||||
/**
|
||||
* sku 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 商品编号
|
||||
*/
|
||||
private Integer spuId;
|
||||
/**
|
||||
* 图片地址
|
||||
*/
|
||||
private String picURL;
|
||||
/**
|
||||
* 规格值数组
|
||||
*/
|
||||
private List<ProductAttrAndValuePairBO> attrs;
|
||||
/**
|
||||
* 价格,单位:分
|
||||
*/
|
||||
private Integer price;
|
||||
/**
|
||||
* 库存数量
|
||||
*/
|
||||
private Integer quantity;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -58,10 +58,20 @@ public interface ProductSpuConvert {
|
||||
})
|
||||
ProductSpuDetailBO convert2(ProductSpuDO spu);
|
||||
|
||||
@Mappings({
|
||||
@Mapping(source = "picUrls", target = "picUrls", ignore = true)
|
||||
})
|
||||
ProductSkuDetailBO.Spu convert3(ProductSpuDO spu);
|
||||
|
||||
@Mappings({
|
||||
@Mapping(source = "attrs", target = "attrs", ignore = true)
|
||||
})
|
||||
ProductSkuDetailBO convert2(ProductSkuDO sku);
|
||||
ProductSpuDetailBO.Sku convert2(ProductSkuDO sku);
|
||||
|
||||
@Mappings({
|
||||
@Mapping(source = "attrs", target = "attrs", ignore = true)
|
||||
})
|
||||
ProductSkuDetailBO convert3(ProductSkuDO sku);
|
||||
|
||||
@Mappings({}) // TODO 芋艿,后续细看下 mapstruct 的 API ,优化这块
|
||||
default ProductSpuDetailBO convert2(ProductSpuDO spu, List<ProductSkuDO> skus, List<ProductAttrAndValuePairBO> productAttrDetailBOs) {
|
||||
@@ -74,7 +84,7 @@ public interface ProductSpuConvert {
|
||||
spuDetail.setSkus(new ArrayList<>());
|
||||
skus.forEach(sku -> {
|
||||
// 创建 ProductSpuDetailBO 对象
|
||||
ProductSkuDetailBO skuDetail = ProductSpuConvert.this.convert2(sku)
|
||||
ProductSpuDetailBO.Sku skuDetail = ProductSpuConvert.this.convert2(sku)
|
||||
.setAttrs(new ArrayList<>());
|
||||
spuDetail.getSkus().add(skuDetail);
|
||||
// 设置 ProductSpuDetailBO 的 attrs 规格属性
|
||||
@@ -85,9 +95,33 @@ public interface ProductSpuConvert {
|
||||
return spuDetail;
|
||||
}
|
||||
|
||||
@Mappings({}) // TODO 芋艿,后续细看下 mapstruct 的 API ,优化这块
|
||||
default List<ProductSkuDetailBO> convert3(List<ProductSkuDO> skus, List<ProductSpuDO> spus, List<ProductAttrAndValuePairBO> productAttrDetailBOs) {
|
||||
// 创建 ProductAttrDetailBO 的映射。其中,KEY 为 ProductAttrDetailBO.attrValueId ,即规格值的编号
|
||||
Map<Integer, ProductAttrAndValuePairBO> productAttrDetailBOMap = productAttrDetailBOs.stream().collect(
|
||||
Collectors.toMap(ProductAttrAndValuePairBO::getAttrValueId, productAttrDetailBO -> productAttrDetailBO));
|
||||
// 创建 ProductSpuDO 的映射
|
||||
Map<Integer, ProductSkuDetailBO.Spu> spuMap = spus.stream().collect(
|
||||
Collectors.toMap(ProductSpuDO::getId, spu -> ProductSpuConvert.this.convert3(spu).setPicUrls(StringUtil.split(spu.getPicUrls(), ","))));
|
||||
// 拼装结果
|
||||
List<ProductSkuDetailBO> spuDetailList = new ArrayList<>(skus.size());
|
||||
for (ProductSkuDO sku : skus) {
|
||||
// 创建 ProductSkuDetailBO 对象
|
||||
ProductSkuDetailBO skuDetail = ProductSpuConvert.this.convert3(sku)
|
||||
.setAttrs(new ArrayList<>())
|
||||
.setSpu(spuMap.get(sku.getSpuId()));
|
||||
spuDetailList.add(skuDetail);
|
||||
// 设置 ProductSpuDetailBO 的 attrs 规格属性
|
||||
List<String> attrs = StringUtil.split(sku.getAttrs(), ",");
|
||||
attrs.forEach(attr -> skuDetail.getAttrs().add(productAttrDetailBOMap.get(Integer.valueOf(attr))));
|
||||
}
|
||||
// 返回
|
||||
return spuDetailList;
|
||||
}
|
||||
|
||||
@Named("translatePicUrlsFromString")
|
||||
default List<String> translatePicUrlsFromString(String picUrls) {
|
||||
return StringUtil.split(picUrls, ",");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import cn.iocoder.mall.product.dataobject.ProductSkuDO;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
@@ -11,6 +12,8 @@ public interface ProductSkuMapper {
|
||||
|
||||
ProductSkuDO selectById(Integer id);
|
||||
|
||||
List<ProductSkuDO> selectByIds(@Param("ids") Collection<Integer> ids);
|
||||
|
||||
List<ProductSkuDO> selectListBySpuIdAndStatus(@Param("spuId") Integer spuId,
|
||||
@Param("status") Integer status);
|
||||
|
||||
@@ -20,4 +23,4 @@ public interface ProductSkuMapper {
|
||||
|
||||
int updateToDeleted(@Param("ids") List<Integer> ids);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,10 +6,7 @@ import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.util.StringUtil;
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.product.api.ProductSpuService;
|
||||
import cn.iocoder.mall.product.api.bo.ProductAttrAndValuePairBO;
|
||||
import cn.iocoder.mall.product.api.bo.ProductSpuBO;
|
||||
import cn.iocoder.mall.product.api.bo.ProductSpuDetailBO;
|
||||
import cn.iocoder.mall.product.api.bo.ProductSpuPageBO;
|
||||
import cn.iocoder.mall.product.api.bo.*;
|
||||
import cn.iocoder.mall.product.api.constant.ProductErrorCodeEnum;
|
||||
import cn.iocoder.mall.product.api.constant.ProductSpuConstants;
|
||||
import cn.iocoder.mall.product.api.dto.ProductSkuAddOrUpdateDTO;
|
||||
@@ -44,14 +41,14 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||
private ProductAttrServiceImpl productAttrService;
|
||||
|
||||
// @Override
|
||||
// public ProductSpuBO getProductSpu(Integer id) {
|
||||
// public ProductSpuBO getProductSpuDetail(Integer id) {
|
||||
// ProductSpuDO productSpuDO = productSpuMapper.selectById(id);
|
||||
// // 转换成 BO
|
||||
// return ProductSpuConvert.INSTANCE.convert(productSpuDO);
|
||||
// }
|
||||
|
||||
@Override
|
||||
public CommonResult<ProductSpuDetailBO> getProductSpu(Integer id) {
|
||||
public CommonResult<ProductSpuDetailBO> getProductSpuDetail(Integer id) {
|
||||
// 校验商品 spu 存在
|
||||
ProductSpuDO spu = productSpuMapper.selectById(id);
|
||||
if (spu == null) {
|
||||
@@ -64,9 +61,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||
skus.forEach(sku -> productAttrValueIds.addAll(StringUtil.splitToInt(sku.getAttrs(), ",")));
|
||||
CommonResult<List<ProductAttrAndValuePairBO>> validAttrResult = productAttrService.validProductAttrAndValue(productAttrValueIds,
|
||||
false); // 读取规格时,不考虑规格是否被禁用
|
||||
if (validAttrResult.isError()) {
|
||||
return CommonResult.error(validAttrResult);
|
||||
}
|
||||
// 返回成功
|
||||
return CommonResult.success(ProductSpuConvert.INSTANCE.convert2(spu, skus, validAttrResult.getData()));
|
||||
}
|
||||
@@ -219,6 +213,27 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||
return CommonResult.success(ProductSpuConvert.INSTANCE.convert(spus));
|
||||
}
|
||||
|
||||
@Override
|
||||
public CommonResult<List<ProductSkuDetailBO>> getProductSkuDetailList(Collection<Integer> ids) {
|
||||
// 查询 SKU 数组
|
||||
List<ProductSkuDO> skus = productSkuMapper.selectByIds(ids);
|
||||
if (skus.isEmpty()) {
|
||||
return CommonResult.success(Collections.emptyList());
|
||||
}
|
||||
// 查询 SPU 数组
|
||||
List<ProductSpuDO> spus = productSpuMapper.selectByIds(skus.stream().map(ProductSkuDO::getSpuId).collect(Collectors.toSet()));
|
||||
if (spus.isEmpty()) {
|
||||
return CommonResult.success(Collections.emptyList());
|
||||
}
|
||||
// 获得规格
|
||||
Set<Integer> productAttrValueIds = new HashSet<>();
|
||||
skus.forEach(sku -> productAttrValueIds.addAll(StringUtil.splitToInt(sku.getAttrs(), ",")));
|
||||
CommonResult<List<ProductAttrAndValuePairBO>> validAttrResult = productAttrService.validProductAttrAndValue(productAttrValueIds,
|
||||
false); // 读取规格时,不考虑规格是否被禁用
|
||||
// 返回成功
|
||||
return CommonResult.success(ProductSpuConvert.INSTANCE.convert3(skus, spus, validAttrResult.getData()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验 sku 是否合法
|
||||
*
|
||||
@@ -289,4 +304,4 @@ public class ProductSpuServiceImpl implements ProductSpuService {
|
||||
spu.setQuantity(skus.stream().mapToInt(ProductSkuAddOrUpdateDTO::getQuantity).sum()); // 求库存之和
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,18 @@
|
||||
<include refid="FIELDS" />
|
||||
FROM product_sku
|
||||
WHERE id = #{id}
|
||||
AND delete = 0
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<select id="selectByIds" resultType="ProductSkuDO">
|
||||
SELECT
|
||||
<include refid="FIELDS" />
|
||||
FROM product_sku
|
||||
WHERE id IN
|
||||
<foreach item="id" collection="ids" separator="," open="(" close=")" index="">
|
||||
#{id}
|
||||
</foreach>
|
||||
AND deleted = 0
|
||||
</select>
|
||||
|
||||
<insert id="insertList" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
|
||||
@@ -73,4 +84,4 @@
|
||||
</foreach>
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user