交易分账 重构

This commit is contained in:
2023-08-28 17:05:39 +08:00
parent 2f1900e65b
commit e435d3b379
2 changed files with 75 additions and 4 deletions

View File

@@ -5,6 +5,7 @@ import com.jsowell.common.constant.CacheConstants;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.vo.AuthorizedDeptVO;
import com.jsowell.common.core.redis.RedisCache;
import com.jsowell.common.enums.MemberWalletEnum;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.SecurityUtils;
import com.jsowell.common.util.StringUtils;
@@ -183,7 +184,7 @@ public class MemberBasicInfoServiceImpl implements IMemberBasicInfoService {
// 更新本金金额
if (updatePrincipalBalance != null) {
if (StringUtils.equals(dto.getType(), "2")) {
if (StringUtils.equals(dto.getType(), MemberWalletEnum.TYPE_OUT.getValue())) {
// 扣款 转为负数
updatePrincipalBalance = updatePrincipalBalance.negate();
}
@@ -210,7 +211,7 @@ public class MemberBasicInfoServiceImpl implements IMemberBasicInfoService {
// 更新赠送金额
if (updateGiftBalance != null) {
if (StringUtils.equals(dto.getType(), "2")) {
if (StringUtils.equals(dto.getType(), MemberWalletEnum.TYPE_OUT.getValue())) {
// 扣款 转为负数
updateGiftBalance = updateGiftBalance.negate();
}

View File

@@ -2775,7 +2775,8 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
Map<String, Object> resultMap = Maps.newHashMap();
if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) {
// 余额支付
balancePayOrder(dto);
// balancePayOrder(dto);
balancePayOrderV2(dto);
} else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) {
// 2023-07-11 全部改为汇付支付
dto.setGoodsTitle("充电费用");
@@ -2995,7 +2996,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 余额支付订单逻辑
*
* 去除赠送金额相关的代码
* @param dto
*/
private void balancePayOrder(PayOrderDTO dto) {
@@ -3090,6 +3091,75 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
}
private void balancePayOrderV2(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) {
JSONObject json = new JSONObject();
json.put("paymentId", balanceDeductionAmountVO.getPaymentId());
json.put("amount", balanceDeductionAmountVO.getDeductionAmount());
// 记录流水
payRecordList.add(OrderPayRecord.builder()
.orderCode(orderCode)
.payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())
.payAmount(balanceDeductionAmountVO.getDeductionAmount())
.acquirer(AcquirerEnum.LOCAL.getValue())
.deductionRecord(json.toJSONString())
.createBy(dto.getMemberId())
.build());
}
// 订单支付流水入库
if (CollectionUtils.isNotEmpty(payRecordList)) {
orderPayRecordService.batchInsert(payRecordList);
}
// 余额支付可以直接调支付回调方法
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);
}
/**
* 校验充电桩相关的信息
*