Quellcode durchsuchen

营销政策修改

ZHOUTD vor 1 Woche
Ursprung
Commit
a41a727d0e

+ 30 - 19
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -2786,15 +2786,23 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setIsRead(0);
             // 订单金额
             TradeOrderTotalVO summary = createVO.getSummary();
-            BigDecimal realAmount = summary.getRealMoney()==null?BigDecimal.ZERO:summary.getRealMoney()  ;
-            BigDecimal freeAmount = tradeOrderDO.getFreeAmount()==null?BigDecimal.ZERO:tradeOrderDO.getFreeAmount();
-            BigDecimal orderMoney = summary.getOrderMoney();
-            realAmount = realAmount.subtract(freeAmount);
+            BigDecimal orderMoney = ObjectUtil.defaultIfNull(summary.getOrderMoney(), BigDecimal.ZERO);
+            BigDecimal policyAmount = policyList == null
+                    ? ObjectUtil.defaultIfNull(tradeOrderDO.getFreeAmount(), BigDecimal.ZERO)
+                    : policyList.stream()
+                            .map(TradeOrderPolicyReqVO::getAmount)
+                            .filter(Objects::nonNull)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+            BigDecimal effectivePolicyAmount = policyAmount.max(BigDecimal.ZERO)
+                    .min(orderMoney.max(BigDecimal.ZERO));
+            BigDecimal realAmount = orderMoney.subtract(effectivePolicyAmount);
             Long discountId = summary.getDiscountId();
             shipTradeOrderCreateReqVO.setAmount(orderMoney);
-            //减去优惠金额
-            shipTradeOrderCreateReqVO.setPayAmount(realAmount);
-            shipTradeOrderCreateReqVO.setFreeAmount(freeAmount);
+            BigDecimal oldPayAmount = ObjectUtil.defaultIfNull(tradeOrderDO.getPayAmount(), BigDecimal.ZERO);
+            BigDecimal oldFreeAmount = ObjectUtil.defaultIfNull(tradeOrderDO.getFreeAmount(), BigDecimal.ZERO);
+            // 修改订单时只保存待审核的政策,不提前修改优惠金额和实际金额
+            shipTradeOrderCreateReqVO.setPayAmount(oldPayAmount);
+            shipTradeOrderCreateReqVO.setFreeAmount(oldFreeAmount);
             BigDecimal oldOrderDeposi = ObjectUtil.defaultIfNull(tradeOrderDO.getDeposi(), BigDecimal.ZERO);
             if (createVO.getSummary().getDeposi() != null
                     && shipTradeOrderCreateReqVO.getDeposi().compareTo(oldOrderDeposi) != 0) {
@@ -2803,7 +2811,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             }
 
             shipTradeOrderCreateReqVO.setDiscountId(discountId);
-            if (createVO.getSummary().getRealOrderMoney() != null) {
+            if (policyList == null && createVO.getSummary().getRealOrderMoney() != null) {
                 shipTradeOrderCreateReqVO.setPayAmount(createVO.getSummary().getRealOrderMoney());
             }
             // 设置订单联系人信息
@@ -2912,6 +2920,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
             shipTradeOrderCreateReqVO.setOldtradeOrderTotalDO(oldTradeOrderTotal);
             // 构建新的订单汇总信息
             TradeOrderTotalDO tradeOrderTotalDO = BeanUtils.toBean(summary, TradeOrderTotalDO.class);
+            // 实际金额在最终审核通过后,按订单总金额和最新营销政策统一计算
+            tradeOrderTotalDO.setRealMoney(oldTradeOrderTotal.getRealMoney());
             if(tradeOrderTotalDO.getUpFloorTotalMoney()==null){
                 tradeOrderTotalDO.setUpFloorTotalMoney(BigDecimal.ZERO);
             }
@@ -2943,8 +2953,8 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                     }
                 }
             }
-            if(tradeOrderDO.getPayStatus()==1 && tradeOrderDO.getPayAmount().subtract(shipTradeOrderCreateReqVO.getPayAmount()).compareTo(BigDecimal.ZERO)!=0){
-                return CommonResult.error(500, "已支付订单金额发生变化"+tradeOrderDO.getPayAmount()+"->"+shipTradeOrderCreateReqVO.getPayAmount());
+            if(tradeOrderDO.getPayStatus()==1 && tradeOrderDO.getPayAmount().subtract(realAmount).compareTo(BigDecimal.ZERO)!=0){
+                return CommonResult.error(500, "已支付订单金额发生变化"+tradeOrderDO.getPayAmount()+"->"+realAmount);
             }
 
             String changedFields1 = com.yc.ship.module.trade.utils.BeanUtils.getChangedFields(oldTradeOrderTotal, tradeOrderTotalDO);
@@ -3291,10 +3301,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
     private String updateOrderPolicyAmountOnAudit(TradeOrderDO order) {
         List<OrderPolicyDO> policyList = orderPolicyMapper.selectList(OrderPolicyDO::getOrderId, order.getId());
-        BigDecimal beforeFreeAmount = ObjectUtil.defaultIfNull(order.getFreeAmount(), BigDecimal.ZERO);
-        if (CollUtil.isEmpty(policyList) && beforeFreeAmount.compareTo(BigDecimal.ZERO) == 0) {
-            return "";
-        }
         TradeOrderTotalDO orderTotal = tradeOrderTotalMapper.selectByOrderId(order.getId());
         if (orderTotal == null) {
             throw exception(ORDER_NOT_EXIST);
@@ -3303,24 +3309,29 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 .map(OrderPolicyDO::getAmount)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        return updateOrderPolicyAmount(order.getId(), orderTotal.getRealMoney(), policyAmount);
+        return updateOrderPolicyAmount(order.getId(), orderTotal.getOrderMoney(), policyAmount);
     }
 
-    private String updateOrderPolicyAmount(Long orderId, BigDecimal realMoney, BigDecimal policyAmount) {
+    private String updateOrderPolicyAmount(Long orderId, BigDecimal orderMoney, BigDecimal policyAmount) {
         TradeOrderDO order = tradeOrderMapper.selectById(orderId);
         if (order == null) {
             throw exception(ORDER_NOT_EXIST);
         }
         BigDecimal beforePayAmount = ObjectUtil.defaultIfNull(order.getPayAmount(), BigDecimal.ZERO);
         BigDecimal beforeFreeAmount = ObjectUtil.defaultIfNull(order.getFreeAmount(), BigDecimal.ZERO);
-        BigDecimal actualRealMoney = ObjectUtil.defaultIfNull(realMoney, BigDecimal.ZERO);
-        BigDecimal actualPolicyAmount = ObjectUtil.defaultIfNull(policyAmount, BigDecimal.ZERO);
-        BigDecimal afterPayAmount = actualRealMoney.subtract(actualPolicyAmount);
+        BigDecimal actualOrderMoney = ObjectUtil.defaultIfNull(orderMoney, BigDecimal.ZERO).max(BigDecimal.ZERO);
+        BigDecimal actualPolicyAmount = ObjectUtil.defaultIfNull(policyAmount, BigDecimal.ZERO)
+                .max(BigDecimal.ZERO)
+                .min(actualOrderMoney);
+        BigDecimal afterPayAmount = actualOrderMoney.subtract(actualPolicyAmount);
         tradeOrderMapper.update(Wrappers.<TradeOrderDO>lambdaUpdate()
                 .set(TradeOrderDO::getPayAmount, afterPayAmount)
                 .set(TradeOrderDO::getFreeAmount, actualPolicyAmount)
                 .set(TradeOrderDO::getUpdateTime, LocalDateTime.now())
                 .eq(TradeOrderDO::getId, orderId));
+        tradeOrderTotalMapper.update(Wrappers.<TradeOrderTotalDO>lambdaUpdate()
+                .set(TradeOrderTotalDO::getRealMoney, afterPayAmount)
+                .eq(TradeOrderTotalDO::getOldOrderId, orderId));
 
         StringJoiner amountJoiner = new StringJoiner(",");
         if (beforePayAmount.compareTo(afterPayAmount) != 0) {