Browse Source

promotion:优化价格计算的接口,增加 orderPrice 字段

YunaiV 2 years ago
parent
commit
d10f49b6a7

+ 9 - 0
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/price/dto/PriceCalculateRespDTO.java

@@ -48,9 +48,17 @@ public class PriceCalculateRespDTO {
          * 商品原价(总),单位:分
          *
          * 基于 {@link OrderItem#getOriginalPrice()} 求和
+         *
          * 对应 taobao 的 trade.total_fee 字段
          */
         private Integer originalPrice;
+        /**
+         * 订单原价(总),单位:分
+         *
+         * 基于 {@link OrderItem#getPayPrice()} 求和
+         * 和 {@link #originalPrice} 的差异:去除商品级优惠
+         */
+        private Integer orderPrice;
         /**
          * 订单优惠(总),单位:分
          *
@@ -82,6 +90,7 @@ public class PriceCalculateRespDTO {
          * - {@link #couponPrice}
          * - {@link #pointPrice}
          * + {@link #deliveryPrice}
+         * - {@link #discountPrice}
          */
         private Integer payPrice;
         /**

+ 2 - 1
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/price/PriceConvert.java

@@ -36,7 +36,8 @@ public interface PriceConvert {
             orderItem.setPayPrice(orderItem.getOriginalPrice()).setOrderDividePrice(orderItem.getOriginalPrice());
             priceCalculate.getOrder().getItems().add(orderItem);
             // 补充价格信息到 Order 中
-            order.setOriginalPrice(order.getOriginalPrice() + orderItem.getOriginalPrice()).setPayPrice(order.getOriginalPrice());
+            order.setOriginalPrice(order.getOriginalPrice() + orderItem.getOriginalPrice())
+                    .setOrderPrice(order.getOriginalPrice()).setPayPrice(order.getOriginalPrice());
         });
         return priceCalculate;
     }

+ 4 - 1
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceImpl.java

@@ -420,13 +420,16 @@ public class PriceServiceImpl implements PriceService {
      */
     private void modifyOrderItemPayPrice(PriceCalculateRespDTO.OrderItem orderItem, Integer newPayPrice,
                                          PriceCalculateRespDTO priceCalculate) {
+        // diffPayPrice 等于额外增加的商品级的优惠
         int diffPayPrice = orderItem.getPayPrice() - newPayPrice;
         // 设置 OrderItem 价格相关字段
         orderItem.setDiscountPrice(orderItem.getDiscountPrice() + diffPayPrice);
         orderItem.setPayPrice(newPayPrice);
         orderItem.setOrderDividePrice(orderItem.getPayPrice() - orderItem.getOrderPartPrice());
         // 设置 Order 相关相关字段
-        priceCalculate.getOrder().setPayPrice(priceCalculate.getOrder().getPayPrice() - diffPayPrice);
+        PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
+        order.setPayPrice(order.getPayPrice() - diffPayPrice);
+        order.setOrderPrice(order.getOrderPrice() - diffPayPrice);
     }
 
     /**

+ 5 - 0
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceTest.java

@@ -64,6 +64,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
         // 断言 Order 部分
         PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
         assertEquals(order.getOriginalPrice(), 200);
+        assertEquals(order.getOrderPrice(), 180);
         assertEquals(order.getDiscountPrice(), 0);
         assertEquals(order.getPointPrice(), 0);
         assertEquals(order.getDeliveryPrice(), 0);
@@ -126,6 +127,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
         // 断言 Order 部分
         PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
         assertEquals(order.getOriginalPrice(), 350);
+        assertEquals(order.getOrderPrice(), 210);
         assertEquals(order.getDiscountPrice(), 0);
         assertEquals(order.getPointPrice(), 0);
         assertEquals(order.getDeliveryPrice(), 0);
@@ -217,6 +219,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
         // 断言 Order 部分
         PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
         assertEquals(order.getOriginalPrice(), 470);
+        assertEquals(order.getOrderPrice(), 470);
         assertEquals(order.getDiscountPrice(), 130);
         assertEquals(order.getPointPrice(), 0);
         assertEquals(order.getDeliveryPrice(), 0);
@@ -314,6 +317,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
         // 断言 Order 部分
         PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
         assertEquals(order.getOriginalPrice(), 350);
+        assertEquals(order.getOrderPrice(), 350);
         assertEquals(order.getDiscountPrice(), 0);
         assertEquals(order.getPointPrice(), 0);
         assertEquals(order.getDeliveryPrice(), 0);
@@ -386,6 +390,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
         // 断言 Order 部分
         PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
         assertEquals(order.getOriginalPrice(), 470);
+        assertEquals(order.getOrderPrice(), 470);
         assertEquals(order.getDiscountPrice(), 0);
         assertEquals(order.getPointPrice(), 0);
         assertEquals(order.getDeliveryPrice(), 0);

+ 3 - 4
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java

@@ -43,13 +43,12 @@ public class AppTradeOrderController {
     @PreAuthenticated
     public CommonResult<Long> createTradeOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO,
                                                HttpServletRequest servletRequest) {
-        // 获取登录用户
+        // 获取登录用户、用户 IP 地址
         Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
-        // 获取用户ip地址
         String clientIp = ServletUtil.getClientIP(servletRequest);
         // 创建交易订单,预支付记录
-        Long result = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO);
-        return CommonResult.success(result);
+        Long orderId = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO);
+        return CommonResult.success(orderId);
     }
 
     @GetMapping("/get")

+ 1 - 1
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java

@@ -19,7 +19,7 @@ public class AppTradeOrderCreateReqVO {
     @ApiModelProperty(name = "优惠劵编号", example = "1024")
     private Long couponId;
 
-    @ApiModelProperty(name = "备注", example = "1024")
+    @ApiModelProperty(name = "备注", example = "这个是我的订单哟")
     private String remark;
 
     @ApiModelProperty(name = "是否来自购物车", required = true, example = "true", notes = "true - 来自购物车;false - 立即购买")

+ 25 - 9
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.order;
 
 import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO.OrderItem;
 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum;
 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
@@ -74,7 +75,7 @@ public class TradeOrderDO extends BaseDO {
     /**
      * 购买的商品数量
      */
-    private Integer productCount; // total_num
+    private Integer productCount;
     /**
      * 订单完成时间
      */
@@ -116,14 +117,25 @@ public class TradeOrderDO extends BaseDO {
      * 商品原价(总),单位:分
      *
      * 基于 {@link TradeOrderItemDO#getTotalOriginalPrice()} 求和
+     *
+     * 对应 taobao 的 trade.total_fee 字段
      */
     private Integer originalPrice;
+    /**
+     * 订单原价(总),单位:分
+     *
+     * 基于 {@link OrderItem#getPayPrice()} 求和
+     * 和 {@link #originalPrice} 的差异:去除商品级优惠
+     */
+    private Integer orderPrice;
     /**
      * 订单优惠(总),单位:分
      *
-     * 例如说:满减折扣;不包括优惠劵、商品优惠(TODO)
+     * 订单级优惠:对主订单的优惠,常见如:订单满 200 元减 10 元;订单满 80 包邮。
+     *
+     * 对应 taobao 的 order.discount_fee 字段
      */
-    private Integer promotionPrice;
+    private Integer discountPrice;
     /**
      * 运费金额,单位:分
      */
@@ -137,12 +149,12 @@ public class TradeOrderDO extends BaseDO {
     /**
      * 应付金额(总),单位:分
      *
-     * = {@link #originalPrice}
-     * + {@link #deliveryPrice}
-     * + {@link #adjustPrice}
-     * - {@link #promotionPrice}
+     * = {@link OrderItem#getPayPrice()} 求和
      * - {@link #couponPrice}
      * - {@link #pointPrice}
+     * + {@link #deliveryPrice}
+     * - {@link #discountPrice}
+     * + {@link #adjustPrice}
      */
     private Integer payPrice;
     /**
@@ -164,11 +176,11 @@ public class TradeOrderDO extends BaseDO {
      *
      * 关联 DeliveryTemplateDO 的 id 编号
      */
-    private Long deliveryTemplateId; // dvy_id
+    private Long deliveryTemplateId;
     /**
      * 物流公司单号
      */
-    private String expressNo; // dvy_flow_id
+    private String expressNo;
     /**
      * 发货状态
      *
@@ -227,10 +239,14 @@ public class TradeOrderDO extends BaseDO {
     private Long couponId;
     /**
      * 优惠劵减免金额,单位:分
+     *
+     * 对应 taobao 的 trade.coupon_fee 字段
      */
     private Integer couponPrice;
     /**
      * 积分抵扣的金额,单位:分
+     *
+     * 对应 taobao 的 trade.point_fee 字段
      */
     private Integer pointPrice;
 

+ 6 - 4
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java

@@ -3,18 +3,20 @@ package cn.iocoder.yudao.module.trade.service.order;
 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
 
 /**
- * TODO @LeeYan9: 类注释
+ * 交易订单 Service 接口
+ *
  * @author LeeYan9
  * @since 2022-08-26
  */
 public interface TradeOrderService {
 
     /**
-     * 创建交易订单 TODO @LeeYan9: 方法注释, 和参数要空一行
+     * 创建交易订单
+     *
      * @param loginUserId 登录用户
-     * @param clientIp 用户ip地址 // TODO @LeeYan9: 中英文之间, 空一行哈
+     * @param clientIp 用户 IP 地址
      * @param createReqVO 创建交易订单请求模型
-     * @return 交易订单创建结果
+     * @return 交易订单的编号
      */
     Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO);
 }

+ 6 - 8
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java

@@ -45,14 +45,17 @@ import java.util.Map;
 import java.util.Objects;
 
 /**
- * TODO @LeeYan9: 注释
+ * 交易订单 Service 实现类
+ *
  * @author LeeYan9
  * @since 2022-08-26
  */
 @Service
 public class TradeOrderServiceImpl implements TradeOrderService {
 
-    // TODO @LeeYan9: 相同类型的, 可以放在一起,不用空行; 例如说 Mapper 和 API 和 Properties
+    // TODO LeeYan9: 静态变量, 需要在最前面哈; 另外, 静态变量的注释最好写下;
+    private static final String BLANK_PLACEHOLDER = " ";
+    private static final String MULTIPLIER_PLACEHOLDER = "x";
 
     @Resource
     private TradeOrderMapper tradeOrderMapper;
@@ -71,15 +74,10 @@ public class TradeOrderServiceImpl implements TradeOrderService {
     @Resource
     private TradeOrderProperties tradeOrderProperties;
 
-    // TODO LeeYan9: 静态变量, 需要在最前面哈; 另外, 静态变量的注释最好写下;
-    private static final String BLANK_PLACEHOLDER = " ";
-    private static final String MULTIPLIER_PLACEHOLDER = "x";
-
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO) {
-
-        List<Item> items = createReqVO.getItems(); // TODO @LeeYan9: 方法第一行, 不用空哈;
+        List<Item> items = createReqVO.getItems();
         // 商品SKU检查 sku可售状态,库存
         List<ProductSkuRespDTO> skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId));
         Map<Long, ProductSkuRespDTO> skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId);