Selaa lähdekoodia

订单支付,余额抵扣

chao 3 vuotta sitten
vanhempi
commit
b3c230bfe9

+ 34 - 3
src/main/java/com/caimei365/order/controller/OnlinePayApi.java

@@ -7,24 +7,56 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.Map;
 
 /**
- * 在线支付API
+ * 支付API
  *
  * @author : Charles
  * @date : 2021/7/29
  */
-@Api(tags="在线支付API")
+@Api(tags="支付API")
 @RestController
 @RequiredArgsConstructor
 @RequestMapping("/order/pay")
 public class OnlinePayApi {
     private final OnlinePayService onlinePayService;
 
+    /**
+     * 订单支付前效验付款规则
+     */
+    @ApiOperation("订单支付前效验付款规则(旧:/order/paymentValidation)")
+    @ApiImplicitParam(required = false, name = "orderId", value = "订单Id")
+    @GetMapping("/check")
+    public ResponseJson<Map<String, Object>> paymentValidation(Integer orderId) {
+        if (null == orderId) {
+            return ResponseJson.error("订单Id不能为空!", null);
+        }
+        return onlinePayService.payBeforeCheck(orderId);
+    }
+
+    /**
+     * 订单支付,余额抵扣
+     */
+    @ApiOperation("订单支付,余额抵扣(旧:/order/balanceDeduction)")
+    @ApiImplicitParam(required = false, name = "orderId", value = "订单Id")
+    @GetMapping("/balance/deduction")
+    public ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId) {
+        if (null == orderId) {
+            return ResponseJson.error("订单Id不能为空!", null);
+        }
+        return onlinePayService.balanceDeduction(orderId);
+    }
+
+
+
+
+
+
     /**
      * 获取线上支付全局开关状态
      */
@@ -34,7 +66,6 @@ public class OnlinePayApi {
         return onlinePayService.getPayOnLineSwitch();
     }
 
-
     /**
      * 收银台数据显示
      */

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

@@ -145,4 +145,8 @@ public interface BaseMapper {
      * @param userId 机构用户Id
      */
     void updateUserBeans(Integer userId, int userBeans);
+    /**
+     * 保存余额到余额收支记录
+     */
+    void insertBalanceRecord(BalanceRecordPo balanceRecord);
 }

+ 17 - 0
src/main/java/com/caimei365/order/mapper/OnlinePayMapper.java

@@ -20,4 +20,21 @@ public interface OnlinePayMapper {
      * @param orderId 订单Id
      */
     OrderVo getOrderByOrderId(Integer orderId);
+    /**
+     * 查询审核中的退款退货数量
+     * @param orderId 订单Id
+     */
+    int getRefundCount(Integer orderId);
+    /**
+     * 更新订单状态
+     * @param order 主订单
+     */
+    void updateOrderStatus(OrderVo order);
+    /**
+     * 根据用户Id更新余额
+     * @param userMoney      用户余额
+     * @param availableMoney 用户可用余额
+     * @param userId 用户Id
+     */
+    void updateMoneyByUserId(double userMoney, Double availableMoney, Integer userId);
 }

+ 0 - 4
src/main/java/com/caimei365/order/mapper/SubmitMapper.java

@@ -97,8 +97,4 @@ public interface SubmitMapper {
      * 保存 订单用户地址
      */
     void insertOrderUserInfo(OrderUserInfoPo userInfo);
-    /**
-     * 保存余额到余额收支记录
-     */
-    void insertBalanceRecord(BalanceRecordPo balanceRecord);
 }

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

@@ -235,4 +235,5 @@ public class OrderVo implements Serializable {
      * 是否有商品发票属性的限制,为true时只能线下支付
      */
     private boolean invoiceStatus = false;
+
 }

+ 11 - 0
src/main/java/com/caimei365/order/service/OnlinePayService.java

@@ -11,6 +11,16 @@ import java.util.Map;
  * @date : 2021/7/29
  */
 public interface OnlinePayService {
+    /**
+     * 订单支付前效验付款规则
+     * @param orderId 订单Id
+     */
+    ResponseJson<Map<String, Object>> payBeforeCheck(Integer orderId);
+    /**
+     * 订单支付,余额抵扣
+     * @param orderId 订单Id
+     */
+    ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId);
     /**
      * 获取线上支付全局开关状态
      */
@@ -20,4 +30,5 @@ public interface OnlinePayService {
      * @param orderId 订单Id
      */
     ResponseJson<Map<String, Object>> getCheckoutCounter(Integer orderId);
+
 }

+ 143 - 0
src/main/java/com/caimei365/order/service/impl/OnlinePayServiceImpl.java

@@ -1,9 +1,12 @@
 package com.caimei365.order.service.impl;
 
+import com.caimei365.order.components.OrderCommonService;
+import com.caimei365.order.components.ProductService;
 import com.caimei365.order.mapper.BaseMapper;
 import com.caimei365.order.mapper.OnlinePayMapper;
 import com.caimei365.order.mapper.OrderCommonMapper;
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.po.BalanceRecordPo;
 import com.caimei365.order.model.vo.DiscernReceiptVo;
 import com.caimei365.order.model.vo.OrderProductVo;
 import com.caimei365.order.model.vo.OrderVo;
@@ -14,6 +17,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -34,6 +39,144 @@ public class OnlinePayServiceImpl implements OnlinePayService {
     private OnlinePayMapper onlinePayMapper;
     @Resource
     private OrderCommonMapper orderCommonMapper;
+    @Resource
+    private OrderCommonService orderCommonService;
+    @Resource
+    private ProductService productService;
+
+    /**
+     * 订单支付前效验付款规则
+     *
+     * @param orderId 订单Id
+     */
+    @Override
+    public ResponseJson<Map<String, Object>> payBeforeCheck(Integer orderId) {
+        // 订单信息
+        OrderVo order = onlinePayMapper.getOrderByOrderId(orderId);
+        if (null == order) {
+            return ResponseJson.error("订单不存在", null);
+        }
+        // 返回数据
+        Map<String, Object> map = new HashMap<>();
+        map.put("orderId", orderId);
+        // 查询审核中的退款退货数量
+        int refundCount = onlinePayMapper.getRefundCount(orderId);
+        if (refundCount > 0) {
+            map.put("code", -1);
+            map.put("msg", "订单已申请全部退款,无需再付款!");
+            return ResponseJson.success(map);
+        }
+        // 付款金额
+        orderCommonService.getDiscernReceiptAndSetOrder(order);
+        // 商品数据
+        List<OrderProductVo> orderProductList = orderCommonMapper.getOrderProductByOrderId(orderId);
+        for (OrderProductVo orderProduct : orderProductList) {
+            // 是否充值商品
+            boolean recharge = productService.isRechargeProduct(orderProduct.getProductId());
+            if (recharge) {
+                return ResponseJson.success(map);
+            }
+        }
+        // 可用余额
+        Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+        if (MathUtil.compare(availableMoney, 0) > 0) {
+            if (MathUtil.compare(availableMoney, order.getPendingPayments()) >= 0) {
+                map.put("code", 2);
+                map.put("msg", "余额大于或等于待付金额");
+                map.put("ableUserMoney", availableMoney);
+            } else {
+                map.put("code", 1);
+                map.put("msg", "余额不为0且小于待付金额");
+                map.put("ableUserMoney", availableMoney);
+                map.put("pendingPayments", MathUtil.sub(order.getPendingPayments(), availableMoney));
+            }
+        }
+        return ResponseJson.success(map);
+    }
+
+    /**
+     * 订单支付,余额抵扣
+     *
+     * @param orderId 订单Id
+     */
+    @Override
+    public ResponseJson<Map<String, Object>> balanceDeduction(Integer orderId) {
+        // 订单信息
+        OrderVo order = onlinePayMapper.getOrderByOrderId(orderId);
+        if (null == order) {
+            return ResponseJson.error("订单不存在", null);
+        }
+        // 付款金额
+        orderCommonService.getDiscernReceiptAndSetOrder(order);
+        // 可用余额
+        Double availableMoney = baseMapper.getAbleUserMoney(order.getUserId());
+        Double balancePayFee = 0d;
+        if (MathUtil.compare(availableMoney, 0) > 0) {
+            if (MathUtil.compare(availableMoney, order.getPendingPayments()) >= 0) {
+                if (0 != 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();
+            } else {
+                if (0 != order.getStatus()) {
+                    //待确认状态,不修改订单状态
+                    if (1 == order.getSendOutStatus()) {
+                        order.setStatus(21);
+                    } else if (2 == order.getSendOutStatus()) {
+                        order.setStatus(22);
+                    } else {
+                        order.setStatus(23);
+                    }
+                }
+                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);
+            order.setUpdateDate(curDateStr);
+            // 更新订单支付状态
+            onlinePayMapper.updateOrderStatus(order);
+            // 剩余待付金额
+            order.setPendingPayments(MathUtil.sub(order.getPendingPayments(), balancePayFee).doubleValue());
+            // 修改账户余额
+            double userMoney = baseMapper.getUserMoney(order.getUserId());
+            if (0 != order.getStatus()) {
+                userMoney = MathUtil.sub(userMoney, balancePayFee).doubleValue();
+                //保存收款记录
+                productService.saveDiscernReceipt(balancePayFee, orderId, "【订单支付,余额抵扣】");
+            }
+            availableMoney = MathUtil.sub(availableMoney, balancePayFee).doubleValue();
+            onlinePayMapper.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);
+        }
+        Map<String, Object> map = new HashMap<>(2);
+        map.put("order", order);
+        map.put("balancePayFee", balancePayFee);
+        return ResponseJson.success(map);
+    }
 
     /**
      * 获取线上支付全局开关状态

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

@@ -1128,7 +1128,7 @@ public class SubmitServiceImpl implements SubmitService {
             balanceRecord.setRemark("机构自主订单");
             balanceRecord.setDelFlag(0);
             // 保存 余额收支记录
-            submitMapper.insertBalanceRecord(balanceRecord);
+            baseMapper.insertBalanceRecord(balanceRecord);
             log.info("【提交订单】>>>>>>>>>>>>>>>>>>>>>>>>>>新增用户余额收支记录(insert[cm_user_balance_record])orderId:" + mainOrder.getOrderId());
 
             // 保存余额抵扣到收款记录(自主订单)

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

@@ -205,6 +205,10 @@
         UPDATE USER SET userBeans = #{userBeans}
         WHERE userID = #{userId}
     </update>
+    <insert id="insertBalanceRecord" parameterType="com.caimei365.order.model.po.BalanceRecordPo">
+        INSERT INTO cm_user_balance_record (userId, type, balanceType, addDate, amount, orderId, remark, delFlag)
+        VALUES (#{userId}, #{type}, #{balanceType}, #{addDate}, #{amount}, #{orderId}, #{remark}, #{delFlag})
+    </insert>
     <!--    <select id="getAddressDetailById" resultType="com.caimei365.order.model.vo.AddressVo">-->
 <!--        SELECT-->
 <!--            a.addressID AS addressId,-->

+ 27 - 0
src/main/resources/mapper/OnlinePayMapper.xml

@@ -1,6 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei365.order.mapper.OnlinePayMapper">
+    <update id="updateOrderStatus">
+        UPDATE cm_order SET
+        status = #{status}
+        <if test="receiptStatus != null and receiptStatus != ''">
+            ,receiptStatus = #{receiptStatus}
+        </if>
+        <if test="payStatus != null and payStatus != ''">
+            ,payStatus = #{payStatus}
+        </if>
+        <if test="balancePayFee != null and balancePayFee != ''">
+            ,balancePayFee = #{balancePayFee}
+        </if>
+        <if test="payableAmount != null and payableAmount != ''">
+            ,payableAmount = #{payableAmount}
+        </if>
+        ,updateDate = #{updateDate}
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="updateMoneyByUserId">
+        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>
@@ -50,4 +72,9 @@
         FROM cm_order
         WHERE orderID = #{orderId}
     </select>
+    <select id="getRefundCount" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM cm_returned_purchase
+        WHERE orderID = #{orderId} AND STATUS = '1' AND delFlag = '0'
+    </select>
 </mapper>

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

@@ -63,10 +63,6 @@
         VALUES (#{orderId}, #{clubId}, #{userId}, #{userName}, #{name}, #{mobile},
                 #{addressId}, #{townId}, #{province}, #{city}, #{town}, #{address})
     </insert>
-    <insert id="insertBalanceRecord" parameterType="com.caimei365.order.model.po.BalanceRecordPo">
-        INSERT INTO cm_user_balance_record (userId, type, balanceType, addDate, amount, orderId, remark, delFlag)
-        VALUES (#{userId}, #{type}, #{balanceType}, #{addDate}, #{amount}, #{orderId}, #{remark}, #{delFlag})
-    </insert>
     <update id="updateUserMoney">
         UPDATE USER SET userMoney = #{userMoney}, ableUserMoney = #{ableUserMoney}
         WHERE userID = #{userId}