From ec8e8f1c208abe54042add2124c9759d9b1369d1 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期六, 12 九月 2026 16:59:06 +0800
Subject: [PATCH] feat(order): 核销幂等与退款边界按订单串行化
---
talent-card-server/src/main/java/com/talentcard/server/service/BenefitVerificationService.java | 11 ++++++++---
1 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/talent-card-server/src/main/java/com/talentcard/server/service/BenefitVerificationService.java b/talent-card-server/src/main/java/com/talentcard/server/service/BenefitVerificationService.java
index bf8dad4..4707235 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/service/BenefitVerificationService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/service/BenefitVerificationService.java
@@ -9,6 +9,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.talentcard.server.business.BusinessIdGenerator;
+import com.talentcard.server.business.order.OrderFundBoundaryService;
import com.talentcard.server.request.BenefitVerificationRequest;
import com.talentcard.server.business.merchant.auth.MerchantPrincipal;
import com.talentcard.server.common.BusinessException;
@@ -53,6 +54,7 @@
private final TicketPackageClaimMapper ticketPackageClaimMapper;
private final TicketPackageCodeMapper ticketPackageCodeMapper;
private final TicketPackagePortalService ticketPackagePortalService;
+ private final OrderFundBoundaryService orderFundBoundary;
public BenefitVerificationService(
BenefitQuotaService quotaService,
@@ -67,7 +69,8 @@
BenefitMerchantProductMapper productMapper,
TicketPackageClaimMapper ticketPackageClaimMapper,
TicketPackageCodeMapper ticketPackageCodeMapper,
- TicketPackagePortalService ticketPackagePortalService
+ TicketPackagePortalService ticketPackagePortalService,
+ OrderFundBoundaryService orderFundBoundary
) {
this.quotaService = quotaService;
this.verifyRecordMapper = verifyRecordMapper;
@@ -82,6 +85,7 @@
this.ticketPackageClaimMapper = ticketPackageClaimMapper;
this.ticketPackageCodeMapper = ticketPackageCodeMapper;
this.ticketPackagePortalService = ticketPackagePortalService;
+ this.orderFundBoundary = orderFundBoundary;
}
@Transactional
@@ -198,10 +202,11 @@
}
BenefitOrderDynamicVerificationCode code = context.code();
BenefitOrder order = context.order();
- if (intValue(code.getStatus()) != 0 || expiredDateTime(code.getExpiresAt())
- || intValue(order.getOrderStatus()) != 1 || intValue(order.getVerifyStatus()) != 0) {
+ if (intValue(code.getStatus()) != 0 || expiredDateTime(code.getExpiresAt())) {
throw new BusinessException(ErrorCode.CONFLICT, "酒店订单当前不可核销");
}
+ // 与商户端核销、退款共用同一把订单行锁:未支付、已退款或已进入提现记录的订单都不能核销。
+ orderFundBoundary.lock(order.getId()).requireVerifiable();
int codeUpdated = orderCodeMapper.update(null, new UpdateWrapper<BenefitOrderDynamicVerificationCode>()
.set("status", 1)
.eq("id", code.getId())
--
Gitblit v1.7.1