diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 1dc6de076..48a1fedbe 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -205,6 +205,111 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { memberTransactionRecordService.insertSelective(record); } + /** + * 余额支付订单逻辑 + * 使用的是通过后管充值的余额 + * 包括赠送金 + */ + @Transactional(rollbackFor = Exception.class) + public void balancePayOrderV2(PayOrderDTO dto) { + logger.info("【{}】-余额支付订单V2start, 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); + // 总余额 + BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount(); + if (totalAccountAmount.compareTo(chargeAmount) < 0) { + // 总余额小于充电金额 + throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); + } + + // 本金支付金额 + BigDecimal principalBalancePay = BigDecimal.ZERO; + // 赠送金支付金额 + BigDecimal giftBalancePay = BigDecimal.ZERO; + // 计算下发金额 + Map stringBigDecimalMap = calculateTheAmount(memberVO); + if (stringBigDecimalMap != null) { + principalBalancePay = stringBigDecimalMap.get("principalBalancePay"); + giftBalancePay = stringBigDecimalMap.get("giftBalancePay"); + } + + // 更新会员钱包 全部金额都用于支付订单 + UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() + .memberId(memberId) + .targetMerchantId(merchantId) + .type(MemberWalletEnum.TYPE_OUT.getValue()) + .subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue()) + .updatePrincipalBalance(principalBalancePay) // 使用本金支付的金额 + .updateGiftBalance(giftBalancePay) // 赠送金额支付 + .relatedOrderCode(orderCode) + .build(); + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + + // 本金支付 + OrderPayRecord principalPayRecord = null; + if (principalBalancePay.compareTo(BigDecimal.ZERO) > 0) { + principalPayRecord = OrderPayRecord.builder() + .orderCode(orderCode) + .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) + .payAmount(principalBalancePay) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .createBy(memberId) + .createTime(DateUtils.getNowDate()) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .build(); + } + + // 赠送金支付 + OrderPayRecord giftPayRecord = null; + if (giftBalancePay.compareTo(BigDecimal.ZERO) > 0) { + giftPayRecord = OrderPayRecord.builder() + .orderCode(orderCode) + .payMode(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()) + .payAmount(giftBalancePay) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .createBy(memberId) + .createTime(DateUtils.getNowDate()) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .build(); + } + + // 记录支订单付流水 记录两条支付 + List payRecordList = Lists.newArrayList(principalPayRecord, giftPayRecord); + 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(memberId) + .actionType(ActionTypeEnum.FORWARD.getValue()) + .payMode(PayModeEnum.PAYMENT_OF_BALANCE.getValue()) + .paymentInstitutions(PaymentInstitutionsEnum.LOCAL_ACCOUNTS.getValue()) + .amount(dto.getPayAmount()) // 单位元 + .build(); + memberTransactionRecordService.insertSelective(record); + } + /** * 在线支付订单 *