浏览代码

线上/下余额

zhijiezhao 3 年之前
父节点
当前提交
7a427fc075

+ 5 - 0
src/main/java/com/caimei365/order/components/ProductService.java

@@ -355,6 +355,11 @@ public class ProductService {
         relation.setAssociateAmount(balancePayFee);
         relation.setRelationType(2);
         relation.setDelFlag(0);
+        String s = "YE" + new SimpleDateFormat("yyyyMMddHHmmssSSS") + "T" + orderId;
+        //todo 余额抵扣订单产生时未产生第三方平台交易,无流水号和唯一订单号,暂自定义相同,防止分账存参数空指针(线上/下余额改版)
+        relation.setMbOrderId(s);
+        relation.setOrderRequestNo(s);
+        relation.setSplitStatus(0);
         // 保存 收款项和订单关系
         baseMapper.insertOrderReceiptRelation(relation);
         log.info(note + ">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",orderId:" + orderId);

+ 7 - 0
src/main/java/com/caimei365/order/mapper/BaseMapper.java

@@ -217,4 +217,11 @@ public interface BaseMapper {
     UserBeansHistoryPo findLowOrder(Integer orderId);
 
     Integer findBeans(Integer userId);
+
+    //根据orderid找paytype
+    String findPayType(String orderId);
+    //根据mborderid找paytype
+    String findType(String mbOrderId);
+
+    Double getonlineMoney(Integer userId);
 }

+ 10 - 0
src/main/java/com/caimei365/order/mapper/PayOrderMapper.java

@@ -31,6 +31,8 @@ public interface PayOrderMapper {
      * @param order 主订单
      */
     void updateOrderStatus(OrderVo order);
+
+    void updateUserMoney(Double userMoney, Double ableUserMoney,Integer userId);
     /**
      * 根据用户Id更新余额
      * @param userMoney      用户余额
@@ -38,6 +40,14 @@ public interface PayOrderMapper {
      * @param userId 用户Id
      */
     void updateMoneyByUserId(Double userMoney, Double ableUserMoney, Integer userId);
+    /**
+     * 根据用户Id更新线上余额
+     *
+     * @param onlineMoney   线上用户余额
+     * @param ableUserMoney 用户可用余额
+     * @param userId        用户Id
+     */
+    void updateOnlineMoneyByUserId(Double onlineMoney, Double ableUserMoney, Integer userId);
     /**
      * 订单支付链接
      * @param orderId 订单Id

+ 4 - 0
src/main/java/com/caimei365/order/model/bo/OrderParamBo.java

@@ -117,4 +117,8 @@ public class OrderParamBo implements Serializable {
      * 超级会员用户标记
      */
     private Boolean svipUserFlag;
+    /**
+     * 线上余额
+     */
+    private Double onlineMoney;
 }

+ 1 - 1
src/main/java/com/caimei365/order/model/po/BalanceRecordPo.java

@@ -27,7 +27,7 @@ public class BalanceRecordPo implements Serializable {
      */
     private Integer type;
     /**
-     * 余额类型:1余额抵扣,2多收退款到余额,3申请退款,4余额充值,5余额提现,6订金订单充值,7余额订单充值,8订金订单退款,9余额订单退款
+     * 余额类型:1线下余额抵扣,2多收退款到余额,3申请退款,4余额充值,5余额提现,6订金订单充值,7余额订单充值,8订金订单退款,9余额订单退款,10线上余额抵扣
      */
     private Integer balanceType;
     /**

+ 1 - 1
src/main/java/com/caimei365/order/model/po/PayShopPo.java

@@ -62,7 +62,7 @@ public class PayShopPo implements Serializable {
     private Double transferPayFee;
 
     /**
-     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461
+     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
      */
     private Integer payType;
 

+ 1 - 1
src/main/java/com/caimei365/order/model/po/PayShopRecordPo.java

@@ -36,7 +36,7 @@ public class PayShopRecordPo implements Serializable {
      */
     private Double wipePayment;
     /**
-     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461
+     * 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
      */
     private Integer payType;
     /**

+ 1 - 1
src/main/java/com/caimei365/order/model/vo/ReturnedPurchaseVo.java

@@ -35,7 +35,7 @@ public class ReturnedPurchaseVo implements Serializable {
      */
     private Integer returnedWay;
     /**
-     * 付款方式 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461
+     * 付款方式 付款方式 1建设银行7297, 2中信银行0897, 3中信银行7172, 4广发银行0115, 5广发银行5461,6线上分账
      */
     private String payType;
     /**

+ 78 - 19
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -185,22 +185,61 @@ public class PayOrderServiceImpl implements PayOrderService {
                 //保存收款记录
                 productService.saveDiscernReceipt(balancePayFee, orderId, "【订单支付,余额抵扣】");
             }
+            //可用=可用-本次抵扣
             availableMoney = MathUtil.sub(availableMoney, balancePayFee).doubleValue();
-            payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
-            //保存余额到余额收支记录
-            BalanceRecordPo balanceRecord = new BalanceRecordPo();
-            balanceRecord.setUserId(order.getUserId());
-            balanceRecord.setType(2);
-            balanceRecord.setBalanceType(1);
-            balanceRecord.setAddDate(new Date());
-            balanceRecord.setAmount(balancePayFee);
-            balanceRecord.setOrderId(orderId);
-            balanceRecord.setRemark("订单支付,余额抵扣");
-            balanceRecord.setDelFlag(0);
-            // 保存 余额收支记录
-            baseMapper.insertBalanceRecord(balanceRecord);
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+            //区分扣多少线上扣多少线下,优先线上余额
+            Double onlineMoney = baseMapper.getonlineMoney(order.getUserId());
+            if (onlineMoney > balancePayFee) {
+                onlineMoney = MathUtil.sub(onlineMoney, balancePayFee).doubleValue();
+                payOrderMapper.updateOnlineMoneyByUserId(onlineMoney, availableMoney, order.getUserId());
+                log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
+                //保存余额到余额收支记录
+                BalanceRecordPo balanceRecord = new BalanceRecordPo();
+                balanceRecord.setUserId(order.getUserId());
+                balanceRecord.setType(2);
+                balanceRecord.setBalanceType(10);
+                balanceRecord.setAddDate(new Date());
+                balanceRecord.setAmount(balancePayFee);
+                balanceRecord.setOrderId(orderId);
+                balanceRecord.setRemark("订单支付,余额抵扣");
+                balanceRecord.setDelFlag(0);
+                // 保存 余额收支记录
+                baseMapper.insertBalanceRecord(balanceRecord);
+                log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + orderId);
+            } else {//线上不够,线上全抵,剩余线下
+                //线下=原线下-(本次抵扣-线上)
+                userMoney = MathUtil.sub(userMoney, MathUtil.sub(balancePayFee, onlineMoney)).doubleValue();
+                //更新线上/线下余额  线上置为0,全部抵扣
+                payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, 0d, order.getUserId());
+                log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
+                if (onlineMoney > 0) {
+                    // 线上>0有抵扣的情况下保存线上余额到余额收支记录
+                    BalanceRecordPo balanceRecord = new BalanceRecordPo();
+                    balanceRecord.setUserId(order.getUserId());
+                    balanceRecord.setType(2);
+                    balanceRecord.setBalanceType(10);
+                    balanceRecord.setAddDate(new Date());
+                    balanceRecord.setAmount(onlineMoney);
+                    balanceRecord.setOrderId(orderId);
+                    balanceRecord.setRemark("订单支付,余额抵扣");
+                    balanceRecord.setDelFlag(0);
+                    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);
+            }
         }
         Map<String, Object> map = new HashMap<>(2);
         map.put("order", order);
@@ -404,7 +443,17 @@ public class PayOrderServiceImpl implements PayOrderService {
             code = 5;
         }
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String time = dateFormat.format(orderPayLink.getEffectiveTime());
+        //原24小时有效期,增加2天到72小时
+        String time = "";
+        Date effectiveTime = orderPayLink.getEffectiveTime();
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(effectiveTime);
+        ca.add(Calendar.DAY_OF_MONTH, 2);
+        if (null != orderPayLink.getOrderId()) {
+            time = dateFormat.format(ca.getTime());
+        } else {
+            time = dateFormat.format(orderPayLink.getEffectiveTime());
+        }
         Map<String, Object> map = new HashMap<>(5);
         map.put("type", type);
         map.put("orderPayLink", orderPayLink);
@@ -760,12 +809,13 @@ public class PayOrderServiceImpl implements PayOrderService {
         }
         if (rechargeFlag > 0) {
             // 账户余额
-            double oldUserMoney = baseMapper.getUserMoney(order.getUserId());
+            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.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
+            //充值线上余额
+            payOrderMapper.updateOnlineMoneyByUserId(userMoney, availableMoney, order.getUserId());
             log.info("【支付异步回调】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
             //保存余额到余额收支记录
             BalanceRecordPo balanceRecord = new BalanceRecordPo();
@@ -926,10 +976,16 @@ public class PayOrderServiceImpl implements PayOrderService {
         String currentTime = format.format(calendar.getTime());
         // 查询未分账已支付收款
         List<OrderReceiptRelationPo> orderRelations = payOrderMapper.getUndividedPaidReceipt(currentTime);
+        // 上面过滤了余额抵扣, 把线上余额抵扣单补充到list里面,线上余额抵扣的金额视为正常收款金额进行分账
+        List<OrderReceiptRelationPo> onlineRelations = payOrderMapper.getOnlineBalance(currentTime);
+        // 过滤不足分账金额的单
+        onlineRelations.removeIf(o -> o.getAssociateAmount() < 0.01);
+        // 把线上余额抵扣订单加入分账
+        orderRelations.addAll(onlineRelations);
         if (orderRelations != null && orderRelations.size() > 0) {
             for (OrderReceiptRelationPo orderRelation : orderRelations) {
                 log.info("【延时分账】>>>>>>>>>>订单id:" + orderRelation.getOrderId() + ",进入延时分账");
-                // 订单信息
+                // 收款对应的订单信息
                 OrderVo order = orderCommonMapper.getOrderByOrderId(orderRelation.getOrderId());
                 PayParamBo payParam = new PayParamBo();
                 payParam.setPayAmount(MathUtil.mul(orderRelation.getAssociateAmount(), 100).intValue());
@@ -963,6 +1019,9 @@ public class PayOrderServiceImpl implements PayOrderService {
                         totalAmount2 = MathUtil.add(totalAmount2, account.getSplitAccount()).doubleValue();
                     } else if (3 == account.getType()) {
                         totalAmount3 = MathUtil.add(totalAmount3, account.getSplitAccount()).doubleValue();
+                    } else if (5 == account.getType()) {
+                        totalAmount = MathUtil.add(totalAmount, account.getSplitAccount());
+                        sp = account.getSubUserNo();
                     }
                 }
                 addMaps(maps, totalAmount1, PayUtil.publicAccountNo);

+ 3 - 0
src/main/resources/mapper/BaseMapper.xml

@@ -330,4 +330,7 @@
     <select id="findBeans" resultType="java.lang.Integer">
         select userBeans from user where userID=#{userId}
     </select>
+    <select id="getonlineMoney" resultType="java.lang.Double">
+        select onlineMoney FROM USER WHERE userId = #{userId}
+    </select>
 </mapper>

+ 1 - 0
src/main/resources/mapper/SubmitMapper.xml

@@ -174,6 +174,7 @@
                bindMobile,
                userMoney,
                ableUserMoney,
+               onlineMoney,
                userBeans
         FROM user
         WHERE userID = #{userId}