Просмотр исходного кода

分账前后转账补贴手续费

zhijiezhao 2 лет назад
Родитель
Сommit
d107ff9b83

+ 8 - 0
src/main/java/com/caimei/modules/order/dao/CmReturnedPurchaseDao.java

@@ -35,4 +35,12 @@ public interface CmReturnedPurchaseDao extends CrudDao<CmReturnedPurchase> {
     List<Integer> getReturnShopOrder(String id);
     List<Integer> getReturnShopOrder(String id);
 
 
     void insertCmRefundRecord(CmRefundRecord cmRefundRecord);
     void insertCmRefundRecord(CmRefundRecord cmRefundRecord);
+
+    Double findBrokerage(String orderRequestNo);
+
+    Double findRefundTransfer(String orderRequestNo);
+
+    Double findRefundCharge(String orderRequestNo);
+
+    Double findPayAmount(String orderRequestNo);
 }
 }

+ 9 - 0
src/main/java/com/caimei/modules/order/entity/CmReceiptOrderRelation.java

@@ -23,6 +23,7 @@ public class CmReceiptOrderRelation extends DataEntity<CmReceiptOrderRelation> {
     private String receiptDate;    //收款时间
     private String receiptDate;    //收款时间
     private String confirmType;        //确认订单类型
     private String confirmType;        //确认订单类型
 
 
+    private Integer splitStatus;   //分账状态:0待分账,1已分账(只针对线上支付)
     /**
     /**
      * 抹平备注(目前适用后台直接抹平账户操作)
      * 抹平备注(目前适用后台直接抹平账户操作)
      */
      */
@@ -47,6 +48,14 @@ public class CmReceiptOrderRelation extends DataEntity<CmReceiptOrderRelation> {
      */
      */
     private String payWay;
     private String payWay;
 
 
+    public Integer getSplitStatus() {
+        return splitStatus;
+    }
+
+    public void setSplitStatus(Integer splitStatus) {
+        this.splitStatus = splitStatus;
+    }
+
     public String getPayWay() {
     public String getPayWay() {
         return payWay;
         return payWay;
     }
     }

+ 34 - 0
src/main/java/com/caimei/modules/order/entity/CmRefundTransfer.java

@@ -0,0 +1,34 @@
+package com.caimei.modules.order.entity;
+
+import com.thinkgem.jeesite.common.persistence.DataEntity;
+
+public class CmRefundTransfer extends DataEntity<CmRefundTransfer> {
+    private static final long serialVersionUID = 1L;
+    private Integer transferType;//转账类型,1网银手续费2佣金
+    private Double transferAmount;//转账金额
+    private String orderRequestNo;
+
+    public Integer getTransferType() {
+        return transferType;
+    }
+
+    public void setTransferType(Integer transferType) {
+        this.transferType = transferType;
+    }
+
+    public Double getTransferAmount() {
+        return transferAmount;
+    }
+
+    public void setTransferAmount(Double transferAmount) {
+        this.transferAmount = transferAmount;
+    }
+
+    public String getOrderRequestNo() {
+        return orderRequestNo;
+    }
+
+    public void setOrderRequestNo(String orderRequestNo) {
+        this.orderRequestNo = orderRequestNo;
+    }
+}

+ 123 - 16
src/main/java/com/caimei/modules/order/service/CmReturnedPurchaseService.java

@@ -44,6 +44,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
@@ -611,7 +612,7 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
                     throw new Exception("退款子订单信息错误!");
                     throw new Exception("退款子订单信息错误!");
                 }
                 }
                 Double refundOnlineFee = returnedPurchase.getRefundOnlineFee();
                 Double refundOnlineFee = returnedPurchase.getRefundOnlineFee();
-                theOnlineRefund(shopOrderIds,refundOnlineFee);
+                theOnlineRefund(shopOrderIds, refundOnlineFee);
             }
             }
 
 
             //二手订单交易全退,标记未售
             //二手订单交易全退,标记未售
@@ -753,39 +754,68 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
      *
      *
      * @param shopOrderIds
      * @param shopOrderIds
      */
      */
-    public void theOnlineRefund(List<Integer> shopOrderIds,Double refundOnlineFee) {
+    public void theOnlineRefund(List<Integer> shopOrderIds, Double refundOnlineFee) {
         List<CmReceiptOrderRelation> relationList = cmReceiptOrderRelationDao.findByShopOrderIds(shopOrderIds);
         List<CmReceiptOrderRelation> relationList = cmReceiptOrderRelationDao.findByShopOrderIds(shopOrderIds);
-//        AtomicDouble allRefund = new AtomicDouble(0);
-//        relationList.forEach(r -> allRefund.getAndSet(Double.parseDouble(r.getAssociateAmount())));
         if (null != relationList && relationList.size() > 0) {
         if (null != relationList && relationList.size() > 0) {
             for (CmReceiptOrderRelation orderRelation : relationList) {
             for (CmReceiptOrderRelation orderRelation : relationList) {
                 //cdr表payway为1纯线上收款
                 //cdr表payway为1纯线上收款
                 if ("1".equals(orderRelation.getPayWay())) {
                 if ("1".equals(orderRelation.getPayWay())) {
-                    String value="";
-                    refundOnlineFee=MathUtil.sub(refundOnlineFee,Double.parseDouble(orderRelation.getAssociateAmount())).doubleValue();
-                    if(refundOnlineFee>0){
+                    String value = "";
+                    refundOnlineFee = MathUtil.sub(refundOnlineFee, Double.parseDouble(orderRelation.getAssociateAmount())).doubleValue();
+                    if (refundOnlineFee > 0) {
                         //要退的钱大于本次交易金额
                         //要退的钱大于本次交易金额
-                        value=orderRelation.getAssociateAmount();
+                        value = orderRelation.getAssociateAmount();
                     }
                     }
-                    if(refundOnlineFee<0){
-                        value=refundOnlineFee.toString();
+                    if (refundOnlineFee < 0) {
+                        value = refundOnlineFee.toString();
                     }
                     }
                     //不同产品区分
                     //不同产品区分
                     if ("12".equals(orderRelation.getPayType()) || "17".equals(orderRelation.getPayType())) {
                     if ("12".equals(orderRelation.getPayType()) || "17".equals(orderRelation.getPayType())) {
-                        //已分帐应该先转回佣金
-
+                        if (1 == orderRelation.getSplitStatus()) {
+                            //已分帐应该先转回佣金
+                            //如果已转回则不再转。
+                            Double refundTransfer = cmReturnedPurchaseDao.findRefundTransfer(orderRelation.getOrderRequestNo());
+                            if (0 == refundTransfer) {
+                                Double brokerage = cmReturnedPurchaseDao.findBrokerage(orderRelation.getOrderRequestNo());
+                                if (brokerage > 0) {
+                                    //0.1%手续费,转回金额*99.9%=brokerage
+                                    Double v = MathUtil.div(brokerage, 0.999, 2).doubleValue();
+                                    transferMoney(v, orderRelation.getShopOrderId(), orderRelation.getOrderRequestNo(), 2);
+                                }
+                            }
+                        }
                         //手续费转给供应商
                         //手续费转给供应商
+                        Double refundTransfer = cmReturnedPurchaseDao.findRefundCharge(orderRelation.getOrderRequestNo());
+                        if (0 == refundTransfer) {
+                            //计算手续费
+                            Double payAmount = cmReturnedPurchaseDao.findPayAmount(orderRelation.getOrderRequestNo());
+                            //0.1%手续费,转回金额*99.9%=payAmount
+                            Double v = MathUtil.div(payAmount, 0.999, 2).doubleValue();
+                            transferMoney(v, orderRelation.getShopOrderId(), orderRelation.getOrderRequestNo(), 1);
 
 
+                        }
                         //网银
                         //网银
                         unionRefund(orderRelation.getOrderRequestNo(), value, orderRelation.getShopOrderId());
                         unionRefund(orderRelation.getOrderRequestNo(), value, orderRelation.getShopOrderId());
                     } else {
                     } else {
                         // 已分帐应该先转回佣金
                         // 已分帐应该先转回佣金
-
+                        if (1 == orderRelation.getSplitStatus()) {
+                            //已分帐应该先转回佣金
+                            //如果已转回则不再转。
+                            Double refundTransfer = cmReturnedPurchaseDao.findRefundTransfer(orderRelation.getOrderRequestNo());
+                            if (0 == refundTransfer) {
+                                Double brokerage = cmReturnedPurchaseDao.findBrokerage(orderRelation.getOrderRequestNo());
+                                if (brokerage > 0) {
+                                    //0.1%手续费,转回金额*99.9%=brokerage
+                                    Double v = MathUtil.div(brokerage, 0.999, 2).doubleValue();
+                                    transferMoney(v, orderRelation.getShopOrderId(), orderRelation.getOrderRequestNo(), 2);
+                                }
+                            }
+                        }
                         //扫码
                         //扫码
-                        onlinePay(orderRelation.getOrderRequestNo(),value, orderRelation.getShopOrderId());
+                        onlinePay(orderRelation.getOrderRequestNo(), value, orderRelation.getShopOrderId());
                     }
                     }
 
 
-                    if(0==refundOnlineFee){
+                    if (0 == refundOnlineFee) {
                         break;
                         break;
                     }
                     }
                 }
                 }
@@ -793,6 +823,83 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
         }
         }
     }
     }
 
 
+    public void transferMoney(Double v, Integer shopOrderId, String orderRequestNo, Integer flag) {
+        try {
+            AccountPayOrder accountPayOrder = new AccountPayOrder();
+            accountPayOrder.setP1_bizType("AccountPaySub");
+            accountPayOrder.setP2_signType("MD5");
+            String format1 = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss.SSS").format(new Date());
+            accountPayOrder.setP3_timestamp(format1);
+            String substring = format1.substring(20);
+            // fz+当前微秒时间+原唯一订单号
+            accountPayOrder.setP4_orderId("FZ" + substring + orderRequestNo);
+            //付款账户子订单绑定商户号(这里从佣金转出)
+            accountPayOrder.setP5_customerNumber(Constant.CUSTOMERNUM2);
+            AccountPayOrder.AccountPayOrderExt accountPayOrderExt = new AccountPayOrder.AccountPayOrderExt();
+            //收款账户商编  填写splitBillRules时候不填写MerchantNo,Amount并且即使填写这两个参数不生效!!
+            accountPayOrderExt.setInMerchantNo(cmReturnedPurchaseDao.findSplitCode(shopOrderId));
+            accountPayOrderExt.setOrderType(AccountPayOrderType.TRANSFER);
+            accountPayOrderExt.setAmount(BigDecimal.valueOf(v));
+            accountPayOrderExt.setServerCallbackUrl("");
+            accountPayOrderExt.setGoodsName("退款转账");
+            String ext = JSON.toJSONString(accountPayOrderExt);
+            logger.info("退款转账分账规则串json串:" + ext);
+            accountPayOrder.setP6_ext(ext);
+            // 生成签名
+            StringBuilder builder = new StringBuilder();
+            builder.append(Constant.SPLIT)
+                    .append(accountPayOrder.getP1_bizType()).append(Constant.SPLIT)
+                    .append(accountPayOrder.getP2_signType()).append(Constant.SPLIT)
+                    .append(accountPayOrder.getP3_timestamp()).append(Constant.SPLIT)
+                    .append(accountPayOrder.getP4_orderId()).append(Constant.SPLIT)
+                    .append(accountPayOrder.getP5_customerNumber()).append(Constant.SPLIT)
+                    .append(accountPayOrder.getP6_ext()).append(Constant.SPLIT)
+                    .append(Constant.XUNI);
+            String sign = Disguiser.disguiseMD5(builder.toString().trim());
+            Map<String, String> bean = convertBean(accountPayOrder);
+            logger.info("--------------------> 发送退款转账参数:  " + bean);
+            Map<String, String> map = postForm(bean, Constant.FZ, sign, Map.class);
+            logger.info("----------------退款转账数据: " + map.toString());
+            if (map != null) {
+                String code = map.get("rt5_retCode");
+                if (!"0000".equals(code)) {
+                    String msg = map.get("rt6_retMsg");
+                    logger.info("【退款转账】>>>>>>>>>>退款转账失败>>>>>>>msg:" + msg);
+                } else {
+                    CmRefundTransfer cmRefundTransfer = new CmRefundTransfer();
+                    cmRefundTransfer.setTransferType(flag);
+                    cmRefundTransfer.setTransferAmount(v);
+                    cmRefundTransfer.setOrderRequestNo(orderRequestNo);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("【退款转账】>>>>>>>>>>错误信息", e);
+        }
+    }
+
+    public Map<String, String> convertBean(Object bean) {
+        Class clazz = bean.getClass();
+        Field[] fields = clazz.getDeclaredFields();
+        for (Field f : fields) {
+            f.setAccessible(true);
+        }
+        try {
+            Map<String, String> retMap = new LinkedHashMap<>();
+            for (Field f : fields) {
+                String key = f.toString().substring(f.toString().lastIndexOf(".") + 1);
+                Object value = f.get(bean);
+                if (value == null) {
+                    value = "";
+                }
+                retMap.put(key, (String) value);
+            }
+            return retMap;
+        } catch (Exception e) {
+            logger.info("分账", e);
+            throw new IllegalStateException("分账异常", e);
+        }
+    }
+
     public void onlinePay(String orderRequestNo, String money, Integer shopOrderId) {
     public void onlinePay(String orderRequestNo, String money, Integer shopOrderId) {
         AppPayRefundOrderVo orderVo = new AppPayRefundOrderVo();
         AppPayRefundOrderVo orderVo = new AppPayRefundOrderVo();
         orderVo.setP1_bizType("AppPayRefund");
         orderVo.setP1_bizType("AppPayRefund");
@@ -896,7 +1003,7 @@ public class CmReturnedPurchaseService extends CrudService<CmReturnedPurchaseDao
         }
         }
     }
     }
 
 
-    public  <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
+    public <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
         FormBody.Builder builder = new FormBody.Builder();
         FormBody.Builder builder = new FormBody.Builder();
         for (Map.Entry<String, String> entry : params.entrySet()) {
         for (Map.Entry<String, String> entry : params.entrySet()) {
             builder.add(entry.getKey(), entry.getValue());
             builder.add(entry.getKey(), entry.getValue());

+ 1 - 1
src/main/java/com/caimei/modules/order/service/SplitAccountService.java

@@ -221,7 +221,7 @@ public class SplitAccountService extends BaseService {
                             } else {
                             } else {
                                 for (SplitAccountPo splitAccount : splitBillDetail) {
                                 for (SplitAccountPo splitAccount : splitBillDetail) {
                                     splitAccount.setMbOrderId(orderRelation.getMbOrderId());
                                     splitAccount.setMbOrderId(orderRelation.getMbOrderId());
-                                    splitAccount.setOrderRequestNo(substring + orderRelation.getOrderRequestNo());
+                                    splitAccount.setOrderRequestNo(orderRelation.getOrderRequestNo());
                                     splitAccount.setPayStatus(1);
                                     splitAccount.setPayStatus(1);
                                     // 保存分账详情
                                     // 保存分账详情
                                     newOrderDao.insertSplitAccount(splitAccount);
                                     newOrderDao.insertSplitAccount(splitAccount);

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

@@ -216,23 +216,30 @@
 		select userId from cm_order where orderId=#{orderId}
 		select userId from cm_order where orderId=#{orderId}
 	</select>
 	</select>
 	<select id="findByShopOrderIds" resultType="com.caimei.modules.order.entity.CmReceiptOrderRelation">
 	<select id="findByShopOrderIds" resultType="com.caimei.modules.order.entity.CmReceiptOrderRelation">
-		select
-			a.*,
-			b.payType as "payType",
-			b.receiptDate as "receiptDate",
-			b.confirmType as "confirmType",
-			b.balanceAccountsRemark as "balanceAccountsRemark",
-			b.payWay as "payWay"
-		from  cm_receipt_order_relation a
-		left join cm_discern_receipt b on a.receiptID = b.id
-		where a.shopOrderId in
-		<foreach collection="shopOrderIds" open="(" close=")" item="shopOrderId" separator=",">
-			#{shopOrderId}
+		SELECT
+			a.relationType,
+			a.receiptID,
+			a.shopOrderId,
+			a.orderID,
+			a.mbOrderId,
+			a.orderRequestNo,
+			a.splitStatus,
+			a.associateAmount-IFNULL((SELECT SUM(refundAmount) FROM cm_refundmoney_record WHERE orderRequestNo=a.orderRequestNo),0) AS associateAmount,
+			b.payType AS "payType",
+			b.receiptDate AS "receiptDate",
+			b.confirmType AS "confirmType",
+			b.balanceAccountsRemark AS "balanceAccountsRemark",
+			b.payWay AS "payWay"
+		FROM  cm_receipt_order_relation a
+		LEFT JOIN cm_discern_receipt b ON a.receiptID = b.id
+		WHERE a.shopOrderId IN
+		<foreach collection="shopOrderIds" separator="," item="shopOrderID" open="(" close=")">
+			#{shopOrderID}
 		</foreach>
 		</foreach>
 		  AND b.receiptType = '1'
 		  AND b.receiptType = '1'
 		  AND b.receiptStatus = '3'
 		  AND b.receiptStatus = '3'
 		  AND a.delFlag = '0'
 		  AND a.delFlag = '0'
 		  AND b.delFlag = '0'
 		  AND b.delFlag = '0'
-		order by a.associateAmount desc
+		ORDER BY a.associateAmount DESC
 	</select>
 	</select>
 </mapper>
 </mapper>

+ 21 - 0
src/main/resources/mappings/modules/order/CmReturnedPurchaseMapper.xml

@@ -419,4 +419,25 @@
 		  AND crp.returnedWay =1
 		  AND crp.returnedWay =1
 		  AND crp.delflag=0
 		  AND crp.delflag=0
 	</select>
 	</select>
+	<select id="findBrokerage" resultType="java.lang.Double">
+		SELECT SUM(splitAccount)
+		FROM cm_split_account
+		WHERE productType = 3
+		  AND TYPE=5
+		  AND orderRequestNo= #{orderRequestNo}
+	</select>
+	<select id="findRefundTransfer" resultType="java.lang.Double">
+		SELECT SUM(transferAmount) FROM cm_refund_transfer
+		WHERE transferType=2
+		  AND orderRequestNo=#{orderRequestNo}
+	</select>
+	<select id="findRefundCharge" resultType="java.lang.Double">
+		SELECT SUM(transferAmount) FROM cm_refund_transfer
+		WHERE transferType=1
+		  AND orderRequestNo=#{orderRequestNo}
+	</select>
+	<select id="findPayAmount" resultType="java.lang.Double">
+		select associateAmount from cm_receipt_order_relation
+		where orderRequestNo = #{orderRequestNo}
+	</select>
 </mapper>
 </mapper>