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 index ed584c6c1..c46bcb037 100644 --- 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 @@ -326,9 +326,113 @@ public class DelayMerchantOrderLogic extends AbstractOrderLogic { // 会员id String memberId = dto.getMemberId(); // 查询该会员的余额 在所属运营商的余额 - // MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId()); - MemberWalletInfo memberWalletInfo = memberWalletInfoService.selectByMemberId(memberId, merchantId); - BigDecimal totalAccountAmount = memberWalletInfo.getPrincipalBalance(); // 总余额 + MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId(), merchantId); + // MemberWalletInfo memberWalletInfo = memberWalletInfoService.selectByMemberId(memberId, merchantId); + BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount(); // 总余额 + + if (totalAccountAmount.compareTo(chargeAmount) < 0) { + // 总余额小于充电金额 + throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); + } + BigDecimal principalPay = chargeAmount; + + // 更新会员钱包 + UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() + .memberId(memberId) + .targetMerchantId(merchantId) + .type(MemberWalletEnum.TYPE_OUT.getValue()) + .subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue()) + .updatePrincipalBalance(principalPay) // 使用本金支付的金额 + .relatedOrderCode(orderCode) + .build(); + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + + // 查询余额充值有剩余的记录 + List list = calculateTheBalanceDeductionAmount(memberId, chargeAmount); + + // 记录订单支付流水 + BigDecimal payAmt = BigDecimal.ZERO; + List paymentInfos = Lists.newArrayList(); + for (BalanceDeductionAmountVO balanceDeductionAmountVO : list) { + String paymentId = balanceDeductionAmountVO.getPaymentId(); + // 此交易单扣除金额 + BigDecimal deductionAmount = balanceDeductionAmountVO.getDeductionAmount(); + payAmt = payAmt.add(deductionAmount); + + PaymentInfo paymentInfo = new PaymentInfo(); + paymentInfo.setPaymentId(paymentId); + paymentInfo.setAmount(deductionAmount.toString()); + paymentInfos.add(paymentInfo); + } + OrderPayRecord build = OrderPayRecord.builder() + .orderCode(orderCode) + .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) + .payAmount(principalPay) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .deductionRecord(JSON.toJSONString(paymentInfos)) + .createBy(memberId) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .build(); + + // 记录支订单付流水 + List payRecordList = Lists.newArrayList(build); + orderPayRecordService.batchInsert(payRecordList); + + // 把消费金额冻结 + for (OrderPayRecord record : payRecordList) { + List paymentInfoList = parseDeductionRecord(record.getDeductionRecord()); + // 循环冻结金额 + for (PaymentInfo paymentInfo : paymentInfoList) { + String paymentId = paymentInfo.getPaymentId(); + BigDecimal amount = new BigDecimal(paymentInfo.getAmount()); + // 余额支付 临时冻结金额 + 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(memberId) + .actionType(ActionTypeEnum.FORWARD.getValue()) + .payMode(PayModeEnum.PAYMENT_OF_BALANCE.getValue()) + .paymentInstitutions(PaymentInstitutionsEnum.LOCAL_ACCOUNTS.getValue()) + .amount(dto.getPayAmount()) // 单位元 + .build(); + memberTransactionRecordService.insertSelective(record); + } + + /** + * 余额支付订单 + */ + @Transactional(rollbackFor = Exception.class) + public void balancePayOrderV3(PayOrderDTO dto) { + logger.info("【{}】-余额支付订单V3start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto)); + // 订单编号 + String orderCode = dto.getOrderCode(); + // 查订单详情 + OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); + // 订单所属运营商id + String merchantId = orderBasicInfo.getMerchantId(); + // 支付金额 + BigDecimal chargeAmount = dto.getPayAmount(); + // 会员id + String memberId = dto.getMemberId(); + // 查询该会员的余额 在所属运营商的余额 + MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId(), merchantId); + // MemberWalletInfo memberWalletInfo = memberWalletInfoService.selectByMemberId(memberId, merchantId); + BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount(); // 总余额 if (totalAccountAmount.compareTo(chargeAmount) < 0) { // 总余额小于充电金额