From fc70b95587de7f90221e0ff4e341d26f9afbaf5b Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Mon, 28 Aug 2023 11:53:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A4=E6=98=93=E5=88=86=E8=B4=A6=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/OrderBasicInfoServiceImpl.java | 210 ++++++++++-------- 1 file changed, 115 insertions(+), 95 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index bfd325a9e..92526d326 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -232,7 +232,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { return orderListVOS; } - private void tempUpdateVirtualAmount(OrderListVO orderListVO) { + /*private void tempUpdateVirtualAmount(OrderListVO orderListVO) { if (orderListVO.getVirtualAmount() != null) { return; } @@ -252,10 +252,10 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { if (orderAmount.compareTo(BigDecimal.ZERO) > 0) { if (StringUtils.equals(orderListVO.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) { - /* + *//* 余额支付 查询支付记录,如全部用本金支付,则虚拟金额为0,结算金额为订单消费金额, 如果使用了赠送金额,虚拟金额为赠送金额支付部分,结算金额=订单消费金额-虚拟金额消费部分 - */ + *//* // 查询支付记录 List orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderListVO.getOrderCode()); for (OrderPayRecord orderPayRecord : orderPayRecordList) { @@ -275,9 +275,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } } } else { - /* + *//* 微信支付 虚拟金额为0 结算金额等于订单消费金额 - */ + *//* settleAmount = orderAmount; } } @@ -290,7 +290,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { .settleAmount(settleAmount) .build(); updateOrderBasicInfo(build); - } + }*/ /** * 通过订单状态和支付状态 转换订单状态描述 @@ -562,6 +562,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { return orderBasicInfoMapper.updateOrderDetail(orderDetail); } + /** + * 清除订单缓存 订单编号或交易流水号 任意传一个 + * @param orderCode 订单编号 + * @param transactionCode 交易流水号 + */ @Override public void cleanCacheByOrderCode(String orderCode, String transactionCode) { logger.debug("清除订单缓存 orderCode:{}, transactionCode:{}", orderCode, transactionCode); @@ -766,20 +771,23 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } OrderSettleResult orderSettleResult = null; - // if (StringUtils.equals(delayMode, Constants.ADAPAY_PAY_MODE_DELAY)) { - // // 延迟商家订单处理逻辑 - // orderSettleResult = delayMerchantOrderProcessingLogic(orderBasicInfo, adapayMemberAccount, appId); - // } else { - // // 不延迟商家订单处理逻辑 不使用延时分账的汇付商户,钱已经到基本账户中了,只需要退款就可以 - // orderSettleResult = notDelayMerchantOrderProcessingLogic(orderBasicInfo, adapayMemberAccount, appId); - // } // 退款逻辑/需要退款的情况 BigDecimal residue = orderBasicInfo.getRefundAmount(); if (residue.compareTo(BigDecimal.ZERO) > 0) { // 执行退款逻辑 try { - refundOrder(orderBasicInfo, residue); + String payMode = orderBasicInfo.getPayMode(); + if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) { + // 余额支付 + balancePaymentOrderRefund(orderBasicInfo); + } else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { + // 微信支付 + onlinePaymentOrderRefund(orderBasicInfo); + } else { + // 白名单支付 + logger.info("订单:{}使用白名单支付,不进行退款处理", orderBasicInfo.getOrderCode()); + } } catch (Exception e) { logger.error("订单退款逻辑异常orderCode:{}", orderBasicInfo.getOrderCode(), e); } @@ -817,7 +825,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 订单支付记录,保存一下消费记录 deduction_record List orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); - + if (CollectionUtils.isNotEmpty(orderPayRecordList)) { + // + } } private AdapayCallbackRecord selectAdapayCallbackRecord(String orderCode) { @@ -1021,12 +1031,54 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } /** - * 订单退款逻辑 - * - * @param orderBasicInfo 订单信息 - * @param residue 需退款金额 + * 在线支付的订单退款 */ - private void refundOrder(OrderBasicInfo orderBasicInfo, BigDecimal residue) { + private void onlinePaymentOrderRefund(OrderBasicInfo orderBasicInfo) { + // 订单编号 + String orderCode = orderBasicInfo.getOrderCode(); + // 订单消费金额 + BigDecimal orderAmount = orderBasicInfo.getOrderAmount(); + // 查支付记录 + List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); + // 需要退款的金额 + BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); + + // 微信退款逻辑 + ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO(); + applyRefundDTO.setOrderCode(orderCode); + applyRefundDTO.setRefundType(Constants.ONE); + applyRefundDTO.setRefundAmount(refundAmount); + + // 查到该笔订单付款金额到哪里了 + MemberTransactionRecord transactionRecord = memberTransactionRecordService.selectByOrderCode(orderCode, ActionTypeEnum.FORWARD.getValue()); + logger.info("查到该笔订单付款金额到哪里了:{}", JSON.toJSONString(transactionRecord)); + if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.WECHAT_PAY.getValue())) { + this.weChatRefund(applyRefundDTO); + } else if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.ADAPAY.getValue())) { + // 汇付退款需要一级运营商的小程序appId, 否则会退款失败 + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); + if (StringUtils.isNotBlank(wechatAppId)) { + applyRefundDTO.setWechatAppId(wechatAppId); + } + this.refundOrderWithAdapay(applyRefundDTO); + } + + // 更新订单支付记录 + List updatePayRecordList = Lists.newArrayList(); + OrderPayRecord orderPayRecord = payRecordList.get(0); + orderPayRecord.setRefundAmount(refundAmount); + updatePayRecordList.add(orderPayRecord); + + // 更新order_pay_record + if (CollectionUtils.isNotEmpty(updatePayRecordList)) { + orderPayRecordService.updateBatch(updatePayRecordList); + } + } + + /** + * 余额支付的订单退款 + */ + private void balancePaymentOrderRefund(OrderBasicInfo orderBasicInfo) { // 订单编号 String orderCode = orderBasicInfo.getOrderCode(); // 订单消费金额 @@ -1035,84 +1087,52 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); // 更新订单支付记录 List updatePayRecordList = Lists.newArrayList(); - // 根据支付方式不同,走不同渠道退款 - String payMode = orderBasicInfo.getPayMode(); - if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) { // 余额支付 - Map payRecordMap = payRecordList.stream() - .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); - // 取出本金支付金额,赠送支付金额 - BigDecimal principalPay = null; - BigDecimal giftPay = null; - OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE); - if (principalPayRecord != null) { - principalPay = principalPayRecord.getPayAmount(); - } + Map payRecordMap = payRecordList.stream() + .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); + // 取出本金支付金额,赠送支付金额 + BigDecimal principalPay = null; + BigDecimal giftPay = null; - OrderPayRecord giftPayRecord = payRecordMap.get(Constants.TWO); - if (giftPayRecord != null) { - giftPay = giftPayRecord.getPayAmount(); - } - - Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount); - logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", - orderCode, orderAmount, principalPay, giftPay, JSONObject.toJSONString(returnAmountMap)); - // 更新会员钱包 - BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); - if (returnPrincipal != null && principalPayRecord != null) { - principalPayRecord.setRefundAmount(returnPrincipal); - updatePayRecordList.add(principalPayRecord); - } - BigDecimal returnGift = returnAmountMap.get("returnGift"); - if (returnGift != null && giftPayRecord != null) { - giftPayRecord.setRefundAmount(returnGift); - updatePayRecordList.add(giftPayRecord); - // 支付的赠送金额-退回的赠送金额 = 实际使用赠送金额消费的部分 - // virtualAmount = giftPay.subtract(returnGift); - } - UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() - .memberId(orderBasicInfo.getMemberId()) - .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 - .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 - .updatePrincipalBalance(returnPrincipal) - .updateGiftBalance(returnGift) - .relatedOrderCode(orderCode) - .build(); - memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); - } else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { // 微信支付 - // 微信退款逻辑 - ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO(); - applyRefundDTO.setOrderCode(orderCode); - applyRefundDTO.setRefundType(Constants.ONE); - applyRefundDTO.setRefundAmount(residue); - - // 查到该笔订单付款金额到哪里了 - MemberTransactionRecord transactionRecord = memberTransactionRecordService.selectByOrderCode(orderCode, ActionTypeEnum.FORWARD.getValue()); - logger.info("查到该笔订单付款金额到哪里了:{}", JSON.toJSONString(transactionRecord)); - if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.WECHAT_PAY.getValue())) { - this.weChatRefund(applyRefundDTO); - } else if (StringUtils.equals(transactionRecord.getPaymentInstitutions(), PaymentInstitutionsEnum.ADAPAY.getValue())) { - // 汇付退款需要一级运营商的小程序appId, 否则会退款失败 - String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); - if (StringUtils.isNotBlank(wechatAppId)) { - applyRefundDTO.setWechatAppId(wechatAppId); - } - this.refundOrderWithAdapay(applyRefundDTO); - } - // 订单支付记录 - OrderPayRecord orderPayRecord = payRecordList.get(0); - orderPayRecord.setRefundAmount(residue); - updatePayRecordList.add(orderPayRecord); - } else { - // 白名单支付 - logger.info("订单:{}使用白名单支付,不进行退款处理", orderCode); + OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE); + if (principalPayRecord != null) { + principalPay = principalPayRecord.getPayAmount(); } + OrderPayRecord giftPayRecord = payRecordMap.get(Constants.TWO); + if (giftPayRecord != null) { + giftPay = giftPayRecord.getPayAmount(); + } + + Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount); + logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", + orderCode, orderAmount, principalPay, giftPay, JSONObject.toJSONString(returnAmountMap)); + // 更新会员钱包 + BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); + if (returnPrincipal != null && principalPayRecord != null) { + principalPayRecord.setRefundAmount(returnPrincipal); + updatePayRecordList.add(principalPayRecord); + } + BigDecimal returnGift = returnAmountMap.get("returnGift"); + if (returnGift != null && giftPayRecord != null) { + giftPayRecord.setRefundAmount(returnGift); + updatePayRecordList.add(giftPayRecord); + // 支付的赠送金额-退回的赠送金额 = 实际使用赠送金额消费的部分 + // virtualAmount = giftPay.subtract(returnGift); + } + UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() + .memberId(orderBasicInfo.getMemberId()) + .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 + .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 + .updatePrincipalBalance(returnPrincipal) + .updateGiftBalance(returnGift) + .relatedOrderCode(orderCode) + .build(); + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + // 更新order_pay_record if (CollectionUtils.isNotEmpty(updatePayRecordList)) { - for (OrderPayRecord orderPayRecord : updatePayRecordList) { - orderPayRecordService.updateByPrimaryKeySelective(orderPayRecord); - } + orderPayRecordService.updateBatch(updatePayRecordList); } } @@ -1471,9 +1491,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { /** * 余额支付 计算需要退回的金额 * - * @param principalPay - * @param giftPay - * @param orderAmount + * @param principalPay 本金支付金额 + * @param giftPay 赠送金额支付的金额 + * @param orderAmount 订单消费金额 * @return */ private Map calculateReturnAmount(BigDecimal principalPay, BigDecimal giftPay, BigDecimal orderAmount) {