This commit is contained in:
2023-08-05 16:15:20 +08:00
parent 593ee7d16f
commit cb534520b3
5 changed files with 155 additions and 73 deletions

View File

@@ -0,0 +1,55 @@
package com.jsowell.adapay.response;
import lombok.*;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BalancePaymentResponse {
/**
* 当前交易结果状态,参见 状态 说明
*/
private String status;
private String error_code;
private String error_msg;
private String error_type;
/**
* 商户客户号
*/
private String mer_cust_id;
/**
*
* 应用ID
*/
private String app_id;
/**
* 订单号
*/
private String order_no;
/**
* 交易金额
*/
private String trans_amt;
/**
* 手续费
*/
private String fee_amt;
/**
* 余额支付流水号
*/
private String balance_seq_id;
/**
* 支付模式
*/
private String pay_mode;
}

View File

@@ -9,6 +9,7 @@ import com.huifu.adapay.model.*;
import com.jsowell.adapay.dto.SettleAccountDTO;
import com.jsowell.adapay.dto.UpdateAccountConfigDTO;
import com.jsowell.adapay.dto.WithdrawDTO;
import com.jsowell.adapay.response.BalancePaymentResponse;
import com.jsowell.adapay.response.QueryCorpMemberResponse;
import com.jsowell.adapay.response.QueryMemberResponse;
import com.jsowell.adapay.vo.AdapayAccountBalanceVO;
@@ -17,6 +18,7 @@ import com.jsowell.adapay.vo.AdapayMemberInfoVO;
import com.jsowell.adapay.vo.AdapaySettleAccountVO;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.enums.DelFlagEnum;
import com.jsowell.common.enums.adapay.AdapayStatusEnum;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.AdapayUtil;
@@ -453,7 +455,7 @@ public class AdapayMemberService {
throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_MEMBER_IS_NULL_ERROR);
}
// 提现手续费 每笔固定10
// 提现手续费 每笔固定5
BigDecimal feeAmt = new BigDecimal("5");
// 实际提现到账金额
@@ -484,7 +486,7 @@ public class AdapayMemberService {
String id = (String) settleCount.get("id");
// 发起支付手续费请求 inMemberId为0表示本商户
createBalancePaymentRequest(adapayAccountBalanceVO.getAdapayMemberId(), Constants.ZERO, feeAmt.toString());
createBalancePaymentRequest(adapayAccountBalanceVO.getAdapayMemberId(), Constants.ZERO, feeAmt.toString(), "提现手续费", "提现单号:" + id);
// 保存提现记录
ClearingWithdrawInfo record = new ClearingWithdrawInfo();
@@ -538,7 +540,7 @@ public class AdapayMemberService {
log.info("更新企业账户param:{}", memberParams);
Map<String, Object> member = AdapayCommon.requestAdapayFile(memberParams, file);
log.info("更新企业账户result:{}", JSON.toJSONString(member));
if (StringUtils.equals((String) member.get("status"), "failed")) {
if (AdapayStatusEnum.FAILED.getValue().equals((String) member.get("status"))) {
throw new BusinessException("", (String) member.get("error_msg"));
}
return null;
@@ -549,8 +551,10 @@ public class AdapayMemberService {
* @param outMemberId 出账用户的member_id 若为商户本身时请传入0
* @param inMemberId 入账用户的member_id 若为商户本身时请传入0
* @param transAmt 交易金额, 必须大于0保留两位小数点如0.10、100.05等
* @param title 标题
* @param desc 描述信息
*/
public void createBalancePaymentRequest(String outMemberId, String inMemberId, String transAmt) throws BaseAdaPayException {
public BalancePaymentResponse createBalancePaymentRequest(String outMemberId, String inMemberId, String transAmt, String title, String desc) throws BaseAdaPayException {
Map<String, Object> balanceParam = Maps.newHashMap();
balanceParam.put("app_id", ADAPAY_APP_ID);
balanceParam.put("adapay_func_code", "settle_accounts.balancePay");
@@ -558,10 +562,11 @@ public class AdapayMemberService {
balanceParam.put("out_member_id", outMemberId);
balanceParam.put("in_member_id", inMemberId);
balanceParam.put("trans_amt", AdapayUtil.formatAmount(transAmt));
balanceParam.put("goods_title", "测试余额支付");
balanceParam.put("goods_desc", "该商品信息用于测试余额支付");
balanceParam.put("goods_title", title);
balanceParam.put("goods_desc", desc);
Map<String, Object> paymentResult = AdapayCommon.requestAdapay(balanceParam);
log.info("创建余额支付param:{}, result:{}", JSON.toJSONString(balanceParam), JSON.toJSONString(paymentResult));
return JSONObject.parseObject(JSON.toJSONString(paymentResult), BalancePaymentResponse.class);
}
/**

View File

@@ -16,7 +16,9 @@ import com.huifu.adapay.model.PaymentReverse;
import com.huifu.adapay.model.Refund;
import com.jsowell.adapay.common.CreateAdaPaymentParam;
import com.jsowell.adapay.common.DivMember;
import com.jsowell.adapay.response.BalancePaymentResponse;
import com.jsowell.adapay.response.PaymentConfirmResponse;
import com.jsowell.adapay.service.AdapayMemberService;
import com.jsowell.adapay.vo.OrderSettleResult;
import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
@@ -41,10 +43,8 @@ import com.jsowell.pile.service.*;
import com.jsowell.pile.transaction.dto.ClearingBillTransactionDTO;
import com.jsowell.pile.transaction.dto.OrderTransactionDTO;
import com.jsowell.pile.transaction.service.TransactionService;
import com.jsowell.pile.vo.base.MerchantOrderInfoVO;
import com.jsowell.pile.vo.base.OrderAmountDetailVO;
import com.jsowell.pile.vo.base.OrderPeriodAmountVO;
import com.jsowell.pile.vo.base.PileInfoVO;
import com.jsowell.pile.vo.base.*;
import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
import com.jsowell.pile.vo.uniapp.*;
import com.jsowell.pile.vo.web.*;
@@ -167,6 +167,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
@Autowired
private IPileStationWhitelistService pileStationWhitelistService;
@Autowired
private AdapayMemberService adapayMemberService;
/**
* 条件查询订单基本信息
*
@@ -928,11 +931,15 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 执行分账
for (OrderBasicInfo orderBasicInfo : orderBasicInfos) {
try {
OrderSettleResult orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount);
OrderSettleResult orderSettleResult = null;
if (PayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
// 余额支付的订单 只用余额支付转账
orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount);
} else {
// 在线支付,进行支付确认分账
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount);
}
if (orderSettleResult != null && AdapayStatusEnum.SUCCEEDED.getValue().equals(orderSettleResult.getStatus())) {
JSONObject jsonObject = JSON.parseObject(orderSettleResult.getDescription());
String orderCode = (String) jsonObject.get("orderCode");
// 应收金额 = 订单结算金额汇总
receivableAmount = receivableAmount.add(orderBasicInfo.getSettleAmount());
// 应清分金额 = 订单产生的电费+服务费实际消费 汇总
@@ -948,7 +955,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
ClearingBillDetail clearingBillDetail = ClearingBillDetail.builder()
.clearingBillCode(clearingBillCode)
.orderCode(orderCode)
.orderCode(orderBasicInfo.getOrderCode())
.createTime(DateUtils.getNowDate())
.delFlag(DelFlagEnum.NORMAL.getValue())
.build();
@@ -1014,28 +1021,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
continue;
}
// 清分账单信息
// ClearingBillInfo clearingBillInfo = new ClearingBillInfo();
// clearingBillInfo.setBillStatus("1");
// String clearingBillCode = "CLE" + IdUtils.getOrderCode();
// clearingBillInfo.setClearingBillCode(clearingBillCode);
// clearingBillInfo.setClearingTime(DateUtils.getNowDate());
// clearingBillInfo.setMerchantId(merchantId);
// clearingBillInfo.setOrderSource("1");
// 应收金额
// BigDecimal receivableAmount = BigDecimal.ZERO;
// // 应清分金额
// BigDecimal shouldClearingAmount = BigDecimal.ZERO;
// // 实际清分金额
// BigDecimal actualClearingAmount = BigDecimal.ZERO;
// // 手续费金额
// BigDecimal feeAmount = BigDecimal.ZERO;
// // 可提现金额
// BigDecimal withdrawableAmount = BigDecimal.ZERO;
// 清分账单详情列表
// List<ClearingBillDetail> billDetailList = Lists.newArrayList();
// 执行分账
for (OrderBasicInfo orderBasicInfo : orderBasicInfos) {
try {
@@ -1044,49 +1029,47 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
JSONObject jsonObject = JSON.parseObject(orderSettleResult.getDescription());
String orderCode = (String) jsonObject.get("orderCode");
// 应收金额 = 订单结算金额汇总
// receivableAmount = receivableAmount.add(orderBasicInfo.getSettleAmount());
// // 应清分金额 = 订单产生的电费+服务费实际消费 汇总
// shouldClearingAmount = shouldClearingAmount.add(orderBasicInfo.getSettleAmount());
// // 实际清分金额 = 汇付清分接口返回的清分金额
// actualClearingAmount = actualClearingAmount.add(new BigDecimal(orderSettleResult.getConfirm_amt()));
// // 手续费金额 = 汇付清分接口返回的手续费金额
// feeAmount = feeAmount.add(new BigDecimal(orderSettleResult.getFee_amt()));
// // 可提现金额 = 实际清分金额 - 手续费金额
// withdrawableAmount = withdrawableAmount
// .add(new BigDecimal(orderSettleResult.getConfirm_amt()))
// .subtract(new BigDecimal(orderSettleResult.getFee_amt()));
// ClearingBillDetail clearingBillDetail = ClearingBillDetail.builder()
// .clearingBillCode(clearingBillCode)
// .orderCode(orderCode)
// .createTime(DateUtils.getNowDate())
// .delFlag(DelFlagEnum.NORMAL.getValue())
// .build();
// billDetailList.add(clearingBillDetail);
}
} catch (Exception e) {
logger.error("订单交易确认失败:{}", orderBasicInfo.getOrderCode(), e);
}
}
// clearingBillInfo.setReceivableAmount(receivableAmount);
// clearingBillInfo.setShouldClearingAmount(shouldClearingAmount);
// clearingBillInfo.setFeeAmount(feeAmount);
// clearingBillInfo.setWithdrawableAmount(withdrawableAmount);
// clearingBillInfo.setActualClearingAmount(actualClearingAmount);
// clearingBillInfo.setCreateTime(DateUtils.getNowDate());
// clearingBillInfo.setDelFlag(DelFlagEnum.NORMAL.getValue());
// 保存清分账单
// ClearingBillTransactionDTO dto = new ClearingBillTransactionDTO();
// dto.setClearingBillInfo(clearingBillInfo);
// dto.setBillDetailList(billDetailList);
// transactionService.createClearingBill(dto);
}
logger.info("运营商:{}, 交易日期:{}, 进行分账处理end", merchantId, tradeDate);
}
/**
* 余额支付订单,使用余额支付转账
* @param orderBasicInfo
* @param adapayMemberAccount
* @return
*/
public OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount) throws BaseAdaPayException {
// 计算应该支付金额,和手续费
SplitSettleAmountVO splitSettleAmountVO = splitSettleAmount(orderBasicInfo.getSettleAmount());
BigDecimal feeAmount = splitSettleAmountVO.getFeeAmount();
BigDecimal tradeAmount = splitSettleAmountVO.getTradeAmount();
String orderCode = orderBasicInfo.getOrderCode();
// 使用汇付余额支付功能
String outMemberId = Constants.ZERO; // 若为商户本身时请传入0
String inMemberId = adapayMemberAccount.getAdapayMemberId();
String transAmt = AdapayUtil.formatAmount(tradeAmount);
String title = "订单结算入账";
String desc = "订单号:" + orderCode + ", 结算金额";
BalancePaymentResponse balancePaymentRequest = adapayMemberService.createBalancePaymentRequest(outMemberId, inMemberId, transAmt, title, desc);
OrderSettleResult result = new OrderSettleResult();
result.setConfirm_amt(balancePaymentRequest.getTrans_amt());
result.setStatus(balancePaymentRequest.getStatus());
result.setFee_amt(feeAmount.toString());
JSONObject jsonObject = new JSONObject();
jsonObject.put("orderCode", orderCode);
result.setDescription(jsonObject.toJSONString());
return result;
}
/**
* 延迟交易订单 交易确认
* @param orderBasicInfo 订单
@@ -2361,9 +2344,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
settleOrderReport.setTradeDate(tradeDate);
settleOrderReport.setOrderCodes(Joiner.on(",").join(orderCodeList));
// 计算手续费 = 结算金额 * 0.55%
BigDecimal tradeFee = totalSettleAmount.multiply(new BigDecimal(Constants.FEE_RATES));
settleOrderReport.setTradeFee(tradeFee);
settleOrderReport.setTradeAmount(totalSettleAmount.subtract(tradeFee));
SplitSettleAmountVO splitSettleAmountVO = splitSettleAmount(totalSettleAmount);
settleOrderReport.setTradeFee(splitSettleAmountVO.getFeeAmount());
settleOrderReport.setTradeAmount(splitSettleAmountVO.getTradeAmount());
// 根据站点id和交易日期查询
SettleOrderReport selectResult = settleOrderReportService.selectByStationIdAndDate(stationId, tradeDate);
if (selectResult != null) {
@@ -2373,6 +2356,24 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
settleOrderReportService.insertOrUpdate(settleOrderReport);
}
/**
* 通过结算金额,计算客户到账金额和手续费
* @param settleAmount 需要拆分的结算金额
* @return
*/
private SplitSettleAmountVO splitSettleAmount(BigDecimal settleAmount) {
SplitSettleAmountVO resultVO = new SplitSettleAmountVO();
if (settleAmount == null) {
return resultVO;
}
// 计算手续费 = 结算金额 * 0.55%
BigDecimal fee = settleAmount.multiply(new BigDecimal(Constants.FEE_RATES));
resultVO.setSettleAmount(settleAmount);
resultVO.setFeeAmount(fee);
resultVO.setTradeAmount(settleAmount.subtract(fee));
return resultVO;
}
/**
* 获取运营商订单列表
*

View File

@@ -0,0 +1,21 @@
package com.jsowell.pile.vo.base;
import lombok.*;
import java.math.BigDecimal;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SplitSettleAmountVO {
// 结算金额
private BigDecimal settleAmount;
// 手续费 = 结算金额 * 0.55%
private BigDecimal feeAmount;
// 交易金额 = 结算金额 - 手续费
private BigDecimal tradeAmount;
}