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