update 退款时将保险金额与退款金额合并

This commit is contained in:
Lemon
2026-03-13 09:51:47 +08:00
parent 4e0d551edb
commit 9eb9d44348
3 changed files with 61 additions and 4 deletions

View File

@@ -77,6 +77,8 @@ public interface OrderBasicInfoService{
*/
List<OrderListVO> selectOrderBasicInfoList(QueryOrderDTO dto);
boolean checkRefundInsuranceAmount(OrderBasicInfo orderBasicInfo);
void refundInsurance(OrderBasicInfo orderBasicInfo);
/**

View File

@@ -798,6 +798,43 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService {
}
}
/**
* 判断是否退款保险金额
* @return
*/
@Override
public boolean checkRefundInsuranceAmount(OrderBasicInfo orderBasicInfo) {
if (Objects.isNull(orderBasicInfo)) {
return false;
}
// 判断该订单是否支付保险
BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount();
// 判断保险费是否大于0
if (insuranceAmount.compareTo(BigDecimal.ZERO) <= 0) {
return false;
}
// 判断是否已经退过保险费
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 false;
}
}
}
return true;
}
/**
* 退保险费,需要退保险调此方法,此方法会调用退款接口
*/

View File

@@ -1098,12 +1098,24 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
.updateGiftBalance(returnGift)
.relatedOrderCode(orderCode)
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 判断消费金额,如果消费金额 - 折扣金额小于 1 元,则将保险费也进行退回
if (orderBasicInfo.getOrderAmount().subtract(orderBasicInfo.getDiscountAmount()).compareTo(BigDecimal.ONE) < 0) {
orderBasicInfoService.refundInsurance(orderBasicInfo);
// orderBasicInfoService.refundInsurance(orderBasicInfo);
// 判断是否需要退保险费用
boolean checkResult = orderBasicInfoService.checkRefundInsuranceAmount(orderBasicInfo);
if (checkResult) {
// 退保险, 计算退保金额
Map<String, BigDecimal> refundMap = calculateBalanceRefund(principalPay, giftPay, orderBasicInfo.getOrderAmount(), orderBasicInfo.getDiscountAmount(), insuranceAmount);
BigDecimal returnPrincipalForInsurance = refundMap.get("returnPrincipalForInsurance");
BigDecimal returnGiftForInsurance = refundMap.get("returnGiftForInsurance");
updateMemberBalanceDTO.setUpdatePrincipalBalance(returnPrincipal.add(returnPrincipalForInsurance));
updateMemberBalanceDTO.setUpdateGiftBalance(returnGift.add(returnGiftForInsurance));
}
}
// 统一退款
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 更新order_pay_record, 解冻部分
// List<Map<String, Object>> list = calculateUnfreezeAmount(orderAmount, payRecordList);
@@ -1150,13 +1162,19 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic {
if (StringUtils.isNotBlank(wechatAppId)) {
applyRefundDTO.setWechatAppId(wechatAppId);
}
this.refundOrderWithAdapay(applyRefundDTO);
// 判断消费金额,如果消费金额 - 折扣金额小于 1 元,则将保险费也进行退回
if (orderBasicInfo.getOrderAmount().subtract(orderBasicInfo.getDiscountAmount()).compareTo(BigDecimal.ONE) < 0) {
orderBasicInfoService.refundInsurance(orderBasicInfo);
// orderBasicInfoService.refundInsurance(orderBasicInfo);
// 判断是否需要退款保险金额
boolean checkResult = orderBasicInfoService.checkRefundInsuranceAmount(orderBasicInfo);
if (checkResult) {
// 退款保险,将保险金额进行合并
applyRefundDTO.setRefundAmount(refundAmount.add(orderBasicInfo.getInsuranceAmount()));
}
}
this.refundOrderWithAdapay(applyRefundDTO);
}
/**