mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-05-14 23:08:35 +08:00
启动失败的订单,同时退保险费用
This commit is contained in:
@@ -412,4 +412,7 @@ public class CacheConstants {
|
|||||||
* 控制处理未分帐订单频率
|
* 控制处理未分帐订单频率
|
||||||
*/
|
*/
|
||||||
public static final String PROCESS_UNSPLIT_ORDERS = "processUnsplitOrders";
|
public static final String PROCESS_UNSPLIT_ORDERS = "processUnsplitOrders";
|
||||||
|
|
||||||
|
// 保险退保
|
||||||
|
public static final String REFUND_INSURANCE = "REFUND_INSURANCE:";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ public enum ScenarioEnum {
|
|||||||
BALANCE("balance", "支付余额"),
|
BALANCE("balance", "支付余额"),
|
||||||
|
|
||||||
OCCUPY("occupy", "占桩订单"),
|
OCCUPY("occupy", "占桩订单"),
|
||||||
|
|
||||||
|
INSURANCE("insurance", "支付保险"),
|
||||||
;
|
;
|
||||||
|
|
||||||
private String value;
|
private String value;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.jsowell.pile.dto;
|
package com.jsowell.pile.dto;
|
||||||
|
|
||||||
|
import com.jsowell.common.enums.ykc.ScenarioEnum;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -53,4 +54,9 @@ public class ApplyRefundDTO {
|
|||||||
private String walletCode;
|
private String walletCode;
|
||||||
|
|
||||||
private List<String> orderCoderList;
|
private List<String> orderCoderList;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 退款场景类型 @see{@link ScenarioEnum}
|
||||||
|
*/
|
||||||
|
String scenarioType;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,8 @@ public interface OrderBasicInfoService{
|
|||||||
*/
|
*/
|
||||||
List<OrderListVO> selectOrderBasicInfoList(QueryOrderDTO dto);
|
List<OrderListVO> selectOrderBasicInfoList(QueryOrderDTO dto);
|
||||||
|
|
||||||
|
void refundInsurance(OrderBasicInfo orderBasicInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询充电中的订单,没有数据权限校验,后管不要用
|
* 查询充电中的订单,没有数据权限校验,后管不要用
|
||||||
* @param pileSn
|
* @param pileSn
|
||||||
|
|||||||
@@ -193,6 +193,9 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OrderSplitRecordService orderSplitRecordService;
|
private OrderSplitRecordService orderSplitRecordService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AdapayRefundRecordService adapayRefundRecordService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int deleteByPrimaryKey(Integer id) {
|
public int deleteByPrimaryKey(Integer id) {
|
||||||
return orderBasicInfoMapper.deleteByPrimaryKey(id);
|
return orderBasicInfoMapper.deleteByPrimaryKey(id);
|
||||||
@@ -616,6 +619,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("启动失败退款, orderCode:{}, transactionCode:{}, 执行订单结算逻辑发生异常", orderInfo.getOrderCode(),transactionCode, 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);
|
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();
|
String paymentId = callbackRecord.getPaymentId();
|
||||||
// 判断支付金额和退款金额
|
// 判断支付金额和退款金额
|
||||||
BigDecimal refundAmount = dto.getRefundAmount();
|
BigDecimal refundAmount = dto.getRefundAmount();
|
||||||
@@ -3863,7 +3937,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
|||||||
operation.setReverseAmt(refundAmount);
|
operation.setReverseAmt(refundAmount);
|
||||||
operation.setMerchantKey(dto.getWechatAppId());
|
operation.setMerchantKey(dto.getWechatAppId());
|
||||||
operation.setMemberId(dto.getMemberId());
|
operation.setMemberId(dto.getMemberId());
|
||||||
operation.setScenarioType(ScenarioEnum.ORDER.getValue());
|
operation.setScenarioType(scenarioType);
|
||||||
operation.setOrderCode(dto.getOrderCode());
|
operation.setOrderCode(dto.getOrderCode());
|
||||||
PaymentReverseResponse response = adapayService.createPaymentReverseRequest(operation);
|
PaymentReverseResponse response = adapayService.createPaymentReverseRequest(operation);
|
||||||
if (response != null && response.isNotFailed()) {
|
if (response != null && response.isNotFailed()) {
|
||||||
@@ -3877,7 +3951,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
|
|||||||
} else {
|
} else {
|
||||||
// 实时分账的调退款接口
|
// 实时分账的调退款接口
|
||||||
RefundResponse refundRequest = adapayService.createRefundRequest(paymentId, refundAmount,
|
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()) {
|
if (refundRequest != null && refundRequest.isNotFailed()) {
|
||||||
refundAmt = new BigDecimal(refundRequest.getRefund_amt());
|
refundAmt = new BigDecimal(refundRequest.getRefund_amt());
|
||||||
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额
|
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额
|
||||||
|
|||||||
Reference in New Issue
Block a user