Browse Source

线上/下余额退款

zhijiezhao 3 years ago
parent
commit
4336d02694

+ 47 - 32
src/main/java/com/caimei/modules/bulkpurchase/web/CmRefundsProductController.java

@@ -267,37 +267,39 @@ public class CmRefundsProductController extends BaseController {
             BpClause bpClause = new BpClause();
             bpClause.setEnabledStatus("1");
             List<BpClause> bpClauses = bpClauseService.findList(bpClause);
-            CmDiscernReceipt cmDiscernReceipt = cmDiscernReceiptDao.findPayType(newOrder.getOrderID().toString());
 
+            CmDiscernReceipt cmDiscernReceipt = cmDiscernReceiptDao.findPayType(newOrder.getOrderID().toString());
             //是否可以线上退回
             boolean returnOnline = false;
             if (cmDiscernReceipt != null && "1".equals(cmDiscernReceipt.getPayWay())) {
                 Date splitTime = cmDiscernReceiptDao.findSplitTime(newOrder.getOrderID());
                 if (splitTime != null) {
-//                    Calendar calendar = Calendar.getInstance();
-//                    calendar.setTime(splitTime);
-//                    calendar.set(Calendar.HOUR_OF_DAY, 23);
-//                    calendar.set(Calendar.MINUTE, 20);
-//                    if (calendar.getTime().compareTo(new Date()) > 0) {
-//                        returnOnline = true;
-//                    }
-                    returnOnline = false;
+                    Calendar calendar = Calendar.getInstance();
+                    calendar.setTime(splitTime);
+                    calendar.set(Calendar.HOUR_OF_DAY, 23);
+                    calendar.set(Calendar.MINUTE, 20);
+                    if (calendar.getTime().compareTo(new Date()) > 0) {
+                        returnOnline = true;
+                    }
                 } else {
                     returnOnline = true;
                 }
             }
+            //订单支付线上余额
             Double onlineMoney = cmDiscernReceiptDao.findOnlineMoney(newOrder.getOrderID().toString());
-            Double refundOnlineMoney = cmDiscernReceiptDao.findRefundOnlineMoney(newOrder.getOrderID().toString());
+            //线上只能全退,理论不用考虑线上退款
+//            Double refundOnlineMoney = cmDiscernReceiptDao.findRefundOnlineMoney(newOrder.getOrderID().toString());
+            //订单支付线下余额
             Double userMoney = cmDiscernReceiptDao.findUserMoney(newOrder.getOrderID().toString());
             Double refundUserMoney = cmDiscernReceiptDao.findRefundUserMoney(newOrder.getOrderID().toString());
             refundUserMoney = null == refundUserMoney ? 0 : refundUserMoney;
-            refundOnlineMoney = null == refundOnlineMoney ? 0 : refundOnlineMoney;
+//            refundOnlineMoney = null == refundOnlineMoney ? 0 : refundOnlineMoney;
             onlineMoney = null == onlineMoney ? 0 : onlineMoney;
             userMoney = null == userMoney ? 0 : userMoney;
             //线上线下余额-退款
-            onlineMoney -= refundOnlineMoney;
+//            onlineMoney -= refundOnlineMoney;
             userMoney -= refundUserMoney;
-            //todo 退线上/线下
+            //退线上/线下
             if (cmDiscernReceipt != null && "3".equals(cmDiscernReceipt.getPayWay())) {
                 Date splitTime = cmDiscernReceiptDao.findSplitTime(newOrder.getOrderID());
                 if (splitTime != null) {
@@ -305,32 +307,45 @@ public class CmRefundsProductController extends BaseController {
                     calendar.setTime(splitTime);
                     calendar.set(Calendar.HOUR_OF_DAY, 23);
                     calendar.set(Calendar.MINUTE, 20);
+                    //分帐后,如果在当天时间的11.20之前
                     if (calendar.getTime().compareTo(new Date()) > 0) {
-                        // 分账前 如果当前单线上余额支付>0并且>退款可以退线上
-                        if (onlineMoney > 0 && MathUtil.compare(onlineMoney, refundOnlineMoney) > 0) {
+                        //余额全付
+                        //如果当前单线上余额>0,无线下,全付,退线上
+                        if (onlineMoney > 0 && userMoney == 0 && "31".equals(newOrder.getStatus())) {
+                            //1. 当订单全部被线上余额抵扣掉时,订单直接支付成功,无需再支付,但这抵扣掉的线上余额需要参与分账
+                            //此种订单的退款方式有:线上退回,账户余额(两者只能选一个),只能全部退款
                             returnOnline = true;
                         }
-                        if (userMoney > 0 && newOrder.getPayableAmount() == 0 && MathUtil.compare(newOrder.getPayTotalFee(), newOrder.getBalancePayFee()) == 0) {
-                            //余额全付其中有线下,重新置为不能线上
-                            returnOnline = false;
-                        }
-                        if (onlineMoney > 0 && userMoney > 0 && newOrder.getPayableAmount() > 0) {
-                            //单没付完,线上线下余额都有,不能线上
-                            returnOnline = false;
+                        if (onlineMoney > 0 && userMoney == 0 && "21".equals(newOrder.getStatus())) {
+                            //2. 当线上余额只抵扣了部分订单金额,该订单只能走线上支付
+                            //此种订单的退款方式有:线上退回,账户余额(两者只能选一个),只能全部退款
+                            returnOnline = true;
                         }
+//                        if (userMoney > 0 && onlineMoney > 0 && newOrder.getPayableAmount() == 0 && "31".equals(newOrder.getStatus())) {
+//                            //5. 当线上余额和线下余额两者都抵扣了且将订单金额全部抵扣完了,订单直接支付成功,无需再支付,但这抵扣掉的线上余额需要参与分账
+//                            //此种订单的退款方式有:线下转账,账户余额(两者只能选一个),只能全部退款
+//                            returnOnline = false;
+//                        }
+//                        if (onlineMoney > 0 && userMoney > 0 && "21".equals(newOrder.getStatus())) {
+//                            //6. 当线上余额和线下余额两者都抵扣了但只抵扣了部分订单金额,订单只能走线下支付,点击提交订单,跳转到线下支付页面
+//                            //此种订单的退款方式有:线下转账,账户余额(两者只能选一个),只能全部退款
+//                            //7. 当订单多次付款,前笔款已经分账,后笔款暂未分账,此时申请退款
+//                            //此种订单的退款方式有:线下转账,账户余额(两者只能选一个),只能全部退款,而且是都退到线下余额
+//                            returnOnline = false;
+//                        }
                     }
-                } else {
-                    // 分账前 如果当前单线上余额支付>0并且>退款可以退线上
-                    if (onlineMoney > 0 && MathUtil.compare(onlineMoney, refundOnlineMoney) > 0) {
+                }
+                //未分账
+                else {
+                    if (onlineMoney > 0 && userMoney == 0 && "31".equals(newOrder.getStatus())) {
+                        //1. 当订单全部被线上余额抵扣掉时,订单直接支付成功,无需再支付,但这抵扣掉的线上余额需要参与分账
+                        //此种订单的退款方式有:线上退回,账户余额(两者只能选一个),只能全部退款
                         returnOnline = true;
                     }
-                    if (userMoney > 0 && newOrder.getPayableAmount() == 0 && MathUtil.compare(newOrder.getPayTotalFee(), newOrder.getBalancePayFee()) == 0) {
-                        //余额全付其中有线下,重新置为不能线上
-                        returnOnline = false;
-                    }
-                    if (userMoney > 0 && onlineMoney > 0 && newOrder.getPayableAmount() > 0) {
-                        //单没付完,线上线下余额都有,不能线上
-                        returnOnline = false;
+                    if (onlineMoney > 0 && userMoney == 0 && "21".equals(newOrder.getStatus())) {
+                        //2. 当线上余额只抵扣了部分订单金额,该订单只能走线上支付
+                        //此种订单的退款方式有:线上退回,账户余额(两者只能选一个),只能全部退款
+                        returnOnline = true;
                     }
                 }
             }

+ 19 - 4
src/main/java/com/caimei/modules/order/web/NewOrderController.java

@@ -699,11 +699,26 @@ public class NewOrderController extends BaseController {
         Double balancePayFee = order.getBalancePayFee();
         CmUser u = cmUserService.get(userID + "");
         if (null != u && null != balancePayFee) {
-            Double userMoney = u.getUserMoney();
-            if (null != userMoney) {
-                u.setUserMoney(userMoney - balancePayFee);
-                cmUserDao.updateMoney(u);
+            Double userMoney = null == u.getUserMoney() ? 0 : u.getUserMoney();
+            Double onlineMoney = null == u.getOnlineMoney() ? 0 : u.getOnlineMoney();
+            //线上使用余额
+            Double onlineUseMoney = 0d;
+            //线下使用余额
+            Double userUseMoney = 0d;
+            //可用余额
+            Double ableUserMoney = u.getAbleUserMoney();
+            if (onlineMoney > u.getAbleUserMoney()) {
+                onlineUseMoney = u.getAbleUserMoney();
+            } else {
+                userUseMoney = u.getAbleUserMoney() - onlineMoney;
             }
+            ableUserMoney = MathUtil.sub(ableUserMoney, MathUtil.add(onlineUseMoney, userUseMoney)).doubleValue();
+            onlineMoney = MathUtil.sub(onlineMoney, onlineUseMoney).doubleValue();
+            userMoney = MathUtil.sub(userMoney, userUseMoney).doubleValue();
+            u.setAbleUserMoney(ableUserMoney);
+            u.setOnlineMoney(onlineMoney);
+            u.setUserMoney(userMoney);
+            cmUserDao.update(u);
         }
         addMessage(redirectAttributes, "确认订单成功");
         return "redirect:" + Global.getAdminPath() + "/order/detail/?id=" + orderID;