@@ -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 ( S cenarioEnum . ORDER . getValue ( ) ) ;
operation . setScenarioType ( s cenarioType ) ;
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 ( ) , S cenarioEnum . ORDER . getValue ( ) , dto . getOrderCode ( ) ) ;
dto . getWechatAppId ( ) , dto . getMemberId ( ) , s cenarioType , dto . getOrderCode ( ) ) ;
if ( refundRequest ! = null & & refundRequest . isNotFailed ( ) ) {
refundAmt = new BigDecimal ( refundRequest . getRefund_amt ( ) ) ;
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额