|
@@ -6,9 +6,11 @@ import com.ym.mec.biz.dal.dao.StudentPaymentRouteOrderDao;
|
|
|
import com.ym.mec.biz.dal.dao.SysConfigDao;
|
|
|
import com.ym.mec.biz.dal.dto.AmountChannelDto;
|
|
|
import com.ym.mec.biz.dal.dto.RouteScaleDto;
|
|
|
+import com.ym.mec.biz.dal.entity.Group;
|
|
|
import com.ym.mec.biz.dal.entity.StudentPaymentRouteOrder;
|
|
|
import com.ym.mec.biz.dal.entity.SysAccount;
|
|
|
import com.ym.mec.biz.dal.entity.SysPaymentConfig;
|
|
|
+import com.ym.mec.biz.dal.enums.FeeTypeEnum;
|
|
|
import com.ym.mec.biz.dal.enums.PaymentChannelEnum;
|
|
|
import com.ym.mec.biz.dal.enums.PaymentChannelTypeEnum;
|
|
|
import com.ym.mec.biz.service.*;
|
|
@@ -41,6 +43,8 @@ public class PayServiceImpl implements PayService {
|
|
|
private SysPaymentConfigService sysPaymentConfigService;
|
|
|
@Autowired
|
|
|
private StudentPaymentRouteOrderDao studentPaymentRouteOrderDao;
|
|
|
+ @Autowired
|
|
|
+ private SellOrderService sellOrderService;
|
|
|
|
|
|
@Override
|
|
|
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 {
|
|
@@ -51,6 +55,11 @@ public class PayServiceImpl implements PayService {
|
|
|
routeScaleDtos = noUsePaymentConfig(amount);
|
|
|
}
|
|
|
|
|
|
+ //根据费用类型
|
|
|
+ if (routeScaleDtos == null) {
|
|
|
+ routeScaleDtos = getTypeRouteChannel(organId, orderNo, amount, balanceAmount);
|
|
|
+ }
|
|
|
+
|
|
|
//根据金额获取分润
|
|
|
if (routeScaleDtos == null) {
|
|
|
routeScaleDtos = getAmountChannel(organId, amount, receiver);
|
|
@@ -305,9 +314,20 @@ public class PayServiceImpl implements PayService {
|
|
|
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);
|
|
|
- BigDecimal routingMoney = amount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+
|
|
|
+ BigDecimal routingFee = null;
|
|
|
+ BigDecimal routeBalanceAmount = null;
|
|
|
+ BigDecimal routingMoney = null;
|
|
|
+
|
|
|
+ if (routeScaleDto.getFeeType() == null) {
|
|
|
+ routingFee = routingAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ routeBalanceAmount = balanceAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ routingMoney = amount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP);
|
|
|
+ } else {
|
|
|
+ routingFee = routeScaleDto.getAmount();
|
|
|
+ routeBalanceAmount = routeScaleDto.getBalance();
|
|
|
+ routingMoney = routeScaleDto.getAmount();
|
|
|
+ }
|
|
|
if (i == routeScaleDtos.size()) {
|
|
|
routingFee = routingAmount.subtract(hasRouteAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
routeBalanceAmount = balanceAmount.subtract(hasRouteBalanceAmount).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
@@ -364,4 +384,119 @@ public class PayServiceImpl implements PayService {
|
|
|
return unionPay;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @param organId
|
|
|
+ * @param orderNo
|
|
|
+ * @param amount
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private List<RouteScaleDto> getTypeRouteChannel(Integer organId, String orderNo, BigDecimal amount, BigDecimal balanceAmount) {
|
|
|
+ SysPaymentConfig paymentConfig = sysPaymentConfigService.findPaymentConfigByOrganId(organId);
|
|
|
+ if (paymentConfig == null || StringUtils.isBlank(paymentConfig.getTypeRouteScale())) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, BigDecimal> sellAmount = sellOrderService.getSellAmount(orderNo);
|
|
|
+ if (sellAmount == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ String typeRouteScale = paymentConfig.getTypeRouteScale();
|
|
|
+ List<RouteScaleDto> routeScaleDtos = JSON.parseArray(typeRouteScale, RouteScaleDto.class);
|
|
|
+ List<Integer> organIds = routeScaleDtos.stream().map(RouteScaleDto::getOrganId).collect(Collectors.toList());
|
|
|
+ List<SysPaymentConfig> paymentConfigByOrganIds = sysPaymentConfigService.findPaymentConfigByOrganIds(organIds);
|
|
|
+
|
|
|
+ long serviceCount = routeScaleDtos.stream().filter(e -> e.getFeeType().equals(FeeTypeEnum.SERVICE)).count();
|
|
|
+ long sellCount = routeScaleDtos.stream().filter(e -> e.getFeeType().equals(FeeTypeEnum.SELL)).count();
|
|
|
+
|
|
|
+ BigDecimal routeAmount = sellAmount.get("actualAmount");
|
|
|
+ BigDecimal routeBalance = sellAmount.get("balance");
|
|
|
+
|
|
|
+ BigDecimal serviceHasRouteMoney = BigDecimal.ZERO;
|
|
|
+ BigDecimal serviceHasRouteBalance = BigDecimal.ZERO;
|
|
|
+ BigDecimal sellHasRouteMoney = BigDecimal.ZERO;
|
|
|
+ BigDecimal sellHasRouteBalance = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ Iterator<RouteScaleDto> iterator = routeScaleDtos.iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ RouteScaleDto routeScaleDto = iterator.next();
|
|
|
+ routeScaleDto.setPayType(paymentConfig.getPayType());
|
|
|
+ if (routeScaleDto.getFeeType().equals(FeeTypeEnum.SERVICE)) {
|
|
|
+ routeAmount = amount.subtract(sellAmount.get("actualAmount"));
|
|
|
+ routeBalance = balanceAmount.subtract(sellAmount.get("balance"));
|
|
|
+ serviceCount--;
|
|
|
+ } else {
|
|
|
+ routeAmount = sellAmount.get("actualAmount");
|
|
|
+ routeBalance = sellAmount.get("balance");
|
|
|
+ sellCount--;
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal routingMoney = routeAmount.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN);
|
|
|
+ BigDecimal routingBalance = routeBalance.multiply(new BigDecimal(routeScaleDto.getScale())).divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN);
|
|
|
+
|
|
|
+ if (routeScaleDto.getFeeType().equals(FeeTypeEnum.SERVICE) && serviceCount == 0) {
|
|
|
+ routingMoney = routeAmount.subtract(serviceHasRouteMoney);
|
|
|
+ routingBalance = routeBalance.subtract(serviceHasRouteBalance);
|
|
|
+ } else if (routeScaleDto.getFeeType().equals(FeeTypeEnum.SELL) && sellCount == 0) {
|
|
|
+ routingMoney = routeAmount.subtract(sellHasRouteMoney);
|
|
|
+ routingBalance = routeBalance.subtract(sellHasRouteBalance);
|
|
|
+ }
|
|
|
+ routeScaleDto.setAmount(routingMoney);
|
|
|
+ routeScaleDto.setBalance(routingBalance);
|
|
|
+
|
|
|
+ if (routeScaleDto.getFeeType().equals(FeeTypeEnum.SERVICE)) {
|
|
|
+ serviceHasRouteMoney = serviceHasRouteMoney.add(routingMoney);
|
|
|
+ serviceHasRouteBalance = serviceHasRouteBalance.add(routingBalance);
|
|
|
+ } else {
|
|
|
+ sellHasRouteMoney = sellHasRouteMoney.add(routingMoney);
|
|
|
+ sellHasRouteBalance = sellHasRouteBalance.add(routingBalance);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (routeScaleDto.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ iterator.remove();
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ 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());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String, List<RouteScaleDto>> routeScaleDtosMap = routeScaleDtos.stream().collect(Collectors.groupingBy(RouteScaleDto::getMerNo));
|
|
|
+
|
|
|
+ //合并同账号的数据
|
|
|
+ BigDecimal maxAmount = BigDecimal.ZERO;
|
|
|
+ List<RouteScaleDto> newRouteScaleDtos = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, List<RouteScaleDto>> groupRouteScaleDtos : routeScaleDtosMap.entrySet()) {
|
|
|
+ RouteScaleDto routeScaleDto = null;
|
|
|
+ for (RouteScaleDto scaleDto : groupRouteScaleDtos.getValue()) {
|
|
|
+ if(routeScaleDto == null){
|
|
|
+ routeScaleDto = scaleDto;
|
|
|
+ }else {
|
|
|
+ routeScaleDto.setAmount(routeScaleDto.getAmount().add(scaleDto.getAmount()));
|
|
|
+ routeScaleDto.setBalance(routeScaleDto.getBalance().add(scaleDto.getBalance()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (routeScaleDto != null && routeScaleDto.getAmount().compareTo(maxAmount) > 0) {
|
|
|
+ maxAmount = routeScaleDto.getAmount();
|
|
|
+ }
|
|
|
+ newRouteScaleDtos.add(routeScaleDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ //金额最大的账号承担手续费
|
|
|
+ boolean hasFeeFlag = false;
|
|
|
+ for (RouteScaleDto routeScaleDto : newRouteScaleDtos) {
|
|
|
+ if (!hasFeeFlag && routeScaleDto.getAmount().compareTo(maxAmount) == 0) {
|
|
|
+ routeScaleDto.setFeeFlag("Y");
|
|
|
+ hasFeeFlag = true;
|
|
|
+ } else {
|
|
|
+ routeScaleDto.setFeeFlag("N");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return newRouteScaleDtos;
|
|
|
+ }
|
|
|
}
|