diff --git a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/price/dto/PriceCalculateRespDTO.java b/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/price/dto/PriceCalculateRespDTO.java index 99cb36ae6..cda6d99d6 100644 --- a/yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/api/price/dto/PriceCalculateRespDTO.java +++ b/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; /** diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/price/PriceConvert.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/price/PriceConvert.java index bca6bb95c..cafe81526 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/price/PriceConvert.java +++ b/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; } diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceImpl.java b/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceImpl.java index 2017c12b2..062ec2f89 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceImpl.java +++ b/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); } /** diff --git a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceTest.java b/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceTest.java index 8d2e749b0..5263b3404 100644 --- a/yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/price/PriceServiceTest.java +++ b/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); diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java index 2d600a314..802127b26 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java +++ b/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 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") diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java index 54e856a6b..54629e543 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderCreateReqVO.java +++ b/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 - 立即购买") diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java index 0cbd7021c..defd64f98 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/order/TradeOrderDO.java +++ b/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; diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java index c70a2a273..572a654ba 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderService.java +++ b/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); } diff --git a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java b/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java index ecab7d9fd..9b7b877fa 100644 --- a/yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderServiceImpl.java +++ b/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 items = createReqVO.getItems(); // TODO @LeeYan9: 方法第一行, 不用空哈; + List items = createReqVO.getItems(); // 商品SKU检查 sku可售状态,库存 List skuInfos = productSkuApi.getSkuList(CollectionUtils.convertSet(items, Item::getSkuId)); Map skuInfoMap = CollectionUtils.convertMap(skuInfos, ProductSkuRespDTO::getId);