Browse Source

余额抵扣

zhijiezhao 1 year ago
parent
commit
6a3e4fb57a

+ 44 - 62
src/main/java/com/caimei365/order/components/ProductService.java

@@ -443,67 +443,49 @@ public class ProductService {
         }
     }
 
-    public void saveShopOrderDiscernReceipt(Double balancePayFee, OrderVo order) {
-        List<ShopOrderVo> shopOrderVos = commonMapper.getShopOrderListByOrderId(order.getOrderId());
-        AtomicReference<Double> bal = new AtomicReference<>(balancePayFee);
-        shopOrderVos.forEach(s -> {
-            Double pay = 0d;
-            if (MathUtil.compare(bal.get(), s.getNeedPayAmount()) >= 0) {
-                pay = s.getNeedPayAmount();
-                bal.updateAndGet(v -> v - s.getNeedPayAmount());
-                s.setReceiptStatus(3);
-            } else {
-                pay = bal.get();
-                s.setReceiptStatus(2);
-            }
-            s.setReceiptAmount(pay);
-            s.setAccountAmount(pay);
-            s.setUseBalanceFlag(1);
-            Date date = new Date();
-            String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
-            // 识别款项表
-            DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
-            discernReceipt.setPayWay(3);
-            discernReceipt.setPayType(16);
-            discernReceipt.setReceiptType(1);
-            discernReceipt.setReceiptStatus(3);
-            discernReceipt.setReceiptAmount(pay);
-            discernReceipt.setConfirmType(4);
-            discernReceipt.setReceiptDate(curDateStr);
-            discernReceipt.setConfirmDate(curDateStr);
-            discernReceipt.setReviewDate(curDateStr);
-            discernReceipt.setUpdateDate(curDateStr);
-            discernReceipt.setDelFlag(0);
-            // 保存 收款记录
-            baseMapper.insertDiscernReceipt(discernReceipt);
-            log.info(">>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",shopOrderId:" + s.getShopOrderId());
-            // 收款项和订单关系表
-            OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
-            relation.setReceiptId(discernReceipt.getId());
-            relation.setOrderId(order.getOrderId());
-            relation.setShopOrderId(s.getShopOrderId());
-            relation.setAssociateAmount(pay);
-            relation.setRelationType(2);
-            relation.setDelFlag(0);
-            // 保存 收款项和订单关系
-            baseMapper.insertOrderReceiptRelation(relation);
-            log.info(">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",shopOrderId:" + s.getShopOrderId());
-            //保存余额到余额收支记录
-            BalanceRecordPo balanceRecord = new BalanceRecordPo();
-            balanceRecord.setUserId(order.getUserId());
-            balanceRecord.setType(2);
-            balanceRecord.setBalanceType(1);
-            balanceRecord.setAddDate(new Date());
-            balanceRecord.setAmount(pay);
-            balanceRecord.setOrderId(order.getOrderId());
-            balanceRecord.setShopOrderId(s.getShopOrderId());
-            balanceRecord.setRemark("订单支付,余额抵扣");
-            balanceRecord.setDelFlag(0);
-            // 保存 余额收支记录
-            baseMapper.insertBalanceRecord(balanceRecord);
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])shopOrderId:" + s.getShopOrderId());
-            commonMapper.updateShopOrderBalance(s);
-        });
-
+    public void saveShopOrderDiscernReceipt(Double balancePayFee, ShopOrderVo order) {
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        // 识别款项表
+        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
+        discernReceipt.setPayWay(3);
+        discernReceipt.setPayType(16);
+        discernReceipt.setReceiptType(1);
+        discernReceipt.setReceiptStatus(3);
+        discernReceipt.setReceiptAmount(balancePayFee);
+        discernReceipt.setConfirmType(4);
+        discernReceipt.setReceiptDate(curDateStr);
+        discernReceipt.setConfirmDate(curDateStr);
+        discernReceipt.setReviewDate(curDateStr);
+        discernReceipt.setUpdateDate(curDateStr);
+        discernReceipt.setDelFlag(0);
+        // 保存 收款记录
+        baseMapper.insertDiscernReceipt(discernReceipt);
+        log.info(">>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",shopOrderId:" + s.getShopOrderId());
+        // 收款项和订单关系表
+        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+        relation.setReceiptId(discernReceipt.getId());
+        relation.setOrderId(order.getOrderId());
+        relation.setShopOrderId(order.getShopOrderId());
+        relation.setAssociateAmount(balancePayFee);
+        relation.setRelationType(2);
+        relation.setDelFlag(0);
+        // 保存 收款项和订单关系
+        baseMapper.insertOrderReceiptRelation(relation);
+        log.info(">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",shopOrderId:" + s.getShopOrderId());
+        //保存余额到余额收支记录
+        BalanceRecordPo balanceRecord = new BalanceRecordPo();
+        balanceRecord.setUserId(order.getUserId());
+        balanceRecord.setType(2);
+        balanceRecord.setBalanceType(1);
+        balanceRecord.setAddDate(new Date());
+        balanceRecord.setAmount(balancePayFee);
+        balanceRecord.setOrderId(order.getOrderId());
+        balanceRecord.setShopOrderId(order.getShopOrderId());
+        balanceRecord.setRemark("订单支付,余额抵扣");
+        balanceRecord.setDelFlag(0);
+        // 保存 余额收支记录
+        baseMapper.insertBalanceRecord(balanceRecord);
+        log.info("【订单支付,余额抵扣】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])shopOrderId:" + s.getShopOrderId());
     }
 }

+ 2 - 2
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -165,10 +165,10 @@ public class HeliPayApi {
     @ApiOperation("订单支付,余额抵扣(旧:/order/balanceDeduction)")
     @PostMapping("/balance/deduction")
     public ResponseJson<Map<String, Object>> balanceDeduction(PayDto payDto) {
-        if (null == payDto.getOrderId()) {
+        if (null == payDto.getShopOrderId()) {
             return ResponseJson.error("订单Id不能为空!", null);
         }
-        return payOrderService.balanceDeduction(payDto.getOrderId());
+        return payOrderService.balanceDeduction(payDto.getShopOrderId());
     }
 
     /**

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

@@ -295,4 +295,6 @@ public interface PayOrderMapper {
     QuickInfoVo findInfoById(Integer infoId);
 
     QuickInfoVo findInfoNotDel(String infoId);
+
+    void updateShopOrderBalancePay(ShopOrderVo shopOrder);
 }

+ 3 - 0
src/main/java/com/caimei365/order/model/dto/PayDto.java

@@ -54,4 +54,7 @@ public class PayDto implements Serializable {
 
     @ApiModelProperty("支付类型 微信:WXPAY  支付宝:ALIPAY 公众号:AppPayPublic 小程序:AppPayApplet 银联:PUBLIC")
     private String payType;
+
+    @ApiModelProperty("子订单Id")
+    private Integer shopOrderId;
 }

+ 1 - 1
src/main/java/com/caimei365/order/service/PayOrderService.java

@@ -30,7 +30,7 @@ public interface PayOrderService {
      * 订单支付,余额抵扣
      * @param orderId 订单Id
      */
-    ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId);
+    ResponseJson<Map<String, Object>> balanceDeduction(Integer shopOrderId);
     /**
      * 获取线上支付全局开关状态
      */

+ 58 - 83
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -156,111 +156,86 @@ public class PayOrderServiceImpl implements PayOrderService {
      * @param orderId 订单Id
      */
     @Override
-    public ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId) {
+    public ResponseJson<Map<String, Object>> balanceDeduction(Integer shopOrderId) {
         // 订单信息
-        OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
-        if (null == order) {
+        ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
+        if (null == shopOrder) {
             return ResponseJson.error("订单不存在", null);
         }
         // 付款金额
-        orderCommonService.getDiscernReceiptAndSetOrder(order);
+        orderCommonService.getDiscernReceiptAndSetShoporder(shopOrder);
         // 可用余额
-        Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+        Double availableMoney = baseMapper.getAbleUserMoney(shopOrder.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()) {
-                        order.setStatus(31);
-                    } else if (2 == order.getSendOutStatus()) {
-                        order.setStatus(32);
-                    } else {
-                        order.setStatus(33);
-                    }
-                }
-                order.setReceiptStatus(3);
-                balancePayFee = order.getPendingPayments();
+            if (MathUtil.compare(availableMoney, shopOrder.getObligation()) >= 0) {
+                shopOrder.setReceiptStatus(3);
+                balancePayFee = shopOrder.getObligation();
             } else {
-                if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
-                    //待确认状态,不修改订单状态
-                    if (1 == order.getSendOutStatus()) {
-                        order.setStatus(21);
-                    } else if (2 == order.getSendOutStatus()) {
-                        order.setStatus(22);
-                    } else {
-                        order.setStatus(23);
-                    }
-                }
-                order.setReceiptStatus(2);
+                shopOrder.setReceiptStatus(2);
                 balancePayFee = availableMoney;
             }
             //设置余额支付金额
-            order.setBalancePayFee(MathUtil.add(order.getBalancePayFee(), balancePayFee).doubleValue());
+            shopOrder.setAccountAmount(MathUtil.add(shopOrder.getAccountAmount(), 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);
-            order.setUpdateDate(curDateStr);
-            order.setOnlinePayFlag(1);
+            shopOrder.setReceiptAmount(MathUtil.sub(shopOrder.getReceiptAmount(), balancePayFee).doubleValue());
+            shopOrder.setOnlinePay(1);
             // 更新订单支付状态
-            payOrderMapper.updateOrderStatus(order);
-            // 剩余待付金额
-            order.setPendingPayments(MathUtil.sub(order.getPendingPayments(), balancePayFee).doubleValue());
+            payOrderMapper.updateShopOrderBalancePay(shopOrder);
             // 修改账户余额
-            double userMoney = baseMapper.getUserMoney(order.getUserId());
-            if (OrderStatus.UNCONFIRMED.getCode() != order.getStatus()) {
+            double userMoney = baseMapper.getUserMoney(shopOrder.getUserId());
+            if (OrderStatus.UNCONFIRMED.getCode() != shopOrder.getStatus()) {
                 /**
-                 *  子订单循环抵扣用户余额
+                 *  子订单抵扣用户余额
                  */
-                productService.saveShopOrderDiscernReceipt(balancePayFee, order);
+                productService.saveShopOrderDiscernReceipt(balancePayFee, shopOrder);
             }
             //可用=可用-本次抵扣
             availableMoney = MathUtil.sub(availableMoney, balancePayFee).doubleValue();
             userMoney = MathUtil.sub(userMoney, balancePayFee).doubleValue();
-            payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, order.getUserId());
-            log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + order.getUserId() + ",orderId:" + orderId);
-            log.info("************************订单支付完成消息推送*********************");
-            //判断是否是二手订单和返佣订单
-            List<Integer> productIds = orderClubMapper.getProductOrder(orderId);
-            if (0 == orderClubMapper.getsecondHandOrderFlag(orderId) && 0 == orderClubMapper.getrebateFlag(orderId) && (null != productIds && !productIds.contains(6060))) {
-                try {
-                    String accessToken = weChatService.getAccessToken();
-                    List<String> openidList = orderClubMapper.getOpenidListByPermission(orderClubMapper.FromUnionId(order.getOrderId()));
-                    openidList.removeIf(Objects::isNull);
-                    String name = StringUtils.strip(orderClubMapper.getOrderIds(orderId).toString().substring(0, 11), "[]");
-                    String associateTitle = "订单支付成功!";
-                    Double money = orderClubMapper.getpayTotalFee(orderId);
-                    String orderno = order.getOrderNo();
-                    String paytime = curDateStr;
-                    String remarkText = "采美将尽快为您安排发货~";
-                    // 跳转到【小程序付款-选择支付方式页面】
-                    String pagePath = "pages/user/order/order-details?type=share&orderId=" + orderId;
-                    for (String openid : openidList) {
-                        // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
-                        weChatService.sendTemplateMsgz(accessToken, openid, associateTitle, paytime, name, orderno, money, remarkText, pagePath);
-                    }
-                } catch (Exception e) {
-                    log.error("【订单发货通知】获取微信公众号access_token异常!", e);
-                }
-
-                //推送信息中心-交易物流
-                MessageCenter messageCenter = new MessageCenter();
-                messageCenter.setShopID(null);
-                messageCenter.setClubID(order.getClubId());
-                messageCenter.setUserType(1);
-                messageCenter.setMessageType(1);
-                messageCenter.setOrderMessageType(2);
-                messageCenter.setOrderID(orderId);
-                messageCenter.setContent(null);
-                messageCenter.setTime(curDateStr);
-                orderClubMapper.addMessageCenter(messageCenter);
-
-            }
-            log.info("支付成功" + order.getUserId());
-        }
+            payOrderMapper.updateMoneyByUserId(userMoney, availableMoney, shopOrder.getUserId());
+            log.info("【订单支付,余额抵扣】>>>>>>>>>>>更新用户余额(update[user])userId:" + shopOrder.getUserId() + ",shopOrderId:" + shopOrder.getShopOrderId());
+//            log.info("************************订单支付完成消息推送*********************");
+//            //判断是否是二手订单和返佣订单
+//            List<Integer> productIds = orderClubMapper.getProductOrder(shopOrder.getOrderId());
+//            if (0 == orderClubMapper.getsecondHandOrderFlag(orderId) && 0 == orderClubMapper.getrebateFlag(orderId) && (null != productIds && !productIds.contains(6060))) {
+//                try {
+//                    String accessToken = weChatService.getAccessToken();
+//                    List<String> openidList = orderClubMapper.getOpenidListByPermission(orderClubMapper.FromUnionId(order.getOrderId()));
+//                    openidList.removeIf(Objects::isNull);
+//                    String name = StringUtils.strip(orderClubMapper.getOrderIds(orderId).toString().substring(0, 11), "[]");
+//                    String associateTitle = "订单支付成功!";
+//                    Double money = orderClubMapper.getpayTotalFee(orderId);
+//                    String orderno = order.getOrderNo();
+//                    String paytime = curDateStr;
+//                    String remarkText = "采美将尽快为您安排发货~";
+//                    // 跳转到【小程序付款-选择支付方式页面】
+//                    String pagePath = "pages/user/order/order-details?type=share&orderId=" + orderId;
+//                    for (String openid : openidList) {
+//                        // sendTemplateMsg(openid, 标题, 金额, 收款日期, 备注, 跳转链接)
+//                        weChatService.sendTemplateMsgz(accessToken, openid, associateTitle, paytime, name, orderno, money, remarkText, pagePath);
+//                    }
+//                } catch (Exception e) {
+//                    log.error("【订单发货通知】获取微信公众号access_token异常!", e);
+//                }
+//
+//                //推送信息中心-交易物流
+//                MessageCenter messageCenter = new MessageCenter();
+//                messageCenter.setShopID(null);
+//                messageCenter.setClubID(order.getClubId());
+//                messageCenter.setUserType(1);
+//                messageCenter.setMessageType(1);
+//                messageCenter.setOrderMessageType(2);
+//                messageCenter.setOrderID(orderId);
+//                messageCenter.setContent(null);
+//                messageCenter.setTime(curDateStr);
+//                orderClubMapper.addMessageCenter(messageCenter);
+//
+//            }
+//        }
         Map<String, Object> map = new HashMap<>(2);
-        map.put("order", order);
+        map.put("order", shopOrder);
         map.put("balancePayFee", balancePayFee);
         return ResponseJson.success(map);
     }

+ 2 - 1
src/main/resources/mapper/OrderCommonMapper.xml

@@ -813,7 +813,8 @@
                cop.receiptStatus,
                cop.splitCode,
                ifnull(cop.paySuccessCounter, 0) as paySuccessCounter,
-               p.name                           as shopName
+               p.name                           as shopName,
+               cop.shopStatus as status
         FROM cm_shop_order cop
                  left join shop p on cop.shopID = p.shopID
         WHERE delFlag = 0

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

@@ -251,6 +251,14 @@
             idCard         = #{idCard}
         where id = #{id}
     </update>
+    <update id="updateShopOrderBalancePay">
+        update cm_shop_order
+        set accountAmount = #{accountAmount},
+            receiptAmount = #{receiptAmount},
+            receiptStatus = #{receiptStatus},
+            updateTime = now()
+        where shopOrderId = #{shopOrderId}
+    </update>
     <select id="getPayOnLineSwitch" resultType="java.lang.Integer">
         SELECT STATUS
         FROM cm_pay_online_switch