mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-06-20 15:19:52 +08:00
订单分账逻辑
This commit is contained in:
@@ -51,7 +51,7 @@ public class PileMerchantInfoController extends BaseController {
|
|||||||
@PreAuthorize("@ss.hasPermi('pile:merchant:list')")
|
@PreAuthorize("@ss.hasPermi('pile:merchant:list')")
|
||||||
@GetMapping("queryFirstLevelMerchant")
|
@GetMapping("queryFirstLevelMerchant")
|
||||||
public TableDataInfo queryFirstLevelMerchant() {
|
public TableDataInfo queryFirstLevelMerchant() {
|
||||||
List<PileMerchantInfo> list = pileMerchantInfoService.queryFirstLevelMerchant();
|
List<PileMerchantInfo> list = pileMerchantInfoService.queryFirstLevelMerchantList();
|
||||||
return getDataTable(list);
|
return getDataTable(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -206,6 +206,16 @@ public class SpringBootTestController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private LTYTService ltytService;
|
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
|
@Test
|
||||||
public void queryPaymentInfoTest() throws BaseAdaPayException {
|
public void queryPaymentInfoTest() throws BaseAdaPayException {
|
||||||
String wechatAppId = "wxbb3e0d474569481d";
|
String wechatAppId = "wxbb3e0d474569481d";
|
||||||
|
|||||||
@@ -3,11 +3,24 @@ package com.jsowell.adapay.vo;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单分账结果
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
public class OrderSettleResult {
|
public class OrderSettleResult {
|
||||||
/**
|
/**
|
||||||
* 状态
|
* 订单编号
|
||||||
|
*/
|
||||||
|
private String orderCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单结算金额
|
||||||
|
*/
|
||||||
|
private String settleAmt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分账状态
|
||||||
*/
|
*/
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ public interface PileMerchantInfoMapper {
|
|||||||
/**
|
/**
|
||||||
* 查询一级运营商
|
* 查询一级运营商
|
||||||
*/
|
*/
|
||||||
List<PileMerchantInfo> queryFirstLevelMerchant();
|
List<PileMerchantInfo> queryFirstLevelMerchantList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据appid查询对应一级运营商id
|
* 根据appid查询对应一级运营商id
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ public interface IPileMerchantInfoService {
|
|||||||
* 查询一级运营商列表
|
* 查询一级运营商列表
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
List<PileMerchantInfo> queryFirstLevelMerchant();
|
List<PileMerchantInfo> queryFirstLevelMerchantList();
|
||||||
|
|
||||||
String queryAppIdByMerchantId(String merchantId);
|
String queryAppIdByMerchantId(String merchantId);
|
||||||
|
|
||||||
@@ -109,4 +109,9 @@ public interface IPileMerchantInfoService {
|
|||||||
List<String> getDeptIdsByAppId(String appId);
|
List<String> getDeptIdsByAppId(String appId);
|
||||||
|
|
||||||
String getDelayModeByWechatAppId(String wechatAppId);
|
String getDelayModeByWechatAppId(String wechatAppId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过merchantId获取一级运营商信息
|
||||||
|
*/
|
||||||
|
PileMerchantInfo getFirstLevelMerchantByMerchantId(String merchantId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -695,7 +695,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
transactionService.doUpdateOrder(dto);
|
transactionService.doUpdateOrder(dto);
|
||||||
|
|
||||||
// 订单支付结算
|
// 订单支付结算
|
||||||
orderPaymentSettlement(orderBasicInfo);
|
OrderSettleResult orderSettleResult = orderPaymentSettlement(orderBasicInfo);
|
||||||
|
|
||||||
// 退款逻辑/需要退款的情况
|
// 退款逻辑/需要退款的情况
|
||||||
BigDecimal residue = orderBasicInfo.getRefundAmount();
|
BigDecimal residue = orderBasicInfo.getRefundAmount();
|
||||||
@@ -735,18 +735,33 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
* 清分账单生成逻辑改为当天第一笔结算后就新建,后面的产生的订单,追加更新
|
* 清分账单生成逻辑改为当天第一笔结算后就新建,后面的产生的订单,追加更新
|
||||||
*/
|
*/
|
||||||
private OrderSettleResult orderPaymentSettlement(OrderBasicInfo orderBasicInfo) {
|
private OrderSettleResult orderPaymentSettlement(OrderBasicInfo orderBasicInfo) {
|
||||||
// 获取一级运营商appId
|
String merchantId = orderBasicInfo.getMerchantId();
|
||||||
String appId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId());
|
String orderCode = orderBasicInfo.getOrderCode();
|
||||||
if (StringUtils.isBlank(appId)) {
|
// 获取一级运营商信息
|
||||||
|
PileMerchantInfo merchantInfo = pileMerchantInfoService.getFirstLevelMerchantByMerchantId(merchantId);
|
||||||
|
if (merchantInfo == null) {
|
||||||
|
logger.info("订单分账逻辑-订单:{}, 查不到一级运营商信息", orderCode);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
String appId = merchantInfo.getAppId();
|
||||||
|
String delayMode = merchantInfo.getDelayMode();
|
||||||
|
|
||||||
// 获取结算账户信息
|
// 获取结算账户信息
|
||||||
AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(orderBasicInfo.getMerchantId());
|
AdapayMemberAccount adapayMemberAccount = adapayMemberAccountService.selectByMerchantId(merchantId);
|
||||||
if (adapayMemberAccount == null) {
|
if (adapayMemberAccount == null) {
|
||||||
|
logger.info("订单分账逻辑-订单:{}, 运营商id:{}, 没有配置结算账户信息", orderCode, merchantId);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
获取一级运营商的 延时分账设置
|
||||||
|
使用延时分账的一级运营商,需要
|
||||||
|
|
||||||
|
未使用延时分账的一级运营商
|
||||||
|
*/
|
||||||
OrderSettleResult orderSettleResult = null;
|
OrderSettleResult orderSettleResult = null;
|
||||||
try {
|
if (StringUtils.equals(delayMode, Constants.ADAPAY_PAY_MODE_DELAY)) {
|
||||||
|
// 延时分账的处理逻辑
|
||||||
if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
|
if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) {
|
||||||
// 余额支付的订单
|
// 余额支付的订单
|
||||||
orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId);
|
orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount, appId);
|
||||||
@@ -754,9 +769,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
// 在线支付,进行支付确认分账
|
// 在线支付,进行支付确认分账
|
||||||
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
|
orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount, appId);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} else {
|
||||||
logger.error("订单交易确认失败:{}", orderBasicInfo.getOrderCode(), e);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return orderSettleResult;
|
return orderSettleResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1208,7 +1226,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@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();
|
BigDecimal settleAmount = orderBasicInfo.getSettleAmount();
|
||||||
String orderCode = orderBasicInfo.getOrderCode();
|
String orderCode = orderBasicInfo.getOrderCode();
|
||||||
|
|
||||||
@@ -1222,28 +1240,22 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
for (BalanceDeductionAmountVO vo : list) {
|
for (BalanceDeductionAmountVO vo : list) {
|
||||||
String paymentId = vo.getPaymentId();
|
String paymentId = vo.getPaymentId();
|
||||||
BigDecimal deductionAmount = vo.getDeductionAmount();
|
BigDecimal deductionAmount = vo.getDeductionAmount();
|
||||||
String delayMode = vo.getDelayMode();
|
|
||||||
|
|
||||||
if (StringUtils.equals(delayMode, Constants.ADAPAY_PAY_MODE_DELAY)) {
|
// 延时分账,使用确认交易API
|
||||||
// 延时分账,使用确认交易API
|
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode, wechatAppId);
|
||||||
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode, wechatAppId);
|
if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) {
|
||||||
if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) {
|
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirmed_amt()));
|
||||||
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirmed_amt()));
|
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
|
||||||
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
|
status = paymentConfirmResponse.getStatus();
|
||||||
status = paymentConfirmResponse.getStatus();
|
description = paymentConfirmResponse.getDescription();
|
||||||
description = paymentConfirmResponse.getDescription();
|
|
||||||
|
|
||||||
// 更新这笔交易的剩余金额
|
// 更新这笔交易的剩余金额
|
||||||
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
|
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
|
||||||
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
|
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
|
||||||
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
|
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
|
||||||
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
|
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
|
||||||
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
|
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
|
||||||
memberAdapayRecordService.updateByPrimaryKeySelective(record);
|
memberAdapayRecordService.updateByPrimaryKeySelective(record);
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// 实时分账
|
|
||||||
logger.info("实时分账");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1314,10 +1326,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
*
|
*
|
||||||
* @param orderBasicInfo 订单
|
* @param orderBasicInfo 订单
|
||||||
* @param adapayMemberAccount 结算账户
|
* @param adapayMemberAccount 结算账户
|
||||||
* @throws BaseAdaPayException
|
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) throws BaseAdaPayException {
|
public OrderSettleResult doPaymentConfirm(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount, String wechatAppId) {
|
||||||
// 查询订单的交易id
|
// 查询订单的交易id
|
||||||
String orderCode = orderBasicInfo.getOrderCode();
|
String orderCode = orderBasicInfo.getOrderCode();
|
||||||
AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderCode);
|
AdapayCallbackRecord adapayCallbackRecord = adapayCallbackRecordService.selectByOrderCode(orderCode);
|
||||||
@@ -2747,9 +2758,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
// 余额支付
|
// 余额支付
|
||||||
balancePayOrder(dto);
|
balancePayOrder(dto);
|
||||||
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
|
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
|
||||||
// 微信支付
|
|
||||||
// dto.setOrderBasicInfo(orderInfo);
|
|
||||||
|
|
||||||
// 2023-07-11 全部改为汇付支付
|
// 2023-07-11 全部改为汇付支付
|
||||||
dto.setGoodsTitle("充电费用");
|
dto.setGoodsTitle("充电费用");
|
||||||
dto.setGoodsDesc("充电桩预付款金额");
|
dto.setGoodsDesc("充电桩预付款金额");
|
||||||
|
|||||||
@@ -339,8 +339,8 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<PileMerchantInfo> queryFirstLevelMerchant() {
|
public List<PileMerchantInfo> queryFirstLevelMerchantList() {
|
||||||
return pileMerchantInfoMapper.queryFirstLevelMerchant();
|
return pileMerchantInfoMapper.queryFirstLevelMerchantList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -407,4 +407,27 @@ public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService {
|
|||||||
return null;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -339,7 +339,7 @@
|
|||||||
</if>
|
</if>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="queryFirstLevelMerchant" resultMap="PileMerchantInfoResult">
|
<select id="queryFirstLevelMerchantList" resultMap="PileMerchantInfoResult">
|
||||||
select
|
select
|
||||||
<include refid="Base_Column_List"/>
|
<include refid="Base_Column_List"/>
|
||||||
from
|
from
|
||||||
|
|||||||
Reference in New Issue
Block a user