diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java new file mode 100644 index 000000000..a92472d8e --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java @@ -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 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 calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) { + return orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount); + } +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java new file mode 100644 index 000000000..539745e51 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java @@ -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 list = calculateTheBalanceDeductionAmount(dto.getMemberId(), chargeAmount); + // 记录支订单付流水 + List 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 onlinePaymentOrder(PayOrderDTO dto) { + // 2023-07-11 全部改为汇付支付 + dto.setGoodsTitle("充电费用"); + dto.setGoodsDesc("充电桩预付款金额"); + Map 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) { + + } +} diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java new file mode 100644 index 000000000..e8625d703 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java @@ -0,0 +1,12 @@ +package com.jsowell.pile.service.orderlogic; + +import org.springframework.stereotype.Service; + +/** + * 没有设置延时分账的运营商订单逻辑 + */ +@Service +public class NotDelayMerchantOrderLogic { + + +}