Commit d10f49b6a7b6b03f89b464ee8e278908a7bf712c

Authored by YunaiV
1 parent 636cc794

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

yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/price/dto/PriceCalculateRespDTO.java
@@ -48,10 +48,18 @@ public class PriceCalculateRespDTO { @@ -48,10 +48,18 @@ public class PriceCalculateRespDTO {
48 * 商品原价(总),单位:分 48 * 商品原价(总),单位:分
49 * 49 *
50 * 基于 {@link OrderItem#getOriginalPrice()} 求和 50 * 基于 {@link OrderItem#getOriginalPrice()} 求和
  51 + *
51 * 对应 taobao 的 trade.total_fee 字段 52 * 对应 taobao 的 trade.total_fee 字段
52 */ 53 */
53 private Integer originalPrice; 54 private Integer originalPrice;
54 /** 55 /**
  56 + * 订单原价(总),单位:分
  57 + *
  58 + * 基于 {@link OrderItem#getPayPrice()} 求和
  59 + * 和 {@link #originalPrice} 的差异:去除商品级优惠
  60 + */
  61 + private Integer orderPrice;
  62 + /**
55 * 订单优惠(总),单位:分 63 * 订单优惠(总),单位:分
56 * 64 *
57 * 订单级优惠:对主订单的优惠,常见如:订单满 200 元减 10 元;订单满 80 包邮。 65 * 订单级优惠:对主订单的优惠,常见如:订单满 200 元减 10 元;订单满 80 包邮。
@@ -82,6 +90,7 @@ public class PriceCalculateRespDTO { @@ -82,6 +90,7 @@ public class PriceCalculateRespDTO {
82 * - {@link #couponPrice} 90 * - {@link #couponPrice}
83 * - {@link #pointPrice} 91 * - {@link #pointPrice}
84 * + {@link #deliveryPrice} 92 * + {@link #deliveryPrice}
  93 + * - {@link #discountPrice}
85 */ 94 */
86 private Integer payPrice; 95 private Integer payPrice;
87 /** 96 /**
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 { @@ -36,7 +36,8 @@ public interface PriceConvert {
36 orderItem.setPayPrice(orderItem.getOriginalPrice()).setOrderDividePrice(orderItem.getOriginalPrice()); 36 orderItem.setPayPrice(orderItem.getOriginalPrice()).setOrderDividePrice(orderItem.getOriginalPrice());
37 priceCalculate.getOrder().getItems().add(orderItem); 37 priceCalculate.getOrder().getItems().add(orderItem);
38 // 补充价格信息到 Order 中 38 // 补充价格信息到 Order 中
39 - order.setOriginalPrice(order.getOriginalPrice() + orderItem.getOriginalPrice()).setPayPrice(order.getOriginalPrice()); 39 + order.setOriginalPrice(order.getOriginalPrice() + orderItem.getOriginalPrice())
  40 + .setOrderPrice(order.getOriginalPrice()).setPayPrice(order.getOriginalPrice());
40 }); 41 });
41 return priceCalculate; 42 return priceCalculate;
42 } 43 }
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 { @@ -420,13 +420,16 @@ public class PriceServiceImpl implements PriceService {
420 */ 420 */
421 private void modifyOrderItemPayPrice(PriceCalculateRespDTO.OrderItem orderItem, Integer newPayPrice, 421 private void modifyOrderItemPayPrice(PriceCalculateRespDTO.OrderItem orderItem, Integer newPayPrice,
422 PriceCalculateRespDTO priceCalculate) { 422 PriceCalculateRespDTO priceCalculate) {
  423 + // diffPayPrice 等于额外增加的商品级的优惠
423 int diffPayPrice = orderItem.getPayPrice() - newPayPrice; 424 int diffPayPrice = orderItem.getPayPrice() - newPayPrice;
424 // 设置 OrderItem 价格相关字段 425 // 设置 OrderItem 价格相关字段
425 orderItem.setDiscountPrice(orderItem.getDiscountPrice() + diffPayPrice); 426 orderItem.setDiscountPrice(orderItem.getDiscountPrice() + diffPayPrice);
426 orderItem.setPayPrice(newPayPrice); 427 orderItem.setPayPrice(newPayPrice);
427 orderItem.setOrderDividePrice(orderItem.getPayPrice() - orderItem.getOrderPartPrice()); 428 orderItem.setOrderDividePrice(orderItem.getPayPrice() - orderItem.getOrderPartPrice());
428 // 设置 Order 相关相关字段 429 // 设置 Order 相关相关字段
429 - priceCalculate.getOrder().setPayPrice(priceCalculate.getOrder().getPayPrice() - diffPayPrice); 430 + PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
  431 + order.setPayPrice(order.getPayPrice() - diffPayPrice);
  432 + order.setOrderPrice(order.getOrderPrice() - diffPayPrice);
430 } 433 }
431 434
432 /** 435 /**
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 { @@ -64,6 +64,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
64 // 断言 Order 部分 64 // 断言 Order 部分
65 PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); 65 PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
66 assertEquals(order.getOriginalPrice(), 200); 66 assertEquals(order.getOriginalPrice(), 200);
  67 + assertEquals(order.getOrderPrice(), 180);
67 assertEquals(order.getDiscountPrice(), 0); 68 assertEquals(order.getDiscountPrice(), 0);
68 assertEquals(order.getPointPrice(), 0); 69 assertEquals(order.getPointPrice(), 0);
69 assertEquals(order.getDeliveryPrice(), 0); 70 assertEquals(order.getDeliveryPrice(), 0);
@@ -126,6 +127,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { @@ -126,6 +127,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
126 // 断言 Order 部分 127 // 断言 Order 部分
127 PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); 128 PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
128 assertEquals(order.getOriginalPrice(), 350); 129 assertEquals(order.getOriginalPrice(), 350);
  130 + assertEquals(order.getOrderPrice(), 210);
129 assertEquals(order.getDiscountPrice(), 0); 131 assertEquals(order.getDiscountPrice(), 0);
130 assertEquals(order.getPointPrice(), 0); 132 assertEquals(order.getPointPrice(), 0);
131 assertEquals(order.getDeliveryPrice(), 0); 133 assertEquals(order.getDeliveryPrice(), 0);
@@ -217,6 +219,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { @@ -217,6 +219,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
217 // 断言 Order 部分 219 // 断言 Order 部分
218 PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); 220 PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
219 assertEquals(order.getOriginalPrice(), 470); 221 assertEquals(order.getOriginalPrice(), 470);
  222 + assertEquals(order.getOrderPrice(), 470);
220 assertEquals(order.getDiscountPrice(), 130); 223 assertEquals(order.getDiscountPrice(), 130);
221 assertEquals(order.getPointPrice(), 0); 224 assertEquals(order.getPointPrice(), 0);
222 assertEquals(order.getDeliveryPrice(), 0); 225 assertEquals(order.getDeliveryPrice(), 0);
@@ -314,6 +317,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { @@ -314,6 +317,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
314 // 断言 Order 部分 317 // 断言 Order 部分
315 PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); 318 PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
316 assertEquals(order.getOriginalPrice(), 350); 319 assertEquals(order.getOriginalPrice(), 350);
  320 + assertEquals(order.getOrderPrice(), 350);
317 assertEquals(order.getDiscountPrice(), 0); 321 assertEquals(order.getDiscountPrice(), 0);
318 assertEquals(order.getPointPrice(), 0); 322 assertEquals(order.getPointPrice(), 0);
319 assertEquals(order.getDeliveryPrice(), 0); 323 assertEquals(order.getDeliveryPrice(), 0);
@@ -386,6 +390,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { @@ -386,6 +390,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest {
386 // 断言 Order 部分 390 // 断言 Order 部分
387 PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); 391 PriceCalculateRespDTO.Order order = priceCalculate.getOrder();
388 assertEquals(order.getOriginalPrice(), 470); 392 assertEquals(order.getOriginalPrice(), 470);
  393 + assertEquals(order.getOrderPrice(), 470);
389 assertEquals(order.getDiscountPrice(), 0); 394 assertEquals(order.getDiscountPrice(), 0);
390 assertEquals(order.getPointPrice(), 0); 395 assertEquals(order.getPointPrice(), 0);
391 assertEquals(order.getDeliveryPrice(), 0); 396 assertEquals(order.getDeliveryPrice(), 0);
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 { @@ -43,13 +43,12 @@ public class AppTradeOrderController {
43 @PreAuthenticated 43 @PreAuthenticated
44 public CommonResult<Long> createTradeOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO, 44 public CommonResult<Long> createTradeOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO,
45 HttpServletRequest servletRequest) { 45 HttpServletRequest servletRequest) {
46 - // 获取登录用户 46 + // 获取登录用户、用户 IP 地址
47 Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); 47 Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
48 - // 获取用户ip地址  
49 String clientIp = ServletUtil.getClientIP(servletRequest); 48 String clientIp = ServletUtil.getClientIP(servletRequest);
50 // 创建交易订单,预支付记录 49 // 创建交易订单,预支付记录
51 - Long result = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO);  
52 - return CommonResult.success(result); 50 + Long orderId = tradeOrderService.createTradeOrder(loginUserId, clientIp, createReqVO);
  51 + return CommonResult.success(orderId);
53 } 52 }
54 53
55 @GetMapping("/get") 54 @GetMapping("/get")
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 { @@ -19,7 +19,7 @@ public class AppTradeOrderCreateReqVO {
19 @ApiModelProperty(name = "优惠劵编号", example = "1024") 19 @ApiModelProperty(name = "优惠劵编号", example = "1024")
20 private Long couponId; 20 private Long couponId;
21 21
22 - @ApiModelProperty(name = "备注", example = "1024") 22 + @ApiModelProperty(name = "备注", example = "这个是我的订单哟")
23 private String remark; 23 private String remark;
24 24
25 @ApiModelProperty(name = "是否来自购物车", required = true, example = "true", notes = "true - 来自购物车;false - 立即购买") 25 @ApiModelProperty(name = "是否来自购物车", required = true, example = "true", notes = "true - 来自购物车;false - 立即购买")
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; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.trade.dal.dataobject.order;
2 2
3 import cn.iocoder.yudao.framework.common.enums.TerminalEnum; 3 import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  5 +import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO.OrderItem;
5 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; 6 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum;
6 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; 7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
7 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; 8 import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
@@ -74,7 +75,7 @@ public class TradeOrderDO extends BaseDO { @@ -74,7 +75,7 @@ public class TradeOrderDO extends BaseDO {
74 /** 75 /**
75 * 购买的商品数量 76 * 购买的商品数量
76 */ 77 */
77 - private Integer productCount; // total_num 78 + private Integer productCount;
78 /** 79 /**
79 * 订单完成时间 80 * 订单完成时间
80 */ 81 */
@@ -116,14 +117,25 @@ public class TradeOrderDO extends BaseDO { @@ -116,14 +117,25 @@ public class TradeOrderDO extends BaseDO {
116 * 商品原价(总),单位:分 117 * 商品原价(总),单位:分
117 * 118 *
118 * 基于 {@link TradeOrderItemDO#getTotalOriginalPrice()} 求和 119 * 基于 {@link TradeOrderItemDO#getTotalOriginalPrice()} 求和
  120 + *
  121 + * 对应 taobao 的 trade.total_fee 字段
119 */ 122 */
120 private Integer originalPrice; 123 private Integer originalPrice;
121 /** 124 /**
  125 + * 订单原价(总),单位:分
  126 + *
  127 + * 基于 {@link OrderItem#getPayPrice()} 求和
  128 + * 和 {@link #originalPrice} 的差异:去除商品级优惠
  129 + */
  130 + private Integer orderPrice;
  131 + /**
122 * 订单优惠(总),单位:分 132 * 订单优惠(总),单位:分
123 * 133 *
124 - * 例如说:满减折扣;不包括优惠劵、商品优惠(TODO) 134 + * 订单级优惠:对主订单的优惠,常见如:订单满 200 元减 10 元;订单满 80 包邮。
  135 + *
  136 + * 对应 taobao 的 order.discount_fee 字段
125 */ 137 */
126 - private Integer promotionPrice; 138 + private Integer discountPrice;
127 /** 139 /**
128 * 运费金额,单位:分 140 * 运费金额,单位:分
129 */ 141 */
@@ -137,12 +149,12 @@ public class TradeOrderDO extends BaseDO { @@ -137,12 +149,12 @@ public class TradeOrderDO extends BaseDO {
137 /** 149 /**
138 * 应付金额(总),单位:分 150 * 应付金额(总),单位:分
139 * 151 *
140 - * = {@link #originalPrice}  
141 - * + {@link #deliveryPrice}  
142 - * + {@link #adjustPrice}  
143 - * - {@link #promotionPrice} 152 + * = {@link OrderItem#getPayPrice()} 求和
144 * - {@link #couponPrice} 153 * - {@link #couponPrice}
145 * - {@link #pointPrice} 154 * - {@link #pointPrice}
  155 + * + {@link #deliveryPrice}
  156 + * - {@link #discountPrice}
  157 + * + {@link #adjustPrice}
146 */ 158 */
147 private Integer payPrice; 159 private Integer payPrice;
148 /** 160 /**
@@ -164,11 +176,11 @@ public class TradeOrderDO extends BaseDO { @@ -164,11 +176,11 @@ public class TradeOrderDO extends BaseDO {
164 * 176 *
165 * 关联 DeliveryTemplateDO 的 id 编号 177 * 关联 DeliveryTemplateDO 的 id 编号
166 */ 178 */
167 - private Long deliveryTemplateId; // dvy_id 179 + private Long deliveryTemplateId;
168 /** 180 /**
169 * 物流公司单号 181 * 物流公司单号
170 */ 182 */
171 - private String expressNo; // dvy_flow_id 183 + private String expressNo;
172 /** 184 /**
173 * 发货状态 185 * 发货状态
174 * 186 *
@@ -227,10 +239,14 @@ public class TradeOrderDO extends BaseDO { @@ -227,10 +239,14 @@ public class TradeOrderDO extends BaseDO {
227 private Long couponId; 239 private Long couponId;
228 /** 240 /**
229 * 优惠劵减免金额,单位:分 241 * 优惠劵减免金额,单位:分
  242 + *
  243 + * 对应 taobao 的 trade.coupon_fee 字段
230 */ 244 */
231 private Integer couponPrice; 245 private Integer couponPrice;
232 /** 246 /**
233 * 积分抵扣的金额,单位:分 247 * 积分抵扣的金额,单位:分
  248 + *
  249 + * 对应 taobao 的 trade.point_fee 字段
234 */ 250 */
235 private Integer pointPrice; 251 private Integer pointPrice;
236 252
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; @@ -3,18 +3,20 @@ package cn.iocoder.yudao.module.trade.service.order;
3 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; 3 import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO;
4 4
5 /** 5 /**
6 - * TODO @LeeYan9: 类注释 6 + * 交易订单 Service 接口
  7 + *
7 * @author LeeYan9 8 * @author LeeYan9
8 * @since 2022-08-26 9 * @since 2022-08-26
9 */ 10 */
10 public interface TradeOrderService { 11 public interface TradeOrderService {
11 12
12 /** 13 /**
13 - * 创建交易订单 TODO @LeeYan9: 方法注释, 和参数要空一行 14 + * 创建交易订单
  15 + *
14 * @param loginUserId 登录用户 16 * @param loginUserId 登录用户
15 - * @param clientIp 用户ip地址 // TODO @LeeYan9: 中英文之间, 空一行哈 17 + * @param clientIp 用户 IP 地址
16 * @param createReqVO 创建交易订单请求模型 18 * @param createReqVO 创建交易订单请求模型
17 - * @return 交易订单创建结果 19 + * @return 交易订单的编号
18 */ 20 */
19 Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO); 21 Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO);
20 } 22 }
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; @@ -45,14 +45,17 @@ import java.util.Map;
45 import java.util.Objects; 45 import java.util.Objects;
46 46
47 /** 47 /**
48 - * TODO @LeeYan9: 注释 48 + * 交易订单 Service 实现类
  49 + *
49 * @author LeeYan9 50 * @author LeeYan9
50 * @since 2022-08-26 51 * @since 2022-08-26
51 */ 52 */
52 @Service 53 @Service
53 public class TradeOrderServiceImpl implements TradeOrderService { 54 public class TradeOrderServiceImpl implements TradeOrderService {
54 55
55 - // TODO @LeeYan9: 相同类型的, 可以放在一起,不用空行; 例如说 Mapper 和 API 和 Properties 56 + // TODO LeeYan9: 静态变量, 需要在最前面哈; 另外, 静态变量的注释最好写下;
  57 + private static final String BLANK_PLACEHOLDER = " ";
  58 + private static final String MULTIPLIER_PLACEHOLDER = "x";
56 59
57 @Resource 60 @Resource
58 private TradeOrderMapper tradeOrderMapper; 61 private TradeOrderMapper tradeOrderMapper;
@@ -71,15 +74,10 @@ public class TradeOrderServiceImpl implements TradeOrderService { @@ -71,15 +74,10 @@ public class TradeOrderServiceImpl implements TradeOrderService {
71 @Resource 74 @Resource
72 private TradeOrderProperties tradeOrderProperties; 75 private TradeOrderProperties tradeOrderProperties;
73 76
74 - // TODO LeeYan9: 静态变量, 需要在最前面哈; 另外, 静态变量的注释最好写下;  
75 - private static final String BLANK_PLACEHOLDER = " ";  
76 - private static final String MULTIPLIER_PLACEHOLDER = "x";  
77 -  
78 @Override 77 @Override
79 @Transactional(rollbackFor = Exception.class) 78 @Transactional(rollbackFor = Exception.class)
80 public Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO) { 79 public Long createTradeOrder(Long loginUserId, String clientIp, AppTradeOrderCreateReqVO createReqVO) {
81 -  
82 - List<Item> items = createReqVO.getItems(); // TODO @LeeYan9: 方法第一行, 不用空哈; 80 + List<Item> items = createReqVO.getItems();
83 // 商品SKU检查 sku可售状态,库存 81 // 商品SKU检查 sku可售状态,库存
84 List<ProductSkuRespDTO> skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId)); 82 List<ProductSkuRespDTO> skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId));
85 Map<Long, ProductSkuRespDTO> skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId); 83 Map<Long, ProductSkuRespDTO> skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId);