From 14b3dd223d4a148a4ca681a5c542901dfe74f029 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期五, 26 九月 2025 17:49:08 +0800
Subject: [PATCH] 店铺优惠卷调整

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java |   82 ++++++++++++++++++++++++++++++++++------
 1 files changed, 69 insertions(+), 13 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
index dc31f6c..3b40116 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
@@ -4,13 +4,18 @@
 import cn.lili.common.security.AuthUser;
 import cn.lili.common.security.context.UserContext;
 import cn.lili.modules.lmk.domain.entity.StoreCoupon;
+import cn.lili.modules.lmk.domain.entity.StoreCouponSingle;
 import cn.lili.modules.lmk.enums.general.PrizeStatusEnum;
+import cn.lili.modules.lmk.enums.general.StoreCouponStausEnum;
 import cn.lili.modules.lmk.service.StoreCouponService;
+import cn.lili.modules.lmk.service.StoreCouponSingleService;
+import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
 import cn.lili.modules.promotion.entity.dos.MemberCoupon;
 import cn.lili.modules.promotion.service.MemberCouponService;
 import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
 import cn.lili.modules.lmk.mapper.StoreCouponClaimRecordMapper;
@@ -50,6 +55,7 @@
     private static final String STORE_COUPON_CLAIM = "store_coupon_claim:";
     private final MemberCouponService memberCouponService;
     private final StoreCouponService storeCouponService;
+    private final StoreCouponSingleService storeCouponSingleService;
     /**
      * 娣诲姞
      * @param form
@@ -147,33 +153,63 @@
         String userId = currentUser.getId();
         String nickName = currentUser.getNickName();
 
-        //閿佷綇搴楅摵鏌愪竴涓紭鎯犲嵎
+        //閿佷綇绀煎搧鐮乮d
         RLock redissonLock = redissonClient.getLock(STORE_COUPON_CLAIM + id);
         try {
             redissonLock.lock();
-            StoreCoupon storeCoupon = storeCouponService.getById(id);
-            if (storeCoupon == null) {
-                throw new ServiceException("褰撳墠搴楅摵涓嶅瓨鍦ㄤ紭鎯犲嵎");
+            LambdaQueryWrapper<StoreCouponSingle> forUpdate = Wrappers.<StoreCouponSingle>lambdaQuery()
+                    .eq(StoreCouponSingle::getId, id).last("FOR UPDATE");
+            StoreCouponSingle storeCouponSingle = storeCouponSingleService.getOne(forUpdate);
+            if (storeCouponSingle == null) {
+                throw new ServiceException("褰撳墠绀煎搧鐮佷笉瀛樺湪");
+            }
+            if (!ClaimStatusEnum.NOT_CLAIM.name().equals(storeCouponSingle.getClaimStatus())) {
+                throw new ServiceException("褰撳墠绀煎搧鐮佺姸鎬佸紓甯�");
+            }
+            LambdaQueryWrapper<StoreCouponSingle> claimListQuery = Wrappers.<StoreCouponSingle>lambdaQuery()
+                    .eq(StoreCouponSingle::getClaimUserId, userId)
+                    .eq(StoreCouponSingle::getStoreCoupRef, storeCouponSingle.getStoreCoupRef())
+                    .eq(StoreCouponSingle::getClaimStatus, ClaimStatusEnum.CLAIM.name());
+            List<StoreCouponSingle> claimList = storeCouponSingleService.list(claimListQuery);
+            if (!claimList.isEmpty()) {
+                throw new ServiceException("宸茬粡棰嗗彇杩囪绫诲瀷鐨勭ぜ鍝佺爜鏃犳硶棰嗗彇");
             }
             //澶勭悊骞傜瓑闂闄愬埗涓�涓敤鎴峰彧鑳借搴楅摵棰嗗彇涓�绉嶄紭鎯犲嵎
             LambdaQueryWrapper<StoreCouponClaimRecord> memCoupon = Wrappers.<StoreCouponClaimRecord>lambdaQuery()
                     .eq(StoreCouponClaimRecord::getUserId, userId)
-                    .eq(StoreCouponClaimRecord::getCouponId, storeCoupon.getCouponId());
+                    .eq(StoreCouponClaimRecord::getCouponId, storeCouponSingle.getCouponId());
             List<StoreCouponClaimRecord> list = this.list(memCoupon);
             if (!list.isEmpty()){
                 throw new ServiceException("褰撳墠鐢ㄦ埛宸茬粡棰嗗彇杩囦簡鏃犳硶鍐嶆棰嗗彇");
             }
+            //鏇存柊鍗曞搧琚鍙栫殑璁板綍
+            storeCouponSingle.setClaimStatus(ClaimStatusEnum.CLAIM.name());
+            storeCouponSingle.setClaimUserId(userId);
+            storeCouponSingle.setClaimUserName(nickName);
+            storeCouponSingleService.updateById(storeCouponSingle);
+            //鏍¢獙鏄惁鍦ㄥ崟鍝佸嵎绫婚鍙栬繃
+            LambdaQueryWrapper<StoreCoupon> storeCoupQuery = Wrappers.<StoreCoupon>lambdaQuery()
+                    .eq(StoreCoupon::getId, storeCouponSingle.getStoreCoupRef()).last("FOR UPDATE");
+            StoreCoupon storeCoupon = storeCouponService.getOne(storeCoupQuery);
+            if (storeCoupon == null) {
+                throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗蜂笉瀛樺湪");
+            }
+            if (!StoreCouponStausEnum.ENABLE.name().equals(storeCoupon.getStatus())) {
+                throw new ServiceException("褰撳墠搴楅摵浼樻儬鍗风姸鎬佸紓甯�");
+            }
             //棰嗗彇瀵瑰簲鐨勪紭鎯犲嵎鍐欏叆璁板綍
-            memberCouponService.receiveCoupon(storeCoupon.getCouponId(),userId , nickName);
-            StoreCouponClaimRecord storeCouponClaimRecord = new StoreCouponClaimRecord();
-            storeCouponClaimRecord.setCouponId(storeCoupon.getCouponId());
-            storeCouponClaimRecord.setCouponName(storeCoupon.getCouponName());
-            storeCouponClaimRecord.setStoreId(storeCoupon.getStoreId());
-            storeCouponClaimRecord.setStoreName(storeCoupon.getStoreName());
-            storeCouponClaimRecord.setUserId(userId);
+            memberCouponService.receiveCoupon(storeCouponSingle.getCouponId(),userId , nickName);
+            StoreCouponClaimRecord storeCouponClaimRecord = getStoreCouponClaimRecord(storeCouponSingle, userId);
             this.save(storeCouponClaimRecord);
+            LambdaUpdateWrapper<StoreCoupon> updateStoreCoupon = Wrappers.<StoreCoupon>lambdaUpdate().eq(StoreCoupon::getId, storeCoupon.getId())
+                    .set(StoreCoupon::getCouponClaimNum, storeCoupon.getCouponClaimNum() + 1)
+                    .gt(StoreCoupon::getCouponClaimNum, storeCoupon.getCouponClaimNum() + 1);
+            boolean update = storeCouponService.update(updateStoreCoupon);
+            if (!update) {
+                throw new ServiceException("鏇存柊澶辫触");
+            }
             //棰嗗彇鎴愬姛杩斿洖浼樻儬鍗穒d鐢ㄤ簬璺宠浆璐墿浣跨敤
-            return Result.ok().data(storeCoupon.getCouponId());
+            return Result.ok().data(storeCouponSingle.getCouponId());
 
         } finally {
             TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@@ -183,8 +219,28 @@
                         redissonLock.unlock();
                     }
                 }
+                
+                @Override
+                public void afterCompletion(int status) {
+                    // 纭繚鍗充娇鍦ㄤ簨鍔″洖婊氱殑鎯呭喌涓嬩篃鑳介噴鏀鹃攣
+                    if (redissonLock.isHeldByCurrentThread()) {
+                        redissonLock.unlock();
+                    }
+                }
+
             });
 
         }
     }
+
+    private static StoreCouponClaimRecord getStoreCouponClaimRecord(StoreCouponSingle storeCouponSingle, String userId) {
+        StoreCouponClaimRecord storeCouponClaimRecord = new StoreCouponClaimRecord();
+        storeCouponClaimRecord.setCouponId(storeCouponSingle.getCouponId());
+        storeCouponClaimRecord.setCouponName(storeCouponSingle.getCouponName());
+        storeCouponClaimRecord.setStoreId(storeCouponSingle.getStoreId());
+        storeCouponClaimRecord.setStoreName(storeCouponSingle.getStoreName());
+        storeCouponClaimRecord.setUserId(userId);
+        storeCouponClaimRecord.setStoreCouponId(storeCouponSingle.getStoreCoupRef());
+        return storeCouponClaimRecord;
+    }
 }

--
Gitblit v1.8.0