From 4eeeb59f6c514b61c78aec2acc95cff4807810e1 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期五, 05 九月 2025 10:52:49 +0800
Subject: [PATCH] 抽奖活动中奖跳转

---
 framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java |  104 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 98 insertions(+), 6 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 c0359cf..60c0963 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
@@ -5,26 +5,34 @@
 import cn.lili.common.properties.RocketmqCustomProperties;
 import cn.lili.common.security.AuthUser;
 import cn.lili.common.security.context.UserContext;
+import cn.lili.common.utils.BeanUtil;
 import cn.lili.common.utils.StringUtils;
 import cn.lili.modules.lmk.domain.entity.*;
+import cn.lili.modules.lmk.domain.form.AddPrizeNumForm;
 import cn.lili.modules.lmk.domain.query.PrizeRecordTimeQuery;
 import cn.lili.modules.lmk.domain.vo.PrizeDetailVO;
 import cn.lili.modules.lmk.domain.vo.PrizeProbabilityVO;
 import cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO;
+import cn.lili.modules.lmk.domain.vo.PrizeResultVO;
 import cn.lili.modules.lmk.enums.general.*;
 import cn.lili.modules.lmk.service.*;
+import cn.lili.modules.promotion.entity.dos.Coupon;
+import cn.lili.modules.promotion.service.CouponService;
 import cn.lili.mybatis.BaseEntity;
 import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
 import cn.lili.utils.COSUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
+import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -41,6 +49,7 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class PrizeServiceImpl implements PrizeService {
@@ -56,6 +65,8 @@
     private final RocketmqCustomProperties rocketmqCustomProperties;
     private final RocketMQTemplate rocketMQTemplate;
     private final COSUtil cosUtil;
+    private final CouponService couponService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Result prize(String prizeId) {
@@ -174,7 +185,7 @@
         prizeRecordTimeQuery.setEndTime(endTime);
         prizeRecordTimeQuery.setRecordActivityId(prizeId);
         prizeRecordListByTime = prizeRecordService.getPrizeRecordListByTime(prizeRecordTimeQuery);
-        prizeRecordListByTime.stream().filter(item->{
+        prizeRecordListByTime.stream().filter(item -> {
             return item.getActivityPrizeRefId() != null;
         }).forEach(item -> {
             ActivityRefPrize activityRefPrize = canPrizeMap.get(item.getActivityPrizeRefId());
@@ -214,6 +225,12 @@
         }
         BigDecimal max = currentProbability.multiply(BigDecimal.valueOf(100));
         BigDecimal bigDecimal = generateRandom(BigDecimal.ONE, max);
+        try {
+            log.info("鎶藉鍙风爜涓�---------------------------->{}", bigDecimal);
+            log.info("鎶藉姒傜巼闆嗗悎涓�------------------------->{}", JSONObject.toJSONString(prizeProbabilityList));
+        } catch (Exception e) {
+            log.error("鎵撳嵃鎶藉淇℃伅鎶ラ敊----------------------->", e);
+        }
         for (PrizeProbabilityVO prizeProbabilityVO : prizeProbabilityList) {
             BigDecimal minP = prizeProbabilityVO.getProbability()[0][0];
             BigDecimal maxP = prizeProbabilityVO.getProbability()[0][1];
@@ -221,6 +238,31 @@
                 prizeWon = prizeProbabilityVO.getActivityPrizeRefId();
                 break;
             }
+        }
+        Coupon coupon = null;
+        //鏍¢獙浼樻儬鍗锋槸鍚﹀厑璁哥敤鎴峰棰嗕笉鍏佽褰撴湭涓澶勭悊
+        if (prizeWon != null) {
+            ActivityRefPrize activityRefPrize = canPrizeMap.get(prizeWon);
+            String prizeDrawId = activityRefPrize.getPrizeId();
+            PrizeDraw prizeDraw = prizeDrawService.getById(prizeDrawId);
+            String couponId = prizeDraw.getCouponId();
+            coupon = couponService.getById(couponId);
+            if (coupon == null) {
+                prizeWon = null;
+            } else {
+                Integer couponLimitNum = coupon.getCouponLimitNum();
+                //鑾峰彇鐢ㄦ埛杩欎釜浼樻儬鍗风殑涓鎯呭喌
+                LambdaQueryWrapper<PrizeRecord> eq = Wrappers.<PrizeRecord>lambdaQuery()
+                        .eq(PrizeRecord::getUserId, userId)
+                        .eq(PrizeRecord::getPrizeActivityId, prizeId)
+                        .eq(PrizeRecord::getPrizeId, prizeDrawId);
+                int size = prizeRecordService.list(eq).size();
+                if ( couponLimitNum>0 && size >= couponLimitNum) {
+                    log.info("瑙﹀彂浼樻儬鍗烽鍙栭檺鍒�---------->{}",prizeWon);
+                    prizeWon = null;
+                }
+            }
+
         }
         //鏈腑濂栫殑鎯呭喌
         if (prizeWon == null) {
@@ -288,6 +330,7 @@
 //        if (!lock.equals(nowLock)) {
 //            throw new RuntimeException("褰撳墠娲诲姩澶伀鐖嗕簡璇风◢鍚庡啀璇�");
 //        }
+        String couponId = coupon.getId();
         // 璧癿q寮傛澶勭悊
         TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
             @Override
@@ -296,7 +339,10 @@
                 rocketMQTemplate.asyncSend(destination, JSON.toJSONString(prizeRecord), RocketmqSendCallbackBuilder.commonCallback());
             }
         });
-        return Result.ok().data(activityRefPrize);
+        PrizeResultVO prizeResultVO = new PrizeResultVO();
+        BeanUtils.copyProperties(activityRefPrize, prizeResultVO);
+        prizeResultVO.setCouponId(couponId);
+        return Result.ok().data(prizeResultVO);
     }
 
     public static BigDecimal generateRandom(BigDecimal min, BigDecimal max) {
@@ -384,7 +430,7 @@
         if (useNum >= maxPrize) {
             return Result.ok().data(0);
         } else {
-            return Result.ok().data(userPrizeNum>maxPrize?maxPrize-useNum:notUseNum);
+            return Result.ok().data(userPrizeNum > maxPrize ? maxPrize - useNum : notUseNum);
         }
     }
 
@@ -421,16 +467,16 @@
         }
         PrizeDetailVO data = prizeActivityService.prizeInfo(prizeActivityId);
         String activityCover = data.getActivityCover();
-        if (StringUtils.isNotBlank(activityCover)&&!activityCover.contains("http")) {
+        if (StringUtils.isNotBlank(activityCover) && !activityCover.contains("http")) {
             data.setActivityCover(cosUtil.getPreviewUrl(activityCover));
         }
         data.getPrizeInfoVOS().forEach(info -> {
             String prizeImg = info.getPrizeImg();
             String prizeCover = info.getPrizeCover();
-            if (StringUtils.isNotBlank(prizeImg)&&!prizeImg.contains("http")) {
+            if (StringUtils.isNotBlank(prizeImg) && !prizeImg.contains("http")) {
                 info.setPrizeImg(cosUtil.getPreviewUrl(prizeImg));
             }
-            if (StringUtils.isNotBlank(prizeCover)&&!prizeCover.contains("http")) {
+            if (StringUtils.isNotBlank(prizeCover) && !prizeCover.contains("http")) {
                 info.setPrizeCover(cosUtil.getPreviewUrl(prizeCover));
             }
         });
@@ -441,4 +487,50 @@
     public Result grantRecord(String prizeActivityId) {
         return prizeDrawService.grantRecord(prizeActivityId);
     }
+
+    @Override
+    public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) {
+        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("褰撳墠绫诲瀷涓嶅瓨鍦�");
+        }
+        //todo 杩涜鏁版嵁鏍¢獙
+        switch (actionEnum) {
+            case BUY:
+                System.err.println("BUY");
+                break;
+            case SHARE:
+                //鐩存帴鑾峰緱鎶藉娆℃暟
+                System.err.println("SHARE");
+                break;
+            case SEE_SHOP:
+                System.err.println("SEE_SHOP");
+                break;
+            case SEE_VIDEO:
+                System.err.println("SEE_VIDEO");
+                break;
+            default:
+
+                break;
+        }
+        return null;
+    }
 }

--
Gitblit v1.8.0