Commit d10f49b6a7b6b03f89b464ee8e278908a7bf712c
1 parent
636cc794
promotion:优化价格计算的接口,增加 orderPrice 字段
Showing
9 changed files
with
61 additions
and
28 deletions
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 | 48 | * 商品原价(总),单位:分 |
| 49 | 49 | * |
| 50 | 50 | * 基于 {@link OrderItem#getOriginalPrice()} 求和 |
| 51 | + * | |
| 51 | 52 | * 对应 taobao 的 trade.total_fee 字段 |
| 52 | 53 | */ |
| 53 | 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 | 65 | * 订单级优惠:对主订单的优惠,常见如:订单满 200 元减 10 元;订单满 80 包邮。 |
| ... | ... | @@ -82,6 +90,7 @@ public class PriceCalculateRespDTO { |
| 82 | 90 | * - {@link #couponPrice} |
| 83 | 91 | * - {@link #pointPrice} |
| 84 | 92 | * + {@link #deliveryPrice} |
| 93 | + * - {@link #discountPrice} | |
| 85 | 94 | */ |
| 86 | 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 | 36 | orderItem.setPayPrice(orderItem.getOriginalPrice()).setOrderDividePrice(orderItem.getOriginalPrice()); |
| 37 | 37 | priceCalculate.getOrder().getItems().add(orderItem); |
| 38 | 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 | 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 | 420 | */ |
| 421 | 421 | private void modifyOrderItemPayPrice(PriceCalculateRespDTO.OrderItem orderItem, Integer newPayPrice, |
| 422 | 422 | PriceCalculateRespDTO priceCalculate) { |
| 423 | + // diffPayPrice 等于额外增加的商品级的优惠 | |
| 423 | 424 | int diffPayPrice = orderItem.getPayPrice() - newPayPrice; |
| 424 | 425 | // 设置 OrderItem 价格相关字段 |
| 425 | 426 | orderItem.setDiscountPrice(orderItem.getDiscountPrice() + diffPayPrice); |
| 426 | 427 | orderItem.setPayPrice(newPayPrice); |
| 427 | 428 | orderItem.setOrderDividePrice(orderItem.getPayPrice() - orderItem.getOrderPartPrice()); |
| 428 | 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 | 64 | // 断言 Order 部分 |
| 65 | 65 | PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); |
| 66 | 66 | assertEquals(order.getOriginalPrice(), 200); |
| 67 | + assertEquals(order.getOrderPrice(), 180); | |
| 67 | 68 | assertEquals(order.getDiscountPrice(), 0); |
| 68 | 69 | assertEquals(order.getPointPrice(), 0); |
| 69 | 70 | assertEquals(order.getDeliveryPrice(), 0); |
| ... | ... | @@ -126,6 +127,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { |
| 126 | 127 | // 断言 Order 部分 |
| 127 | 128 | PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); |
| 128 | 129 | assertEquals(order.getOriginalPrice(), 350); |
| 130 | + assertEquals(order.getOrderPrice(), 210); | |
| 129 | 131 | assertEquals(order.getDiscountPrice(), 0); |
| 130 | 132 | assertEquals(order.getPointPrice(), 0); |
| 131 | 133 | assertEquals(order.getDeliveryPrice(), 0); |
| ... | ... | @@ -217,6 +219,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { |
| 217 | 219 | // 断言 Order 部分 |
| 218 | 220 | PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); |
| 219 | 221 | assertEquals(order.getOriginalPrice(), 470); |
| 222 | + assertEquals(order.getOrderPrice(), 470); | |
| 220 | 223 | assertEquals(order.getDiscountPrice(), 130); |
| 221 | 224 | assertEquals(order.getPointPrice(), 0); |
| 222 | 225 | assertEquals(order.getDeliveryPrice(), 0); |
| ... | ... | @@ -314,6 +317,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { |
| 314 | 317 | // 断言 Order 部分 |
| 315 | 318 | PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); |
| 316 | 319 | assertEquals(order.getOriginalPrice(), 350); |
| 320 | + assertEquals(order.getOrderPrice(), 350); | |
| 317 | 321 | assertEquals(order.getDiscountPrice(), 0); |
| 318 | 322 | assertEquals(order.getPointPrice(), 0); |
| 319 | 323 | assertEquals(order.getDeliveryPrice(), 0); |
| ... | ... | @@ -386,6 +390,7 @@ public class PriceServiceTest extends BaseMockitoUnitTest { |
| 386 | 390 | // 断言 Order 部分 |
| 387 | 391 | PriceCalculateRespDTO.Order order = priceCalculate.getOrder(); |
| 388 | 392 | assertEquals(order.getOriginalPrice(), 470); |
| 393 | + assertEquals(order.getOrderPrice(), 470); | |
| 389 | 394 | assertEquals(order.getDiscountPrice(), 0); |
| 390 | 395 | assertEquals(order.getPointPrice(), 0); |
| 391 | 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 | 43 | @PreAuthenticated |
| 44 | 44 | public CommonResult<Long> createTradeOrder(@RequestBody AppTradeOrderCreateReqVO createReqVO, |
| 45 | 45 | HttpServletRequest servletRequest) { |
| 46 | - // 获取登录用户 | |
| 46 | + // 获取登录用户、用户 IP 地址 | |
| 47 | 47 | Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); |
| 48 | - // 获取用户ip地址 | |
| 49 | 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 | 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 | 19 | @ApiModelProperty(name = "优惠劵编号", example = "1024") |
| 20 | 20 | private Long couponId; |
| 21 | 21 | |
| 22 | - @ApiModelProperty(name = "备注", example = "1024") | |
| 22 | + @ApiModelProperty(name = "备注", example = "这个是我的订单哟") | |
| 23 | 23 | private String remark; |
| 24 | 24 | |
| 25 | 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 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.enums.TerminalEnum; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 5 | +import cn.iocoder.yudao.module.promotion.api.price.dto.PriceCalculateRespDTO.OrderItem; | |
| 5 | 6 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderCancelTypeEnum; |
| 6 | 7 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum; |
| 7 | 8 | import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum; |
| ... | ... | @@ -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 | 117 | * 商品原价(总),单位:分 |
| 117 | 118 | * |
| 118 | 119 | * 基于 {@link TradeOrderItemDO#getTotalOriginalPrice()} 求和 |
| 120 | + * | |
| 121 | + * 对应 taobao 的 trade.total_fee 字段 | |
| 119 | 122 | */ |
| 120 | 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 | 149 | /** |
| 138 | 150 | * 应付金额(总),单位:分 |
| 139 | 151 | * |
| 140 | - * = {@link #originalPrice} | |
| 141 | - * + {@link #deliveryPrice} | |
| 142 | - * + {@link #adjustPrice} | |
| 143 | - * - {@link #promotionPrice} | |
| 152 | + * = {@link OrderItem#getPayPrice()} 求和 | |
| 144 | 153 | * - {@link #couponPrice} |
| 145 | 154 | * - {@link #pointPrice} |
| 155 | + * + {@link #deliveryPrice} | |
| 156 | + * - {@link #discountPrice} | |
| 157 | + * + {@link #adjustPrice} | |
| 146 | 158 | */ |
| 147 | 159 | private Integer payPrice; |
| 148 | 160 | /** |
| ... | ... | @@ -164,11 +176,11 @@ public class TradeOrderDO extends BaseDO { |
| 164 | 176 | * |
| 165 | 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 | 239 | private Long couponId; |
| 228 | 240 | /** |
| 229 | 241 | * 优惠劵减免金额,单位:分 |
| 242 | + * | |
| 243 | + * 对应 taobao 的 trade.coupon_fee 字段 | |
| 230 | 244 | */ |
| 231 | 245 | private Integer couponPrice; |
| 232 | 246 | /** |
| 233 | 247 | * 积分抵扣的金额,单位:分 |
| 248 | + * | |
| 249 | + * 对应 taobao 的 trade.point_fee 字段 | |
| 234 | 250 | */ |
| 235 | 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 | 3 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderCreateReqVO; |
| 4 | 4 | |
| 5 | 5 | /** |
| 6 | - * TODO @LeeYan9: 类注释 | |
| 6 | + * 交易订单 Service 接口 | |
| 7 | + * | |
| 7 | 8 | * @author LeeYan9 |
| 8 | 9 | * @since 2022-08-26 |
| 9 | 10 | */ |
| 10 | 11 | public interface TradeOrderService { |
| 11 | 12 | |
| 12 | 13 | /** |
| 13 | - * 创建交易订单 TODO @LeeYan9: 方法注释, 和参数要空一行 | |
| 14 | + * 创建交易订单 | |
| 15 | + * | |
| 14 | 16 | * @param loginUserId 登录用户 |
| 15 | - * @param clientIp 用户ip地址 // TODO @LeeYan9: 中英文之间, 空一行哈 | |
| 17 | + * @param clientIp 用户 IP 地址 | |
| 16 | 18 | * @param createReqVO 创建交易订单请求模型 |
| 17 | - * @return 交易订单创建结果 | |
| 19 | + * @return 交易订单的编号 | |
| 18 | 20 | */ |
| 19 | 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 | 45 | import java.util.Objects; |
| 46 | 46 | |
| 47 | 47 | /** |
| 48 | - * TODO @LeeYan9: 注释 | |
| 48 | + * 交易订单 Service 实现类 | |
| 49 | + * | |
| 49 | 50 | * @author LeeYan9 |
| 50 | 51 | * @since 2022-08-26 |
| 51 | 52 | */ |
| 52 | 53 | @Service |
| 53 | 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 | 60 | @Resource |
| 58 | 61 | private TradeOrderMapper tradeOrderMapper; |
| ... | ... | @@ -71,15 +74,10 @@ public class TradeOrderServiceImpl implements TradeOrderService { |
| 71 | 74 | @Resource |
| 72 | 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 | 77 | @Override |
| 79 | 78 | @Transactional(rollbackFor = Exception.class) |
| 80 | 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 | 81 | // 商品SKU检查 sku可售状态,库存 |
| 84 | 82 | List<ProductSkuRespDTO> skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId)); |
| 85 | 83 | Map<Long, ProductSkuRespDTO> skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId); | ... | ... |