交易分账 重构

This commit is contained in:
2023-08-29 15:53:21 +08:00
parent 683c8794d3
commit fd5e13ef1e
3 changed files with 256 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
package com.jsowell.pile.service.orderlogic;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.dto.PayOrderDTO;
import com.jsowell.pile.dto.PayOrderSuccessCallbackDTO;
import com.jsowell.pile.service.IOrderBasicInfoService;
import com.jsowell.pile.vo.web.BalanceDeductionAmountVO;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* 描述订单逻辑
*/
public abstract class AbstractOrderLogic {
@Resource
private IOrderBasicInfoService orderBasicInfoService;
/**
* 余额支付订单
*/
public abstract void balancePayOrder(PayOrderDTO dto);
/**
* 在线支付订单
*/
public abstract Map<String, Object> onlinePaymentOrder(PayOrderDTO dto);
/**
* 白名单支付订单
*/
public abstract void whitelistPaymentOrder(PayOrderDTO dto);
/**
* 订单结算
*/
public abstract void orderSettle(TransactionRecordsData data, OrderBasicInfo orderBasicInfo);
/**
* 余额支付订单退款
*/
public abstract void balancePayOrderRefund(OrderBasicInfo orderBasicInfo);
/**
* 在线支付订单退款
*/
public abstract void onlinePaymentOrderRefund(OrderBasicInfo orderBasicInfo);
/**
* 订单支付成功 支付回调
* 支付成功后掉用这个方法
* 1. 修改订单支付状态
* 2. 发送启动充电指令
*/
protected void payOrderSuccessCallback(PayOrderSuccessCallbackDTO dto) {
orderBasicInfoService.payOrderSuccessCallback(dto);
}
protected List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) {
return orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount);
}
}

View File

@@ -0,0 +1,179 @@
package com.jsowell.pile.service.orderlogic;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists;
import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.core.domain.ykc.TransactionRecordsData;
import com.jsowell.common.enums.AcquirerEnum;
import com.jsowell.common.enums.MemberWalletEnum;
import com.jsowell.common.enums.ykc.*;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.pile.domain.MemberTransactionRecord;
import com.jsowell.pile.domain.OrderBasicInfo;
import com.jsowell.pile.domain.OrderPayRecord;
import com.jsowell.pile.dto.PayOrderDTO;
import com.jsowell.pile.dto.PayOrderSuccessCallbackDTO;
import com.jsowell.pile.service.IMemberBasicInfoService;
import com.jsowell.pile.service.IMemberTransactionRecordService;
import com.jsowell.pile.service.MemberAdapayRecordService;
import com.jsowell.pile.service.OrderPayRecordService;
import com.jsowell.pile.vo.uniapp.MemberVO;
import com.jsowell.pile.vo.web.BalanceDeductionAmountVO;
import com.jsowell.pile.vo.web.UpdateMemberBalanceDTO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* 设置延时分账的运营商订单逻辑
*/
@Service
public class DelayMerchantOrderLogic extends AbstractOrderLogic {
@Autowired
private IMemberBasicInfoService memberBasicInfoService;
@Autowired
private MemberAdapayRecordService memberAdapayRecordService;
@Autowired
private OrderPayRecordService orderPayRecordService;
@Autowired
private IMemberTransactionRecordService memberTransactionRecordService;
@Autowired
private AdapayService adapayService;
/**
* 余额支付订单
*/
@Override
public void balancePayOrder(PayOrderDTO dto) {
String orderCode = dto.getOrderCode(); // 订单编号
BigDecimal chargeAmount = dto.getPayAmount(); // 支付金额
// 查询该会员的余额
MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId());
BigDecimal totalAccountAmount = memberVO.getPrincipalBalance();
if (totalAccountAmount.compareTo(chargeAmount) < 0) {
// 总余额小于充电金额
throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT);
}
BigDecimal principalPay = chargeAmount;
// 更新会员钱包
UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder()
.memberId(dto.getMemberId())
.type(MemberWalletEnum.TYPE_OUT.getValue())
.subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue())
.updatePrincipalBalance(principalPay) // 使用本金支付的金额
.relatedOrderCode(orderCode)
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 查询余额充值有剩余的记录
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(dto.getMemberId(), chargeAmount);
// 记录支订单付流水
List<OrderPayRecord> payRecordList = Lists.newArrayList();
for (BalanceDeductionAmountVO balanceDeductionAmountVO : list) {
String paymentId = balanceDeductionAmountVO.getPaymentId();
BigDecimal deductionAmount = balanceDeductionAmountVO.getDeductionAmount();
JSONObject json = new JSONObject();
json.put("paymentId", paymentId);
json.put("amount", deductionAmount);
// 记录流水
payRecordList.add(OrderPayRecord.builder()
.orderCode(orderCode)
.payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())
.payAmount(deductionAmount)
.acquirer(AcquirerEnum.LOCAL.getValue())
.deductionRecord(json.toJSONString())
.createBy(dto.getMemberId())
.build());
}
// 订单支付流水入库
if (CollectionUtils.isNotEmpty(payRecordList)) {
orderPayRecordService.batchInsert(payRecordList);
for (OrderPayRecord record : payRecordList) {
String deductionRecord = record.getDeductionRecord();
JSONObject jsonObject = JSON.parseObject(deductionRecord);
String paymentId = jsonObject.getString("paymentId");
BigDecimal amount = jsonObject.getBigDecimal("amount");
// 余额支付 临时冻结金额
memberAdapayRecordService.updateFreezeAmount(paymentId, amount);
}
}
// 余额支付可以直接调支付回调方法
PayOrderSuccessCallbackDTO callbackDTO = PayOrderSuccessCallbackDTO.builder()
.orderCode(orderCode)
.payAmount(chargeAmount)
.payMode(dto.getPayMode())
.startMode(dto.getStartMode())
.acquirer(AcquirerEnum.LOCAL.getValue())
.build();
payOrderSuccessCallback(callbackDTO);
// 余额支付订单 记录会员交易流水
MemberTransactionRecord record = MemberTransactionRecord.builder()
.orderCode(orderCode)
.scenarioType(ScenarioEnum.ORDER.getValue())
.memberId(memberVO.getMemberId())
.actionType(ActionTypeEnum.FORWARD.getValue())
.payMode(PayModeEnum.PAYMENT_OF_BALANCE.getValue())
.paymentInstitutions(PaymentInstitutionsEnum.LOCAL_ACCOUNTS.getValue())
.amount(dto.getPayAmount()) // 单位元
.build();
memberTransactionRecordService.insertSelective(record);
}
/**
* 在线支付订单
*/
@Override
public Map<String, Object> onlinePaymentOrder(PayOrderDTO dto) {
// 2023-07-11 全部改为汇付支付
dto.setGoodsTitle("充电费用");
dto.setGoodsDesc("充电桩预付款金额");
Map<String, Object> weixinMap = adapayService.createPayment(dto);
return weixinMap;
}
/**
* 白名单支付订单
*/
@Override
public void whitelistPaymentOrder(PayOrderDTO dto) {
}
/**
* 订单结算
*/
@Override
public void orderSettle(TransactionRecordsData data, OrderBasicInfo orderBasicInfo) {
}
/**
* 余额支付订单退款
*/
@Override
public void balancePayOrderRefund(OrderBasicInfo orderBasicInfo) {
}
/**
* 在线支付订单退款
*/
@Override
public void onlinePaymentOrderRefund(OrderBasicInfo orderBasicInfo) {
}
}

View File

@@ -0,0 +1,12 @@
package com.jsowell.pile.service.orderlogic;
import org.springframework.stereotype.Service;
/**
* 没有设置延时分账的运营商订单逻辑
*/
@Service
public class NotDelayMerchantOrderLogic {
}