浏览代码

汇付分账退款

ct 2 天之前
父节点
当前提交
fd96b872ab

+ 2 - 80
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -50,6 +50,7 @@ import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
+import com.fs.huifuPay.sdk.opps.core.utils.HuiFuUtils;
 import com.fs.huifuPay.service.HuiFuService;
 import com.fs.im.dto.*;
 import com.fs.im.service.IImService;
@@ -562,7 +563,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                 //1.判断是否是全额退款
                 CompanyDivItem companyDivItem = null;
                 try {
-                    companyDivItem = doRefundDiv(fsStoreOrder, reMoney, payment, extendInfoMap);
+                    companyDivItem = HuiFuUtils.doRefundDiv(fsStoreOrder.getPayPrice(), reMoney, payment, extendInfoMap);
                 } catch (Exception e) {
                     logger.error("-----------------分账退款处理失败{}", e.getMessage());
                 }
@@ -629,86 +630,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
         return i;
     }
 
-    /**
-     * 处理分账退款
-     *
-     * @param fsStoreOrder
-     * @param reMoney
-     * @param payment
-     * @param extendInfoMap
-     */
-    private CompanyDivItem doRefundDiv(FsStoreOrder fsStoreOrder, BigDecimal reMoney, FsStorePayment payment, Map<String, Object> extendInfoMap) {
-        CompanyDivItem companyDivItem = null;
-        Long companyId = fsStoreOrder.getCompanyId();
-        if (companyId != null) {
-            companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payment.getPayCode());
-            if (fsStoreOrder.getPayPrice().compareTo(reMoney) > 0) {
-                //部分退款
-                if (companyDivItem != null) {
-                    SysConfigMapper sysConfigMapper = SpringUtils.getBean(SysConfigMapper.class);
-                    SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.pay");
-                    FsPayConfig fsPayConfig = new Gson().fromJson(sysConfig.getConfigValue(), FsPayConfig.class);
-                    String defaultHuiFuId = fsPayConfig.getHuifuId(); //默认汇付id
-
-                    String detail = companyDivItem.getDetail();
-                    if (StringUtils.isNotBlank(detail)) {
-                        JSONObject acctSplitBunch = JSONObject.parseObject(detail);
-                        if (acctSplitBunch.get("percentage_flag") != null) {
-                            List<Map<String, Object>> param = new ArrayList(); //传入汇付参数
-
-                            String percentageFlag = acctSplitBunch.get("percentage_flag").toString();
-                            Object acctInfosObj = acctSplitBunch.get("acct_infos");
-                            if (acctInfosObj != null) {
-                                if ("Y".equals(percentageFlag)) {
-                                    // 百分比分账
-                                    List<Map> acctInfos = JSON.parseArray(acctInfosObj.toString(), Map.class);
-                                    if (acctInfos != null && !acctInfos.isEmpty()) {
-                                        BigDecimal remainMoney = reMoney;
-
-                                        for (Map acctInfo : acctInfos) {
-                                            String percentageDiv = acctInfo.get("percentage_div").toString();
-                                            BigDecimal divAmt = reMoney.multiply(BigDecimal.valueOf(Float.valueOf(percentageDiv)).multiply(BigDecimal.valueOf(0.01))).setScale(2, BigDecimal.ROUND_HALF_UP);
-                                            if (divAmt.compareTo(BigDecimal.ZERO) <= 0) {
-                                                continue;
-                                            }
-                                            remainMoney = remainMoney.subtract(divAmt);
-                                            String huiFuId = acctInfo.get("huifu_id").toString();
-                                            Map<String, Object> map = new HashMap<>();
-                                            map.put("div_amt", divAmt);
-                                            map.put("huifu_id", huiFuId);
-//                                                part_loan_amt	垫资金额
-                                            param.add(map);
-                                            if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
-                                                break;
-                                            }
-                                        }
-                                        if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
-                                            BigDecimal divAmt = reMoney.subtract(remainMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
-                                            Map<String, Object> map = new HashMap<>();
-                                            map.put("div_amt", divAmt);
-                                            map.put("huifu_id", defaultHuiFuId);
-                                            param.add(map);
-                                        }
-                                    }
-
-                                } else if ("N".equals(percentageFlag)) {
-                                    // 金额分账 目前按照排序从第一个开始扣 扣到满足退款金额
-                                }
-                                if (!param.isEmpty()) {
-                                    extendInfoMap.put("acct_split_bunch", JSON.toJSONString(param));
-                                }
-                            }
-
-                        }
-
 
-                    }
-                }
-            }
-        }
-        return companyDivItem;
-
-    }
 
     @Override
     public List<FsStoreAfterSalesExcelVO> selectFsStoreAfterSalesExcelListVO(FsStoreAfterSalesParam fsStoreAfterSales) {

+ 25 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -26,10 +26,12 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.ip.IpUtils;
 import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyDivItem;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.param.FsStoreStatisticsParam;
 import com.fs.company.service.ICompanyConfigService;
+import com.fs.company.service.ICompanyDivItemService;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyUserService;
 import com.fs.company.vo.FsStorePaymentStatisticsVO;
@@ -206,6 +208,9 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
     @Autowired
     private RedPacketLogMapper redPacketLogMapper;
 
+    @Autowired
+    private ICompanyDivItemService companyDivItemService;
+
     /**
      * 红包账户锁
      */
@@ -421,6 +426,8 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                 orderType="course";
             }else if (fsStorePayment.getBusinessType()==5){
                 orderType="appvip";
+            } else if (fsStorePayment.getBusinessType()==7){
+                orderType="payment";
             }
 
             if(fsStorePayment.getPayMode().equals("wx")){
@@ -508,6 +515,14 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_req_seq_id", orderType+"-"+fsStorePayment.getPayCode());
                 request.setExtendInfo(extendInfoMap);
+                //处理分账退款
+                //1.判断是否是全额退款
+                CompanyDivItem companyDivItem = null;
+                try {
+                    companyDivItem = HuiFuUtils.doRefundDiv(fsStorePayment.getPayMoney(), fsStorePayment.getPayMoney(), fsStorePayment, extendInfoMap);
+                } catch (Exception e) {
+                    logger.error("-----------------分账退款处理失败{}", e.getMessage());
+                }
                 HuiFuRefundResult refund = huiFuService.refund(request);
                 logger.info("订单退款返回结果:"+paymentId+""+refund);
                 if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
@@ -517,6 +532,15 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                     paymentMap.setRefundTime(DateUtils.getNowDate());
                     paymentMap.setRefundMoney(fsStorePayment.getPayMoney());
                     fsStorePaymentMapper.updateFsStorePayment(paymentMap);
+                    try {
+                        //处理分账退款明细表
+                        if (companyDivItem !=null && companyDivItem.getId() != null) {
+                            companyDivItem.setIsRefund(1);
+                            companyDivItemService.updateCompanyDivItem(companyDivItem);
+                        }
+                    } catch (Exception e) {
+                        logger.error("-----------------分账退款明细处理失败{}", e.getMessage());
+                    }
                 }else {
                     throw new CustomException("退款请求失败"+refund.getResp_desc());
                 }
@@ -1578,6 +1602,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
         storePayment.setRemark("商城收款订单支付");
         storePayment.setOpenId(openId);
         storePayment.setUserId(user.getUserId());
+        storePayment.setPayMode("hf");//目前微信收款仅支持汇付
         fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
         //汇付支付

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePaymentScrmServiceImpl.java

@@ -882,6 +882,7 @@ public class FsStorePaymentScrmServiceImpl implements IFsStorePaymentScrmService
         storePayment.setRemark("商城收款订单支付");
         storePayment.setOpenId(user.getMaOpenId());
         storePayment.setUserId(user.getUserId());
+        storePayment.setPayMode("hf");//目前微信收款仅支持汇付
         fsStorePaymentMapper.insertFsStorePayment(storePayment);
 
         //汇付支付

+ 83 - 0
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/utils/HuiFuUtils.java

@@ -1,6 +1,7 @@
 package com.fs.huifuPay.sdk.opps.core.utils;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyDivItem;
@@ -12,6 +13,7 @@ import com.fs.company.service.impl.CompanyDivConfigServiceImpl;
 import com.fs.company.vo.CompanyDivConfigVo;
 import com.fs.his.domain.FsPackageOrder;
 import com.fs.his.domain.FsPayConfig;
+import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStorePayment;
 import com.fs.huifuPay.domain.HuiFuCreateOrder;
 import com.fs.system.domain.SysConfig;
@@ -168,4 +170,85 @@ public class HuiFuUtils {
             companyDivItemService.updateCompanyDivItem(companyDivItem);
         }
     }
+
+
+
+    /**
+     * 处理分账退款
+     *
+     * @param reMoney
+     * @param payment
+     * @param extendInfoMap
+     */
+    public static CompanyDivItem doRefundDiv(BigDecimal payPrice,BigDecimal reMoney, FsStorePayment payment, Map<String, Object> extendInfoMap) {
+        CompanyDivItem companyDivItem = null;
+        companyDivItem = companyDivItemService.selectCompanyDivItemByPayCode(payment.getPayCode());
+        if (companyDivItem != null) {
+            if (payPrice.compareTo(reMoney) > 0) {
+                //部分退款
+                if (companyDivItem != null) {
+                    SysConfigMapper sysConfigMapper = SpringUtils.getBean(SysConfigMapper.class);
+                    SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.pay");
+                    FsPayConfig fsPayConfig = new Gson().fromJson(sysConfig.getConfigValue(), FsPayConfig.class);
+                    String defaultHuiFuId = fsPayConfig.getHuifuId(); //默认汇付id
+
+                    String detail = companyDivItem.getDetail();
+                    if (StringUtils.isNotBlank(detail)) {
+                        JSONObject acctSplitBunch = JSONObject.parseObject(detail);
+                        if (acctSplitBunch.get("percentage_flag") != null) {
+                            List<Map<String, Object>> param = new ArrayList(); //传入汇付参数
+
+                            String percentageFlag = acctSplitBunch.get("percentage_flag").toString();
+                            Object acctInfosObj = acctSplitBunch.get("acct_infos");
+                            if (acctInfosObj != null) {
+                                if ("Y".equals(percentageFlag)) {
+                                    // 百分比分账
+                                    List<Map> acctInfos = JSON.parseArray(acctInfosObj.toString(), Map.class);
+                                    if (acctInfos != null && !acctInfos.isEmpty()) {
+                                        BigDecimal remainMoney = reMoney;
+
+                                        for (Map acctInfo : acctInfos) {
+                                            String percentageDiv = acctInfo.get("percentage_div").toString();
+                                            BigDecimal divAmt = reMoney.multiply(BigDecimal.valueOf(Float.valueOf(percentageDiv)).multiply(BigDecimal.valueOf(0.01))).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                            if (divAmt.compareTo(BigDecimal.ZERO) <= 0) {
+                                                continue;
+                                            }
+                                            remainMoney = remainMoney.subtract(divAmt);
+                                            String huiFuId = acctInfo.get("huifu_id").toString();
+                                            Map<String, Object> map = new HashMap<>();
+                                            map.put("div_amt", divAmt);
+                                            map.put("huifu_id", huiFuId);
+//                                                part_loan_amt	垫资金额
+                                            param.add(map);
+                                            if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
+                                                break;
+                                            }
+                                        }
+                                        if (remainMoney.compareTo(BigDecimal.ZERO) >= 0) {
+                                            BigDecimal divAmt = reMoney.subtract(remainMoney).setScale(2, BigDecimal.ROUND_HALF_UP);
+                                            Map<String, Object> map = new HashMap<>();
+                                            map.put("div_amt", divAmt);
+                                            map.put("huifu_id", defaultHuiFuId);
+                                            param.add(map);
+                                        }
+                                    }
+
+                                } else if ("N".equals(percentageFlag)) {
+                                    // 金额分账 目前按照排序从第一个开始扣 扣到满足退款金额
+                                }
+                                if (!param.isEmpty()) {
+                                    extendInfoMap.put("acct_split_bunch", JSON.toJSONString(param));
+                                }
+                            }
+
+                        }
+
+
+                    }
+                }
+            }
+        }
+        return companyDivItem;
+
+    }
 }