后端:商品确认下单的信息 api 接口,后续需要结合促销,完善这个接口。

This commit is contained in:
YunaiV
2019-04-11 00:44:46 +08:00
parent 50d8ec33ee
commit 4300ce141d
29 changed files with 688 additions and 75 deletions

View File

@@ -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 {
}
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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, ",");
}
}
}

View File

@@ -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);
}
}

View File

@@ -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()); // 求库存之和
}
}
}

View File

@@ -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>