启动失败的订单,同时退保险费用

This commit is contained in:
bl\GQS02
2025-09-30 22:35:18 +08:00
parent 84a750b3f7
commit faeb26faaf
5 changed files with 89 additions and 2 deletions

View File

@@ -412,4 +412,7 @@ public class CacheConstants {
* 控制处理未分帐订单频率
*/
public static final String PROCESS_UNSPLIT_ORDERS = "processUnsplitOrders";
// 保险退保
public static final String REFUND_INSURANCE = "REFUND_INSURANCE:";
}

View File

@@ -9,6 +9,8 @@ public enum ScenarioEnum {
BALANCE("balance", "支付余额"),
OCCUPY("occupy", "占桩订单"),
INSURANCE("insurance", "支付保险"),
;
private String value;

View File

@@ -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<String> orderCoderList;
/**
* 退款场景类型 @see{@link ScenarioEnum}
*/
String scenarioType;
}

View File

@@ -73,6 +73,8 @@ public interface OrderBasicInfoService{
*/
List<OrderListVO> selectOrderBasicInfoList(QueryOrderDTO dto);
void refundInsurance(OrderBasicInfo orderBasicInfo);
/**
* 查询充电中的订单,没有数据权限校验,后管不要用
* @param pileSn

View File

@@ -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<AdapayRefundRecord> 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());
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额