From 6c3c5f3fb28cc65684e065b60a09768cf8a77429 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 29 九月 2025 23:45:13 +0800
Subject: [PATCH] 添加抽奖次数加锁

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java |  361 +++++++++++++++++++++++++++------------------------
 1 files changed, 192 insertions(+), 169 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
index fa8eda8..b550cc6 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
@@ -524,6 +524,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) {
         //鎸囧畾娲诲姩缁欐寚瀹氭椿鍔ㄦ坊鍔犳病鎸囧畾娲诲姩缁欓粯璁ゆ椿鍔ㄦ坊鍔�
         String prizeActivityId = addPrizeNumForm.getPrizeActivityId();
@@ -547,180 +548,202 @@
             addPrizeNumForm.setUserId(currentUser.getId());
 
         }
-        PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId());
-        if (activity == null) {
-            throw new ServiceException("褰撳墠娲诲姩涓嶅瓨鍦�");
-        }
-        if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) {
-            throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�");
-        }
-        Date date = new Date();
-        //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔�
-        if (date.after(activity.getEndTime())) {
-            throw new ServiceException("褰撳墠娲诲姩宸茬粨鏉�");
-        }
-        Integer maxPrize = activity.getMaxPrize();
         String userId = addPrizeNumForm.getUserId();
-        List<PrizeNumber> prizeNumberList = getPrizeNumberList(activity.getId(), userId);
-        if (prizeNumberList.size() >= maxPrize) {
-            throw new ServiceException("鎶藉娆℃暟宸茶揪鍒颁笂闄愪簡");
-        }
-        PrizeUserActionEnum actionEnum = PrizeUserActionEnum.select(addPrizeNumForm.getAddType());
-        if (actionEnum == null) {
-            throw new ServiceException("褰撳墠绫诲瀷涓嶅瓨鍦�");
-        }
-        AddPrizeRule addPrizeRule = getAddPrizeRule(actionEnum.name());
-        if (addPrizeRule == null) {
-            return Result.ok().data(0);
-        }
-        List<PrizeNumber>  needAdd = new ArrayList<>();
-        Integer addNum = addPrizeRule.getAddNum();
-        if (addNum == null) {
-            return Result.ok().data(0);
-        }
-        //鍒よ娣诲姞鍚庢槸鍚﹀ぇ浜庢渶澶ф鏁�
-        if (prizeNumberList.size()+addNum >= maxPrize){
-            addNum = maxPrize-prizeNumberList.size();
-        }
-        boolean addFlag = false;
-        //鍒ゆ柇璇ョ被鍨嬪綋澶╂槸鍚︽坊鍔犺繃浜�
-        for (PrizeNumber prizeNumber : prizeNumberList) {
-            if (actionEnum.name().equals(prizeNumber.getUserAction())) {
-                addFlag =  true;
-                break;
+        RLock lock = redissonClient.getLock(PRIZE_ADD_NUM + userId);
+        try {
+
+            lock.lock();
+            PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId());
+            if (activity == null) {
+                throw new ServiceException("褰撳墠娲诲姩涓嶅瓨鍦�");
             }
-        }
-        String extend = addPrizeNumForm.getExtend();
-        JSONObject jsonObject = JSONObject.parseObject(extend);
-        LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery();
-        AddNumCheek addNumCheek = null;
-        String orderSn = null;
-        Order order = null;
-        String ruleValue= null;
-        switch (actionEnum) {
-            case SHARE_GOODS_VIDEO:
-                String shareId = jsonObject.getString("shareId");
-                ShareAction shareAction = shareActionService.getById(shareId);
-                if (shareAction == null) {
-                    return Result.ok().data(0);
-                }
-                if (addFlag){
-                    log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍒嗕韩娣诲姞娆℃暟浜�-------->{}",userId);
-                    return Result.ok().data(0);
-                }
-                break;
-            case SHARE_USER_REGISTRY:
-                String memberId = jsonObject.getString("memberId");
-                query.eq(AddNumCheek::getType,PrizeUserActionEnum.SHARE_USER_REGISTRY.name())
-                        .eq(AddNumCheek::getCheckNo, memberId);
-                if (addNumCheekService.getOne(query) != null) {
-                    log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}",memberId);
-                    return Result.ok().data(0);
-                }
-                addNumCheek =  new AddNumCheek();
-                addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name());
-                addNumCheek.setUserId(userId);
-                addNumCheek.setCheckNo(memberId);
-                addNumCheekService.save(addNumCheek);
-                break;
-            case SHARE_USER_SHOPPING:
-                 orderSn = jsonObject.getString("orderSn");
-                //鏍¢獙璁㈠崟鏄惁瀛樺湪
-                 order = orderService.getBySn(orderSn);
-                if (order == null) {
-                    log.info("鍒嗕韩鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}",orderSn);
-                    return Result.ok().data(0);
-                }
-                query.eq(AddNumCheek::getType,PrizeUserActionEnum.SHARE_USER_SHOPPING.name())
-                        .eq(AddNumCheek::getCheckNo, orderSn);
-                if (addNumCheekService.getOne(query) != null) {
-                    log.info("褰撳墠閭�璇疯鍗曞凡缁忚棰嗗彇杩囦簡----------------->{}",orderSn);
-                    return Result.ok().data(0);
-                }
-                addNumCheek = new AddNumCheek();
-                addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_SHOPPING.name());
-                addNumCheek.setUserId(userId);
-                addNumCheek.setCheckNo(orderSn);
-                addNumCheekService.save(addNumCheek);
-                break;
-            case USER_STAY_TIME:
-                //todo 閫氳繃鐢ㄦ埛琛屼负鍒嗘瀽鑾峰彇鏁版嵁杩涜鍒ゆ柇
-                 ruleValue = addPrizeRule.getRuleValue();
-
-                if (addFlag){
-                    log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍋滅暀鏃堕棿娣诲姞娆℃暟浜�-------->{}",userId);
-                    return Result.ok().data(0);
-                }
-                break;
-            case USER_BUY_SUM_PRICE:
-                 orderSn = jsonObject.getString("orderSn");
-                //鏍¢獙璁㈠崟鏄惁瀛樺湪
-                 order = orderService.getBySn(orderSn);
-                if (order == null) {
-                    log.info("鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}",orderSn);
-                    return Result.ok().data(0);
-                }
-                ruleValue =  addPrizeRule.getRuleValue();
-                double price = Double.parseDouble(ruleValue);
-                Double flowPrice = order.getFlowPrice();
-                if (flowPrice < price) {
-                    log.info("褰撳墠璐墿璁㈠崟閲戦灏忎簬娣诲姞瑕佹眰----------------->{}",orderSn);
-                    return Result.ok().data(0);
-                }
-                query.eq(AddNumCheek::getType,PrizeUserActionEnum.USER_BUY_SUM_PRICE.name())
-                        .eq(AddNumCheek::getCheckNo, orderSn);
-                if (addNumCheekService.getOne(query) != null) {
-                    log.info("褰撳墠璐墿璁㈠崟宸茬粡琚鍙栬繃浜�----------------->{}",orderSn);
-                    return Result.ok().data(0);
-                }
-                addNumCheek = new AddNumCheek();
-                addNumCheek.setType(PrizeUserActionEnum.USER_BUY_SUM_PRICE.name());
-                addNumCheek.setUserId(userId);
-                addNumCheek.setCheckNo(orderSn);
-                addNumCheekService.save(addNumCheek);
-                break;
-            case USER_BUY_ORDER_NUM:
-                orderSn = jsonObject.getString("orderSn");
-                //鏍¢獙璁㈠崟鏄惁瀛樺湪
-                order = orderService.getBySn(orderSn);
-                if (order == null) {
-                    log.info("鐢ㄦ埛璐墿鏁伴噺璁㈠崟涓嶅瓨鍦▄}",orderSn);
-                    return Result.ok().data(0);
-                }
-                query.eq(AddNumCheek::getType,PrizeUserActionEnum.USER_BUY_ORDER_NUM.name())
-                        .eq(AddNumCheek::getCheckNo, orderSn);
-                if (addNumCheekService.getOne(query) != null) {
-                    log.info("褰撳墠璐墿璁㈠崟鏁伴噺宸茬粡琚鍙栬繃浜�----------------->{}",orderSn);
-                    return Result.ok().data(0);
-                }
-                addNumCheek = new AddNumCheek();
-                addNumCheek.setType(PrizeUserActionEnum.USER_BUY_ORDER_NUM.name());
-                addNumCheek.setUserId(userId);
-                addNumCheek.setCheckNo(orderSn);
-                addNumCheekService.save(addNumCheek);
-                break;
-            case USER_SCAN_STORE:
-                break;
-            case USER_PUBLISH_EXAMINE:
-
-                break;
-            default:
+            if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) {
+                throw new ServiceException("褰撳墠娲诲姩娌″紑鍚�");
+            }
+            Date date = new Date();
+            //娲诲姩缁撴潫涓嶉渶瑕佹坊鍔�
+            if (date.after(activity.getEndTime())) {
+                throw new ServiceException("褰撳墠娲诲姩宸茬粨鏉�");
+            }
+            Integer maxPrize = activity.getMaxPrize();
+            List<PrizeNumber> prizeNumberList = getPrizeNumberList(activity.getId(), userId);
+            if (prizeNumberList.size() >= maxPrize) {
+                throw new ServiceException("鎶藉娆℃暟宸茶揪鍒颁笂闄愪簡");
+            }
+            PrizeUserActionEnum actionEnum = PrizeUserActionEnum.select(addPrizeNumForm.getAddType());
+            if (actionEnum == null) {
+                throw new ServiceException("褰撳墠绫诲瀷涓嶅瓨鍦�");
+            }
+            AddPrizeRule addPrizeRule = getAddPrizeRule(actionEnum.name());
+            if (addPrizeRule == null) {
                 return Result.ok().data(0);
+            }
+            List<PrizeNumber> needAdd = new ArrayList<>();
+            Integer addNum = addPrizeRule.getAddNum();
+            if (addNum == null) {
+                return Result.ok().data(0);
+            }
+            //鍒よ娣诲姞鍚庢槸鍚﹀ぇ浜庢渶澶ф鏁�
+            if (prizeNumberList.size() + addNum >= maxPrize) {
+                addNum = maxPrize - prizeNumberList.size();
+            }
+            boolean addFlag = false;
+            //鍒ゆ柇璇ョ被鍨嬪綋澶╂槸鍚︽坊鍔犺繃浜�
+            for (PrizeNumber prizeNumber : prizeNumberList) {
+                if (actionEnum.name().equals(prizeNumber.getUserAction())) {
+                    addFlag = true;
+                    break;
+                }
+            }
+            String extend = addPrizeNumForm.getExtend();
+            JSONObject jsonObject = JSONObject.parseObject(extend);
+            LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery();
+            AddNumCheek addNumCheek = null;
+            String orderSn = null;
+            Order order = null;
+            String ruleValue = null;
+            switch (actionEnum) {
+                case SHARE_GOODS_VIDEO:
+                    String shareId = jsonObject.getString("shareId");
+                    ShareAction shareAction = shareActionService.getById(shareId);
+                    if (shareAction == null) {
+                        return Result.ok().data(0);
+                    }
+                    if (addFlag) {
+                        log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍒嗕韩娣诲姞娆℃暟浜�-------->{}", userId);
+                        return Result.ok().data(0);
+                    }
+                    break;
+                case SHARE_USER_REGISTRY:
+                    String memberId = jsonObject.getString("memberId");
+                    query.eq(AddNumCheek::getType, PrizeUserActionEnum.SHARE_USER_REGISTRY.name())
+                            .eq(AddNumCheek::getCheckNo, memberId);
+                    if (addNumCheekService.getOne(query) != null) {
+                        log.info("褰撳墠鐢ㄦ埛宸茬粡琚個璇疯繃浜�----------------->{}", memberId);
+                        return Result.ok().data(0);
+                    }
+                    addNumCheek = new AddNumCheek();
+                    addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name());
+                    addNumCheek.setUserId(userId);
+                    addNumCheek.setCheckNo(memberId);
+                    addNumCheekService.save(addNumCheek);
+                    break;
+                case SHARE_USER_SHOPPING:
+                    orderSn = jsonObject.getString("orderSn");
+                    //鏍¢獙璁㈠崟鏄惁瀛樺湪
+                    order = orderService.getBySn(orderSn);
+                    if (order == null) {
+                        log.info("鍒嗕韩鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    query.eq(AddNumCheek::getType, PrizeUserActionEnum.SHARE_USER_SHOPPING.name())
+                            .eq(AddNumCheek::getCheckNo, orderSn);
+                    if (addNumCheekService.getOne(query) != null) {
+                        log.info("褰撳墠閭�璇疯鍗曞凡缁忚棰嗗彇杩囦簡----------------->{}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    addNumCheek = new AddNumCheek();
+                    addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_SHOPPING.name());
+                    addNumCheek.setUserId(userId);
+                    addNumCheek.setCheckNo(orderSn);
+                    addNumCheekService.save(addNumCheek);
+                    break;
+                case USER_STAY_TIME:
+                    //todo 閫氳繃鐢ㄦ埛琛屼负鍒嗘瀽鑾峰彇鏁版嵁杩涜鍒ゆ柇
+                    ruleValue = addPrizeRule.getRuleValue();
+
+                    if (addFlag) {
+                        log.info("褰撳墠鐢ㄦ埛褰撳ぉ宸茬粡娣诲姞杩囦簡鍋滅暀鏃堕棿娣诲姞娆℃暟浜�-------->{}", userId);
+                        return Result.ok().data(0);
+                    }
+                    break;
+                case USER_BUY_SUM_PRICE:
+                    orderSn = jsonObject.getString("orderSn");
+                    //鏍¢獙璁㈠崟鏄惁瀛樺湪
+                    order = orderService.getBySn(orderSn);
+                    if (order == null) {
+                        log.info("鐢ㄦ埛璐墿璁㈠崟涓嶅瓨鍦▄}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    ruleValue = addPrizeRule.getRuleValue();
+                    double price = Double.parseDouble(ruleValue);
+                    Double flowPrice = order.getFlowPrice();
+                    if (flowPrice < price) {
+                        log.info("褰撳墠璐墿璁㈠崟閲戦灏忎簬娣诲姞瑕佹眰----------------->{}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    query.eq(AddNumCheek::getType, PrizeUserActionEnum.USER_BUY_SUM_PRICE.name())
+                            .eq(AddNumCheek::getCheckNo, orderSn);
+                    if (addNumCheekService.getOne(query) != null) {
+                        log.info("褰撳墠璐墿璁㈠崟宸茬粡琚鍙栬繃浜�----------------->{}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    addNumCheek = new AddNumCheek();
+                    addNumCheek.setType(PrizeUserActionEnum.USER_BUY_SUM_PRICE.name());
+                    addNumCheek.setUserId(userId);
+                    addNumCheek.setCheckNo(orderSn);
+                    addNumCheekService.save(addNumCheek);
+                    break;
+                case USER_BUY_ORDER_NUM:
+                    orderSn = jsonObject.getString("orderSn");
+                    //鏍¢獙璁㈠崟鏄惁瀛樺湪
+                    order = orderService.getBySn(orderSn);
+                    if (order == null) {
+                        log.info("鐢ㄦ埛璐墿鏁伴噺璁㈠崟涓嶅瓨鍦▄}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    query.eq(AddNumCheek::getType, PrizeUserActionEnum.USER_BUY_ORDER_NUM.name())
+                            .eq(AddNumCheek::getCheckNo, orderSn);
+                    if (addNumCheekService.getOne(query) != null) {
+                        log.info("褰撳墠璐墿璁㈠崟鏁伴噺宸茬粡琚鍙栬繃浜�----------------->{}", orderSn);
+                        return Result.ok().data(0);
+                    }
+                    addNumCheek = new AddNumCheek();
+                    addNumCheek.setType(PrizeUserActionEnum.USER_BUY_ORDER_NUM.name());
+                    addNumCheek.setUserId(userId);
+                    addNumCheek.setCheckNo(orderSn);
+                    addNumCheekService.save(addNumCheek);
+                    break;
+                case USER_SCAN_STORE:
+                    break;
+                case USER_PUBLISH_EXAMINE:
+
+                    break;
+                default:
+                    return Result.ok().data(0);
+            }
+            //璁剧疆榛樿鎶藉娆℃暟骞惰繑鍥為粯璁ゆ娊濂栨鏁�
+            for (int i = 0; i < addNum; i++) {
+                PrizeNumber prizeNumber = new PrizeNumber();
+                prizeNumber.setActivityPrizeId(Long.parseLong(addPrizeNumForm.getPrizeActivityId()));
+                prizeNumber.setUserId(Long.parseLong(userId));
+                prizeNumber.setUserAction(actionEnum.name());
+                prizeNumber.setUseStatus(PrizeNumberUseEnum.WAIT.name());
+                needAdd.add(prizeNumber);
+            }
+            prizeNumberService.saveBatch(needAdd);
+            return Result.ok().data(0);
+        } finally {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    if (lock.isHeldByCurrentThread()) {
+                        lock.unlock();
+                    }
+                }
+
+                @Override
+                public void afterCompletion(int status) {
+                    if (lock.isHeldByCurrentThread()) {
+                        lock.unlock();
+                    }
+                }
+            });
         }
-        //璁剧疆榛樿鎶藉娆℃暟骞惰繑鍥為粯璁ゆ娊濂栨鏁�
-        for (int i = 0; i < addNum; i++) {
-            PrizeNumber prizeNumber = new PrizeNumber();
-            prizeNumber.setActivityPrizeId(Long.parseLong(addPrizeNumForm.getPrizeActivityId()));
-            prizeNumber.setUserId(Long.parseLong(userId));
-            prizeNumber.setUserAction(actionEnum.name());
-            prizeNumber.setUseStatus(PrizeNumberUseEnum.WAIT.name());
-            needAdd.add(prizeNumber);
-        }
-        prizeNumberService.saveBatch(needAdd);
-        return Result.ok().data(0);
     }
-    public  AddPrizeRule getAddPrizeRule(String ruleCode) {
+
+    public AddPrizeRule getAddPrizeRule(String ruleCode) {
         LambdaQueryWrapper<AddPrizeRule> one = Wrappers.<AddPrizeRule>lambdaQuery().eq(AddPrizeRule::getRuleCode, ruleCode);
-       return addPrizeRuleService.getOne(one);
+        return addPrizeRuleService.getOne(one);
     }
 }

--
Gitblit v1.8.0