Browse Source

修复订单金额如果超过三千就会出现负数,导致支付金额异常

Yangzw 8 months ago
parent
commit
47b52b8e93

+ 51 - 6
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -534,7 +534,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
     //把数据库的钱转换为数据库的积分
     public static Long money2Integral(Integer money) {
-        return Long.valueOf((long)money * DistriConstants.MONEY2INTEGRAL);
+        return Long.valueOf((long) money * DistriConstants.MONEY2INTEGRAL);
     }
 
     //把数据库的积分转换为数据库的钱
@@ -711,11 +711,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                     double rmb = (orderItem.getHighPrecisionPrice().doubleValue() * orderItem.getCount()) - integral2Money(orderItemTmp.getPayPoints());
                     if (rmb > 0 && rmb < 1) {
                         payRmb = 1;
-                    }else{
+                    } else {
                         double multiplied = rmb * 10;
                         // 对乘以10后的数使用 Math.ceil() 向上取整
                         double roundedUp = Math.ceil(multiplied);
-                        payRmb = (int)(roundedUp/10.0);
+                        payRmb = (int) (roundedUp / 10.0);
                     }
                 }
                 orderItem.setPayRmb(payRmb);//本商品实付人民币
@@ -740,6 +740,51 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             tradeOrderMapper.insert(order);
 
             orderItems.forEach(orderItem -> orderItem.setOrderId(order.getId()));
+
+            /*
+             * 把每一笔运费平摊到相同的运费模板的订单项中,并且把支付金额累加上运费
+             * 同一个店铺中的订单项中的同运费模板的运费只会计算一次
+             * 所以多个订单项中只会有一笔订单项中有运费金额
+             * 拿到相同运费模板的运费金额,然后平摊到相同运费模板的订单项中
+             * 实际上运费模板是基于spu的,所以只要找到同spu的订单项就可以了
+             */
+            List<Long> spuIds = orderItems.stream().map(TradeOrderItemDO::getSpuId).distinct().collect(Collectors.toList());
+            List<Long> deliveryTemplateIds = productSpuMapper.selectList(ProductSpuDO::getId, spuIds).stream().map(ProductSpuDO::getDeliveryTemplateId)
+                    .distinct().collect(Collectors.toList());
+            Map<Long, Long> templateIdMap = new HashMap<>();
+            deliveryTemplateIds.forEach(id -> {
+                templateIdMap.put(id, 0L);
+            });
+
+            Map<Long, Integer> deliveryPriceMap = new HashMap<>();
+            templateIdMap.forEach((id, count) -> {
+                orderItems.forEach(item -> {
+                    ProductSpuDO spu = productSpuMapper.selectById(item.getSpuId());
+                    if (spu.getDeliveryTemplateId().equals(id)) {
+                        templateIdMap.put(id, templateIdMap.get(id) + 1);
+
+                        if(item.getDeliveryPrice() != 0){
+                            deliveryPriceMap.put(spu.getDeliveryTemplateId(), item.getDeliveryPrice());
+                        }
+                    }
+                });
+            });
+
+            orderItems.forEach(itemDO -> {
+                ProductSpuDO spuDO = productSpuMapper.selectById(itemDO.getSpuId());
+                templateIdMap.forEach((id, count) -> {
+                    if (spuDO.getDeliveryTemplateId().equals(id)) {
+                        itemDO.setDeliveryPrice(deliveryPriceMap.get(spuDO.getDeliveryTemplateId()) / count.intValue());
+
+                        // 订单项实付rmb = 订单项实付rmb + 运费金额
+                        itemDO.setPayRmb(itemDO.getPayRmb() + itemDO.getDeliveryPrice());
+                        // 订单项实付金额 = 订单项实付金额 + 运费金额
+                        itemDO.setPayPrice(itemDO.getPayPrice() + itemDO.getDeliveryPrice());
+                    }
+                });
+            });
+
+
             tradeOrderItemMapper.insertBatch(orderItems);
 
             // 4. 订单创建后的逻辑
@@ -786,7 +831,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 String OrderNum = order.getNo();
                 Long payIntegral = order.getPayIntegral().longValue();//每个订单使用的积分
                 Boolean flag = integralService.updateUserIntegral(userId, userId, CaclEnum.ORDER_PAY_INTEGRAL, payIntegral * (-1), 0L, tradeOrderId, OrderNum);
-                if(!flag){
+                if (!flag) {
                     throw exception(ORDER_PAY_ERROR);
                 }
             }
@@ -1166,7 +1211,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
             integralService.updateUserIntegral(tradeOrderDO.getUserId(), ancesterUserId, CaclEnum.ORDER_PAY_INTEGRAL_ANCESTER, 0L, totalAncestorFreezeAmount, tradeOrderId, OrderNum);
 
             //修改购物者本人获得的冻结峰值
-            integralService.updateIntegralFreezeHighQuota(tradeOrderDO.getUserId(), tradeOrderDO.getUserId(),CaclEnum.ORDER_PAY_FREEZE_HIGH_QUOTA,totalFreezeHighQuota,tradeOrderId,OrderNum);
+            integralService.updateIntegralFreezeHighQuota(tradeOrderDO.getUserId(), tradeOrderDO.getUserId(), CaclEnum.ORDER_PAY_FREEZE_HIGH_QUOTA, totalFreezeHighQuota, tradeOrderId, OrderNum);
             log.warn("[TradeOrderUpdateServiceImpl.updateOrderPaid]$$$:[tradeOrderId({}),ancesterUserId({}),totalAncestorFreezeAmount({})]" + new Date(),
                     tradeOrderId, ancesterUserId, totalAncestorFreezeAmount);
 
@@ -1500,7 +1545,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
                 Long userId = order.getUserId();
                 //如果订单有使用积分,则退回积分
                 if (payIntegral > 0) {
-                    integralService.updateUserIntegral(userId,CaclEnum.ORDER_CANCEL_BY_SYSTEM_REFUND_INTEGRAL,payIntegral,tradeOrderId,orderNum);
+                    integralService.updateUserIntegral(userId, CaclEnum.ORDER_CANCEL_BY_SYSTEM_REFUND_INTEGRAL, payIntegral, tradeOrderId, orderNum);
                 }
 
                 count++;