From faeb26faaf3d24279b19b1fa70ee4a8329b1bdc9 Mon Sep 17 00:00:00 2001 From: "bl\\GQS02" Date: Tue, 30 Sep 2025 22:35:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=EF=BC=8C=E5=90=8C=E6=97=B6=E9=80=80=E4=BF=9D?= =?UTF-8?q?=E9=99=A9=E8=B4=B9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/CacheConstants.java | 3 + .../common/enums/ykc/ScenarioEnum.java | 2 + .../com/jsowell/pile/dto/ApplyRefundDTO.java | 6 ++ .../pile/service/OrderBasicInfoService.java | 2 + .../impl/OrderBasicInfoServiceImpl.java | 78 ++++++++++++++++++- 5 files changed, 89 insertions(+), 2 deletions(-) diff --git a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java index 6ee645c0d..fb27f89d3 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java +++ b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java @@ -412,4 +412,7 @@ public class CacheConstants { * 控制处理未分帐订单频率 */ public static final String PROCESS_UNSPLIT_ORDERS = "processUnsplitOrders"; + + // 保险退保 + public static final String REFUND_INSURANCE = "REFUND_INSURANCE:"; } diff --git a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ScenarioEnum.java b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ScenarioEnum.java index b48688512..7f6557bf9 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ScenarioEnum.java +++ b/jsowell-common/src/main/java/com/jsowell/common/enums/ykc/ScenarioEnum.java @@ -9,6 +9,8 @@ public enum ScenarioEnum { BALANCE("balance", "支付余额"), OCCUPY("occupy", "占桩订单"), + + INSURANCE("insurance", "支付保险"), ; private String value; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/dto/ApplyRefundDTO.java b/jsowell-pile/src/main/java/com/jsowell/pile/dto/ApplyRefundDTO.java index 8cf570c64..345be4231 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/dto/ApplyRefundDTO.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/dto/ApplyRefundDTO.java @@ -1,5 +1,6 @@ package com.jsowell.pile.dto; +import com.jsowell.common.enums.ykc.ScenarioEnum; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -53,4 +54,9 @@ public class ApplyRefundDTO { private String walletCode; private List orderCoderList; + + /** + * 退款场景类型 @see{@link ScenarioEnum} + */ + String scenarioType; } 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 ba7e944b9..8bd48e0fc 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 @@ -73,6 +73,8 @@ public interface OrderBasicInfoService{ */ List selectOrderBasicInfoList(QueryOrderDTO dto); + void refundInsurance(OrderBasicInfo orderBasicInfo); + /** * 查询充电中的订单,没有数据权限校验,后管不要用 * @param pileSn 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 0bec49a91..5d916a3df 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 @@ -193,6 +193,9 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { @Autowired private OrderSplitRecordService orderSplitRecordService; + @Autowired + private AdapayRefundRecordService adapayRefundRecordService; + @Override public int deleteByPrimaryKey(Integer id) { return orderBasicInfoMapper.deleteByPrimaryKey(id); @@ -616,6 +619,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } catch (Exception e) { logger.error("启动失败退款, orderCode:{}, transactionCode:{}, 执行订单结算逻辑发生异常", orderInfo.getOrderCode(),transactionCode, e); } + + // 退保险金额 + try { + refundInsurance(orderInfo); + } catch (Exception e) { + logger.error("启动失败退款, orderCode:{}, transactionCode:{}, 退保险发生异常", orderInfo.getOrderCode(),transactionCode, e); + } } /** @@ -725,6 +735,65 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } } + /** + * 退保险费,需要退保险调此方法,此方法会调用退款接口 + */ + @Override + public void refundInsurance(OrderBasicInfo orderBasicInfo) { + if (Objects.isNull(orderBasicInfo)) { + return; + } + // 判断该订单是否支付保险 + BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount(); + // 判断保险费是否大于0 + if (insuranceAmount.compareTo(BigDecimal.ZERO) <= 0) { + return; + } + + // redis加锁,一分钟只能调一次 + String redisKey = CacheConstants.REFUND_INSURANCE + orderBasicInfo.getOrderCode(); + Boolean setnx = redisCache.setnx(redisKey, Constants.ONE, 60); + if (!setnx) { + logger.info("订单号:{}, 退保险一分钟只能调一次", orderBasicInfo.getOrderCode()); + return; + } + + // 判断是否已经退过保险费 + 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; + } + } + } + + // 退保险 + ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO(); + applyRefundDTO.setOrderCode(orderBasicInfo.getOrderCode()); + applyRefundDTO.setRefundType(Constants.ONE); + applyRefundDTO.setRefundAmount(insuranceAmount); + applyRefundDTO.setMemberId(orderBasicInfo.getMemberId()); + applyRefundDTO.setScenarioType(ScenarioEnum.INSURANCE.getValue()); + + // 汇付退款需要一级运营商的小程序appId, 否则会退款失败 + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); + if (StringUtils.isNotBlank(wechatAppId)) { + applyRefundDTO.setWechatAppId(wechatAppId); + } + + this.refundOrderWithAdapay(applyRefundDTO); + } + /** * 查询充电中的订单,没有数据权限校验,后管不要用 * @@ -3842,6 +3911,11 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_CALLBACK_RECORD_ERROR); } + String scenarioType = ScenarioEnum.ORDER.getValue(); + if (StringUtils.isNotBlank(dto.getScenarioType())) { + scenarioType = dto.getScenarioType(); + } + String paymentId = callbackRecord.getPaymentId(); // 判断支付金额和退款金额 BigDecimal refundAmount = dto.getRefundAmount(); @@ -3863,7 +3937,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { operation.setReverseAmt(refundAmount); operation.setMerchantKey(dto.getWechatAppId()); operation.setMemberId(dto.getMemberId()); - operation.setScenarioType(ScenarioEnum.ORDER.getValue()); + operation.setScenarioType(scenarioType); operation.setOrderCode(dto.getOrderCode()); PaymentReverseResponse response = adapayService.createPaymentReverseRequest(operation); if (response != null && response.isNotFailed()) { @@ -3877,7 +3951,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } else { // 实时分账的调退款接口 RefundResponse refundRequest = adapayService.createRefundRequest(paymentId, refundAmount, - dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(), dto.getOrderCode()); + dto.getWechatAppId(), dto.getMemberId(), scenarioType, dto.getOrderCode()); if (refundRequest != null && refundRequest.isNotFailed()) { refundAmt = new BigDecimal(refundRequest.getRefund_amt()); // 更新此笔交易单的消费金额 = 支付金额 - 撤销金额