Commit 2e5cc0537b8002e174a695bc0e2d79bbebda8aba
1 parent
7b727d5c
重构:将订单的分支流程,抽到 TradeOrderHandler 实现类中
Showing
10 changed files
with
355 additions
and
232 deletions
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
| ... | ... | @@ -14,23 +14,12 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 14 | 14 | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| 15 | 15 | import cn.iocoder.yudao.module.member.api.address.AddressApi; |
| 16 | 16 | import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO; |
| 17 | -import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | |
| 18 | -import cn.iocoder.yudao.module.member.api.point.MemberPointApi; | |
| 19 | -import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | |
| 20 | -import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | |
| 21 | -import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; | |
| 22 | -import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | |
| 23 | 17 | import cn.iocoder.yudao.module.pay.api.order.PayOrderApi; |
| 24 | 18 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO; |
| 25 | 19 | import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO; |
| 26 | 20 | import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum; |
| 27 | 21 | import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi; |
| 28 | 22 | import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; |
| 29 | -import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; | |
| 30 | -import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; | |
| 31 | -import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi; | |
| 32 | -import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; | |
| 33 | -import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; | |
| 34 | 23 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO; |
| 35 | 24 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO; |
| 36 | 25 | import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderUpdateAddressReqVO; |
| ... | ... | @@ -40,7 +29,6 @@ import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettle |
| 40 | 29 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.AppTradeOrderSettlementRespVO; |
| 41 | 30 | import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO; |
| 42 | 31 | import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; |
| 43 | -import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; | |
| 44 | 32 | import cn.iocoder.yudao.module.trade.dal.dataobject.cart.CartDO; |
| 45 | 33 | import cn.iocoder.yudao.module.trade.dal.dataobject.delivery.DeliveryExpressDO; |
| 46 | 34 | import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; |
| ... | ... | @@ -48,15 +36,11 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; |
| 48 | 36 | import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper; |
| 49 | 37 | import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper; |
| 50 | 38 | import cn.iocoder.yudao.module.trade.dal.redis.no.TradeNoRedisDAO; |
| 51 | -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; | |
| 52 | 39 | import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; |
| 53 | 40 | import cn.iocoder.yudao.module.trade.enums.order.*; |
| 54 | 41 | import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; |
| 55 | 42 | import cn.iocoder.yudao.module.trade.framework.order.core.annotations.TradeOrderLog; |
| 56 | 43 | import cn.iocoder.yudao.module.trade.framework.order.core.utils.TradeOrderLogUtils; |
| 57 | -import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; | |
| 58 | -import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService; | |
| 59 | -import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; | |
| 60 | 44 | import cn.iocoder.yudao.module.trade.service.cart.CartService; |
| 61 | 45 | import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; |
| 62 | 46 | import cn.iocoder.yudao.module.trade.service.message.TradeMessageService; |
| ... | ... | @@ -68,13 +52,15 @@ import cn.iocoder.yudao.module.trade.service.price.bo.TradePriceCalculateRespBO; |
| 68 | 52 | import cn.iocoder.yudao.module.trade.service.price.calculator.TradePriceCalculatorHelper; |
| 69 | 53 | import lombok.extern.slf4j.Slf4j; |
| 70 | 54 | import org.jetbrains.annotations.NotNull; |
| 71 | -import org.springframework.scheduling.annotation.Async; | |
| 72 | 55 | import org.springframework.stereotype.Service; |
| 73 | 56 | import org.springframework.transaction.annotation.Transactional; |
| 74 | 57 | |
| 75 | 58 | import javax.annotation.Resource; |
| 76 | 59 | import java.time.LocalDateTime; |
| 77 | -import java.util.*; | |
| 60 | +import java.util.ArrayList; | |
| 61 | +import java.util.List; | |
| 62 | +import java.util.Objects; | |
| 63 | +import java.util.Set; | |
| 78 | 64 | |
| 79 | 65 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 80 | 66 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; |
| ... | ... | @@ -109,30 +95,12 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 109 | 95 | private DeliveryExpressService deliveryExpressService; |
| 110 | 96 | @Resource |
| 111 | 97 | private TradeMessageService tradeMessageService; |
| 112 | - @Resource | |
| 113 | - private BrokerageUserService brokerageUserService; | |
| 114 | - @Resource | |
| 115 | - private BrokerageRecordService brokerageRecordService; | |
| 116 | 98 | |
| 117 | 99 | @Resource |
| 118 | - private ProductSpuApi productSpuApi; | |
| 119 | - @Resource | |
| 120 | - private ProductSkuApi productSkuApi; | |
| 121 | - @Resource | |
| 122 | 100 | private PayOrderApi payOrderApi; |
| 123 | 101 | @Resource |
| 124 | 102 | private AddressApi addressApi; |
| 125 | 103 | @Resource |
| 126 | - private CouponApi couponApi; | |
| 127 | - @Resource | |
| 128 | - private CombinationRecordApi combinationRecordApi; | |
| 129 | - @Resource | |
| 130 | - private MemberUserApi memberUserApi; | |
| 131 | - @Resource | |
| 132 | - private MemberLevelApi memberLevelApi; | |
| 133 | - @Resource | |
| 134 | - private MemberPointApi memberPointApi; | |
| 135 | - @Resource | |
| 136 | 104 | private ProductCommentApi productCommentApi; |
| 137 | 105 | |
| 138 | 106 | @Resource |
| ... | ... | @@ -199,7 +167,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 199 | 167 | List<TradeOrderItemDO> orderItems = buildTradeOrderItems(order, calculateRespBO); |
| 200 | 168 | |
| 201 | 169 | // 2. 订单创建前的逻辑 |
| 202 | - beforeCreateTradeOrder(order, orderItems); | |
| 170 | + tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems)); | |
| 203 | 171 | |
| 204 | 172 | // 3. 保存订单 |
| 205 | 173 | tradeOrderMapper.insert(order); |
| ... | ... | @@ -234,11 +202,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 234 | 202 | order.setReceiverName(createReqVO.getReceiverName()).setReceiverMobile(createReqVO.getReceiverMobile()); |
| 235 | 203 | order.setPickUpVerifyCode(RandomUtil.randomNumbers(8)); // 随机一个核销码,长度为 8 位 |
| 236 | 204 | } |
| 237 | - // 设置订单推广人 | |
| 238 | - BrokerageUserDO brokerageUser = brokerageUserService.getBrokerageUser(order.getUserId()); | |
| 239 | - if (brokerageUser != null && brokerageUser.getBindUserId() != null) { | |
| 240 | - order.setBrokerageUserId(brokerageUser.getBindUserId()); | |
| 241 | - } | |
| 242 | 205 | return order; |
| 243 | 206 | } |
| 244 | 207 | |
| ... | ... | @@ -248,21 +211,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 248 | 211 | } |
| 249 | 212 | |
| 250 | 213 | /** |
| 251 | - * 订单创建前,执行前置逻辑 | |
| 252 | - * | |
| 253 | - * @param order 订单 | |
| 254 | - * @param orderItems 订单项 | |
| 255 | - */ | |
| 256 | - private void beforeCreateTradeOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 257 | - // 1. 执行订单创建前置处理器 | |
| 258 | - // TODO @puhui999:这里有个纠结点;handler 的定义是只处理指定类型的订单的拓展逻辑;还是通用的 handler,类似可以处理优惠劵等等 | |
| 259 | - tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems)); | |
| 260 | - | |
| 261 | - // 2. 下单时扣减商品库存 | |
| 262 | - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems)); | |
| 263 | - } | |
| 264 | - | |
| 265 | - /** | |
| 266 | 214 | * 订单创建后,执行后置逻辑 |
| 267 | 215 | * <p> |
| 268 | 216 | * 例如说:优惠劵的扣减、积分的扣减、支付单的创建等等 |
| ... | ... | @@ -276,27 +224,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 276 | 224 | // 1. 执行订单创建后置处理器 |
| 277 | 225 | tradeOrderHandlers.forEach(handler -> handler.afterOrderCreate(order, orderItems)); |
| 278 | 226 | |
| 279 | - // 2. 有使用优惠券时更新 | |
| 280 | - // 不在前置扣减的原因,是因为优惠劵要记录使用的订单号 | |
| 281 | - if (order.getCouponId() != null) { | |
| 282 | - couponApi.useCoupon(new CouponUseReqDTO().setId(order.getCouponId()).setUserId(order.getUserId()) | |
| 283 | - .setOrderId(order.getId())); | |
| 284 | - } | |
| 285 | - | |
| 286 | - // 3. 扣减积分(抵扣) | |
| 287 | - // 不在前置扣减的原因,是因为积分扣减时,需要记录关联业务 | |
| 288 | - reduceUserPoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE, order.getId()); | |
| 289 | - | |
| 290 | - // 4. 删除购物车商品 | |
| 227 | + // 2. 删除购物车商品 | |
| 291 | 228 | Set<Long> cartIds = convertSet(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId); |
| 292 | 229 | if (CollUtil.isNotEmpty(cartIds)) { |
| 293 | 230 | cartService.deleteCart(order.getUserId(), cartIds); |
| 294 | 231 | } |
| 295 | 232 | |
| 296 | - // 5. 生成预支付 | |
| 233 | + // 3. 生成预支付 | |
| 297 | 234 | createPayOrder(order, orderItems); |
| 298 | 235 | |
| 299 | - // 6. 插入订单日志 | |
| 236 | + // 4. 插入订单日志 | |
| 300 | 237 | TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getStatus()); |
| 301 | 238 | |
| 302 | 239 | // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来! |
| ... | ... | @@ -330,18 +267,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 330 | 267 | throw exception(ORDER_UPDATE_PAID_STATUS_NOT_UNPAID); |
| 331 | 268 | } |
| 332 | 269 | |
| 333 | - // 3、订单支付成功后 | |
| 270 | + // 3. 执行 TradeOrderHandler 的后置处理 | |
| 334 | 271 | List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id); |
| 335 | 272 | tradeOrderHandlers.forEach(handler -> handler.afterPayOrder(order, orderItems)); |
| 336 | 273 | |
| 337 | - // 4.1 增加用户积分(赠送) | |
| 338 | - addUserPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE, order.getId()); | |
| 339 | - // 4.2 增加用户经验 | |
| 340 | - getSelf().addUserExperienceAsync(order.getUserId(), order.getPayPrice(), order.getId()); | |
| 341 | - // 4.3 增加用户佣金 | |
| 342 | - getSelf().addBrokerageAsync(order.getUserId(), order.getId()); | |
| 343 | - | |
| 344 | - // 5. 记录订单日志 | |
| 274 | + // 4. 记录订单日志 | |
| 345 | 275 | TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.UNDELIVERED.getStatus()); |
| 346 | 276 | TradeOrderLogUtils.setUserInfo(order.getUserId(), UserTypeEnum.MEMBER.getValue()); |
| 347 | 277 | } |
| ... | ... | @@ -434,8 +364,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 434 | 364 | .put("logisticsNo", express != null ? deliveryReqVO.getLogisticsNo() : "").build()); |
| 435 | 365 | |
| 436 | 366 | // 4. 发送站内信 |
| 437 | - tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO().setOrderId(order.getId()) | |
| 438 | - .setUserId(order.getUserId()).setMessage(null)); | |
| 367 | + tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO() | |
| 368 | + .setOrderId(order.getId()).setUserId(order.getUserId()).setMessage(null)); | |
| 439 | 369 | } |
| 440 | 370 | |
| 441 | 371 | /** |
| ... | ... | @@ -448,18 +378,13 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 448 | 378 | */ |
| 449 | 379 | private TradeOrderDO validateOrderDeliverable(Long id) { |
| 450 | 380 | TradeOrderDO order = validateOrderExists(id); |
| 451 | - // 校验订单是否退款 | |
| 381 | + // 1. 校验订单是否未发货 | |
| 452 | 382 | if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) { |
| 453 | 383 | throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE); |
| 454 | 384 | } |
| 455 | - // 订单类型:拼团 | |
| 456 | - if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) { | |
| 457 | - // 校验订单拼团是否成功 | |
| 458 | - if (!combinationRecordApi.isCombinationRecordSuccess(order.getUserId(), order.getId())) { | |
| 459 | - throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS); | |
| 460 | - } | |
| 461 | - } | |
| 462 | 385 | |
| 386 | + // 2. 执行 TradeOrderHandler 前置处理 | |
| 387 | + tradeOrderHandlers.forEach(handler -> handler.beforeDeliveryOrder(order)); | |
| 463 | 388 | return order; |
| 464 | 389 | } |
| 465 | 390 | |
| ... | ... | @@ -616,30 +541,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 616 | 541 | * @param cancelType 取消类型 |
| 617 | 542 | */ |
| 618 | 543 | private void cancelOrder0(TradeOrderDO order, TradeOrderCancelTypeEnum cancelType) { |
| 619 | - Long id = order.getId(); | |
| 620 | 544 | // 1. 更新 TradeOrderDO 状态为已取消 |
| 621 | - int updateCount = tradeOrderMapper.updateByIdAndStatus(id, order.getStatus(), | |
| 545 | + int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), | |
| 622 | 546 | new TradeOrderDO().setStatus(TradeOrderStatusEnum.CANCELED.getStatus()) |
| 623 | 547 | .setCancelType(cancelType.getType()).setCancelTime(LocalDateTime.now())); |
| 624 | 548 | if (updateCount == 0) { |
| 625 | 549 | throw exception(ORDER_CANCEL_FAIL_STATUS_NOT_UNPAID); |
| 626 | 550 | } |
| 627 | 551 | |
| 628 | - List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id); | |
| 629 | - // 3. 回滚库存 | |
| 630 | - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems)); | |
| 631 | - // 3.1、 活动相关的回滚 | |
| 632 | - tradeOrderHandlers.forEach(handler -> handler.cancelOrder(order, orderItems)); | |
| 633 | - | |
| 634 | - // 4. 回滚优惠券 | |
| 635 | - if (order.getCouponId() != null && order.getCouponId() > 0) { | |
| 636 | - couponApi.returnUsedCoupon(order.getCouponId()); | |
| 637 | - } | |
| 638 | - | |
| 639 | - // 5. 回滚积分(抵扣的) | |
| 640 | - addUserPoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_CANCEL, order.getId()); | |
| 552 | + // 2. 执行 TradeOrderHandler 的后置处理 | |
| 553 | + List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId()); | |
| 554 | + tradeOrderHandlers.forEach(handler -> handler.afterCancelOrder(order, orderItems)); | |
| 641 | 555 | |
| 642 | - // 6. 增加订单日志 | |
| 556 | + // 3. 增加订单日志 | |
| 643 | 557 | TradeOrderLogUtils.setOrderInfo(order.getId(), order.getStatus(), TradeOrderStatusEnum.CANCELED.getStatus()); |
| 644 | 558 | } |
| 645 | 559 | |
| ... | ... | @@ -660,8 +574,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 660 | 574 | .setStatus(TradeOrderStatusEnum.CANCELED.getStatus()) |
| 661 | 575 | .setCancelType(TradeOrderCancelTypeEnum.AFTER_SALE_CLOSE.getType()).setCancelTime(LocalDateTime.now())); |
| 662 | 576 | |
| 663 | - // 2. 退还优惠券 | |
| 664 | - couponApi.returnUsedCoupon(order.getCouponId()); | |
| 577 | + // 2. 执行 TradeOrderHandler 的后置处理 | |
| 578 | + List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(order.getId()); | |
| 579 | + tradeOrderHandlers.forEach(handler -> handler.afterCancelOrder(order, orderItems)); | |
| 665 | 580 | } |
| 666 | 581 | |
| 667 | 582 | @Override |
| ... | ... | @@ -790,13 +705,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 790 | 705 | @Override |
| 791 | 706 | @Transactional(rollbackFor = Exception.class) |
| 792 | 707 | public void updateOrderItemWhenAfterSaleSuccess(Long id, Integer refundPrice) { |
| 793 | - // 1. 更新订单项 | |
| 708 | + // 1.1 更新订单项 | |
| 794 | 709 | updateOrderItemAfterSaleStatus(id, TradeOrderItemAfterSaleStatusEnum.APPLY.getStatus(), |
| 795 | 710 | TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus(), null); |
| 796 | - | |
| 797 | - // 2.1 更新订单的退款金额、积分 | |
| 711 | + // 1.2 执行 TradeOrderHandler 的后置处理 | |
| 798 | 712 | TradeOrderItemDO orderItem = tradeOrderItemMapper.selectById(id); |
| 799 | 713 | TradeOrderDO order = tradeOrderMapper.selectById(orderItem.getOrderId()); |
| 714 | + tradeOrderHandlers.forEach(handler -> handler.afterCancelOrderItem(order, orderItem)); | |
| 715 | + | |
| 716 | + // 2.1 更新订单的退款金额、积分 | |
| 800 | 717 | Integer orderRefundPrice = order.getRefundPrice() + refundPrice; |
| 801 | 718 | Integer orderRefundPoint = order.getRefundPoint() + orderItem.getUsePoint(); |
| 802 | 719 | Integer refundStatus = isAllOrderItemAfterSaleSuccess(order.getId()) ? |
| ... | ... | @@ -807,23 +724,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 807 | 724 | .setRefundPrice(orderRefundPrice).setRefundPoint(orderRefundPoint)); |
| 808 | 725 | // 2.2 如果全部退款,则进行取消订单 |
| 809 | 726 | getSelf().cancelOrderByAfterSale(order, orderRefundPrice); |
| 810 | - | |
| 811 | - | |
| 812 | - // 3. 回滚库存 | |
| 813 | - productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(Collections.singletonList(orderItem))); | |
| 814 | - // 3.1、 活动相关的回滚 | |
| 815 | - tradeOrderHandlers.forEach(handler -> handler.cancelOrder(order, Collections.singletonList(orderItem))); | |
| 816 | - | |
| 817 | - // 4.1 回滚积分:扣减用户积分(赠送的) | |
| 818 | - reduceUserPoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, orderItem.getAfterSaleId()); | |
| 819 | - // 4.2 回滚积分:增加用户积分(返还抵扣) | |
| 820 | - addUserPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, orderItem.getAfterSaleId()); | |
| 821 | - | |
| 822 | - // 5. 回滚经验:扣减用户经验 | |
| 823 | - getSelf().reduceUserExperienceAsync(order.getUserId(), refundPrice, orderItem.getAfterSaleId()); | |
| 824 | - | |
| 825 | - // 6. 回滚佣金:更新分佣记录为已失效 | |
| 826 | - getSelf().cancelBrokerageAsync(order.getUserId(), id); | |
| 827 | 727 | } |
| 828 | 728 | |
| 829 | 729 | @Override |
| ... | ... | @@ -840,6 +740,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 840 | 740 | if (updateCount <= 0) { |
| 841 | 741 | throw exception(ORDER_ITEM_UPDATE_AFTER_SALE_STATUS_FAIL); |
| 842 | 742 | } |
| 743 | + | |
| 843 | 744 | } |
| 844 | 745 | |
| 845 | 746 | /** |
| ... | ... | @@ -940,7 +841,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 940 | 841 | @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.SYSTEM_COMMENT) |
| 941 | 842 | public void createOrderItemCommentBySystemBySystem(TradeOrderDO order) { |
| 942 | 843 | // 1. 查询未评论的订单项 |
| 943 | - List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderIdAndCommentStatus(order.getId(), Boolean.FALSE); | |
| 844 | + List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderIdAndCommentStatus( | |
| 845 | + order.getId(), Boolean.FALSE); | |
| 944 | 846 | if (CollUtil.isEmpty(orderItems)) { |
| 945 | 847 | return; |
| 946 | 848 | } |
| ... | ... | @@ -983,73 +885,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { |
| 983 | 885 | |
| 984 | 886 | // =================== 营销相关的操作 =================== |
| 985 | 887 | |
| 986 | - @Async | |
| 987 | - protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) { | |
| 988 | - int bizType = MemberExperienceBizTypeEnum.ORDER.getType(); | |
| 989 | - memberLevelApi.addExperience(userId, payPrice, bizType, String.valueOf(orderId)); | |
| 990 | - } | |
| 991 | - | |
| 992 | - @Async | |
| 993 | - protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId) { | |
| 994 | - int bizType = MemberExperienceBizTypeEnum.REFUND.getType(); | |
| 995 | - memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId)); | |
| 996 | - } | |
| 997 | - | |
| 998 | - /** | |
| 999 | - * 添加用户积分 | |
| 1000 | - * <p> | |
| 1001 | - * 目前是支付成功后,就会创建积分记录。 | |
| 1002 | - * <p> | |
| 1003 | - * 业内还有两种做法,可以根据自己的业务调整: | |
| 1004 | - * 1. 确认收货后,才创建积分记录 | |
| 1005 | - * 2. 支付 or 下单成功时,创建积分记录(冻结),确认收货解冻或者 n 天后解冻 | |
| 1006 | - * | |
| 1007 | - * @param userId 用户编号 | |
| 1008 | - * @param point 增加积分数量 | |
| 1009 | - * @param bizType 业务编号 | |
| 1010 | - * @param bizId 业务编号 | |
| 1011 | - */ | |
| 1012 | - protected void addUserPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) { | |
| 1013 | - if (point != null && point > 0) { | |
| 1014 | - memberPointApi.addPoint(userId, point, bizType.getType(), String.valueOf(bizId)); | |
| 1015 | - } | |
| 1016 | - } | |
| 1017 | - | |
| 1018 | - protected void reduceUserPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) { | |
| 1019 | - if (point != null && point > 0) { | |
| 1020 | - memberPointApi.reducePoint(userId, point, bizType.getType(), String.valueOf(bizId)); | |
| 1021 | - } | |
| 1022 | - } | |
| 1023 | - | |
| 1024 | - /** | |
| 1025 | - * 创建分销记录 | |
| 1026 | - * <p> | |
| 1027 | - * 目前是支付成功后,就会创建分销记录。 | |
| 1028 | - * <p> | |
| 1029 | - * 业内还有两种做法,可以根据自己的业务调整: | |
| 1030 | - * 1. 确认收货后,才创建分销记录 | |
| 1031 | - * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻 | |
| 1032 | - * | |
| 1033 | - * @param userId 用户编号 | |
| 1034 | - * @param orderId 订单编号 | |
| 1035 | - */ | |
| 1036 | - @Async | |
| 1037 | - protected void addBrokerageAsync(Long userId, Long orderId) { | |
| 1038 | - MemberUserRespDTO user = memberUserApi.getUser(userId); | |
| 1039 | - Assert.notNull(user); | |
| 1040 | - // 每一个订单项,都会去生成分销记录 | |
| 1041 | - List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(orderId); | |
| 1042 | - List<BrokerageAddReqBO> addList = convertList(orderItems, | |
| 1043 | - item -> TradeOrderConvert.INSTANCE.convert(user, item, | |
| 1044 | - productSpuApi.getSpu(item.getSpuId()), productSkuApi.getSku(item.getSkuId()))); | |
| 1045 | - brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList); | |
| 1046 | - } | |
| 1047 | - | |
| 1048 | - @Async | |
| 1049 | - protected void cancelBrokerageAsync(Long userId, Long orderItemId) { | |
| 1050 | - brokerageRecordService.cancelBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItemId)); | |
| 1051 | - } | |
| 1052 | - | |
| 1053 | 888 | /** |
| 1054 | 889 | * 获得自身的代理对象,解决 AOP 生效问题 |
| 1055 | 890 | * | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainHandler.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBargainOrderHandler.java
| ... | ... | @@ -11,12 +11,12 @@ import javax.annotation.Resource; |
| 11 | 11 | import java.util.List; |
| 12 | 12 | |
| 13 | 13 | /** |
| 14 | - * 砍价订单 handler 实现类 | |
| 14 | + * 砍价订单的 {@link TradeOrderHandler} 实现类 | |
| 15 | 15 | * |
| 16 | 16 | * @author HUIHUI |
| 17 | 17 | */ |
| 18 | 18 | @Component |
| 19 | -public class TradeBargainHandler implements TradeOrderHandler { | |
| 19 | +public class TradeBargainOrderHandler implements TradeOrderHandler { | |
| 20 | 20 | |
| 21 | 21 | @Resource |
| 22 | 22 | private BargainActivityApi bargainActivityApi; |
| ... | ... | @@ -25,7 +25,7 @@ public class TradeBargainHandler implements TradeOrderHandler { |
| 25 | 25 | |
| 26 | 26 | @Override |
| 27 | 27 | public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { |
| 28 | - if (TradeOrderTypeEnum.isBargain(order.getType())) { | |
| 28 | + if (!TradeOrderTypeEnum.isBargain(order.getType())) { | |
| 29 | 29 | return; |
| 30 | 30 | } |
| 31 | 31 | |
| ... | ... | @@ -36,7 +36,7 @@ public class TradeBargainHandler implements TradeOrderHandler { |
| 36 | 36 | |
| 37 | 37 | @Override |
| 38 | 38 | public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { |
| 39 | - if (TradeOrderTypeEnum.isBargain(order.getType())) { | |
| 39 | + if (!TradeOrderTypeEnum.isBargain(order.getType())) { | |
| 40 | 40 | return; |
| 41 | 41 | } |
| 42 | 42 | |
| ... | ... | @@ -44,12 +44,4 @@ public class TradeBargainHandler implements TradeOrderHandler { |
| 44 | 44 | bargainRecordApi.updateBargainRecordOrderId(order.getBargainRecordId(), order.getId()); |
| 45 | 45 | } |
| 46 | 46 | |
| 47 | - @Override | |
| 48 | - public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 49 | - if (TradeOrderTypeEnum.isBargain(order.getType())) { | |
| 50 | - return; | |
| 51 | - } | |
| 52 | - // TODO 芋艿:取消订单时,需要增加库存 | |
| 53 | - } | |
| 54 | - | |
| 55 | 47 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeBrokerageOrderHandler.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.trade.service.order.handler; | |
| 2 | + | |
| 3 | +import cn.hutool.core.lang.Assert; | |
| 4 | +import cn.iocoder.yudao.module.member.api.user.MemberUserApi; | |
| 5 | +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | |
| 6 | +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; | |
| 7 | +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; | |
| 8 | +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi; | |
| 9 | +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; | |
| 10 | +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; | |
| 11 | +import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; | |
| 12 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | |
| 13 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | |
| 14 | +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum; | |
| 15 | +import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; | |
| 16 | +import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageUserService; | |
| 17 | +import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; | |
| 18 | +import org.springframework.stereotype.Component; | |
| 19 | + | |
| 20 | +import javax.annotation.Resource; | |
| 21 | +import java.util.List; | |
| 22 | + | |
| 23 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | |
| 24 | + | |
| 25 | +/** | |
| 26 | + * 订单分销的 {@link TradeOrderHandler} 实现类 | |
| 27 | + * | |
| 28 | + * @author 芋道源码 | |
| 29 | + */ | |
| 30 | +@Component | |
| 31 | +public class TradeBrokerageOrderHandler implements TradeOrderHandler { | |
| 32 | + | |
| 33 | + @Resource | |
| 34 | + private MemberUserApi memberUserApi; | |
| 35 | + @Resource | |
| 36 | + private ProductSpuApi productSpuApi; | |
| 37 | + @Resource | |
| 38 | + private ProductSkuApi productSkuApi; | |
| 39 | + | |
| 40 | + @Resource | |
| 41 | + private BrokerageRecordService brokerageRecordService; | |
| 42 | + @Resource | |
| 43 | + private BrokerageUserService brokerageUserService; | |
| 44 | + | |
| 45 | + @Override | |
| 46 | + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 47 | + // 设置订单推广人 | |
| 48 | + BrokerageUserDO brokerageUser = brokerageUserService.getBrokerageUser(order.getUserId()); | |
| 49 | + if (brokerageUser != null && brokerageUser.getBindUserId() != null) { | |
| 50 | + order.setBrokerageUserId(brokerageUser.getBindUserId()); | |
| 51 | + } | |
| 52 | + } | |
| 53 | + | |
| 54 | + @Override | |
| 55 | + public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 56 | + if (order.getBrokerageUserId() != null) { | |
| 57 | + addBrokerage(order.getUserId(), orderItems); | |
| 58 | + } | |
| 59 | + } | |
| 60 | + | |
| 61 | + @Override | |
| 62 | + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 63 | + // TODO 芋艿:取消支付时,需要处理下; | |
| 64 | + } | |
| 65 | + | |
| 66 | + @Override | |
| 67 | + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { | |
| 68 | + if (order.getBrokerageUserId() != null) { | |
| 69 | + cancelBrokerage(order.getId(), orderItem.getOrderId()); | |
| 70 | + } | |
| 71 | + } | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * 创建分销记录 | |
| 75 | + * <p> | |
| 76 | + * 目前是支付成功后,就会创建分销记录。 | |
| 77 | + * <p> | |
| 78 | + * 业内还有两种做法,可以根据自己的业务调整: | |
| 79 | + * 1. 确认收货后,才创建分销记录 | |
| 80 | + * 2. 支付 or 下单成功时,创建分销记录(冻结),确认收货解冻或者 n 天后解冻 | |
| 81 | + * | |
| 82 | + * @param userId 用户编号 | |
| 83 | + * @param orderItems 订单项 | |
| 84 | + */ | |
| 85 | + protected void addBrokerage(Long userId, List<TradeOrderItemDO> orderItems) { | |
| 86 | + MemberUserRespDTO user = memberUserApi.getUser(userId); | |
| 87 | + Assert.notNull(user); | |
| 88 | + ProductSpuRespDTO spu = productSpuApi.getSpu(orderItems.get(0).getSpuId()); | |
| 89 | + Assert.notNull(spu); | |
| 90 | + ProductSkuRespDTO sku = productSkuApi.getSku(orderItems.get(0).getSkuId()); | |
| 91 | + | |
| 92 | + // 每一个订单项,都会去生成分销记录 | |
| 93 | + List<BrokerageAddReqBO> addList = convertList(orderItems, | |
| 94 | + item -> TradeOrderConvert.INSTANCE.convert(user, item, spu, sku)); | |
| 95 | + brokerageRecordService.addBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, addList); | |
| 96 | + } | |
| 97 | + | |
| 98 | + protected void cancelBrokerage(Long userId, Long orderItemId) { | |
| 99 | + brokerageRecordService.cancelBrokerage(userId, BrokerageRecordBizTypeEnum.ORDER, String.valueOf(orderItemId)); | |
| 100 | + } | |
| 101 | + | |
| 102 | +} | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationHandler.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCombinationOrderHandler.java
| ... | ... | @@ -11,13 +11,16 @@ import org.springframework.stereotype.Component; |
| 11 | 11 | import javax.annotation.Resource; |
| 12 | 12 | import java.util.List; |
| 13 | 13 | |
| 14 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | |
| 15 | +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS; | |
| 16 | + | |
| 14 | 17 | /** |
| 15 | - * 拼团订单 handler 接口实现类 | |
| 18 | + * 拼团订单的 {@link TradeOrderHandler} 实现类 | |
| 16 | 19 | * |
| 17 | 20 | * @author HUIHUI |
| 18 | 21 | */ |
| 19 | 22 | @Component |
| 20 | -public class TradeCombinationHandler implements TradeOrderHandler { | |
| 23 | +public class TradeCombinationOrderHandler implements TradeOrderHandler { | |
| 21 | 24 | |
| 22 | 25 | @Resource |
| 23 | 26 | private CombinationRecordApi combinationRecordApi; |
| ... | ... | @@ -25,7 +28,7 @@ public class TradeCombinationHandler implements TradeOrderHandler { |
| 25 | 28 | @Override |
| 26 | 29 | public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { |
| 27 | 30 | // 如果不是拼团订单则结束 |
| 28 | - if (TradeOrderTypeEnum.isCombination(order.getType())) { | |
| 31 | + if (!TradeOrderTypeEnum.isCombination(order.getType())) { | |
| 29 | 32 | return; |
| 30 | 33 | } |
| 31 | 34 | Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); |
| ... | ... | @@ -40,22 +43,26 @@ public class TradeCombinationHandler implements TradeOrderHandler { |
| 40 | 43 | @Override |
| 41 | 44 | public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { |
| 42 | 45 | // 如果不是拼团订单则结束 |
| 43 | - if (TradeOrderTypeEnum.isCombination(order.getType())) { | |
| 46 | + if (!TradeOrderTypeEnum.isCombination(order.getType())) { | |
| 44 | 47 | return; |
| 45 | 48 | } |
| 46 | 49 | Assert.isTrue(orderItems.size() == 1, "拼团时,只允许选择一个商品"); |
| 47 | 50 | |
| 48 | - // 获取商品信息 | |
| 49 | - TradeOrderItemDO item = orderItems.get(0); | |
| 50 | 51 | // 创建拼团记录 |
| 52 | + TradeOrderItemDO item = orderItems.get(0); | |
| 51 | 53 | combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, item)); |
| 52 | 54 | } |
| 53 | 55 | |
| 54 | 56 | @Override |
| 55 | - public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 56 | - if (TradeOrderTypeEnum.isCombination(order.getType())) { | |
| 57 | + public void beforeDeliveryOrder(TradeOrderDO order) { | |
| 58 | + if (!TradeOrderTypeEnum.isCombination(order.getType())) { | |
| 57 | 59 | return; |
| 58 | 60 | } |
| 61 | + // 校验订单拼团是否成功 | |
| 62 | + if (!combinationRecordApi.isCombinationRecordSuccess(order.getUserId(), order.getId())) { | |
| 63 | + throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS); | |
| 64 | + } | |
| 59 | 65 | } |
| 60 | 66 | |
| 61 | 67 | } |
| 68 | + | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeCouponOrderHandler.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.trade.service.order.handler; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi; | |
| 4 | +import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO; | |
| 5 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | |
| 6 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | |
| 7 | +import org.springframework.stereotype.Component; | |
| 8 | + | |
| 9 | +import javax.annotation.Resource; | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * 优惠劵的 {@link TradeOrderHandler} 实现类 | |
| 14 | + * | |
| 15 | + * @author 芋道源码 | |
| 16 | + */ | |
| 17 | +@Component | |
| 18 | +public class TradeCouponOrderHandler implements TradeOrderHandler { | |
| 19 | + | |
| 20 | + @Resource | |
| 21 | + private CouponApi couponApi; | |
| 22 | + | |
| 23 | + @Override | |
| 24 | + public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 25 | + if (order.getCouponId() == null || order.getCouponId() <= 0) { | |
| 26 | + return; | |
| 27 | + } | |
| 28 | + // 不在前置扣减的原因,是因为优惠劵要记录使用的订单号 | |
| 29 | + couponApi.useCoupon(new CouponUseReqDTO().setId(order.getCouponId()).setUserId(order.getUserId()) | |
| 30 | + .setOrderId(order.getId())); | |
| 31 | + } | |
| 32 | + | |
| 33 | + @Override | |
| 34 | + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 35 | + if (order.getCouponId() == null || order.getCouponId() <= 0) { | |
| 36 | + return; | |
| 37 | + } | |
| 38 | + // 退回优惠劵 | |
| 39 | + couponApi.returnUsedCoupon(order.getCouponId()); | |
| 40 | + } | |
| 41 | + | |
| 42 | +} | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeMemberPointOrderHandler.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.trade.service.order.handler; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.member.api.level.MemberLevelApi; | |
| 4 | +import cn.iocoder.yudao.module.member.api.point.MemberPointApi; | |
| 5 | +import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum; | |
| 6 | +import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum; | |
| 7 | +import cn.iocoder.yudao.module.trade.dal.dataobject.aftersale.AfterSaleDO; | |
| 8 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | |
| 9 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | |
| 10 | +import cn.iocoder.yudao.module.trade.service.aftersale.AfterSaleService; | |
| 11 | +import org.springframework.stereotype.Component; | |
| 12 | + | |
| 13 | +import javax.annotation.Resource; | |
| 14 | +import java.util.List; | |
| 15 | + | |
| 16 | +/** | |
| 17 | + * 会员积分、等级的 {@link TradeOrderHandler} 实现类 | |
| 18 | + * | |
| 19 | + * @author owen | |
| 20 | + */ | |
| 21 | +@Component | |
| 22 | +public class TradeMemberPointOrderHandler implements TradeOrderHandler { | |
| 23 | + | |
| 24 | + @Resource | |
| 25 | + private MemberPointApi memberPointApi; | |
| 26 | + @Resource | |
| 27 | + private MemberLevelApi memberLevelApi; | |
| 28 | + | |
| 29 | + @Resource | |
| 30 | + private AfterSaleService afterSaleService; | |
| 31 | + | |
| 32 | + @Override | |
| 33 | + public void afterOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 34 | + // 扣减用户积分(订单抵扣)。不在前置扣减的原因,是因为积分扣减时,需要记录关联业务 | |
| 35 | + reducePoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_USE, order.getId()); | |
| 36 | + } | |
| 37 | + | |
| 38 | + @Override | |
| 39 | + public void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 40 | + // 增加用户积分(订单赠送) | |
| 41 | + addPoint(order.getUserId(), order.getGivePoint(), MemberPointBizTypeEnum.ORDER_GIVE, | |
| 42 | + order.getId()); | |
| 43 | + | |
| 44 | + // 增加用户经验 | |
| 45 | + memberLevelApi.addExperience(order.getUserId(), order.getPayPrice(), MemberExperienceBizTypeEnum.ORDER.getType(), | |
| 46 | + String.valueOf(order.getId())); | |
| 47 | + } | |
| 48 | + | |
| 49 | + @Override | |
| 50 | + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 51 | + // 扣减(回滚)用户积分(订单抵扣) | |
| 52 | + addPoint(order.getUserId(), order.getUsePoint(), MemberPointBizTypeEnum.ORDER_CANCEL, | |
| 53 | + order.getId()); | |
| 54 | + // TODO 芋艿:需要校验;如果部分子订单已经售后退款,则不进行整单退;因为已经退了一部分积分了 | |
| 55 | + } | |
| 56 | + | |
| 57 | + @Override | |
| 58 | + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { | |
| 59 | + // 扣减(回滚)积分(订单赠送) | |
| 60 | + reducePoint(order.getUserId(), orderItem.getGivePoint(), MemberPointBizTypeEnum.AFTER_SALE_DEDUCT_GIVE, | |
| 61 | + orderItem.getAfterSaleId()); | |
| 62 | + // 扣减(回滚)积分:增加用户积分(返还抵扣) | |
| 63 | + addPoint(order.getUserId(), orderItem.getUsePoint(), MemberPointBizTypeEnum.AFTER_SALE_REFUND_USED, | |
| 64 | + orderItem.getAfterSaleId()); | |
| 65 | + | |
| 66 | + // 扣减(回滚)用户经验 | |
| 67 | + AfterSaleDO afterSale = afterSaleService.getAfterSale(orderItem.getAfterSaleId()); | |
| 68 | + memberLevelApi.addExperience(order.getUserId(), -afterSale.getRefundPrice(), MemberExperienceBizTypeEnum.REFUND.getType(), | |
| 69 | + String.valueOf(orderItem.getAfterSaleId())); | |
| 70 | + } | |
| 71 | + | |
| 72 | + /** | |
| 73 | + * 添加用户积分 | |
| 74 | + * <p> | |
| 75 | + * 目前是支付成功后,就会创建积分记录。 | |
| 76 | + * <p> | |
| 77 | + * 业内还有两种做法,可以根据自己的业务调整: | |
| 78 | + * 1. 确认收货后,才创建积分记录 | |
| 79 | + * 2. 支付 or 下单成功时,创建积分记录(冻结),确认收货解冻或者 n 天后解冻 | |
| 80 | + * | |
| 81 | + * @param userId 用户编号 | |
| 82 | + * @param point 增加积分数量 | |
| 83 | + * @param bizType 业务编号 | |
| 84 | + * @param bizId 业务编号 | |
| 85 | + */ | |
| 86 | + protected void addPoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) { | |
| 87 | + if (point != null && point > 0) { | |
| 88 | + memberPointApi.addPoint(userId, point, bizType.getType(), String.valueOf(bizId)); | |
| 89 | + } | |
| 90 | + } | |
| 91 | + | |
| 92 | + protected void reducePoint(Long userId, Integer point, MemberPointBizTypeEnum bizType, Long bizId) { | |
| 93 | + if (point != null && point > 0) { | |
| 94 | + memberPointApi.reducePoint(userId, point, bizType.getType(), String.valueOf(bizId)); | |
| 95 | + } | |
| 96 | + } | |
| 97 | + | |
| 98 | +} | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeOrderHandler.java
| ... | ... | @@ -35,16 +35,29 @@ public interface TradeOrderHandler { |
| 35 | 35 | * @param order 订单 |
| 36 | 36 | * @param orderItems 订单项 |
| 37 | 37 | */ |
| 38 | - default void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 39 | - } | |
| 38 | + default void afterPayOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {} | |
| 40 | 39 | |
| 41 | 40 | /** |
| 42 | - * 订单取消 | |
| 41 | + * 订单取消后 | |
| 43 | 42 | * |
| 44 | 43 | * @param order 订单 |
| 45 | 44 | * @param orderItems 订单项 |
| 46 | 45 | */ |
| 47 | - default void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 48 | - } | |
| 46 | + default void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) {} | |
| 47 | + | |
| 48 | + /** | |
| 49 | + * 订单项取消后 | |
| 50 | + * | |
| 51 | + * @param order 订单 | |
| 52 | + * @param orderItem 订单项 | |
| 53 | + */ | |
| 54 | + default void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) {} | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * 订单发货前 | |
| 58 | + * | |
| 59 | + * @param order 订单 | |
| 60 | + */ | |
| 61 | + default void beforeDeliveryOrder(TradeOrderDO order) {} | |
| 49 | 62 | |
| 50 | 63 | } | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeProductSkuOrderHandler.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.trade.service.order.handler; | |
| 2 | + | |
| 3 | +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi; | |
| 4 | +import cn.iocoder.yudao.module.trade.convert.order.TradeOrderConvert; | |
| 5 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO; | |
| 6 | +import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO; | |
| 7 | +import org.springframework.stereotype.Component; | |
| 8 | + | |
| 9 | +import javax.annotation.Resource; | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +import static java.util.Collections.singletonList; | |
| 13 | + | |
| 14 | +/** | |
| 15 | + * 商品 SKU 库存的 {@link TradeOrderHandler} 实现类 | |
| 16 | + * | |
| 17 | + * @author 芋道源码 | |
| 18 | + */ | |
| 19 | +@Component | |
| 20 | +public class TradeProductSkuOrderHandler implements TradeOrderHandler { | |
| 21 | + | |
| 22 | + @Resource | |
| 23 | + private ProductSkuApi productSkuApi; | |
| 24 | + | |
| 25 | + @Override | |
| 26 | + public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 27 | + productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems)); | |
| 28 | + } | |
| 29 | + | |
| 30 | + @Override | |
| 31 | + public void afterCancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 32 | + // TODO 芋艿:如果部分售后,最后导致取消;这里需要过滤下; | |
| 33 | + productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(orderItems)); | |
| 34 | + } | |
| 35 | + | |
| 36 | + @Override | |
| 37 | + public void afterCancelOrderItem(TradeOrderDO order, TradeOrderItemDO orderItem) { | |
| 38 | + productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convert(singletonList(orderItem))); | |
| 39 | + } | |
| 40 | + | |
| 41 | +} | ... | ... |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillHandler.java renamed to yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/handler/TradeSeckillOrderHandler.java
| ... | ... | @@ -10,19 +10,19 @@ import javax.annotation.Resource; |
| 10 | 10 | import java.util.List; |
| 11 | 11 | |
| 12 | 12 | /** |
| 13 | - * 秒杀订单 handler 实现类 | |
| 13 | + * 秒杀订单的 {@link TradeOrderHandler} 实现类 | |
| 14 | 14 | * |
| 15 | 15 | * @author HUIHUI |
| 16 | 16 | */ |
| 17 | 17 | @Component |
| 18 | -public class TradeSeckillHandler implements TradeOrderHandler { | |
| 18 | +public class TradeSeckillOrderHandler implements TradeOrderHandler { | |
| 19 | 19 | |
| 20 | 20 | @Resource |
| 21 | 21 | private SeckillActivityApi seckillActivityApi; |
| 22 | 22 | |
| 23 | 23 | @Override |
| 24 | 24 | public void beforeOrderCreate(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { |
| 25 | - if (TradeOrderTypeEnum.isSeckill(order.getType())) { | |
| 25 | + if (!TradeOrderTypeEnum.isSeckill(order.getType())) { | |
| 26 | 26 | return; |
| 27 | 27 | } |
| 28 | 28 | |
| ... | ... | @@ -31,12 +31,4 @@ public class TradeSeckillHandler implements TradeOrderHandler { |
| 31 | 31 | orderItems.get(0).getSkuId(), orderItems.get(0).getCount()); |
| 32 | 32 | } |
| 33 | 33 | |
| 34 | - @Override | |
| 35 | - public void cancelOrder(TradeOrderDO order, List<TradeOrderItemDO> orderItems) { | |
| 36 | - if (TradeOrderTypeEnum.isSeckill(order.getType())) { | |
| 37 | - return; | |
| 38 | - } | |
| 39 | - | |
| 40 | - } | |
| 41 | - | |
| 42 | 34 | } | ... | ... |
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java