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/domain/entity/StoreCoupon.java                      |    4 
 buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java                  |   33 +++++++++++
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java |   73 ++++++++++++++++++++++++
 framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java            |    6 ++
 framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java           |    4 
 framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java                     |    4 +
 framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java          |    4 +
 7 files changed, 123 insertions(+), 5 deletions(-)

diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java
new file mode 100644
index 0000000..dd7c8cd
--- /dev/null
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java
@@ -0,0 +1,33 @@
+package cn.lili.controller.lmk;
+
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.service.CouponVirtualService;
+import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
+import cn.lili.modules.lmk.service.StoreCouponService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Validated
+@RequiredArgsConstructor
+@Api(value = "灏忕▼搴忚喘鐗╁晢鍝侀鍙栦紭鎯犲嵎鎺ュ彛", tags = "灏忕▼搴忚喘鐗╁晢鍝侀鍙栦紭鎯犲嵎鎺ュ彛")
+@RestController
+@RequestMapping("/buyer/lmk/store/coupon")
+public class StoreCouponClaimController {
+    private final StoreCouponClaimRecordService storeCouponClaimRecordService;
+    private final StoreCouponService storeCouponService;
+
+
+    @PostMapping("/{id}")
+    @ApiOperation(value = "棰嗗彇浼樻儬鍗�", notes = "棰嗗彇浼樻儬鍗�")
+    public Result claimCoupon(@PathVariable String id){
+        return storeCouponClaimRecordService.claimCoupon(id);
+    }
+    @GetMapping("/{id}")
+    @ApiOperation(value = "鑾峰彇浼樻儬鍗蜂俊鎭�", notes = "鑾峰彇浼樻儬鍗蜂俊鎭�")
+    public Result getCoupon(@PathVariable String id){
+        return storeCouponService.getCoupon(id);
+    }
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java
index 94b9f67..93d29fa 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java
@@ -24,11 +24,11 @@
 
     @TableField("store_name")
     /** 搴楅摵鍚嶇О */
-    private Long storeName;
+    private String storeName;
 
     @TableField("coupon_id")
     /** 浼樻儬鍗穒d */
-    private Long couponId;
+    private String couponId;
 
     @TableField("coupon_name")
     /** 浼樻儬鍗峰悕绉� */
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java
index f29c89a..bd122cc 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java
@@ -24,7 +24,7 @@
 
     @TableField("coupon_id")
     /** 浼樻儬鍗穒d */
-    private Long couponId;
+    private String couponId;
 
     @TableField("coupon_name")
     /** 浼樻儬鍗峰悕绉� */
@@ -36,7 +36,7 @@
 
     @TableField("user_id")
     /** 鐢ㄦ埛id */
-    private Long userId;
+    private String userId;
 
 
 }
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
index eaa51fb..fbf3951 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
@@ -5,6 +5,8 @@
 import cn.lili.base.Result;
 import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
 import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
+import org.springframework.web.bind.annotation.PathVariable;
+
 import java.util.List;
 
 /**
@@ -62,4 +64,6 @@
      * @return
      */
     Result all();
+
+    Result claimCoupon(String id);
 }
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java
index 47e9669..44c4759 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java
@@ -5,6 +5,8 @@
 import cn.lili.base.Result;
 import cn.lili.modules.lmk.domain.form.StoreCouponForm;
 import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
+import org.springframework.web.bind.annotation.PathVariable;
+
 import java.util.List;
 
 /**
@@ -62,4 +64,6 @@
      * @return
      */
     Result all();
+
+    Result getCoupon(String id);
 }
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();
+                    }
+                }
+            });
+
+        }
+    }
 }
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java
index 13120d7..c640c03 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java
@@ -116,4 +116,10 @@
                 .collect(Collectors.toList());
         return Result.ok().data(vos);
     }
+
+    @Override
+    public Result getCoupon(String id) {
+        StoreCoupon storeCoupon = this.getById(id);
+        return Result.ok().data(storeCoupon);
+    }
 }

--
Gitblit v1.8.0