From 64afdb6371aef321db882f3659ba1d2c2e82ad41 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期五, 26 九月 2025 09:58:32 +0800
Subject: [PATCH] 扫码领取门店优惠卷调整

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java |   73 ++++++++++++++++++++++++++++++++++++
 1 files changed, 72 insertions(+), 1 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 375b685..dc31f6c 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
@@ -1,18 +1,35 @@
 package cn.lili.modules.lmk.service.impl;
 
+import cn.lili.common.exception.ServiceException;
+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.enums.general.PrizeStatusEnum;
+import cn.lili.modules.lmk.service.StoreCouponService;
+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.metadata.IPage;
 import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord;
 import cn.lili.modules.lmk.mapper.StoreCouponClaimRecordMapper;
 import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
 import cn.lili.base.Result;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
 import cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO;
 import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 import cn.lili.utils.PageUtil;
 import org.springframework.beans.BeanUtils;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 import org.springframework.util.Assert;
 
 import java.util.List;
@@ -29,7 +46,10 @@
 public class StoreCouponClaimRecordServiceImpl extends ServiceImpl<StoreCouponClaimRecordMapper, StoreCouponClaimRecord> implements StoreCouponClaimRecordService {
 
     private final StoreCouponClaimRecordMapper storeCouponClaimRecordMapper;
-
+    private final RedissonClient redissonClient;
+    private static final String STORE_COUPON_CLAIM = "store_coupon_claim:";
+    private final MemberCouponService memberCouponService;
+    private final StoreCouponService storeCouponService;
     /**
      * 娣诲姞
      * @param form
@@ -116,4 +136,55 @@
                 .collect(Collectors.toList());
         return Result.ok().data(vos);
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Result claimCoupon(String id) {
+        AuthUser currentUser = UserContext.getCurrentUser();
+        if (currentUser == null) {
+            throw new ServiceException("褰撳墠鐢ㄦ埛娌℃湁鐧诲綍鏃犳硶棰嗗彇");
+        }
+        String userId = currentUser.getId();
+        String nickName = currentUser.getNickName();
+
+        //閿佷綇搴楅摵鏌愪竴涓紭鎯犲嵎
+        RLock redissonLock = redissonClient.getLock(STORE_COUPON_CLAIM + id);
+        try {
+            redissonLock.lock();
+            StoreCoupon storeCoupon = storeCouponService.getById(id);
+            if (storeCoupon == null) {
+                throw new ServiceException("褰撳墠搴楅摵涓嶅瓨鍦ㄤ紭鎯犲嵎");
+            }
+            //澶勭悊骞傜瓑闂闄愬埗涓�涓敤鎴峰彧鑳借搴楅摵棰嗗彇涓�绉嶄紭鎯犲嵎
+            LambdaQueryWrapper<StoreCouponClaimRecord> memCoupon = Wrappers.<StoreCouponClaimRecord>lambdaQuery()
+                    .eq(StoreCouponClaimRecord::getUserId, userId)
+                    .eq(StoreCouponClaimRecord::getCouponId, storeCoupon.getCouponId());
+            List<StoreCouponClaimRecord> list = this.list(memCoupon);
+            if (!list.isEmpty()){
+                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);
+            this.save(storeCouponClaimRecord);
+            //棰嗗彇鎴愬姛杩斿洖浼樻儬鍗穒d鐢ㄤ簬璺宠浆璐墿浣跨敤
+            return Result.ok().data(storeCoupon.getCouponId());
+
+        } finally {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    if (redissonLock.isHeldByCurrentThread()) {
+                        redissonLock.unlock();
+                    }
+                }
+            });
+
+        }
+    }
 }

--
Gitblit v1.8.0