Browse Source

增加分润财务订单

周箭河 5 years ago
parent
commit
e5592a5094

+ 0 - 32
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/PayChannelDto.java

@@ -1,32 +0,0 @@
-package com.ym.mec.biz.dal.dto;
-
-import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public class PayChannelDto {
-
-    //支付渠道类型
-    private PaymentChannelEnum payType;
-
-    //分佣列表
-    private List<Map<String, Object>> tempRoutingList = new ArrayList<>();
-
-    public PaymentChannelEnum getPayType() {
-        return payType;
-    }
-
-    public void setPayType(PaymentChannelEnum payType) {
-        this.payType = payType;
-    }
-
-    public List<Map<String, Object>> getTempRoutingList() {
-        return tempRoutingList;
-    }
-
-    public void setTempRoutingList(List<Map<String, Object>> tempRoutingList) {
-        this.tempRoutingList = tempRoutingList;
-    }
-}

+ 19 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentRouteOrderDto.java

@@ -9,14 +9,19 @@ public class StudentPaymentRouteOrderDto extends StudentPaymentOrder {
     /**
      * 分配分部id
      */
-    private Integer routingOrganId;
+    private Integer routeOrganId;
 
     /**
-     * 预计金额
+     * 分润金额
      */
     private BigDecimal routeAmount;
 
     /**
+     * 分润余额
+     */
+    private BigDecimal routeBalanceAmount;
+
+    /**
      * 渠道收款账户
      */
     private String merNo;
@@ -26,12 +31,12 @@ public class StudentPaymentRouteOrderDto extends StudentPaymentOrder {
      */
     private String feeFlag;
 
-    public Integer getRoutingOrganId() {
-        return routingOrganId;
+    public Integer getRouteOrganId() {
+        return routeOrganId;
     }
 
-    public void setRoutingOrganId(Integer routingOrganId) {
-        this.routingOrganId = routingOrganId;
+    public void setRouteOrganId(Integer routingOrganId) {
+        this.routeOrganId = routingOrganId;
     }
 
     public BigDecimal getRouteAmount() {
@@ -57,4 +62,12 @@ public class StudentPaymentRouteOrderDto extends StudentPaymentOrder {
     public void setFeeFlag(String feeFlag) {
         this.feeFlag = feeFlag;
     }
+
+    public BigDecimal getRouteBalanceAmount() {
+        return routeBalanceAmount;
+    }
+
+    public void setRouteBalanceAmount(BigDecimal routeBalanceAmount) {
+        this.routeBalanceAmount = routeBalanceAmount;
+    }
 }

+ 19 - 6
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/StudentPaymentRouteOrder.java

@@ -9,14 +9,19 @@ public class StudentPaymentRouteOrder {
     /**
     * 分配分部id
     */
-    private Integer routingOrganId;
+    private Integer routeOrganId;
 
     /**
-    * 预计金额
+    * 分润金额
     */
     private BigDecimal routeAmount;
 
     /**
+    * 分润余额
+    */
+    private BigDecimal routeBalanceAmount;
+
+    /**
     * 渠道收款账户
     */
     private String merNo;
@@ -39,12 +44,12 @@ public class StudentPaymentRouteOrder {
         this.id = id;
     }
 
-    public Integer getRoutingOrganId() {
-        return routingOrganId;
+    public Integer getRouteOrganId() {
+        return routeOrganId;
     }
 
-    public void setRoutingOrganId(Integer routingOrganId) {
-        this.routingOrganId = routingOrganId;
+    public void setRouteOrganId(Integer routeOrganId) {
+        this.routeOrganId = routeOrganId;
     }
 
     public BigDecimal getRouteAmount() {
@@ -78,4 +83,12 @@ public class StudentPaymentRouteOrder {
     public void setOrderNo(String orderNo) {
         this.orderNo = orderNo;
     }
+
+    public BigDecimal getRouteBalanceAmount() {
+        return routeBalanceAmount;
+    }
+
+    public void setRouteBalanceAmount(BigDecimal routeBalanceAmount) {
+        this.routeBalanceAmount = routeBalanceAmount;
+    }
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/PayService.java

@@ -72,7 +72,7 @@ public interface PayService {
      * @return
      * @throws Exception
      */
-    Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody,Integer organId,String receiver) throws Exception;
+    Map<String, Object> getPayMap(BigDecimal amount,BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody,Integer organId,String receiver) throws Exception;
 
 
 

+ 17 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/StudentPaymentRouteOrderService.java

@@ -7,11 +7,27 @@ import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.math.BigDecimal;
+
 
 public interface StudentPaymentRouteOrderService extends BaseService<Long, StudentPaymentRouteOrder> {
 
 	PageInfoOrder<StudentPaymentRouteOrderDto> OrderQueryPage(StudentPaymentOrderQueryInfo queryInfo);
 
-	StudentPaymentRouteOrderDto addOrder(StudentPaymentRouteOrderDto studentPaymentRouteOrderDto);
+	/**
+	 * 添加外部订单
+	 * @param studentPaymentRouteOrderDto
+	 * @return
+	 */
+	StudentPaymentRouteOrderDto addOutOrder(StudentPaymentRouteOrderDto studentPaymentRouteOrderDto);
+
+	/**
+	 * 添加分润订单
+	 * @param orderNo
+	 * @param routeOrganId
+	 * @param routeAmount
+	 * @return
+	 */
+	StudentPaymentRouteOrder addRouteOrder(String orderNo,Integer routeOrganId, BigDecimal routeAmount);
 
 }

+ 7 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -152,6 +152,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
     @Autowired
     private ImFeignService imFeignService;
+    @Autowired
+    private StudentPaymentRouteOrderService studentPaymentRouteOrderService;
 
     private SimpleDateFormat sdf_ymd = new SimpleDateFormat("yyyy-MM-dd");
 
@@ -309,6 +311,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         studentPaymentOrder.setVersion(0);
         Date date = new Date();
+        BigDecimal balance = BigDecimal.ZERO;
         if (sporadicPayDto.getUseBalancePayment() && amount.compareTo(BigDecimal.ZERO) > 0) {
             if (chargeInfo.getChargeType().getCode().equals(9)) {
                 throw new BizException("账户充值不支持余额支付");
@@ -319,7 +322,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 throw new BizException("用户账户找不到");
             }
             if (userCashAccount.getBalance() != null && userCashAccount.getBalance().compareTo(BigDecimal.ZERO) > 0) {
-                BigDecimal balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
+                balance = amount.compareTo(userCashAccount.getBalance()) >= 0 ? userCashAccount.getBalance() : amount;
                 amount = amount.subtract(balance);
                 studentPaymentOrder.setPaymentChannel("BALANCE");
                 studentPaymentOrder.setActualAmount(amount);
@@ -336,7 +339,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setVersion(studentPaymentOrder.getVersion() + 1);
 
         if (amount.compareTo(BigDecimal.ZERO) == 0) {
-
+            studentPaymentRouteOrderService.addRouteOrder(orderNo, chargeInfo.getOrganId(), studentPaymentOrder.getActualAmount());
             Map<String, String> notifyMap = new HashMap<>();
             notifyMap.put("tradeState", "1");
             notifyMap.put("merOrderNo", studentPaymentOrder.getOrderNo());
@@ -358,6 +361,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
 
         Map payMap = payService.getPayMap(
                 amount,
+                balance,
                 orderNo,
                 baseApiUrl + "/api-student/studentOrder/notify",
                 baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=" + orderNo,
@@ -367,7 +371,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 receiver
         );
 
-        Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
+        //Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
         studentPaymentOrder.setOrganId(chargeInfo.getOrganId());
         //studentPaymentOrder.setRoutingOrganId(chargeInfo.getOrganId());
         studentPaymentOrder.setRoutingOrganId((Integer) payMap.get("routingOrganId"));

+ 98 - 126
mec-biz/src/main/java/com/ym/mec/biz/service/impl/PayServiceImpl.java

@@ -4,9 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dao.MusicGroupDao;
 import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
 import com.ym.mec.biz.dal.dao.SysConfigDao;
-import com.ym.mec.biz.dal.dto.PayChannelDto;
 import com.ym.mec.biz.dal.dto.RouteScaleDto;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
 import com.ym.mec.biz.dal.entity.SysAccount;
 import com.ym.mec.biz.dal.entity.SysPaymentConfig;
@@ -19,13 +17,9 @@ import com.ym.mec.thirdparty.adapay.Payment;
 import com.ym.mec.thirdparty.union.UnionPay;
 import com.ym.mec.thirdparty.union.UnionPayFeignService;
 import com.ym.mec.thirdparty.yqpay.YqPayUtil;
-import com.ym.mec.util.http.HttpUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.SpringApplication;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.data.redis.support.atomic.RedisAtomicDouble;
-import org.springframework.data.redis.support.atomic.RedisAtomicLong;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -62,6 +56,7 @@ public class PayServiceImpl implements PayService {
         try {
             Map<String, Object> payMap = new PayServiceImpl().getPayMap(
                     BigDecimal.TEN,
+                    BigDecimal.ONE,
                     "5435253245",
                     baseApiUrl + "/api-student/studentOrder/notify",
                     baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=5435253245",
@@ -247,43 +242,40 @@ public class PayServiceImpl implements PayService {
     }
 
     @Override
-    public Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer organId, String receiver) throws Exception {
+    public Map<String, Object> getPayMap(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, Integer organId, String receiver) throws Exception {
         //根据金额获取分润
-        PayChannelDto payChannelDto = getAmountChannel(amount);
+        List<RouteScaleDto> routeScaleDtos = getAmountChannel(amount);
         //零星支付,收到指定
-        if (payChannelDto == null && receiver != null && receiver.equals("")) {
-            payChannelDto = getSporadicChannel(amount);
+        if (routeScaleDtos == null && receiver != null && receiver.equals("")) {
+            routeScaleDtos = getSporadicChannel(amount);
         }
         //比例或者笔数分佣
-        if (payChannelDto == null) {
-            payChannelDto = getPaymentConfigChannel(organId, amount);
+        if (routeScaleDtos == null) {
+            routeScaleDtos = getPaymentConfigChannel(organId, amount);
         }
 
-        return getPayRoute(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, payChannelDto);
+        return getPayRoute(amount, balanceAmount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, routeScaleDtos);
     }
 
-    private PayChannelDto getPaymentConfigChannel(Integer organId, BigDecimal amount) {
-        PayChannelDto payChannelDto = new PayChannelDto();
-        List<Map<String, Object>> tempRoutingList = new ArrayList<>();
-        Map<String, Object> routingList = new HashMap<>();
+    private List<RouteScaleDto> getPaymentConfigChannel(Integer organId, BigDecimal amount) {
         SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
         if (paymentConfig == null || StringUtils.isBlank(paymentConfig.getRouteScale())) {
             String paymentChannel = sysConfigDao.findConfigValue("payment_channel");
+            List<RouteScaleDto> routeScaleDtos = new ArrayList<>();
+            RouteScaleDto routeScaleDto = new RouteScaleDto();
+            routeScaleDto.setAmount(amount);
+            routeScaleDto.setOrganId(organId);
+            routeScaleDto.setScale(100);
             if (paymentChannel.equals("YQPAY")) {
-                routingList.put("organId", organId);
-                routingList.put("routingMerNo", YqPayUtil.merNo);//分佣账户
-                routingList.put("routingFee", amount.subtract((amount.multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP)))); //分佣金额
-                payChannelDto.setPayType(PaymentChannelEnum.YQPAY);
+                routeScaleDto.setMerNo(YqPayUtil.merNo);
+                routeScaleDto.setPayType(PaymentChannelEnum.YQPAY);
             } else {
-                routingList.put("organId", organId);
-                routingList.put("member_id", ConfigInit.merNo);//分佣账户
-                routingList.put("amount", amount);//分佣金额
-                routingList.put("fee_flag", "Y"); //承担手续费
-                payChannelDto.setPayType(PaymentChannelEnum.ADAPAY);
+                routeScaleDto.setMerNo(ConfigInit.merNo);
+                routeScaleDto.setPayType(PaymentChannelEnum.ADAPAY);
+                routeScaleDto.setFeeFlag("Y");
             }
-            tempRoutingList.add(routingList);
-            payChannelDto.setTempRoutingList(tempRoutingList);
-            return payChannelDto;
+            routeScaleDtos.add(routeScaleDto);
+            return routeScaleDtos;
         }
 
         String routeScale = paymentConfig.getRouteScale();
@@ -322,44 +314,7 @@ public class PayServiceImpl implements PayService {
                 iterator.remove();
             }
         }
-        BigDecimal routingAmount = amount.subtract((amount.multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP)));
-        int i = 0;
-        BigDecimal hasRouteAmount = BigDecimal.ZERO;
-        for (RouteScaleDto routeScaleDto : routeScaleDtos) {
-            routingList = new HashMap<>();
-            i++;
-            if (routeScaleDto.getPayType().equals(PaymentChannelEnum.YQPAY)) {
-                BigDecimal routingFee = routingAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
-                if (i == routeScaleDtos.size()) {
-                    routingFee = routingAmount.subtract(hasRouteAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
-                }
-                hasRouteAmount = hasRouteAmount.add(routingFee);
-                if (routingFee.compareTo(BigDecimal.ZERO) <= 0) {
-                    continue;
-                }
-                routingList.put("organId", routeScaleDto.getOrganId());
-                routingList.put("routingMerNo", routeScaleDto.getMerNo());//分佣账户
-                routingList.put("routingFee", routingFee); //分佣金额
-            } else if (paymentConfig.getPayType().equals(PaymentChannelEnum.ADAPAY)) {
-                BigDecimal routingFee = amount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
-                if (i == routeScaleDtos.size()) {
-                    routingFee = amount.subtract(hasRouteAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
-                }
-                hasRouteAmount = hasRouteAmount.add(routingFee);
-                if (routingFee.compareTo(BigDecimal.ZERO) <= 0) {
-                    continue;
-                }
-                routingList.put("organId", routeScaleDto.getOrganId());
-                routingList.put("member_id", routeScaleDto.getMerNo());//分佣账户
-                routingList.put("amount", routingFee);//分佣金额
-                routingList.put("fee_flag", routeScaleDto.getFeeFlag()); //承担手续费
-            }
-            tempRoutingList.add(routingList);
-        }
-
-        payChannelDto.setPayType(paymentConfig.getPayType());
-        payChannelDto.setTempRoutingList(tempRoutingList);
-        return payChannelDto;
+        return routeScaleDtos;
     }
 
 
@@ -368,13 +323,12 @@ public class PayServiceImpl implements PayService {
      *
      * @param amount 金额
      */
-    private PayChannelDto getAmountChannel(BigDecimal amount) {
+    private List<RouteScaleDto> getAmountChannel(BigDecimal amount) {
         String amountChannel = sysConfigDao.findConfigValue("amount_channel");
         if (StringUtils.isBlank(amountChannel)) {
             return null;
         }
         Integer organId = null;
-        List<Map<String, Object>> tempRoutingList = new ArrayList<>();
         Map<String, Integer> channel = (Map<String, Integer>) JSON.parseObject(amountChannel, Map.class);
         for (Map.Entry<String, Integer> amountStr : channel.entrySet()) {
             if (new BigDecimal(amountStr.getKey()).compareTo(amount) == 0) {
@@ -385,23 +339,22 @@ public class PayServiceImpl implements PayService {
         if (organId == null) {
             return null;
         }
-        PayChannelDto payChannelDto = new PayChannelDto();
+
         SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
-        Map<String, Object> routingList = new HashMap<>();
+        RouteScaleDto routeScaleDto = new RouteScaleDto();
+        List<RouteScaleDto> routeScaleDtos = new ArrayList<>();
+        routeScaleDto.setAmount(amount);
+        routeScaleDto.setOrganId(paymentConfig.getOrganId());
+        routeScaleDto.setPayType(paymentConfig.getPayType());
+        routeScaleDto.setScale(100);
         if (paymentConfig.getPayType().equals(PaymentChannelEnum.YQPAY)) {
-            routingList.put("organId", paymentConfig.getOrganId());
-            routingList.put("routingMerNo", paymentConfig.getYqMerNo());//分佣账户
-            routingList.put("routingFee", amount.subtract((amount.multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP)))); //分佣金额
-        } else if (paymentConfig.getPayType().equals(PaymentChannelEnum.ADAPAY)) {
-            routingList.put("organId", paymentConfig.getOrganId());
-            routingList.put("member_id", paymentConfig.getHfMerNo());//分佣账户
-            routingList.put("amount", amount);//分佣金额
-            routingList.put("fee_flag", "Y"); //承担手续费
-        }
-        tempRoutingList.add(routingList);
-        payChannelDto.setPayType(paymentConfig.getPayType());
-        payChannelDto.setTempRoutingList(tempRoutingList);
-        return payChannelDto;
+            routeScaleDto.setMerNo(paymentConfig.getYqMerNo());
+        } else {
+            routeScaleDto.setMerNo(paymentConfig.getHfMerNo());
+            routeScaleDto.setFeeFlag("Y");
+        }
+        routeScaleDtos.add(routeScaleDto);
+        return routeScaleDtos;
     }
 
     /**
@@ -410,13 +363,12 @@ public class PayServiceImpl implements PayService {
      * @param amount
      * @return
      */
-    private PayChannelDto getSporadicChannel(BigDecimal amount) {
+    private List<RouteScaleDto> getSporadicChannel(BigDecimal amount) {
         String SporadicChannel = sysConfigDao.findConfigValue("sporadic_channel");
         if (StringUtils.isBlank(SporadicChannel)) {
             return null;
         }
 
-        List<Map<String, Object>> tempRoutingList = new ArrayList<>();
         Map<String, String> channel = (Map<String, String>) JSON.parseObject(SporadicChannel, Map.class);
         Integer organId = Integer.parseInt(channel.get("organId"));
         BigDecimal maxReceipt = new BigDecimal(channel.get("maxReceipt"));
@@ -431,73 +383,93 @@ public class PayServiceImpl implements PayService {
             return null;
         }
 
-        PayChannelDto payChannelDto = new PayChannelDto();
         SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
-        Map<String, Object> routingList = new HashMap<>();
+
+        RouteScaleDto routeScaleDto = new RouteScaleDto();
+        List<RouteScaleDto> routeScaleDtos = new ArrayList<>();
+        routeScaleDto.setAmount(amount);
+        routeScaleDto.setOrganId(paymentConfig.getOrganId());
+        routeScaleDto.setPayType(paymentConfig.getPayType());
+        routeScaleDto.setScale(100);
         if (paymentConfig.getPayType().equals(PaymentChannelEnum.YQPAY)) {
-            routingList.put("organId", paymentConfig.getOrganId());
-            routingList.put("routingMerNo", paymentConfig.getYqMerNo());//分佣账户
-            routingList.put("routingFee", amount.subtract((amount.multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP)))); //分佣金额
-        } else if (paymentConfig.getPayType().equals(PaymentChannelEnum.ADAPAY)) {
-            routingList.put("organId", paymentConfig.getOrganId());
-            routingList.put("member_id", paymentConfig.getHfMerNo());//分佣账户
-            routingList.put("amount", amount);//分佣金额
-            routingList.put("fee_flag", "Y"); //承担手续费
-        }
-        tempRoutingList.add(routingList);
-        payChannelDto.setPayType(paymentConfig.getPayType());
-        payChannelDto.setTempRoutingList(tempRoutingList);
-        return payChannelDto;
+            routeScaleDto.setMerNo(paymentConfig.getYqMerNo());
+        } else {
+            routeScaleDto.setMerNo(paymentConfig.getHfMerNo());
+            routeScaleDto.setFeeFlag("Y");
+        }
+        routeScaleDtos.add(routeScaleDto);
+        return routeScaleDtos;
     }
 
-    private Map<String, Object> getPayRoute(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, PayChannelDto payChannelDto) throws Exception {
+    private Map<String, Object> getPayRoute(BigDecimal amount, BigDecimal balanceAmount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, List<RouteScaleDto> routeScaleDtos) throws Exception {
         Map<String, Object> unionPay = new HashMap<>();
         Map<String, Object> payMap = null;
-        String type;
         String routingMerNos;
 
-        List<Map<String, Object>> tempRoutingList = payChannelDto.getTempRoutingList();
         List<StudentPaymentRouteOrder> RouteOrders = new ArrayList<>();
-        StudentPaymentOrder order = studentPaymentOrderService.findOrderByOrderNo(orderNo);
-        for (Map<String, Object> routing : tempRoutingList) {
+
+        BigDecimal yqAmount = amount.subtract((amount.multiply(new BigDecimal("0.28")).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP)));
+        int i = 0;
+        BigDecimal hasRouteAmount = BigDecimal.ZERO;
+        BigDecimal hasRouteBalanceAmount = BigDecimal.ZERO;
+        List<Map<String, Object>> tempRoutingList = new ArrayList<>();
+
+        PaymentChannelEnum patType = null;
+        for (RouteScaleDto routeScaleDto : routeScaleDtos) {
+            patType = routeScaleDto.getPayType();
+            Map<String, Object> routingList = new HashMap<>();
+            i++;
+
+            BigDecimal routingAmount = amount;
+            if (routeScaleDto.getPayType().equals(PaymentChannelEnum.YQPAY)) {
+                routingAmount = yqAmount;
+            }
+            BigDecimal routingFee = routingAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+            BigDecimal routeBalanceAmount = balanceAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
+            if (i == routeScaleDtos.size()) {
+                routingFee = routingAmount.subtract(hasRouteAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+                routeBalanceAmount = balanceAmount.subtract(hasRouteBalanceAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
+            }
+            hasRouteAmount = hasRouteAmount.add(routingFee);
+            hasRouteBalanceAmount = hasRouteBalanceAmount.add(routeBalanceAmount);
+
+            if (routingFee.compareTo(BigDecimal.ZERO) <= 0) {
+                continue;
+            }
+            routingList.put("organId", routeScaleDto.getOrganId());
+            routingList.put("routingMerNo", routeScaleDto.getMerNo());//分佣账户
+            routingList.put("routingFee", routingFee); //分佣金额
+
+            tempRoutingList.add(routingList);
+
             StudentPaymentRouteOrder studentPaymentRouteOrder = new StudentPaymentRouteOrder();
             studentPaymentRouteOrder.setOrderNo(orderNo);
-            studentPaymentRouteOrder.setRoutingOrganId((Integer) routing.get("organId"));
-            BigDecimal routeAmount;
-            String merNo;
-            if (payChannelDto.getPayType().equals(PaymentChannelEnum.YQPAY)) {
-                routeAmount = (BigDecimal) routing.get("routingFee");
-                merNo = (String) routing.get("routingMerNo");
-            } else {
-                routeAmount = (BigDecimal) routing.get("amount");
-                merNo = (String) routing.get("member_id");
-                studentPaymentRouteOrder.setFeeFlag((String) routing.get("fee_flag"));
-            }
-            studentPaymentRouteOrder.setRouteAmount(routeAmount);
-            studentPaymentRouteOrder.setMerNo(merNo);
+            studentPaymentRouteOrder.setRouteOrganId(routeScaleDto.getOrganId());
+            studentPaymentRouteOrder.setFeeFlag(routeScaleDto.getFeeFlag());
+            studentPaymentRouteOrder.setRouteAmount(routingFee);
+            studentPaymentRouteOrder.setRouteBalanceAmount(routeBalanceAmount);
+            studentPaymentRouteOrder.setMerNo(routeScaleDto.getMerNo());
             RouteOrders.add(studentPaymentRouteOrder);
         }
+
         if (studentPaymentRouteOrderDao.batchAdd(RouteOrders) <= 0) {
             throw new BizException("调用支付接口失败");
         }
 
-        if (payChannelDto.getPayType().equals(PaymentChannelEnum.YQPAY)) {
+        if (patType.equals(PaymentChannelEnum.YQPAY)) {
             if (tempRoutingList.size() == 1 && YqPayUtil.merNo.equals(tempRoutingList.get(0).get("routingMerNo").toString())) {
                 tempRoutingList = null;
             }
             payMap = YqPayUtil.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, YqPayUtil.merNo, tempRoutingList);
-            type = "YQPAY";
-            routingMerNos = payChannelDto.getTempRoutingList().stream().map(e -> e.get("routingMerNo").toString()).collect(Collectors.joining(","));
         } else {
             payMap = Payment.getPayMap(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, ConfigInit.merNo, tempRoutingList);
-            type = "ADAPAY";
-            routingMerNos = payChannelDto.getTempRoutingList().stream().map(e -> e.get("member_id").toString()).collect(Collectors.joining(","));
         }
+        routingMerNos = routeScaleDtos.stream().map(RouteScaleDto::getMerNo).collect(Collectors.joining(","));
+
         unionPay.put("orderNo", orderNo);
-        unionPay.put("type", type);
+        unionPay.put("type", patType.getCode());
         unionPay.put("payMap", payMap);
         unionPay.put("routingMerNos", routingMerNos);
-        unionPay.put("routingList", payChannelDto.getTempRoutingList());
         return unionPay;
     }
 

+ 18 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentRouteOrderServiceImpl.java

@@ -10,6 +10,7 @@ import com.ym.mec.biz.dal.enums.SporadicChargeTypeEnum;
 import com.ym.mec.biz.dal.page.StudentPaymentOrderQueryInfo;
 import com.ym.mec.biz.service.StudentPaymentRouteOrderService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,20 +72,33 @@ public class StudentPaymentRouteOrderServiceImpl extends BaseServiceImpl<Long, S
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public StudentPaymentRouteOrderDto addOrder(StudentPaymentRouteOrderDto studentPaymentRouteOrderDto) {
+    public StudentPaymentRouteOrderDto addOutOrder(StudentPaymentRouteOrderDto studentPaymentRouteOrderDto) {
         Date nowDate = new Date();
         studentPaymentRouteOrderDto.setCreateTime(nowDate);
         studentPaymentRouteOrderDto.setUpdateTime(nowDate);
         studentPaymentOrderDao.insert(studentPaymentRouteOrderDto);
         StudentPaymentRouteOrder studentPaymentRouteOrder = new StudentPaymentRouteOrder();
         studentPaymentRouteOrder.setOrderNo(studentPaymentRouteOrderDto.getOrderNo());
-        studentPaymentRouteOrder.setRoutingOrganId(studentPaymentRouteOrderDto.getOrganId());
+        studentPaymentRouteOrder.setRouteOrganId(studentPaymentRouteOrderDto.getOrganId());
         studentPaymentRouteOrder.setRouteAmount(studentPaymentRouteOrderDto.getActualAmount());
+        studentPaymentRouteOrder.setRouteBalanceAmount(BigDecimal.ZERO);
         studentPaymentRouteOrder.setFeeFlag("N");
-        studentPaymentRouteOrder.setCreateTime(nowDate);
-        studentPaymentRouteOrder.setUpdateTime(nowDate);
         studentPaymentRouteOrderDao.insert(studentPaymentRouteOrder);
         return studentPaymentRouteOrderDto;
     }
 
+    @Override
+    public StudentPaymentRouteOrder addRouteOrder(String orderNo, Integer routeOrganId, BigDecimal routeBalanceAmount) {
+        StudentPaymentRouteOrder studentPaymentRouteOrder = new StudentPaymentRouteOrder();
+        studentPaymentRouteOrder.setOrderNo(orderNo);
+        studentPaymentRouteOrder.setRouteOrganId(routeOrganId);
+        studentPaymentRouteOrder.setRouteAmount(BigDecimal.ZERO);
+        studentPaymentRouteOrder.setRouteBalanceAmount(routeBalanceAmount);
+        studentPaymentRouteOrder.setFeeFlag("N");
+        if (studentPaymentRouteOrderDao.insert(studentPaymentRouteOrder) <= 0) {
+            throw new BizException("插入订单失败");
+        }
+        return studentPaymentRouteOrder;
+    }
+
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRechargeServiceImpl.java

@@ -75,7 +75,7 @@ public class StudentRechargeServiceImpl extends BaseServiceImpl<String, StudentR
 		studentRechargeDao.insert(studentRecharge);
 
 		try {
-			return payService.getPayMap(amount, studentRecharge.getOrderNo(), "https://pay.dayaedu.com/api/yqpay/notify", "http://dev.dayaedu.com", "充值",
+			return payService.getPayMap(amount, BigDecimal.ZERO,studentRecharge.getOrderNo(), "https://pay.dayaedu.com/api/yqpay/notify", "http://dev.dayaedu.com", "充值",
 					"充值",userId,null);
 		} catch (Exception e) {
 			throw new BizException("调用支付接口出错", e);

+ 13 - 11
mec-biz/src/main/resources/config/mybatis/StudentPaymentRouteOrderMapper.xml

@@ -5,8 +5,9 @@
         <!--@mbg.generated-->
         <!--@Table student_payment_route_order-->
         <id column="id_" property="id"/>
-        <result column="routing_organ_id_" property="routingOrganId"/>
+        <result column="route_organ_id_" property="routeOrganId"/>
         <result column="route_amount_" property="routeAmount"/>
+        <result column="route_balance_amount_" property="routeBalanceAmount"/>
         <result column="mer_no_" property="merNo"/>
         <result column="order_no_" property="orderNo"/>
         <result column="fee_flag_" property="feeFlag"/>
@@ -16,8 +17,9 @@
                extends="com.ym.mec.biz.dal.dao.StudentPaymentOrderDao.StudentPaymentOrder">
         <result column="username_" property="user.username"/>
         <result column="phone_" property="user.phone"/>
-        <result column="routing_organ_id_" property="routingOrganId"/>
+        <result column="route_organ_id_" property="routeOrganId"/>
         <result column="route_amount_" property="routeAmount"/>
+        <result column="route_balance_amount_" property="routeBalanceAmount"/>
         <result column="mer_no_" property="merNo"/>
         <result column="order_no_" property="orderNo"/>
         <result column="fee_flag_" property="feeFlag"/>
@@ -25,7 +27,7 @@
 
     <sql id="Base_Column_List">
         <!--@mbg.generated-->
-        id_, routing_organ_id_, route_amount_, mer_no_, order_no_, fee_flag_
+        id_, route_organ_id_, route_amount_,route_balance_amount_, mer_no_, order_no_, fee_flag_
     </sql>
     <select id="get" parameterType="java.lang.Long" resultMap="StudentPaymentRouteOrder">
         <!--@mbg.generated-->
@@ -42,17 +44,17 @@
     <insert id="insert" keyColumn="id_" keyProperty="id"
             parameterType="com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder" useGeneratedKeys="true">
         <!--@mbg.generated-->
-        insert into student_payment_route_order (routing_organ_id_, route_amount_, mer_no_,
+        insert into student_payment_route_order (route_organ_id_, route_amount_,route_balance_amount_, mer_no_,
         order_no_, fee_flag_)
-        values (#{routingOrganId}, #{routeAmount}, #{merNo},
+        values (#{routeOrganId}, #{routeAmount},#{routeBalanceAmount}, #{merNo},
         #{orderNo}, #{feeFlag})
     </insert>
     <update id="update" parameterType="com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder">
         <!--@mbg.generated-->
         update student_payment_route_order
         <set>
-            <if test="routingOrganId != null">
-                routing_organ_id_ = #{routingOrganId},
+            <if test="routeOrganId != null">
+                route_organ_id_ = #{routeOrganId},
             </if>
             <if test="routeAmount != null">
                 route_amount_ = #{routeAmount},
@@ -70,10 +72,10 @@
     <insert id="batchAdd" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="id"
             keyProperty="id">
         INSERT INTO student_payment_route_order
-        (order_no_,routing_organ_id_, route_amount_, mer_no_,fee_flag_)
+        (order_no_,route_organ_id_, route_amount_,route_balance_amount_, mer_no_,fee_flag_)
         VALUE
         <foreach collection="routeOrders" item="routeOrder" separator=",">
-            (#{routeOrder.orderNo},#{routeOrder.routingOrganId},#{routeOrder.routeAmount},#{routeOrder.merNo},#{routeOrder.feeFlag})
+            (#{routeOrder.orderNo},#{routeOrder.routeOrganId},#{routeOrder.routeAmount},#{routeOrder.routeBalanceAmount},#{routeOrder.merNo},#{routeOrder.feeFlag})
         </foreach>
     </insert>
 
@@ -138,7 +140,7 @@
                 AND spo.per_amount_ > 0
             </if>
             <if test="routingOrganId != null">
-                AND FIND_IN_SET(spro.routing_organ_id_,#{routingOrganId})
+                AND FIND_IN_SET(spro.route_organ_id_,#{routingOrganId})
             </if>
             <if test="actualAmount != null">
                 AND spo.actual_amount_ >= #{actualAmount}
@@ -173,7 +175,7 @@
         SELECT SUM(route_amount_)
         FROM student_payment_order spo
                  LEFT JOIN student_payment_route_order spro ON spo.order_no_ = spro.order_no_
-        WHERE spro.routing_organ_id_ = #{routeOrganId} AND spo.payment_channel_ IN
+        WHERE spro.route_organ_id_ = #{routeOrganId} AND spo.payment_channel_ IN
         <foreach collection="paymentChannelEnumList" item="paymentChannel" open="(" close=")" separator="," >
             #{paymentChannel,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
         </foreach>

+ 1 - 0
mec-student/src/main/java/com/ym/mec/student/controller/StudentOrderController.java

@@ -709,6 +709,7 @@ public class StudentOrderController extends BaseController {
         try {
             payMap = payService.getPayMap(
                     new BigDecimal("50"),
+                    BigDecimal.ZERO,
                     "20070915150900001",
                     baseApiUrl + "/api-student/studentOrder/notify",
                     baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=5435253245",

+ 1 - 4
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -175,7 +175,7 @@ public class Payment extends ConfigInit {
 
 
     public static Map<String, Object> getPayMap(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, String sellerNo, List<Map<String, Object>> tempRoutingList) throws Exception {
-        Map<String, Object> paymentParams = new HashMap<>(10);
+        Map<String, Object> paymentParams = new HashMap<>(9);
         paymentParams.put("appId", appId);
         paymentParams.put("amount", amount);
         paymentParams.put("orderNo", orderNo);
@@ -184,9 +184,6 @@ public class Payment extends ConfigInit {
         paymentParams.put("orderSubject", orderSubject);
         paymentParams.put("orderBody", orderBody);
         paymentParams.put("wxAppId", wxAppId);
-        if (tempRoutingList != null) {
-            paymentParams.put("div_members", JSONObject.toJSONString(tempRoutingList));
-        }
 
         String originalStr = JSONObject.toJSONString(paymentParams);
         String sign = DigestUtils.md5DigestAsHex(originalStr.getBytes());

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/StudentPaymentRouteOrderController.java

@@ -75,7 +75,7 @@ public class StudentPaymentRouteOrderController extends BaseController {
     public HttpResponseResult<StudentPaymentRouteOrderDto> add(StudentPaymentRouteOrderDto studentPaymentRouteOrderDto) {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         studentPaymentRouteOrderDto.setUserId(sysUser.getId());
-        return succeed(studentPaymentRouteOrderService.addOrder(studentPaymentRouteOrderDto));
+        return succeed(studentPaymentRouteOrderService.addOutOrder(studentPaymentRouteOrderDto));
     }