订单分账逻辑

This commit is contained in:
2023-08-26 14:09:04 +08:00
parent cf21a9a237
commit 8a2326f300
8 changed files with 100 additions and 41 deletions

View File

@@ -51,7 +51,7 @@ public class PileMerchantInfoController extends BaseController {
@PreAuthorize("@ss.hasPermi('pile:merchant:list')")
@GetMapping("queryFirstLevelMerchant")
public TableDataInfo queryFirstLevelMerchant() {
List<PileMerchantInfo> list = pileMerchantInfoService.queryFirstLevelMerchant();
List<PileMerchantInfo> list = pileMerchantInfoService.queryFirstLevelMerchantList();
return getDataTable(list);
}

View File

@@ -206,6 +206,16 @@ public class SpringBootTestController {
@Autowired
private LTYTService ltytService;
@Autowired
private IPileMerchantInfoService pileMerchantInfoService;
@Test
public void getFirstLevelMerchantByMerchantIdTest() {
String merchantId = "13";
PileMerchantInfo merchantInfo = pileMerchantInfoService.getFirstLevelMerchantByMerchantId(merchantId);
System.out.println(JSON.toJSONString(merchantInfo));
}
@Test
public void queryPaymentInfoTest() throws BaseAdaPayException {
String wechatAppId = "wxbb3e0d474569481d";

View File

@@ -3,11 +3,24 @@ package com.jsowell.adapay.vo;
import lombok.Getter;
import lombok.Setter;
/**
* 订单分账结果
*/
@Getter
@Setter
public class OrderSettleResult {
/**
* 状态
* 订单编号
*/
private String orderCode;
/**
* 订单结算金额
*/
private String settleAmt;
/**
* 分账状态
*/
private String status;

View File

@@ -88,7 +88,7 @@ public interface PileMerchantInfoMapper {
/**
* 查询一级运营商
*/
List<PileMerchantInfo> queryFirstLevelMerchant();
List<PileMerchantInfo> queryFirstLevelMerchantList();
/**
* 根据appid查询对应一级运营商id

View File

@@ -97,7 +97,7 @@ public interface IPileMerchantInfoService {
* 查询一级运营商列表
* @return
*/
List<PileMerchantInfo> queryFirstLevelMerchant();
List<PileMerchantInfo> queryFirstLevelMerchantList();
String queryAppIdByMerchantId(String merchantId);
@@ -109,4 +109,9 @@ public interface IPileMerchantInfoService {
List<String> getDeptIdsByAppId(String appId);
String getDelayModeByWechatAppId(String wechatAppId);
/**
* 通过merchantId获取一级运营商信息
*/
PileMerchantInfo getFirstLevelMerchantByMerchantId(String merchantId);
}

View File

@@ -695,7 +695,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
transactionService.doUpdateOrder(dto);
// 订单支付结算
orderPaymentSettlement(orderBasicInfo);
OrderSettleResult orderSettleResult = orderPaymentSettlement(orderBasicInfo);
// 退款逻辑/需要退款的情况
BigDecimal residue = orderBasicInfo.getRefundAmount();
@@ -735,18 +735,33 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
* 清分账单生成逻辑改为当天第一笔结算后就新建,后面的产生的订单,追加更新
*/
private OrderSettleResult orderPaymentSettlement(OrderBasicInfo orderBasicInfo) {
// 获取一级运营商appId
String appId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId());
if (StringUtils.isBlank(appId)) {
String merchantId = orderBasicInfo.getMerchantId();
String orderCode = orderBasicInfo.getOrderCode();
// 获取一级运营商信息
PileMerchantInfo merchantInfo = pileMerchantInfoService.getFirstLevelMerchantByMerchantId(merchantId);
if (merchantInfo == null) {
logger.info("订单分账逻辑-订单:{}, 查不到一级运营商信息", orderCode);
return null;
}
String appId = merchantInfo.getAppId();
String delayMode = merchantInfo.getDelayMode();
// 获取结算账户信息
AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(orderBasicInfo.getMerchantId());
AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId);
if (adapayMemberAccount == null) {
logger.info("订单分账逻辑-订单:{}, 运营商id:{}, 没有配置结算账户信息", orderCode, merchantId);
return null;
}
/*
获取一级运营商的 延时分账设置
使用延时分账的一级运营商,需要
未使用延时分账的一级运营商
*/
OrderSettleResult orderSettleResult = null;
try {
if (StringUtils.equals(delayMode, Constants.ADAPAY_PAY_MODE_DELAY)) {
// 延时分账的处理逻辑
if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
// 余额支付的订单
orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId);
@@ -754,9 +769,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 在线支付,进行支付确认分账
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
}
} catch (Exception e) {
logger.error("订单交易确认失败:{}", orderBasicInfo.getOrderCode(), e);
} else {
}
return orderSettleResult;
}
@@ -1208,7 +1226,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
* @return
*/
@Override
public OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException {
public OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
BigDecimal settleAmount = orderBasicInfo.getSettleAmount();
String orderCode = orderBasicInfo.getOrderCode();
@@ -1222,28 +1240,22 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
for (BalanceDeductionAmountVO vo : list) {
String paymentId = vo.getPaymentId();
BigDecimal deductionAmount = vo.getDeductionAmount();
String delayMode = vo.getDelayMode();
if (StringUtils.equals(delayMode, Constants.ADAPAY_PAY_MODE_DELAY)) {
// 延时分账使用确认交易API
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode, wechatAppId);
if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) {
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirmed_amt()));
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
status = paymentConfirmResponse.getStatus();
description = paymentConfirmResponse.getDescription();
// 延时分账使用确认交易API
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode, wechatAppId);
if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) {
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirmed_amt()));
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
status = paymentConfirmResponse.getStatus();
description = paymentConfirmResponse.getDescription();
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
}
} else {
// 实时分账
logger.info("实时分账");
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
}
}
@@ -1314,10 +1326,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
*
* @param orderBasicInfo 订单
* @param adapayMemberAccount 结算账户
* @throws BaseAdaPayException
*/
@Override
public OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException {
public OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
// 查询订单的交易id
String orderCode = orderBasicInfo.getOrderCode();
AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderCode);
@@ -2747,9 +2758,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 余额支付
balancePayOrder(dto);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 微信支付
// dto.setOrderBasicInfo(orderInfo);
// 2023-07-11 全部改为汇付支付
dto.setGoodsTitle("充电费用");
dto.setGoodsDesc("充电桩预付款金额");

View File

@@ -339,8 +339,8 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService {
* @return
*/
@Override
public List<PileMerchantInfo> queryFirstLevelMerchant() {
return pileMerchantInfoMapper.queryFirstLevelMerchant();
public List<PileMerchantInfo> queryFirstLevelMerchantList() {
return pileMerchantInfoMapper.queryFirstLevelMerchantList();
}
/**
@@ -407,4 +407,27 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService {
return null;
}
@Override
public PileMerchantInfo getFirstLevelMerchantByMerchantId(String merchantId) {
if (StringUtils.isBlank(merchantId)) {
return null;
}
// 拿merchantId先查一次
PileMerchantInfo pileMerchantInfo = selectPileMerchantInfoById(merchantId);
if (pileMerchantInfo == null) {
return null;
}
if (StringUtils.equals(pileMerchantInfo.getMerchantLevel(), Constants.ONE)) {
// 如果是一级运营商直接返回
return pileMerchantInfo;
}
// 通过parentId再查一次
String parentId = pileMerchantInfo.getParentId();
pileMerchantInfo = selectPileMerchantInfoById(parentId);
if (pileMerchantInfo == null) {
return null;
}
return pileMerchantInfo;
}
}

View File

@@ -339,7 +339,7 @@
</if>
</select>
<select id="queryFirstLevelMerchant" resultMap="PileMerchantInfoResult">
<select id="queryFirstLevelMerchantList" resultMap="PileMerchantInfoResult">
select
<include refid="Base_Column_List"/>
from