Commit db7e47faa2b8a00ae531beb166bba4859ef1423a

Authored by puhui999
1 parent 36c45bd4

fix:完善 TODO 提到的问题

Showing 22 changed files with 328 additions and 167 deletions
yudao-module-mall/yudao-module-product-biz/pom.xml
@@ -23,7 +23,11 @@ @@ -23,7 +23,11 @@
23 <artifactId>yudao-module-product-api</artifactId> 23 <artifactId>yudao-module-product-api</artifactId>
24 <version>${revision}</version> 24 <version>${revision}</version>
25 </dependency> 25 </dependency>
26 - 26 + <dependency>
  27 + <groupId>cn.iocoder.boot</groupId>
  28 + <artifactId>yudao-module-trade-api</artifactId>
  29 + <version>${revision}</version>
  30 + </dependency>
27 <dependency> 31 <dependency>
28 <groupId>cn.iocoder.boot</groupId> 32 <groupId>cn.iocoder.boot</groupId>
29 <artifactId>yudao-module-member-api</artifactId> 33 <artifactId>yudao-module-member-api</artifactId>
@@ -35,11 +39,6 @@ @@ -35,11 +39,6 @@
35 <groupId>cn.iocoder.boot</groupId> 39 <groupId>cn.iocoder.boot</groupId>
36 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId> 40 <artifactId>yudao-spring-boot-starter-biz-operatelog</artifactId>
37 </dependency> 41 </dependency>
38 - <!-- TODO 芋艿:是不是可以去掉这个依赖呀? -->  
39 - <dependency>  
40 - <groupId>cn.iocoder.boot</groupId>  
41 - <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>  
42 - </dependency>  
43 42
44 <!-- Web 相关 --> 43 <!-- Web 相关 -->
45 <dependency> 44 <dependency>
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/AppProductSpuController.java
@@ -5,14 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,14 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO; 5 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;
6 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageItemRespVO; 6 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageItemRespVO;
7 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 7 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
8 -import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;  
9 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 8 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
10 -import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;  
11 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 9 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
12 -import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;  
13 -import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;  
14 -import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO;  
15 -import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;  
16 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; 10 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
17 import io.swagger.v3.oas.annotations.Operation; 11 import io.swagger.v3.oas.annotations.Operation;
18 import io.swagger.v3.oas.annotations.Parameter; 12 import io.swagger.v3.oas.annotations.Parameter;
@@ -25,12 +19,8 @@ import org.springframework.web.bind.annotation.RestController; @@ -25,12 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
25 19
26 import javax.annotation.Resource; 20 import javax.annotation.Resource;
27 import javax.validation.Valid; 21 import javax.validation.Valid;
28 -import java.util.List;  
29 22
30 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
31 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 23 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
32 -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_ENABLE;  
33 -import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;  
34 24
35 @Tag(name = "用户 APP - 商品 SPU") 25 @Tag(name = "用户 APP - 商品 SPU")
36 @RestController 26 @RestController
@@ -40,10 +30,6 @@ public class AppProductSpuController { @@ -40,10 +30,6 @@ public class AppProductSpuController {
40 30
41 @Resource 31 @Resource
42 private ProductSpuService productSpuService; 32 private ProductSpuService productSpuService;
43 - @Resource  
44 - private ProductSkuService productSkuService;  
45 - @Resource  
46 - private ProductPropertyValueService productPropertyValueService;  
47 33
48 @GetMapping("/page") 34 @GetMapping("/page")
49 @Operation(summary = "获得商品 SPU 分页") 35 @Operation(summary = "获得商品 SPU 分页")
@@ -56,22 +42,7 @@ public class AppProductSpuController { @@ -56,22 +42,7 @@ public class AppProductSpuController {
56 @Operation(summary = "获得商品 SPU 明细") 42 @Operation(summary = "获得商品 SPU 明细")
57 @Parameter(name = "id", description = "编号", required = true) 43 @Parameter(name = "id", description = "编号", required = true)
58 public CommonResult<AppProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) { 44 public CommonResult<AppProductSpuDetailRespVO> getSpuDetail(@RequestParam("id") Long id) {
59 - // 获得商品 SPU  
60 - ProductSpuDO spu = productSpuService.getSpu(id);  
61 - if (spu == null) {  
62 - throw exception(SPU_NOT_EXISTS);  
63 - }  
64 - if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) {  
65 - throw exception(SPU_NOT_ENABLE);  
66 - }  
67 -  
68 - // 查询商品 SKU  
69 - List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());  
70 - // 查询商品属性  
71 - List<ProductPropertyValueDetailRespBO> propertyValues = productPropertyValueService  
72 - .getPropertyValueDetailList(ProductSkuConvert.INSTANCE.convertPropertyValueIds(skus));  
73 - // 拼接  
74 - return success(ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus, propertyValues)); 45 + return success(productSpuService.getAppProductSpuDetail(id));
75 } 46 }
76 47
77 } 48 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyDO.java
1 package cn.iocoder.yudao.module.product.dal.dataobject.property; 1 package cn.iocoder.yudao.module.product.dal.dataobject.property;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;  
5 import com.baomidou.mybatisplus.annotation.KeySequence; 4 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
@@ -23,6 +22,15 @@ import lombok.*; @@ -23,6 +22,15 @@ import lombok.*;
23 public class ProductPropertyDO extends BaseDO { 22 public class ProductPropertyDO extends BaseDO {
24 23
25 /** 24 /**
  25 + * 默认属性id
  26 + */
  27 + public static final Long PROPERTY_ID = 0L;
  28 + /**
  29 + * 默认属性名字
  30 + */
  31 + public static final String PROPERTY_NAME = "默认";
  32 +
  33 + /**
26 * 主键 34 * 主键
27 */ 35 */
28 @TableId 36 @TableId
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/dataobject/property/ProductPropertyValueDO.java
1 package cn.iocoder.yudao.module.product.dal.dataobject.property; 1 package cn.iocoder.yudao.module.product.dal.dataobject.property;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 -import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;  
5 import com.baomidou.mybatisplus.annotation.KeySequence; 4 import com.baomidou.mybatisplus.annotation.KeySequence;
6 import com.baomidou.mybatisplus.annotation.TableId; 5 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
@@ -24,6 +23,15 @@ import lombok.*; @@ -24,6 +23,15 @@ import lombok.*;
24 public class ProductPropertyValueDO extends BaseDO { 23 public class ProductPropertyValueDO extends BaseDO {
25 24
26 /** 25 /**
  26 + * 默认属性值id
  27 + */
  28 + public static final Long VALUE_ID = 0L;
  29 + /**
  30 + * 默认属性值名字
  31 + */
  32 + public static final String VALUE_NAME = "默认";
  33 +
  34 + /**
27 * 主键 35 * 主键
28 */ 36 */
29 @TableId 37 @TableId
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/sku/ProductSkuMapper.java
1 package cn.iocoder.yudao.module.product.dal.mysql.sku; 1 package cn.iocoder.yudao.module.product.dal.mysql.sku;
2 2
3 import cn.hutool.core.lang.Assert; 3 import cn.hutool.core.lang.Assert;
4 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
5 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
8 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; 6 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
9 -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;  
10 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 7 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
11 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 8 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
12 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
@@ -63,23 +60,4 @@ public interface ProductSkuMapper extends BaseMapperX&lt;ProductSkuDO&gt; { @@ -63,23 +60,4 @@ public interface ProductSkuMapper extends BaseMapperX&lt;ProductSkuDO&gt; {
63 return selectList(new QueryWrapper<ProductSkuDO>().apply("stock <= warn_stock")); 60 return selectList(new QueryWrapper<ProductSkuDO>().apply("stock <= warn_stock"));
64 } 61 }
65 62
66 - // TODO @puhui999:貌似 IN 不出来数据哈。直接全部查询出来,处理就好列;  
67 - /**  
68 - * 更新 sku 属性值时使用的分页查询  
69 - *  
70 - * @param pageParam 页面参数  
71 - * @return {@link PageResult}<{@link ProductSkuDO}>  
72 - */  
73 - default PageResult<ProductSkuDO> selectPage(PageParam pageParam) {  
74 - return selectPage(pageParam, new LambdaQueryWrapper<ProductSkuDO>().isNotNull(ProductSkuDO::getProperties));  
75 - }  
76 -  
77 - /**  
78 - * 查询 sku properties 不等于 null 的数量  
79 - *  
80 - * @return {@link Long}  
81 - */  
82 - default Long selectCountByPropertyNotNull() {  
83 - return selectCount(new LambdaQueryWrapper<ProductSkuDO>().isNotNull(ProductSkuDO::getProperties));  
84 - }  
85 } 63 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/category/ProductCategoryServiceImpl.java
@@ -68,7 +68,10 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @@ -68,7 +68,10 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
68 throw exception(CATEGORY_EXISTS_CHILDREN); 68 throw exception(CATEGORY_EXISTS_CHILDREN);
69 } 69 }
70 // 校验分类是否绑定了 SPU 70 // 校验分类是否绑定了 SPU
71 - validateProductCategoryIsHaveBindSpu(id); 71 + Long count = productSpuService.getSpuCountByCategoryId(id);
  72 + if (0 != count) {
  73 + throw exception(CATEGORY_HAVE_BIND_SPU);
  74 + }
72 // 删除 75 // 删除
73 productCategoryMapper.deleteById(id); 76 productCategoryMapper.deleteById(id);
74 } 77 }
@@ -96,14 +99,6 @@ public class ProductCategoryServiceImpl implements ProductCategoryService { @@ -96,14 +99,6 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
96 } 99 }
97 } 100 }
98 101
99 - // TODO @puhui999:不用抽方法,因为不太会复用这个方法哈。  
100 - private void validateProductCategoryIsHaveBindSpu(Long id) {  
101 - Long count = productSpuService.getSpuCountByCategoryId(id);  
102 - if (0 != count) {  
103 - throw exception(CATEGORY_HAVE_BIND_SPU);  
104 - }  
105 - }  
106 -  
107 @Override 102 @Override
108 public ProductCategoryDO getCategory(Long id) { 103 public ProductCategoryDO getCategory(Long id) {
109 return productCategoryMapper.selectById(id); 104 return productCategoryMapper.selectById(id);
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java
@@ -8,7 +8,11 @@ import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommen @@ -8,7 +8,11 @@ import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommen
8 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentAdditionalReqVO; 8 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentAdditionalReqVO;
9 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentPageReqVO; 9 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentPageReqVO;
10 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; 10 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
  11 +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
11 import cn.iocoder.yudao.module.product.dal.mysql.comment.ProductCommentMapper; 12 import cn.iocoder.yudao.module.product.dal.mysql.comment.ProductCommentMapper;
  13 +import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
  14 +import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi;
  15 +import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO;
12 import org.springframework.stereotype.Service; 16 import org.springframework.stereotype.Service;
13 import org.springframework.util.StringUtils; 17 import org.springframework.util.StringUtils;
14 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
@@ -18,6 +22,7 @@ import java.util.Objects; @@ -18,6 +22,7 @@ import java.util.Objects;
18 22
19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 23 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
20 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*; 24 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
  25 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
21 26
22 /** 27 /**
23 * 商品评论 Service 实现类 28 * 商品评论 Service 实现类
@@ -30,6 +35,11 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -30,6 +35,11 @@ public class ProductCommentServiceImpl implements ProductCommentService {
30 35
31 @Resource 36 @Resource
32 private ProductCommentMapper productCommentMapper; 37 private ProductCommentMapper productCommentMapper;
  38 + @Resource
  39 + private TradeOrderApi tradeOrderApi;
  40 +
  41 + @Resource
  42 + private ProductSpuService productSpuService;
33 43
34 @Override 44 @Override
35 public PageResult<ProductCommentDO> getCommentPage(ProductCommentPageReqVO pageReqVO) { 45 public PageResult<ProductCommentDO> getCommentPage(ProductCommentPageReqVO pageReqVO) {
@@ -60,6 +70,16 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -60,6 +70,16 @@ public class ProductCommentServiceImpl implements ProductCommentService {
60 @Override 70 @Override
61 public void createComment(ProductCommentDO productComment, Boolean system) { 71 public void createComment(ProductCommentDO productComment, Boolean system) {
62 if (!system) { 72 if (!system) {
  73 + // TODO 判断订单是否存在 fix
  74 + TradeOrderRespDTO order = tradeOrderApi.getOrder(productComment.getOrderId());
  75 + if (null == order) {
  76 + throw exception(ORDER_NOT_FOUND);
  77 + }
  78 + // TODO 判断 SPU 是否存在 fix
  79 + ProductSpuDO spu = productSpuService.getSpu(productComment.getSpuId());
  80 + if (null == spu) {
  81 + throw exception(SPU_NOT_EXISTS);
  82 + }
63 // 判断当前订单的当前商品用户是否评价过 83 // 判断当前订单的当前商品用户是否评价过
64 ProductCommentDO exist = productCommentMapper.findByUserIdAndOrderIdAndSpuId(productComment.getId(), productComment.getOrderId(), productComment.getSpuId()); 84 ProductCommentDO exist = productCommentMapper.findByUserIdAndOrderIdAndSpuId(productComment.getId(), productComment.getOrderId(), productComment.getSpuId());
65 if (null != exist) { 85 if (null != exist) {
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyServiceImpl.java
@@ -71,8 +71,8 @@ public class ProductPropertyServiceImpl implements ProductPropertyService { @@ -71,8 +71,8 @@ public class ProductPropertyServiceImpl implements ProductPropertyService {
71 // 更新 71 // 更新
72 ProductPropertyDO updateObj = ProductPropertyConvert.INSTANCE.convert(updateReqVO); 72 ProductPropertyDO updateObj = ProductPropertyConvert.INSTANCE.convert(updateReqVO);
73 productPropertyMapper.updateById(updateObj); 73 productPropertyMapper.updateById(updateObj);
74 - // TODO @puhui:是不是只要传递变量,不传递整个 updateObj 变量哈  
75 - productSkuService.updateSkuProperty(updateObj); 74 + // 更新 sku 相关属性
  75 + productSkuService.updateSkuProperty(updateObj.getId(), updateObj.getName());
76 } 76 }
77 77
78 @Override 78 @Override
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/property/ProductPropertyValueServiceImpl.java
@@ -73,10 +73,8 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ @@ -73,10 +73,8 @@ public class ProductPropertyValueServiceImpl implements ProductPropertyValueServ
73 // 更新 73 // 更新
74 ProductPropertyValueDO updateObj = ProductPropertyValueConvert.INSTANCE.convert(updateReqVO); 74 ProductPropertyValueDO updateObj = ProductPropertyValueConvert.INSTANCE.convert(updateReqVO);
75 productPropertyValueMapper.updateById(updateObj); 75 productPropertyValueMapper.updateById(updateObj);
76 -  
77 - // TODO 芋艿:更新时,需要看看 sku 表 fix  
78 - // TODO @puhui:是不是只要传递变量,不传递整个 updateObj 变量哈  
79 - productSkuService.updateSkuPropertyValue(updateObj); 76 + // 更新 sku 相关属性
  77 + productSkuService.updateSkuPropertyValue(updateObj.getId(), updateObj.getName());
80 } 78 }
81 79
82 @Override 80 @Override
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java
@@ -2,8 +2,6 @@ package cn.iocoder.yudao.module.product.service.sku; @@ -2,8 +2,6 @@ package cn.iocoder.yudao.module.product.service.sku;
2 2
3 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; 3 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
4 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; 4 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
5 -import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;  
6 -import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;  
7 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; 5 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
8 6
9 import java.util.Collection; 7 import java.util.Collection;
@@ -111,16 +109,18 @@ public interface ProductSkuService { @@ -111,16 +109,18 @@ public interface ProductSkuService {
111 /** 109 /**
112 * 更新 sku 属性 110 * 更新 sku 属性
113 * 111 *
114 - * @param updateObj 属性对象 112 + * @param propertyId 属性 id
  113 + * @param propertyName 属性名
115 * @return int 影响的行数 114 * @return int 影响的行数
116 */ 115 */
117 - int updateSkuProperty(ProductPropertyDO updateObj); 116 + int updateSkuProperty(Long propertyId, String propertyName);
118 117
119 /** 118 /**
120 * 更新 sku 属性值 119 * 更新 sku 属性值
121 * 120 *
122 - * @param updateObj 属性值对象 121 + * @param propertyValueId 属性值 id
  122 + * @param propertyValueName 属性值名字
123 * @return int 影响的行数 123 * @return int 影响的行数
124 */ 124 */
125 - int updateSkuPropertyValue(ProductPropertyValueDO updateObj); 125 + int updateSkuPropertyValue(Long propertyValueId, String propertyValueName);
126 } 126 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuServiceImpl.java
@@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.product.service.sku; @@ -2,9 +2,8 @@ package cn.iocoder.yudao.module.product.service.sku;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
5 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
6 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
7 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; 5 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
  6 +import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuBaseVO;
8 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
9 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert; 8 import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
10 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO; 9 import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
@@ -80,16 +79,25 @@ public class ProductSkuServiceImpl implements ProductSkuService { @@ -80,16 +79,25 @@ public class ProductSkuServiceImpl implements ProductSkuService {
80 79
81 @Override 80 @Override
82 public void validateSkuList(List<ProductSkuCreateOrUpdateReqVO> skus, Boolean specType) { 81 public void validateSkuList(List<ProductSkuCreateOrUpdateReqVO> skus, Boolean specType) {
83 - // 非多规格,不需要校验  
84 - if (ObjectUtil.notEqual(specType, true)) {  
85 - return;  
86 - }  
87 -  
88 // 0、校验skus是否为空 82 // 0、校验skus是否为空
89 if (CollUtil.isEmpty(skus)) { 83 if (CollUtil.isEmpty(skus)) {
90 throw exception(SKU_NOT_EXISTS); 84 throw exception(SKU_NOT_EXISTS);
91 } 85 }
92 - 86 + // 单规格处理
  87 + if (ObjectUtil.equal(specType, false)) {
  88 + ProductSkuCreateOrUpdateReqVO skuVO = skus.get(0);
  89 + // 赋予单规格默认属性
  90 + List<ProductSkuBaseVO.Property> properties = new ArrayList<>();
  91 + ProductSkuBaseVO.Property property = new ProductSkuBaseVO.Property();
  92 + property.setPropertyId(ProductPropertyDO.PROPERTY_ID);
  93 + property.setPropertyName(ProductPropertyDO.PROPERTY_NAME);
  94 + property.setValueId(ProductPropertyValueDO.VALUE_ID);
  95 + property.setValueName(ProductPropertyValueDO.VALUE_NAME);
  96 + properties.add(property);
  97 + skuVO.setProperties(properties);
  98 + // 单规格不需要后续的校验
  99 + return;
  100 + }
93 // 1、校验属性项存在 101 // 1、校验属性项存在
94 Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null) 102 Set<Long> propertyIds = skus.stream().filter(p -> p.getProperties() != null)
95 // 遍历多个 Property 属性 103 // 遍历多个 Property 属性
@@ -156,81 +164,51 @@ public class ProductSkuServiceImpl implements ProductSkuService { @@ -156,81 +164,51 @@ public class ProductSkuServiceImpl implements ProductSkuService {
156 } 164 }
157 165
158 @Override 166 @Override
159 - public int updateSkuProperty(ProductPropertyDO updateObj) {  
160 - // TODO 看了一下数据库有关于 json 字符串的处理,怕数据库出现兼容问题这里还是用数据库常规操作来实现  
161 - // TODO @puhui999:直接全部查询处理,批量处理就好列;一般项目的商品不会超过几十万的哈。  
162 - Long count = productSkuMapper.selectCountByPropertyNotNull();  
163 - int currentPage = 1; 167 + public int updateSkuProperty(Long propertyId, String propertyName) {
  168 + // 获取所有的 sku
  169 + List<ProductSkuDO> skuDOList = productSkuMapper.selectList();
  170 + // 处理后需要更新的 sku
164 List<ProductSkuDO> updateSkus = new ArrayList<>(); 171 List<ProductSkuDO> updateSkus = new ArrayList<>();
165 - if (count == 0) { 172 + if (CollUtil.isEmpty(skuDOList)) {
166 return 0; 173 return 0;
167 } 174 }
168 - int pageSize = 100;  
169 - for (int i = 0; i <= count / 100; i++) {  
170 - PageParam pageParam = new PageParam().setPageNo(currentPage + i).setPageSize(pageSize);  
171 - // 分页查找出 sku 属性不为 null 的  
172 - PageResult<ProductSkuDO> skuPage = productSkuMapper.selectPage(pageParam);  
173 - List<ProductSkuDO> records = skuPage.getList();  
174 - if (CollUtil.isEmpty(records)) {  
175 - break;  
176 - }  
177 - records.stream().filter(sku -> sku.getProperties() != null)  
178 - .forEach(sku -> sku.getProperties().forEach(property -> {  
179 - if (property.getPropertyId().equals(updateObj.getId())) {  
180 - property.setPropertyName(updateObj.getName());  
181 - updateSkus.add(sku);  
182 - }  
183 - }));  
184 - } 175 + skuDOList.stream().filter(sku -> sku.getProperties() != null)
  176 + .forEach(sku -> sku.getProperties().forEach(property -> {
  177 + if (property.getPropertyId().equals(propertyId)) {
  178 + property.setPropertyName(propertyName);
  179 + updateSkus.add(sku);
  180 + }
  181 + }));
185 if (CollUtil.isEmpty(updateSkus)) { 182 if (CollUtil.isEmpty(updateSkus)) {
186 return 0; 183 return 0;
187 } 184 }
188 - // TODO @puhui999:貌似 updateBatch 自己会拆分批次,这里不用再拆分了  
189 - // 每批处理的大小  
190 - int batchSize = 1000;  
191 - for (int i = 0; i < updateSkus.size(); i += batchSize) {  
192 - List<ProductSkuDO> batchSkuDOs = updateSkus.subList(i, Math.min(i + batchSize, updateSkus.size()));  
193 - productSkuMapper.updateBatch(batchSkuDOs, batchSize);  
194 - } 185 +
  186 + productSkuMapper.updateBatch(updateSkus);
195 return updateSkus.size(); 187 return updateSkus.size();
196 } 188 }
197 189
198 @Override 190 @Override
199 - public int updateSkuPropertyValue(ProductPropertyValueDO updateObj) {  
200 - // TODO 看了一下数据库有关于 json 字符串的处理,怕数据库出现兼容问题这里还是用数据库常规操作来实现  
201 - Long count = productSkuMapper.selectCountByPropertyNotNull();  
202 - int currentPage = 1; 191 + public int updateSkuPropertyValue(Long propertyValueId, String propertyValueName) {
  192 + // 获取所有的 sku
  193 + List<ProductSkuDO> skuDOList = productSkuMapper.selectList();
  194 + // 处理后需要更新的 sku
203 List<ProductSkuDO> updateSkus = new ArrayList<>(); 195 List<ProductSkuDO> updateSkus = new ArrayList<>();
204 - if (count == 0) { 196 + if (CollUtil.isEmpty(skuDOList)) {
205 return 0; 197 return 0;
206 } 198 }
207 - int pageSize = 100;  
208 - for (int i = 0; i <= count / 100; i++) {  
209 - PageParam pageParam = new PageParam().setPageNo(currentPage + i).setPageSize(pageSize);  
210 - // 分页查找出 sku 属性不为 null 的  
211 - PageResult<ProductSkuDO> skuPage = productSkuMapper.selectPage(pageParam);  
212 - List<ProductSkuDO> records = skuPage.getList();  
213 - if (CollUtil.isEmpty(records)) {  
214 - break;  
215 - }  
216 - records.stream()  
217 - .filter(sku -> sku.getProperties() != null)  
218 - .forEach(sku -> sku.getProperties().forEach(property -> {  
219 - if (property.getValueId().equals(updateObj.getId())) {  
220 - property.setValueName(updateObj.getName());  
221 - updateSkus.add(sku);  
222 - }  
223 - }));  
224 - } 199 + skuDOList.stream()
  200 + .filter(sku -> sku.getProperties() != null)
  201 + .forEach(sku -> sku.getProperties().forEach(property -> {
  202 + if (property.getValueId().equals(propertyValueId)) {
  203 + property.setValueName(propertyValueName);
  204 + updateSkus.add(sku);
  205 + }
  206 + }));
225 if (CollUtil.isEmpty(updateSkus)) { 207 if (CollUtil.isEmpty(updateSkus)) {
226 return 0; 208 return 0;
227 } 209 }
228 - // 每批处理的大小  
229 - int batchSize = 1000;  
230 - for (int i = 0; i < updateSkus.size(); i += batchSize) {  
231 - List<ProductSkuDO> batchSkuDOs = updateSkus.subList(i, Math.min(i + batchSize, updateSkus.size()));  
232 - productSkuMapper.updateBatch(batchSkuDOs, batchSize);  
233 - } 210 +
  211 + productSkuMapper.updateBatch(updateSkus);
234 return updateSkus.size(); 212 return updateSkus.size();
235 } 213 }
236 214
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuService.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.service.spu; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.service.spu;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; 4 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
  5 +import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;
5 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 6 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
6 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 7 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
7 8
@@ -135,4 +136,11 @@ public interface ProductSpuService { @@ -135,4 +136,11 @@ public interface ProductSpuService {
135 */ 136 */
136 Long getSpuCountByCategoryId(Long id); 137 Long getSpuCountByCategoryId(Long id);
137 138
  139 + /**
  140 + * 通过 spu id 获取商品 SPU 明细
  141 + *
  142 + * @param id id
  143 + * @return 用户 App - 商品 SPU 明细
  144 + */
  145 + AppProductSpuDetailRespVO getAppProductSpuDetail(Long id);
138 } 146 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/spu/ProductSpuServiceImpl.java
@@ -7,15 +7,21 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; @@ -7,15 +7,21 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
8 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO; 8 import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;
9 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*; 9 import cn.iocoder.yudao.module.product.controller.admin.spu.vo.*;
  10 +import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuDetailRespVO;
10 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO; 11 import cn.iocoder.yudao.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
  12 +import cn.iocoder.yudao.module.product.convert.sku.ProductSkuConvert;
11 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 13 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
12 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO; 14 import cn.iocoder.yudao.module.product.dal.dataobject.category.ProductCategoryDO;
  15 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyDO;
  16 +import cn.iocoder.yudao.module.product.dal.dataobject.property.ProductPropertyValueDO;
13 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; 17 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
14 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 18 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
15 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper; 19 import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
16 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; 20 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
17 import cn.iocoder.yudao.module.product.service.brand.ProductBrandService; 21 import cn.iocoder.yudao.module.product.service.brand.ProductBrandService;
18 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService; 22 import cn.iocoder.yudao.module.product.service.category.ProductCategoryService;
  23 +import cn.iocoder.yudao.module.product.service.property.ProductPropertyValueService;
  24 +import cn.iocoder.yudao.module.product.service.property.bo.ProductPropertyValueDetailRespBO;
19 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; 25 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
20 import org.springframework.context.annotation.Lazy; 26 import org.springframework.context.annotation.Lazy;
21 import org.springframework.stereotype.Service; 27 import org.springframework.stereotype.Service;
@@ -50,6 +56,9 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -50,6 +56,9 @@ public class ProductSpuServiceImpl implements ProductSpuService {
50 private ProductBrandService brandService; 56 private ProductBrandService brandService;
51 @Resource 57 @Resource
52 private ProductCategoryService categoryService; 58 private ProductCategoryService categoryService;
  59 + @Resource
  60 + @Lazy // 循环依赖,避免报错
  61 + private ProductPropertyValueService productPropertyValueService;
53 62
54 @Override 63 @Override
55 @Transactional(rollbackFor = Exception.class) 64 @Transactional(rollbackFor = Exception.class)
@@ -140,7 +149,11 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -140,7 +149,11 @@ public class ProductSpuServiceImpl implements ProductSpuService {
140 // 校验存在 149 // 校验存在
141 validateSpuExists(id); 150 validateSpuExists(id);
142 // 校验商品状态不是回收站不能删除 151 // 校验商品状态不是回收站不能删除
143 - validateSpuStatus(id); 152 + ProductSpuDO spuDO = productSpuMapper.selectById(id);
  153 + // 判断 SPU 状态是否为回收站
  154 + if (ObjectUtil.notEqual(spuDO.getStatus(), ProductSpuStatusEnum.RECYCLE.getStatus())) {
  155 + throw exception(SPU_NOT_RECYCLE);
  156 + }
144 157
145 // 删除 SPU 158 // 删除 SPU
146 productSpuMapper.deleteById(id); 159 productSpuMapper.deleteById(id);
@@ -154,20 +167,6 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -154,20 +167,6 @@ public class ProductSpuServiceImpl implements ProductSpuService {
154 } 167 }
155 } 168 }
156 169
157 - /**  
158 - * 验证 SPU 状态是否为回收站  
159 - *  
160 - * @param id id  
161 - */  
162 - // TODO puhui999:感觉不用独立出来一个方法,直接在 deleteSpu 方法中校验即可  
163 - private void validateSpuStatus(Long id) {  
164 - ProductSpuDO spuDO = productSpuMapper.selectById(id);  
165 - // 判断 SPU 状态是否为回收站  
166 - if (ObjectUtil.notEqual(spuDO.getStatus(), ProductSpuStatusEnum.RECYCLE.getStatus())) {  
167 - throw exception(SPU_NOT_RECYCLE);  
168 - }  
169 - }  
170 -  
171 @Override 170 @Override
172 public ProductSpuDO getSpu(Long id) { 171 public ProductSpuDO getSpu(Long id) {
173 return productSpuMapper.selectById(id); 172 return productSpuMapper.selectById(id);
@@ -257,4 +256,35 @@ public class ProductSpuServiceImpl implements ProductSpuService { @@ -257,4 +256,35 @@ public class ProductSpuServiceImpl implements ProductSpuService {
257 return productSpuMapper.selectCount(ProductSpuDO::getCategoryId, id); 256 return productSpuMapper.selectCount(ProductSpuDO::getCategoryId, id);
258 } 257 }
259 258
  259 + @Override
  260 + public AppProductSpuDetailRespVO getAppProductSpuDetail(Long id) {
  261 + // 获得商品 SPU
  262 + ProductSpuDO spu = getSpu(id);
  263 + if (spu == null) {
  264 + throw exception(SPU_NOT_EXISTS);
  265 + }
  266 + if (!ProductSpuStatusEnum.isEnable(spu.getStatus())) {
  267 + throw exception(SPU_NOT_ENABLE);
  268 + }
  269 +
  270 + // 查询商品 SKU
  271 + List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spu.getId());
  272 + List<ProductPropertyValueDetailRespBO> propertyValues = new ArrayList<>();
  273 + // 单规格商品 赋予默认属性值
  274 + if (ObjectUtil.equal(spu.getSpecType(), false)) {
  275 + ProductPropertyValueDetailRespBO respBO = new ProductPropertyValueDetailRespBO();
  276 + respBO.setPropertyId(ProductPropertyDO.PROPERTY_ID);
  277 + respBO.setPropertyName(ProductPropertyDO.PROPERTY_NAME);
  278 + respBO.setValueId(ProductPropertyValueDO.VALUE_ID);
  279 + respBO.setValueName(ProductPropertyValueDO.VALUE_NAME);
  280 + propertyValues.add(respBO);
  281 + } else {
  282 + // 多规格商品则查询商品属性
  283 + propertyValues = productPropertyValueService
  284 + .getPropertyValueDetailList(ProductSkuConvert.INSTANCE.convertPropertyValueIds(skus));
  285 + }
  286 + // 拼接
  287 + return ProductSpuConvert.INSTANCE.convertForGetSpuDetail(spu, skus, propertyValues);
  288 + }
  289 +
260 } 290 }
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApi.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.api.order;
  2 +
  3 +import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO;
  4 +
  5 +/**
  6 + * 订单 API 接口
  7 + *
  8 + * @author HUIHUI
  9 + */
  10 +public interface TradeOrderApi {
  11 +
  12 + /**
  13 + * 获取订单通过订单 id
  14 + *
  15 + * @param id id
  16 + * @return 订单信息 Response DTO
  17 + */
  18 + TradeOrderRespDTO getOrder(Long id);
  19 +
  20 +}
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/order/dto/TradeOrderRespDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.api.order.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
  4 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum;
  5 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
  6 +import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +/**
  12 + * 订单信息 Response DTO
  13 + *
  14 + * @author HUIHUI
  15 + */
  16 +@Data
  17 +public class TradeOrderRespDTO {
  18 +
  19 + // ========== 订单基本信息 ==========
  20 + /**
  21 + * 订单编号,主键自增
  22 + */
  23 + private Long id;
  24 + /**
  25 + * 订单流水号
  26 + * <p>
  27 + * 例如说,1146347329394184195
  28 + */
  29 + private String no;
  30 + /**
  31 + * 订单类型
  32 + * <p>
  33 + * 枚举 {@link TradeOrderTypeEnum}
  34 + */
  35 + private Integer type;
  36 + /**
  37 + * 订单来源
  38 + * <p>
  39 + * 枚举 {@link TerminalEnum}
  40 + */
  41 + private Integer terminal;
  42 + /**
  43 + * 用户编号
  44 + * <p>
  45 + * 关联 MemberUserDO 的 id 编号
  46 + */
  47 + private Long userId;
  48 + /**
  49 + * 用户 IP
  50 + */
  51 + private String userIp;
  52 + /**
  53 + * 用户备注
  54 + */
  55 + private String userRemark;
  56 + /**
  57 + * 订单状态
  58 + * <p>
  59 + * 枚举 {@link TradeOrderStatusEnum}
  60 + */
  61 + private Integer status;
  62 + /**
  63 + * 购买的商品数量
  64 + */
  65 + private Integer productCount;
  66 + /**
  67 + * 订单完成时间
  68 + */
  69 + private LocalDateTime finishTime;
  70 + /**
  71 + * 订单取消时间
  72 + */
  73 + private LocalDateTime cancelTime;
  74 + /**
  75 + * 取消类型
  76 + * <p>
  77 + * 枚举 {@link TradeOrderCancelTypeEnum}
  78 + */
  79 + private Integer cancelType;
  80 + /**
  81 + * 商家备注
  82 + */
  83 + private String remark;
  84 + /**
  85 + * 是否评价
  86 + * <p>
  87 + * true - 已评价
  88 + * false - 未评价
  89 + */
  90 + private Boolean commentStatus;
  91 +
  92 +}
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/api/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.api;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/order/TradeOrderApiImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.api.order;
  2 +
  3 +import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO;
  4 +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert;
  5 +import cn.iocoder.yudao.module.trade.service.order.TradeOrderService;
  6 +import org.springframework.stereotype.Service;
  7 +import org.springframework.validation.annotation.Validated;
  8 +
  9 +import javax.annotation.Resource;
  10 +
  11 +/**
  12 + * 订单 API 接口实现类
  13 + *
  14 + * @author HUIHUI
  15 + */
  16 +@Service
  17 +@Validated
  18 +public class TradeOrderApiImpl implements TradeOrderApi {
  19 +
  20 + @Resource
  21 + private TradeOrderService tradeOrderService;
  22 +
  23 + @Override
  24 + public TradeOrderRespDTO getOrder(Long id) {
  25 + return TradeOrderConvert.INSTANCE.convert(tradeOrderService.getOrder(id));
  26 + }
  27 +
  28 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/api/package-info.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.api;
0 \ No newline at end of file 2 \ No newline at end of file
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java
@@ -70,14 +70,14 @@ public class DeliveryExpressTemplateController { @@ -70,14 +70,14 @@ public class DeliveryExpressTemplateController {
70 return success(DeliveryExpressTemplateConvert.INSTANCE.convertList(list)); 70 return success(DeliveryExpressTemplateConvert.INSTANCE.convertList(list));
71 } 71 }
72 72
73 - // TODO @puhui999:DeliveryExpressTemplateRespVO 搞个 simple 的哈 73 + // TODO @puhui999:DeliveryExpressTemplateRespVO 搞个 simple 的哈 fix
74 @GetMapping("/list-all-simple") 74 @GetMapping("/list-all-simple")
75 @Operation(summary = "获取快递模版精简信息列表", description = "主要用于前端的下拉选项") 75 @Operation(summary = "获取快递模版精简信息列表", description = "主要用于前端的下拉选项")
76 - public CommonResult<List<DeliveryExpressTemplateRespVO>> getSimpleTemplateList() { 76 + public CommonResult<List<DeliveryExpressTemplateSimpleRespVO>> getSimpleTemplateList() {
77 // 获取运费模版列表,只要开启状态的 77 // 获取运费模版列表,只要开启状态的
78 List<DeliveryExpressTemplateDO> list = deliveryExpressTemplateService.getDeliveryExpressTemplateList(); 78 List<DeliveryExpressTemplateDO> list = deliveryExpressTemplateService.getDeliveryExpressTemplateList();
79 // 排序后,返回给前端 79 // 排序后,返回给前端
80 - return success(DeliveryExpressTemplateConvert.INSTANCE.convertList(list)); 80 + return success(DeliveryExpressTemplateConvert.INSTANCE.convertList1(list));
81 } 81 }
82 82
83 @GetMapping("/page") 83 @GetMapping("/page")
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +
  9 +@Schema(description = "管理后台 - 模版精简信息 Response VO")
  10 +@Data
  11 +@NoArgsConstructor
  12 +@AllArgsConstructor
  13 +public class DeliveryExpressTemplateSimpleRespVO {
  14 +
  15 + @Schema(description = "模版编号", required = true, example = "1024")
  16 + private Long id;
  17 +
  18 + @Schema(description = "模板名称", required = true, example = "测试模版")
  19 + private String name;
  20 +
  21 +}
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/delivery/DeliveryExpressTemplateConvert.java
@@ -28,11 +28,13 @@ public interface DeliveryExpressTemplateConvert { @@ -28,11 +28,13 @@ public interface DeliveryExpressTemplateConvert {
28 28
29 List<DeliveryExpressTemplateRespVO> convertList(List<DeliveryExpressTemplateDO> list); 29 List<DeliveryExpressTemplateRespVO> convertList(List<DeliveryExpressTemplateDO> list);
30 30
  31 + List<DeliveryExpressTemplateSimpleRespVO> convertList1(List<DeliveryExpressTemplateDO> list);
  32 +
31 PageResult<DeliveryExpressTemplateRespVO> convertPage(PageResult<DeliveryExpressTemplateDO> page); 33 PageResult<DeliveryExpressTemplateRespVO> convertPage(PageResult<DeliveryExpressTemplateDO> page);
32 34
33 default DeliveryExpressTemplateDetailRespVO convert(DeliveryExpressTemplateDO bean, 35 default DeliveryExpressTemplateDetailRespVO convert(DeliveryExpressTemplateDO bean,
34 List<DeliveryExpressTemplateChargeDO> chargeList, 36 List<DeliveryExpressTemplateChargeDO> chargeList,
35 - List<DeliveryExpressTemplateFreeDO> freeList){ 37 + List<DeliveryExpressTemplateFreeDO> freeList) {
36 DeliveryExpressTemplateDetailRespVO respVO = convert2(bean); 38 DeliveryExpressTemplateDetailRespVO respVO = convert2(bean);
37 respVO.setTemplateCharge(convertTemplateChargeList(chargeList)); 39 respVO.setTemplateCharge(convertTemplateChargeList(chargeList));
38 respVO.setTemplateFree(convertTemplateFreeList(freeList)); 40 respVO.setTemplateFree(convertTemplateFreeList(freeList));
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/order/TradeOrderConvert.java
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
11 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; 11 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
12 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO; 12 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
13 import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO; 13 import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateReqDTO;
  14 +import cn.iocoder.yudao.module.trade.api.order.dto.TradeOrderRespDTO;
14 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO; 15 import cn.iocoder.yudao.module.trade.controller.admin.base.member.user.MemberUserRespVO;
15 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO; 16 import cn.iocoder.yudao.module.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
16 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDetailRespVO; 17 import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDetailRespVO;
@@ -62,6 +63,8 @@ public interface TradeOrderConvert { @@ -62,6 +63,8 @@ public interface TradeOrderConvert {
62 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO, 63 TradeOrderDO convert(Long userId, String userIp, AppTradeOrderCreateReqVO createReqVO,
63 TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address); 64 TradePriceCalculateRespBO calculateRespBO, AddressRespDTO address);
64 65
  66 + TradeOrderRespDTO convert(TradeOrderDO orderDO);
  67 +
65 default List<TradeOrderItemDO> convertList(TradeOrderDO tradeOrderDO, TradePriceCalculateRespBO calculateRespBO) { 68 default List<TradeOrderItemDO> convertList(TradeOrderDO tradeOrderDO, TradePriceCalculateRespBO calculateRespBO) {
66 return CollectionUtils.convertList(calculateRespBO.getItems(), item -> { 69 return CollectionUtils.convertList(calculateRespBO.getItems(), item -> {
67 TradeOrderItemDO orderItem = convert(item); 70 TradeOrderItemDO orderItem = convert(item);