mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-22 03:55:17 +08:00
启动失败的订单,同时退保险费用
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -73,6 +73,8 @@ public interface OrderBasicInfoService{
|
||||
*/
|
||||
List<OrderListVO> selectOrderBasicInfoList(QueryOrderDTO dto);
|
||||
|
||||
void refundInsurance(OrderBasicInfo orderBasicInfo);
|
||||
|
||||
/**
|
||||
* 查询充电中的订单,没有数据权限校验,后管不要用
|
||||
* @param pileSn
|
||||
|
||||
@@ -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());
|
||||
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额
|
||||
|
||||
Reference in New Issue
Block a user