mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-06-12 19:29:52 +08:00
交易分账 重构
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.jsowell.pile.service.orderlogic;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 没有设置延时分账的运营商订单逻辑
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class NotDelayMerchantOrderLogic {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user