Commit c023209aa529d6a8a9f64ceb38d4ac67ba458236

Authored by puhui999
1 parent 51dab968

订单管理:完善订单调价分摊逻辑

yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceImpl.java
... ... @@ -53,8 +53,8 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
53 53 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
54 54 import cn.iocoder.yudao.module.trade.enums.order.*;
55 55 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
56   -import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService;
57 56 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
  57 +import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService;
58 58 import cn.iocoder.yudao.module.trade.service.cart.CartService;
59 59 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
60 60 import cn.iocoder.yudao.module.trade.service.message.TradeMessageService;
... ... @@ -70,14 +70,13 @@ import org.springframework.transaction.annotation.Transactional;
70 70  
71 71 import javax.annotation.Resource;
72 72 import java.time.LocalDateTime;
  73 +import java.util.ArrayList;
73 74 import java.util.List;
74 75 import java.util.Objects;
75 76 import java.util.Set;
76 77  
77 78 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
78 79 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
79   -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.ORDER_UPDATE_PRICE_FAIL_EQUAL;
80   -import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.ORDER_UPDATE_PRICE_FAIL_PAID;
81 80 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
82 81  
83 82 /**
... ... @@ -562,35 +561,67 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
562 561 }
563 562  
564 563 @Override
565   - // TODO @puhui999:考虑事务性
  564 + @Transactional(rollbackFor = Exception.class)
566 565 public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) {
567   - // 校验交易订单
  566 + // 1、校验交易订单
568 567 TradeOrderDO order = validateOrderExists(reqVO.getId());
569 568 if (order.getPayStatus()) {
570 569 throw exception(ORDER_UPDATE_PRICE_FAIL_PAID);
571 570 }
  571 + // 2、校验订单项
  572 + List<TradeOrderItemDO> items = tradeOrderItemMapper.selectListByOrderId(order.getId());
  573 + if (CollUtil.isEmpty(items)) {
  574 + throw exception(ORDER_UPDATE_PRICE_FAIL_NOT_ITEM);
  575 + }
  576 + // 3、校验调价金额是否变化
572 577 if (ObjectUtil.equal(order.getAdjustPrice(), reqVO.getAdjustPrice())) {
573 578 throw exception(ORDER_UPDATE_PRICE_FAIL_EQUAL);
574 579 }
575 580  
576   - // TODO @puhui999:应该是按照 payPrice 分配;并且要考虑取余问题;payPrice 也要考虑,item 里的
577   - List<TradeOrderItemDO> itemDOs = tradeOrderItemMapper.selectListByOrderId(order.getId());
578   - // TradeOrderItemDO 需要做 adjustPrice 的分摊
579   - int price = reqVO.getAdjustPrice() / itemDOs.size();
580   - itemDOs.forEach(item -> {
581   - item.setAdjustPrice(price);
582   - });
583   - // 更新 TradeOrderItem
584   - // TODO @puhui999:不要整个对象去更新哈;应该 new 一下;
585   - tradeOrderItemMapper.updateBatch(itemDOs);
586   - // 更新订单
587   - // TODO @puhui999:要考虑多次修改价格,不能单单的 payPrice + 价格;
588   - TradeOrderDO update = TradeOrderConvert.INSTANCE.convert(reqVO);
589   - update.setPayPrice(update.getPayPrice() + update.getAdjustPrice());
  581 + // 4、更新订单
  582 + TradeOrderDO update = new TradeOrderDO();
  583 + update.setId(order.getId());
  584 + update.setAdjustPrice(reqVO.getAdjustPrice());
  585 + int orderPayPrice = order.getAdjustPrice() != null ? (order.getPayPrice() - order.getAdjustPrice())
  586 + + reqVO.getAdjustPrice() : order.getPayPrice() + reqVO.getAdjustPrice();
  587 + update.setPayPrice(orderPayPrice);
590 588 // TODO @芋艿:改价时,赠送的积分,要不要做改动???
591 589 tradeOrderMapper.updateById(update);
592   - // 更新支付订单
593   - payOrderApi.updatePayOrderPriceById(order.getPayOrderId(), update.getPayPrice());
  590 +
  591 + // TODO @puhui999:应该是按照 payPrice 分配;并且要考虑取余问题;payPrice 也要考虑,item 里的
  592 + // TODO:先按 adjustPrice 实现,没明白 payPrice 怎么搞哈哈哈
  593 + // 5、更新 TradeOrderItem
  594 + if (items.size() > 1) {
  595 + // TradeOrderItemDO 需要做 adjustPrice 的分摊
  596 + int price = reqVO.getAdjustPrice() / items.size();
  597 + int remainderPrice = reqVO.getAdjustPrice() % items.size();
  598 + List<TradeOrderItemDO> orders = new ArrayList<>();
  599 + for (int i = 0; i < items.size(); i++) {
  600 + // 把平摊后剩余的金额加到第一个订单项
  601 + if (remainderPrice != 0 && i == 0) {
  602 + orders.add(convertOrderItemPrice(items.get(i), price + remainderPrice));
  603 + }
  604 + orders.add(convertOrderItemPrice(items.get(i), price));
  605 + }
  606 + tradeOrderItemMapper.updateBatch(orders);
  607 + } else {
  608 + TradeOrderItemDO orderItem = items.get(0);
  609 + TradeOrderItemDO updateItem = convertOrderItemPrice(orderItem, reqVO.getAdjustPrice());
  610 + tradeOrderItemMapper.updateById(updateItem);
  611 + }
  612 +
  613 + // 6、更新支付订单
  614 + payOrderApi.updatePayOrderPrice(order.getPayOrderId(), update.getPayPrice());
  615 + }
  616 +
  617 + private TradeOrderItemDO convertOrderItemPrice(TradeOrderItemDO orderItem, Integer price) {
  618 + TradeOrderItemDO newOrderItem = new TradeOrderItemDO();
  619 + newOrderItem.setId(orderItem.getId());
  620 + newOrderItem.setAdjustPrice(price);
  621 + int payPrice = orderItem.getAdjustPrice() != null ? (orderItem.getPayPrice() - orderItem.getAdjustPrice())
  622 + + price : orderItem.getPayPrice() + price;
  623 + newOrderItem.setPayPrice(payPrice);
  624 + return newOrderItem;
594 625 }
595 626  
596 627 @Override
... ...
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/api/order/PayOrderApi.java
... ... @@ -29,13 +29,12 @@ public interface PayOrderApi {
29 29 */
30 30 PayOrderRespDTO getOrder(Long id);
31 31  
32   - // TODO @puhui999:可以去掉 byId;然后 payOrderId 参数改成 id;
33 32 /**
34 33 * 更新支付订单价格
35 34 *
36   - * @param payOrderId 支付单编号
  35 + * @param id 支付单编号
37 36 * @param payPrice 支付单价格
38 37 */
39   - void updatePayOrderPriceById(Long payOrderId, Integer payPrice);
  38 + void updatePayOrderPrice(Long id, Integer payPrice);
40 39  
41 40 }
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/api/order/PayOrderApiImpl.java
... ... @@ -32,8 +32,8 @@ public class PayOrderApiImpl implements PayOrderApi {
32 32 }
33 33  
34 34 @Override
35   - public void updatePayOrderPriceById(Long payOrderId, Integer payPrice) {
36   - payOrderService.updatePayOrderPriceById(payOrderId, payPrice);
  35 + public void updatePayOrderPrice(Long id, Integer payPrice) {
  36 + payOrderService.updatePayOrderPrice(id, payPrice);
37 37 }
38 38  
39 39 }
... ...
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/order/PayOrderService.java
... ... @@ -101,10 +101,10 @@ public interface PayOrderService {
101 101 /**
102 102 * 更新支付订单价格
103 103 *
104   - * @param payOrderId 支付单编号
  104 + * @param id 支付单编号
105 105 * @param payPrice 支付单价格
106 106 */
107   - void updatePayOrderPriceById(Long payOrderId, Integer payPrice);
  107 + void updatePayOrderPrice(Long id, Integer payPrice);
108 108  
109 109 /**
110 110 * 获得支付订单
... ...