From 9eb9d443484903389418b04df76d9422bf8f1e89 Mon Sep 17 00:00:00 2001 From: Lemon Date: Fri, 13 Mar 2026 09:51:47 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E9=80=80=E6=AC=BE=E6=97=B6=E5=B0=86?= =?UTF-8?q?=E4=BF=9D=E9=99=A9=E9=87=91=E9=A2=9D=E4=B8=8E=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E9=87=91=E9=A2=9D=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pile/service/OrderBasicInfoService.java | 2 + .../impl/OrderBasicInfoServiceImpl.java | 37 +++++++++++++++++++ .../DelayMerchantProgramLogic.java | 26 +++++++++++-- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index b9789c4d8..496903511 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -77,6 +77,8 @@ public interface OrderBasicInfoService{ */ List selectOrderBasicInfoList(QueryOrderDTO dto); + boolean checkRefundInsuranceAmount(OrderBasicInfo orderBasicInfo); + void refundInsurance(OrderBasicInfo orderBasicInfo); /** 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 ab7bdfe34..9127d43cf 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 @@ -798,6 +798,43 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } } + /** + * 判断是否退款保险金额 + * @return + */ + @Override + public boolean checkRefundInsuranceAmount(OrderBasicInfo orderBasicInfo) { + if (Objects.isNull(orderBasicInfo)) { + return false; + } + // 判断该订单是否支付保险 + BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount(); + // 判断保险费是否大于0 + if (insuranceAmount.compareTo(BigDecimal.ZERO) <= 0) { + return false; + } + + // 判断是否已经退过保险费 + AdapayRefundRecord entry = new AdapayRefundRecord(); + entry.setOrderCode(orderBasicInfo.getOrderCode()); + List adapayRefundRecords = adapayRefundRecordService.selectAdapayRefundRecordList(entry); + if (CollectionUtils.isNotEmpty(adapayRefundRecords)) { + for (AdapayRefundRecord adapayRefundRecord : adapayRefundRecords) { + String reason = adapayRefundRecord.getReason(); + // reason转为json + JSONObject jsonObject = JSONObject.parseObject(reason); + // 取scenarioType + String scenarioType = jsonObject.getString("scenarioType"); + if (StringUtils.equals(scenarioType, ScenarioEnum.INSURANCE.getValue())) { + // 退过保险 + logger.info("订单号:{}已经退过保险,请勿重复退保险", orderBasicInfo.getOrderCode()); + return false; + } + } + } + return true; + } + /** * 退保险费,需要退保险调此方法,此方法会调用退款接口 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index c64c7b1df..b6950c2ca 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -1098,12 +1098,24 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { .updateGiftBalance(returnGift) .relatedOrderCode(orderCode) .build(); - memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); // 判断消费金额,如果消费金额 - 折扣金额小于 1 元,则将保险费也进行退回 if (orderBasicInfo.getOrderAmount().subtract(orderBasicInfo.getDiscountAmount()).compareTo(BigDecimal.ONE) < 0) { - orderBasicInfoService.refundInsurance(orderBasicInfo); + // orderBasicInfoService.refundInsurance(orderBasicInfo); + // 判断是否需要退保险费用 + boolean checkResult = orderBasicInfoService.checkRefundInsuranceAmount(orderBasicInfo); + if (checkResult) { + // 退保险, 计算退保金额 + Map refundMap = calculateBalanceRefund(principalPay, giftPay, orderBasicInfo.getOrderAmount(), orderBasicInfo.getDiscountAmount(), insuranceAmount); + BigDecimal returnPrincipalForInsurance = refundMap.get("returnPrincipalForInsurance"); + BigDecimal returnGiftForInsurance = refundMap.get("returnGiftForInsurance"); + + updateMemberBalanceDTO.setUpdatePrincipalBalance(returnPrincipal.add(returnPrincipalForInsurance)); + updateMemberBalanceDTO.setUpdateGiftBalance(returnGift.add(returnGiftForInsurance)); + } } + // 统一退款 + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); // 更新order_pay_record, 解冻部分 // List> list = calculateUnfreezeAmount(orderAmount, payRecordList); @@ -1150,13 +1162,19 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { if (StringUtils.isNotBlank(wechatAppId)) { applyRefundDTO.setWechatAppId(wechatAppId); } - this.refundOrderWithAdapay(applyRefundDTO); // 判断消费金额,如果消费金额 - 折扣金额小于 1 元,则将保险费也进行退回 if (orderBasicInfo.getOrderAmount().subtract(orderBasicInfo.getDiscountAmount()).compareTo(BigDecimal.ONE) < 0) { - orderBasicInfoService.refundInsurance(orderBasicInfo); + // orderBasicInfoService.refundInsurance(orderBasicInfo); + // 判断是否需要退款保险金额 + boolean checkResult = orderBasicInfoService.checkRefundInsuranceAmount(orderBasicInfo); + if (checkResult) { + // 退款保险,将保险金额进行合并 + applyRefundDTO.setRefundAmount(refundAmount.add(orderBasicInfo.getInsuranceAmount())); + } } + this.refundOrderWithAdapay(applyRefundDTO); } /**