Commit c023209aa529d6a8a9f64ceb38d4ac67ba458236
1 parent
51dab968
订单管理:完善订单调价分摊逻辑
Showing
4 changed files
with
58 additions
and
28 deletions
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 | * 获得支付订单 | ... | ... |