|
@@ -1,18 +1,28 @@
|
|
|
package com.ym.mec.biz.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.ym.mec.biz.dal.dao.MusicGroupDao;
|
|
|
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.SysAccount;
|
|
|
import com.ym.mec.biz.dal.entity.SysPaymentConfig;
|
|
|
+import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
|
|
|
import com.ym.mec.biz.dal.enums.PaymentChannelTypeEnum;
|
|
|
import com.ym.mec.biz.service.*;
|
|
|
import com.ym.mec.common.exception.BizException;
|
|
|
+import com.ym.mec.thirdparty.adapay.ConfigInit;
|
|
|
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;
|
|
@@ -37,7 +47,28 @@ public class PayServiceImpl implements PayService {
|
|
|
private SysConfigDao sysConfigDao;
|
|
|
@Autowired
|
|
|
private SysPaymentConfigService sysPaymentConfigService;
|
|
|
-
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate<String, String> redisTemplate;
|
|
|
+
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ String baseApiUrl = "http://dev.dayaedu.com";
|
|
|
+
|
|
|
+ try {
|
|
|
+ Map<String, Object> payMap = new PayServiceImpl().getPayMap(
|
|
|
+ BigDecimal.TEN,
|
|
|
+ "5435253245",
|
|
|
+ baseApiUrl + "/api-student/studentOrder/notify",
|
|
|
+ baseApiUrl + "/api-student/studentOrder/paymentResult?orderNo=5435253245",
|
|
|
+ "对外课程组购买",
|
|
|
+ "测试购买",
|
|
|
+ 1,
|
|
|
+ null
|
|
|
+ );
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 返回订单提交数据
|
|
@@ -99,7 +130,7 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
|
Map<String, Object> payMap = null;
|
|
|
String type = null;
|
|
|
- List<Map<String, Object>> tempRoutingList = new ArrayList();
|
|
|
+ List<Map<String, Object>> tempRoutingList = new ArrayList<>();
|
|
|
for (SysAccount account : accounts) {
|
|
|
Map<String, Object> routingList = new HashMap<>();
|
|
|
if (account.getChannel().equals("YQPAY")) {
|
|
@@ -154,7 +185,6 @@ public class PayServiceImpl implements PayService {
|
|
|
receiver = null;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//直接收到深圳的分部
|
|
|
String sDaYaOrganIds = sysConfigDao.findConfigValue(SysConfigService.SZ_DA_YA_ORGAN_IDS);
|
|
|
if (StringUtils.isNotBlank(sDaYaOrganIds)) {
|
|
@@ -172,7 +202,7 @@ public class PayServiceImpl implements PayService {
|
|
|
|
|
|
Map<String, Object> payMap = null;
|
|
|
String type = null;
|
|
|
- List<Map<String, Object>> tempRoutingList = new ArrayList();
|
|
|
+ List<Map<String, Object>> tempRoutingList = new ArrayList<>();
|
|
|
for (SysAccount account : accounts) {
|
|
|
Map<String, Object> routingList = new HashMap<>();
|
|
|
if (account.getChannel().equals("YQPAY")) {
|
|
@@ -212,6 +242,233 @@ 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 {
|
|
|
+ //根据金额获取分润
|
|
|
+ PayChannelDto payChannelDto = getAmountChannel(amount);
|
|
|
+ //零星支付,收到指定
|
|
|
+ if (payChannelDto == null && receiver != null) {
|
|
|
+ payChannelDto = getSporadicChannel(amount);
|
|
|
+ }
|
|
|
+ //比例或者笔数分佣
|
|
|
+ if (payChannelDto == null) {
|
|
|
+ payChannelDto = getPaymentConfigChannel(organId, amount);
|
|
|
+ }
|
|
|
+
|
|
|
+ return getPayRoute(amount, orderNo, notifyUrl, returnUrl, orderSubject, orderBody, payChannelDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ private PayChannelDto getPaymentConfigChannel(Integer organId, BigDecimal amount) {
|
|
|
+ PayChannelDto payChannelDto = new PayChannelDto();
|
|
|
+ List<Map<String, Object>> tempRoutingList = new ArrayList<>();
|
|
|
+ Map<String, Object> routingList = new HashMap<>();
|
|
|
+ SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
|
|
|
+ if (paymentConfig == null) {
|
|
|
+ String paymentChannel = sysConfigDao.findConfigValue("payment_channel");
|
|
|
+ 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);
|
|
|
+ } else {
|
|
|
+ routingList.put("organId", organId);
|
|
|
+ routingList.put("member_id", ConfigInit.merNo);//分佣账户
|
|
|
+ routingList.put("amount", amount);//分佣金额
|
|
|
+ routingList.put("fee_flag", "Y"); //承担手续费
|
|
|
+ payChannelDto.setPayType(PaymentChannelEnum.ADAPAY);
|
|
|
+ }
|
|
|
+ tempRoutingList.add(routingList);
|
|
|
+ payChannelDto.setTempRoutingList(tempRoutingList);
|
|
|
+ return payChannelDto;
|
|
|
+ }
|
|
|
+
|
|
|
+ String routeScale = paymentConfig.getRouteScale();
|
|
|
+ List<RouteScaleDto> routeScaleDtos = JSON.parseArray(routeScale, RouteScaleDto.class);
|
|
|
+ List<Integer> organIds = routeScaleDtos.stream().map(RouteScaleDto::getOrganId).collect(Collectors.toList());
|
|
|
+ List<SysPaymentConfig> paymentConfigByOrganIds = sysPaymentConfigService.findPaymentConfigByOrganIds(organIds);
|
|
|
+ for (RouteScaleDto routeScaleDto : routeScaleDtos) {
|
|
|
+ routeScaleDto.setPayType(paymentConfig.getPayType());
|
|
|
+ routeScaleDto.setAmount(amount);
|
|
|
+ for (SysPaymentConfig paymentConfigByOrganId : paymentConfigByOrganIds) {
|
|
|
+ if (!paymentConfigByOrganId.getOrganId().equals(routeScaleDto.getOrganId())) continue;
|
|
|
+ if (paymentConfig.getPayType().equals(PaymentChannelEnum.YQPAY)) {
|
|
|
+ routeScaleDto.setMerNo(paymentConfigByOrganId.getYqMerNo());
|
|
|
+ } else {
|
|
|
+ routeScaleDto.setMerNo(paymentConfigByOrganId.getHfMerNo());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //笔数比例
|
|
|
+ if (paymentConfig.getType().equals(1)) {
|
|
|
+ int payOrderNums = studentPaymentOrderService.findPayOrderNum(); //获取支付中和成功的订单数
|
|
|
+ int rem = payOrderNums % 10;
|
|
|
+ rem = rem == 0 ? 10 : rem;
|
|
|
+
|
|
|
+ int scale = 0;
|
|
|
+ Iterator<RouteScaleDto> iterator = routeScaleDtos.iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ RouteScaleDto routeScaleDto = iterator.next();
|
|
|
+ Integer num = routeScaleDto.getScale();
|
|
|
+ if (rem > scale && rem <= scale + num) {
|
|
|
+ routeScaleDto.setScale(100);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ scale += num;
|
|
|
+ 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", "Y"); //承担手续费
|
|
|
+ }
|
|
|
+ tempRoutingList.add(routingList);
|
|
|
+ }
|
|
|
+
|
|
|
+ payChannelDto.setPayType(paymentConfig.getPayType());
|
|
|
+ payChannelDto.setTempRoutingList(tempRoutingList);
|
|
|
+ return payChannelDto;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据金额获取渠道
|
|
|
+ *
|
|
|
+ * @param amount 金额
|
|
|
+ */
|
|
|
+ private PayChannelDto 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) {
|
|
|
+ organId = amountStr.getValue();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (organId == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ PayChannelDto payChannelDto = new PayChannelDto();
|
|
|
+ SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
|
|
|
+ Map<String, Object> routingList = new HashMap<>();
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 零星支付获取渠道
|
|
|
+ *
|
|
|
+ * @param amount
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private PayChannelDto 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"));
|
|
|
+
|
|
|
+ //已收金额
|
|
|
+ BigDecimal hasReceipt = new BigDecimal("7800");
|
|
|
+ if (hasReceipt.compareTo(maxReceipt) >= 0) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ PayChannelDto payChannelDto = new PayChannelDto();
|
|
|
+ SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
|
|
|
+ Map<String, Object> routingList = new HashMap<>();
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> getPayRoute(BigDecimal amount, String orderNo, String notifyUrl, String returnUrl, String orderSubject, String orderBody, PayChannelDto payChannelDto) throws Exception {
|
|
|
+ Map<String, Object> unionPay = new HashMap<>();
|
|
|
+ Map<String, Object> payMap = null;
|
|
|
+ String type;
|
|
|
+ String routingMerNos;
|
|
|
+
|
|
|
+ List<Map<String, Object>> tempRoutingList = payChannelDto.getTempRoutingList();
|
|
|
+
|
|
|
+ if (payChannelDto.getPayType().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(","));
|
|
|
+ }
|
|
|
+ unionPay.put("orderNo", orderNo);
|
|
|
+ unionPay.put("type", type);
|
|
|
+ unionPay.put("payMap", payMap);
|
|
|
+ unionPay.put("routingMerNos", routingMerNos);
|
|
|
+ return unionPay;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public Map<String, Object> query(String orderNo) throws Exception {
|
|
|
return new UnionPay(unionPayFeignService).query(orderNo);
|
|
|
}
|