Browse Source

线上/下余额

zhijiezhao 3 years ago
parent
commit
bc542b6c88

+ 55 - 18
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -124,6 +124,8 @@ public class PayOrderServiceImpl implements PayOrderService {
         return ResponseJson.success(map);
     }
 
+
+
     /**
      * 订单支付,余额抵扣
      *
@@ -142,6 +144,7 @@ public class PayOrderServiceImpl implements PayOrderService {
         Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
         Double balancePayFee = 0d;
         if (MathUtil.compare(availableMoney, 0) > 0) {
+            //可用余额>待付
             if (MathUtil.compare(availableMoney, order.getPendingPayments()) >= 0) {
                 if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
                     if (1 == order.getSendOutStatus()) {
@@ -168,8 +171,9 @@ public class PayOrderServiceImpl implements PayOrderService {
                 order.setReceiptStatus(2);
                 balancePayFee = availableMoney;
             }
-
+            //设置余额支付金额
             order.setBalancePayFee(MathUtil.add(order.getBalancePayFee(), balancePayFee).doubleValue());
+            //设置真实支付金额
             order.setPayableAmount(MathUtil.sub(order.getPayableAmount(), balancePayFee).doubleValue());
             Date date = new Date();
             String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
@@ -181,7 +185,6 @@ public class PayOrderServiceImpl implements PayOrderService {
             // 修改账户余额
             double userMoney = baseMapper.getUserMoney(order.getUserId());
             if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                userMoney = MathUtil.sub(userMoney, balancePayFee).doubleValue();
                 //保存收款记录
                 productService.saveDiscernReceipt(balancePayFee, orderId, "【订单支付,余额抵扣】");
             }
@@ -189,6 +192,7 @@ public class PayOrderServiceImpl implements PayOrderService {
             availableMoney = MathUtil.sub(availableMoney, balancePayFee).doubleValue();
             //区分扣多少线上扣多少线下,优先线上余额
             Double onlineMoney = baseMapper.getonlineMoney(order.getUserId());
+            //线上余额>本次抵扣,全抵线上
             if (onlineMoney > balancePayFee) {
                 onlineMoney = MathUtil.sub(onlineMoney, balancePayFee).doubleValue();
                 payOrderMapper.updateOnlineMoneyByUserId(onlineMoney, availableMoney, order.getUserId());
@@ -226,19 +230,21 @@ public class PayOrderServiceImpl implements PayOrderService {
                     baseMapper.insertBalanceRecord(balanceRecord);
                     log.info("【订单支付,线上/线下余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
                 }
-                //保存线下余额到余额收支记录
-                BalanceRecordPo balanceRecord = new BalanceRecordPo();
-                balanceRecord.setUserId(order.getUserId());
-                balanceRecord.setType(2);
-                balanceRecord.setBalanceType(1);
-                balanceRecord.setAddDate(new Date());
-                balanceRecord.setAmount(userMoney);
-                balanceRecord.setOrderId(orderId);
-                balanceRecord.setRemark("订单支付,余额抵扣");
-                balanceRecord.setDelFlag(0);
-                // 保存 余额收支记录
-                baseMapper.insertBalanceRecord(balanceRecord);
-                log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+                if (userMoney > 0) {
+                    // 保存线下余额到余额收支记录
+                    BalanceRecordPo balanceRecord1 = new BalanceRecordPo();
+                    balanceRecord1.setUserId(order.getUserId());
+                    balanceRecord1.setType(2);
+                    balanceRecord1.setBalanceType(1);
+                    balanceRecord1.setAddDate(new Date());
+                    balanceRecord1.setAmount(userMoney);
+                    balanceRecord1.setOrderId(orderId);
+                    balanceRecord1.setRemark("订单支付,余额抵扣");
+                    balanceRecord1.setDelFlag(0);
+                    // 保存 余额收支记录
+                    baseMapper.insertBalanceRecord(balanceRecord1);
+                }
+                log.info("【订单支付,线上/线下余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
             }
         }
         Map<String, Object> map = new HashMap<>(2);
@@ -288,6 +294,8 @@ public class PayOrderServiceImpl implements PayOrderService {
             }
             order.setReceiptAmount(receiptAmount.get());
         }
+        // 总成本
+        AtomicDouble totalCostPrice = new AtomicDouble(0d);
         // 商品数据
         List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
         //过滤运费商品
@@ -300,17 +308,44 @@ public class PayOrderServiceImpl implements PayOrderService {
             if (productTaxFlag) {
                 order.setInvoiceStatus(true);
             }
+            //当应付金额小于订单总成本时,不能走线上支付,总成本=商品成本 + 供应商运费 + 供应商税费
+            double costPrice = MathUtil.mul(orderProduct.getCostPrice(), orderProduct.getNum()).doubleValue();
+            if (Integer.valueOf(0).equals(orderProduct.getIncludedTax()) && !Integer.valueOf(3).equals(orderProduct.getInvoiceType())) {
+                //应付总税费
+                Double payableTax = MathUtil.mul(orderProduct.getSingleShouldPayTotalTax(), orderProduct.getNum()).doubleValue();
+                //成本+税费
+                costPrice = MathUtil.add(costPrice, payableTax).doubleValue();
+            }
+            List<ShopOrderVo> shopOrderList = orderCommonMapper.getShopOrderListByOrderId(order.getOrderId());
+            for (ShopOrderVo shopOrder : shopOrderList) {
+                // 付供应商运费
+                Double shopPostFee = shopOrder.getShopPostFee();
+                costPrice = MathUtil.add(costPrice, shopPostFee).doubleValue();
+            }
+            totalCostPrice.set(MathUtil.add(costPrice, totalCostPrice.get()).doubleValue());
         });
+
         // 返回数据
         Map<String, Object> map = new HashMap<>();
         map.put("userName", userName);
         map.put("order", order);
         map.put("discernReceipt", discernReceiptList);
         map.put("orderProductList", orderProductList);
-
+        //能否线上判断付供应商是否大于订单金额
+//        orderCommonService.getDiscernReceiptAndSetOrder(order);
+//        boolean payButton = order.isPayButton();
+        // 总成本>应付 不能线上 B2B<10块
+        //todo 判断线上/线下余额
+//        log.info("成本: " + totalCostPrice + "==================  实付: " + order.getPayableAmount());
+        if (MathUtil.compare(totalCostPrice, order.getPayableAmount()) > 0 || order.getPayableAmount() <= 0.01) {
+            map.put("onlinePay", 2);
+        } else {
+            map.put("onlinePay", 1);
+        }
         return ResponseJson.success(map);
     }
 
+
     /**
      * 生成网银支付链接
      *
@@ -808,14 +843,16 @@ public class PayOrderServiceImpl implements PayOrderService {
             }
         }
         if (rechargeFlag > 0) {
-            // 账户余额
+            // 线上账户余额
             double oldUserMoney = baseMapper.getonlineMoney(order.getUserId());
+            // 充值算线下余额
             double userMoney = MathUtil.add(oldUserMoney, amount).doubleValue();
             // 可用余额
             Double oldAvailableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+            // 可用余额=之前的可用+充值
             double availableMoney = MathUtil.add(oldAvailableMoney, amount).doubleValue();
             //充值线上余额
-            payOrderMapper.updateOnlineMoneyByUserId(userMoney, availableMoney, order.getUserId());
+            payOrderMapper.updateUserMoney(userMoney, availableMoney, order.getUserId());
             log.info("【支付异步回调】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
             //保存余额到余额收支记录
             BalanceRecordPo balanceRecord = new BalanceRecordPo();

+ 6 - 0
src/main/resources/mapper/PayOrderMapper.xml

@@ -103,6 +103,12 @@
             ableUserMoney = #{ableUserMoney}
         WHERE userID = #{userId}
     </update>
+    <update id="updateUserMoney">
+        UPDATE USER
+        SET userMoney     = #{userMoney},
+        ableUserMoney = #{ableUserMoney}
+        WHERE userID = #{userId}
+    </update>
     <select id="getPayOnLineSwitch" resultType="java.lang.Integer">
         SELECT STATUS FROM cm_pay_online_switch WHERE id=1
     </select>