优化清分账单逻辑

This commit is contained in:
2023-09-21 11:36:24 +08:00
parent a3826b6375
commit b061442497
5 changed files with 624 additions and 27 deletions

View File

@@ -2,7 +2,6 @@ package com.jsowell.pile.mapper;
import com.jsowell.pile.domain.ClearingBillInfo;
import com.jsowell.pile.dto.GetClearingBillDTO;
import com.jsowell.pile.vo.web.ClearingBillVO;
import com.jsowell.pile.vo.web.MerchantClearingBillVO;
import org.apache.ibatis.annotations.Param;
@@ -25,6 +24,10 @@ public interface ClearingBillInfoMapper {
*/
int insert(ClearingBillInfo record);
int insertOrUpdate(ClearingBillInfo record);
int insertOrUpdateSelective(ClearingBillInfo record);
/**
* insert record to table selective
*
@@ -57,12 +60,19 @@ public interface ClearingBillInfoMapper {
*/
int updateByPrimaryKey(ClearingBillInfo record);
int updateBatch(List<ClearingBillInfo> list);
int updateBatchSelective(List<ClearingBillInfo> list);
int batchInsert(@Param("list") List<ClearingBillInfo> list);
List<ClearingBillInfo> selectByMerchantId(@Param("merchantId") String merchantId, @Param("billStatus") String billStatus);
void updateStatus(@Param("clearingBillIds") List<Integer> clearingBillIds, @Param("billStatus") String billStatus);
/**
* 后管用 查询运营商账单列表
*
* @param dto
* @return
*/

View File

@@ -6,7 +6,7 @@ import com.jsowell.pile.vo.web.MerchantClearingBillVO;
import java.util.List;
public interface ClearingBillInfoService{
public interface ClearingBillInfoService {
int deleteByPrimaryKey(Integer id);
@@ -27,8 +27,20 @@ public interface ClearingBillInfoService{
/**
* 后管用 查询运营商账单列表
*
* @param dto
* @return
*/
List<MerchantClearingBillVO> getMerchantClearingBillList(GetClearingBillDTO dto);
int insertOrUpdate(ClearingBillInfo record);
int insertOrUpdateSelective(ClearingBillInfo record);
int updateBatch(List<ClearingBillInfo> list);
int updateBatchSelective(List<ClearingBillInfo> list);
int batchInsert(List<ClearingBillInfo> list);
}

View File

@@ -13,7 +13,7 @@ import javax.annotation.Resource;
import java.util.List;
@Service
public class ClearingBillInfoServiceImpl implements ClearingBillInfoService{
public class ClearingBillInfoServiceImpl implements ClearingBillInfoService {
@Resource
private ClearingBillInfoMapper clearingBillInfoMapper;
@@ -63,6 +63,7 @@ public class ClearingBillInfoServiceImpl implements ClearingBillInfoService{
/**
* 后管用 查询运营商账单列表
*
* @param dto
* @return
*/
@@ -71,4 +72,29 @@ public class ClearingBillInfoServiceImpl implements ClearingBillInfoService{
return clearingBillInfoMapper.getMerchantClearingBillList(dto);
}
@Override
public int insertOrUpdate(ClearingBillInfo record) {
return clearingBillInfoMapper.insertOrUpdate(record);
}
@Override
public int insertOrUpdateSelective(ClearingBillInfo record) {
return clearingBillInfoMapper.insertOrUpdateSelective(record);
}
@Override
public int updateBatch(List<ClearingBillInfo> list) {
return clearingBillInfoMapper.updateBatch(list);
}
@Override
public int updateBatchSelective(List<ClearingBillInfo> list) {
return clearingBillInfoMapper.updateBatchSelective(list);
}
@Override
public int batchInsert(List<ClearingBillInfo> list) {
return clearingBillInfoMapper.batchInsert(list);
}
}

View File

@@ -1465,27 +1465,34 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况
List<BalanceDeductionAmountVO> list = calculateSplitTheBillAmount(orderBasicInfo.getMemberId(), settleAmount);
for (BalanceDeductionAmountVO vo : list) {
String paymentId = vo.getPaymentId();
BigDecimal deductionAmount = vo.getDeductionAmount();
List<String> collect = list.stream().map(BalanceDeductionAmountVO::getPaymentId).collect(Collectors.toList());
// 校验是否分账
OrderSettleResult result = verifyOrderConfirmAmount(collect, orderCode, settleAmount, wechatAppId);
if (!AdapayStatusEnum.SUCCEEDED.getValue().equals(result.getStatus())) {
// 没有分账,执行分账逻辑
for (BalanceDeductionAmountVO vo : list) {
String paymentId = vo.getPaymentId();
BigDecimal deductionAmount = vo.getDeductionAmount();
// 延时分账使用确认交易API
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId,
adapayMemberAccount, deductionAmount, orderCode, wechatAppId);
// 延时分账使用确认交易API
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId,
adapayMemberAccount, deductionAmount, orderCode, wechatAppId);
if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) {
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirm_amt()));
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
status = paymentConfirmResponse.getStatus();
memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, confirmAmt, confirmAmt);
if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) {
confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirm_amt()));
feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt()));
status = paymentConfirmResponse.getStatus();
memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, confirmAmt, confirmAmt);
}
}
// 分账接口返回的信息
result = new OrderSettleResult();
result.setConfirmAmt(confirmAmt.toString());
result.setStatus(status);
result.setFeeAmt(feeAmt.toString());
}
// 分账接口返回的信息
OrderSettleResult result = new OrderSettleResult();
result.setConfirmAmt(confirmAmt.toString());
result.setStatus(status);
result.setFeeAmt(feeAmt.toString());
return result;
}
@@ -1592,15 +1599,69 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 订单结算金额
BigDecimal settleAmount = orderBasicInfo.getSettleAmount();
// 调汇付的分账接口 确认交易
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId,
adapayMemberAccount, settleAmount, orderCode, wechatAppId);
OrderSettleResult result = verifyOrderConfirmAmount(Lists.newArrayList(paymentId), orderCode, settleAmount, wechatAppId);
// 校验订单是否分账 状态为非交易完成的时候,进行分账处理
if (!AdapayStatusEnum.SUCCEEDED.getValue().equals(result.getStatus())) {
// 调汇付的分账接口 确认交易
PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId,
adapayMemberAccount, settleAmount, orderCode, wechatAppId);
// 分账接口返回的信息
result = new OrderSettleResult();
result.setConfirmAmt(paymentConfirmResponse.getConfirm_amt());
result.setStatus(paymentConfirmResponse.getStatus());
result.setFeeAmt(paymentConfirmResponse.getFee_amt());
}
return result;
}
/**
* 校验订单分账金额
* @param paymentIds 支付id集合
* @param orderCode 订单编号
* @param settleAmount 结算金额
*/
private OrderSettleResult verifyOrderConfirmAmount(List<String> paymentIds, String orderCode, BigDecimal settleAmount, String wechatAppId) {
// 分账金额
BigDecimal confirmAmt = BigDecimal.ZERO;
// 手续费
BigDecimal feeAmt = BigDecimal.ZERO;
// 通过支付id查询分账情况
for (String paymentId : paymentIds) {
QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO();
dto.setPaymentId(paymentId);
dto.setWechatAppId(wechatAppId);
QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto);
if (response != null) {
List<QueryPaymentConfirmDetailResponse.PaymentConfirmInfo> confirms = response.getPaymentConfirms();
if (CollectionUtils.isNotEmpty(confirms)) {
for (QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm : confirms) {
JSONObject jsonObject = JSON.parseObject(confirm.getDescription());
if (StringUtils.equals(jsonObject.getString("orderCode"), orderCode)) {
// 订单号对的上,累计分账金额
confirmAmt = confirmAmt.add(new BigDecimal(confirm.getConfirmAmt()));
feeAmt = feeAmt.add(new BigDecimal(confirm.getFeeAmt()));
}
}
}
}
}
// 分账接口返回的信息
OrderSettleResult result = new OrderSettleResult();
result.setConfirmAmt(paymentConfirmResponse.getConfirm_amt());
result.setStatus(paymentConfirmResponse.getStatus());
result.setFeeAmt(paymentConfirmResponse.getFee_amt());
result.setOrderCode(orderCode);
result.setSettleAmt(settleAmount.toString());
result.setConfirmAmt(confirmAmt.toString());
result.setFeeAmt(feeAmt.toString());
String status;
// 如果确认金额和结算金额相等返回succeeded其他情况返回PENDING
if (settleAmount.compareTo(confirmAmt) >= 0) {
// 返回succeeded 标识该笔订单已经完成了分账,不要再次执行分账
status = AdapayStatusEnum.SUCCEEDED.getValue();
} else {
status = AdapayStatusEnum.PENDING.getValue();
}
result.setStatus(status);
return result;
}