Bladeren bron

线上/下余额退款

zhijiezhao 3 jaren geleden
bovenliggende
commit
09e194b223

+ 2 - 1
src/main/java/com/caimei/modules/order/dao/CmReceiptOrderRelationDao.java

@@ -1,5 +1,6 @@
 package com.caimei.modules.order.dao;
 
+import com.caimei.modules.order.entity.CmOnlineRefundVo;
 import com.thinkgem.jeesite.common.persistence.CrudDao;
 import com.thinkgem.jeesite.common.persistence.annotation.MyBatisDao;
 import com.caimei.modules.order.entity.CmReceiptOrderRelation;
@@ -41,5 +42,5 @@ public interface CmReceiptOrderRelationDao extends CrudDao<CmReceiptOrderRelatio
 
     Double findMoney(String mbOrderId);
 
-    String findPayTypeByOrderRequestNo(String mbOrderId);
+    void insertOnlineRefund(CmOnlineRefundVo cmOnlineRefundVo);
 }

+ 61 - 0
src/main/java/com/caimei/modules/order/entity/CmOnlineRefundVo.java

@@ -0,0 +1,61 @@
+package com.caimei.modules.order.entity;
+
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+
+public class CmOnlineRefundVo extends DataEntity<CmOnlineRefundVo> {
+    private static final long serialVersionUID = 1L;
+    private Integer userId;
+    private String mborderId;
+    private String orderRequestNo;
+    private String orderId;
+    private String amount;
+    private String refundType;//退款方式 1线上支付原路退回 ,2线上余额退现金
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getMborderId() {
+        return mborderId;
+    }
+
+    public void setMborderId(String mborderId) {
+        this.mborderId = mborderId;
+    }
+
+    public String getOrderRequestNo() {
+        return orderRequestNo;
+    }
+
+    public void setOrderRequestNo(String orderRequestNo) {
+        this.orderRequestNo = orderRequestNo;
+    }
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getAmount() {
+        return amount;
+    }
+
+    public void setAmount(String amount) {
+        this.amount = amount;
+    }
+
+    public String getRefundType() {
+        return refundType;
+    }
+
+    public void setRefundType(String refundType) {
+        this.refundType = refundType;
+    }
+}

+ 52 - 6
src/main/java/com/caimei/modules/order/service/CmReturnedPurchaseService.java

@@ -797,6 +797,7 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
         }
         List<CmReceiptOrderRelation> relationList = cmReceiptOrderRelationDao.findByOrderID(orderId.toString());
         if (null != relationList && relationList.size() > 0) {
+            Integer userId = cmReceiptOrderRelationDao.findUserId(orderId);
             for (CmReceiptOrderRelation orderRelation : relationList) {
                 JSONObject json = new JSONObject();
                 json.put("merAccount", merAccount);
@@ -825,6 +826,16 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
                         String msg = result.getString("msg");
                         logger.info("第三方退款失败>>>>>>>msg:" + msg);
                         throw new Exception("第三方退款失败!");
+                    }else{
+                        //存cm_online_refund
+                        CmOnlineRefundVo cmOnlineRefundVo = new CmOnlineRefundVo();
+                        cmOnlineRefundVo.setUserId(userId);
+                        cmOnlineRefundVo.setOrderId(orderId.toString());
+                        cmOnlineRefundVo.setAmount(orderRelation.getAssociateAmount().toString());
+                        cmOnlineRefundVo.setRefundType("1");
+                        cmOnlineRefundVo.setMborderId(orderRelation.getMbOrderId());
+                        cmOnlineRefundVo.setOrderRequestNo(merchantRefundNo);
+                        cmReceiptOrderRelationDao.insertOnlineRefund(cmOnlineRefundVo);
                     }
                 }
                 //cdr表payway为3余额支付,查是否有线上余额支付
@@ -832,8 +843,8 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
                     //查当前单线上余额支付总金额
                     Double onlineMoneyPay = cmReceiptOrderRelationDao.findOnlineMoneyPay(orderId);
                     if (null != onlineMoneyPay && onlineMoneyPay >= 0.01) {
+                        logger.info("线上余额退现金==============orderId==>"+orderId);
                         //根据userid查产生线上余额的唯一请求单号,发起退款请求
-                        Integer userId = cmReceiptOrderRelationDao.findUserId(orderId);
                         //用户名下未分帐的线上余额订单mborderid
                         List<String> mborderIds = cmReceiptOrderRelationDao.findMborderId(userId);
                         //用户名下线上退款回线上余额的原mborderid
@@ -842,14 +853,49 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
                                 if (onlineMoneyPay > 0) {
                                     //该单线上余额
                                     Double money = cmReceiptOrderRelationDao.findMoney(s);
-                                    //待支付总线上余额>该笔退款金额,则退全额,否则退待支付
+                                    //实际退款=待支付总线上余额>该笔退款金额,则退全额,否则退待支付
                                     Double refundMoney = MathUtil.compare(onlineMoneyPay, money) > 0 ? money : onlineMoneyPay;
-                                    String payType=cmReceiptOrderRelationDao.findPayTypeByOrderRequestNo(s);
-                                    //todo 退款
-
-
+                                    //退款
+                                    // 当前时间戳
+                                    long time = System.currentTimeMillis() / 1000;
+                                    json.put("time", time);
+                                    //商户退款流水号,由商户自行生成,必须唯一  orderid+余额退现+orid
+                                    String merchantRefundNo = orderId + "YETX" + orderRelation.getId();
+                                    json.put("merchantRefundNo", merchantRefundNo);
+                                    //退款金额,单位分,必须大于0
+                                    int refundAmt = (int) (refundMoney * 100);
+                                    json.put("refundAmt", refundAmt);
+                                    //退款原因
+                                    String refundCause = "用户主动退款";
+                                    json.put("refundCause", refundCause);
+                                    //平台交易订单号
+                                    json.put("mbOrderId", s);
+                                    String sign = PayUtils.buildSign(json, merKey);
+                                    json.put("sign", sign);
+                                    String data = PayUtils.buildDataPrivate(json, merKey);
+                                    JSONObject result = PayUtils.httpPost("https://platform.mhxxkj.com/paygateway/mbrefund/orderRefund/v1", merAccount, data);
+                                    String code = result.getString("code");
+                                    if (!"000000".equals(code)) {
+                                        String msg = result.getString("msg");
+                                        logger.info("余额退现失败>>>>>>>msg:" + msg);
+                                        throw new Exception("第三方退款失败!");
+                                    }else{
+                                        //存cm_online_refund
+                                        CmOnlineRefundVo cmOnlineRefundVo = new CmOnlineRefundVo();
+                                        cmOnlineRefundVo.setUserId(userId);
+                                        cmOnlineRefundVo.setOrderId(orderId.toString());
+                                        cmOnlineRefundVo.setAmount(refundMoney.toString());
+                                        cmOnlineRefundVo.setRefundType("2");
+                                        cmOnlineRefundVo.setMborderId(s);
+                                        cmOnlineRefundVo.setOrderRequestNo(merchantRefundNo);
+                                        cmReceiptOrderRelationDao.insertOnlineRefund(cmOnlineRefundVo);
+                                    }
+                                    //应付减已退
                                     onlineMoneyPay = MathUtil.sub(onlineMoneyPay, money).doubleValue();
                                 }
+                                if(onlineMoneyPay<=0){
+                                    break;
+                                }
                             }
                         }
                         if(onlineMoneyPay<=0){

+ 11 - 11
src/main/resources/mappings/modules/order/CmReceiptOrderRelationMapper.xml

@@ -71,7 +71,10 @@
 			#{delFlag}
 		)
 	</insert>
-
+	<insert id="insertOnlineRefund">
+		insert into cm_online_refund(userId,mborderId,orderRequestNo,orderId,amount,refundType,refundTime,delFlag)
+		values (#{userId},#{mborderId},#{orderRequestNo},#{orderId},#{amount},#{refundType},now(),0)
+	</insert>
 	<update id="update">
 		UPDATE cm_receipt_order_relation SET
 			relationType = #{relationType},
@@ -214,7 +217,7 @@
 		SELECT cror.mbOrderId FROM cm_receipt_order_relation cror
 		LEFT JOIN cm_user_balance_record cubr ON cror.orderID = cubr.orderId
 		LEFT JOIN cm_order co ON cror.orderID = co.orderID
-		WHERE cubr.balanceType IN (13, 16, 17, 18, 19)
+		WHERE cubr.balanceType IN (13, 16, 17)
 		  AND cror.splitStatus = 0
 		  AND cubr.type = 1
 		  AND cror.delFlag = 0
@@ -230,14 +233,11 @@
 		where orderID = #{orderId}
 	</select>
     <select id="findMoney" resultType="java.lang.Double">
-        select associateAmount
-        from cm_receipt_order_relation
-        where mbOrderId = #{mbOrderId}
-    </select>
-    <select id="findPayTypeByOrderRequestNo" resultType="java.lang.String">
-        SELECT payType
-        FROM cm_discern_receipt cdr
-        LEFT JOIN cm_receipt_order_relation cror ON cror.receiptID = cdr.id
-        WHERE mbOrderId = #{mbOrderId}
+		SELECT cror.associateAmount-SUM(IFNULL(cor.amount,0))
+		FROM cm_receipt_order_relation cror
+		LEFT JOIN cm_online_refund cor ON cror.mbOrderId=cor.mbOrderId
+		WHERE cror.mbOrderId = #{mbOrderId}
+		  AND cor.delflag=0
+		  AND cror.delflag=0
     </select>
 </mapper>