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,8 +53,8 @@ import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageRecordBizTypeEnum;
53 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum; 53 import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
54 import cn.iocoder.yudao.module.trade.enums.order.*; 54 import cn.iocoder.yudao.module.trade.enums.order.*;
55 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties; 55 import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
56 -import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService;  
57 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO; 56 import cn.iocoder.yudao.module.trade.service.brokerage.bo.BrokerageAddReqBO;
  57 +import cn.iocoder.yudao.module.trade.service.brokerage.record.BrokerageRecordService;
58 import cn.iocoder.yudao.module.trade.service.cart.CartService; 58 import cn.iocoder.yudao.module.trade.service.cart.CartService;
59 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService; 59 import cn.iocoder.yudao.module.trade.service.delivery.DeliveryExpressService;
60 import cn.iocoder.yudao.module.trade.service.message.TradeMessageService; 60 import cn.iocoder.yudao.module.trade.service.message.TradeMessageService;
@@ -70,14 +70,13 @@ import org.springframework.transaction.annotation.Transactional; @@ -70,14 +70,13 @@ import org.springframework.transaction.annotation.Transactional;
70 70
71 import javax.annotation.Resource; 71 import javax.annotation.Resource;
72 import java.time.LocalDateTime; 72 import java.time.LocalDateTime;
  73 +import java.util.ArrayList;
73 import java.util.List; 74 import java.util.List;
74 import java.util.Objects; 75 import java.util.Objects;
75 import java.util.Set; 76 import java.util.Set;
76 77
77 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 78 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
78 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; 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 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*; 80 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
82 81
83 /** 82 /**
@@ -562,35 +561,67 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService { @@ -562,35 +561,67 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
562 } 561 }
563 562
564 @Override 563 @Override
565 - // TODO @puhui999:考虑事务性 564 + @Transactional(rollbackFor = Exception.class)
566 public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) { 565 public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) {
567 - // 校验交易订单 566 + // 1、校验交易订单
568 TradeOrderDO order = validateOrderExists(reqVO.getId()); 567 TradeOrderDO order = validateOrderExists(reqVO.getId());
569 if (order.getPayStatus()) { 568 if (order.getPayStatus()) {
570 throw exception(ORDER_UPDATE_PRICE_FAIL_PAID); 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 if (ObjectUtil.equal(order.getAdjustPrice(), reqVO.getAdjustPrice())) { 577 if (ObjectUtil.equal(order.getAdjustPrice(), reqVO.getAdjustPrice())) {
573 throw exception(ORDER_UPDATE_PRICE_FAIL_EQUAL); 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 // TODO @芋艿:改价时,赠送的积分,要不要做改动??? 588 // TODO @芋艿:改价时,赠送的积分,要不要做改动???
591 tradeOrderMapper.updateById(update); 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 @Override 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,13 +29,12 @@ public interface PayOrderApi {
29 */ 29 */
30 PayOrderRespDTO getOrder(Long id); 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 * @param payPrice 支付单价格 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,8 +32,8 @@ public class PayOrderApiImpl implements PayOrderApi {
32 } 32 }
33 33
34 @Override 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,10 +101,10 @@ public interface PayOrderService {
101 /** 101 /**
102 * 更新支付订单价格 102 * 更新支付订单价格
103 * 103 *
104 - * @param payOrderId 支付单编号 104 + * @param id 支付单编号
105 * @param payPrice 支付单价格 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 * 获得支付订单