From c37592f87c700d7301d595af7a8259c4f78040e7 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期三, 27 八月 2025 10:25:53 +0800
Subject: [PATCH] 抽奖活动

---
 framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java |    1 
 buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java                |   20 ++++-
 consumer/src/main/java/cn/lili/listener/PrizeMessageListener.java                  |  155 ++++++++++++++++++++++++++++++++++++++
 framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java     |    4 +
 framework/src/main/java/cn/lili/modules/lmk/domain/form/AddPrizeNumForm.java       |   21 +++++
 5 files changed, 197 insertions(+), 4 deletions(-)

diff --git a/buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java b/buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java
index 543fb74..a13df76 100644
--- a/buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java
@@ -1,14 +1,12 @@
 package cn.lili.controller.lmk;
 
 import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.AddPrizeNumForm;
 import cn.lili.modules.lmk.service.PrizeService;
 import io.swagger.annotations.Api;
 import lombok.RequiredArgsConstructor;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 @Validated
 @RequiredArgsConstructor
@@ -28,6 +26,7 @@
     public Result prize(@PathVariable String prizeActivityId) {
         return prizeService.prize(prizeActivityId);
     }
+
     /**
      * 鑾峰彇鎶藉娆℃暟
      *
@@ -38,6 +37,7 @@
     public Result prizeNum(@PathVariable String prizeActivityId) {
         return prizeService.prizeNum(prizeActivityId);
     }
+
     /**
      * 鑾峰彇鑾峰彇鎶藉椤甸潰淇℃伅
      *
@@ -48,6 +48,7 @@
     public Result prizeInfo(@PathVariable String prizeActivityId) {
         return prizeService.prizeInfo(prizeActivityId);
     }
+
     /**
      * 鑾峰彇鑾峰彇鏈�杩戜腑濂栦俊鎭�
      *
@@ -58,4 +59,15 @@
     public Result grantRecord(@PathVariable String prizeActivityId) {
         return prizeService.grantRecord(prizeActivityId);
     }
+
+    /**
+     * 澧炲姞鎶藉娆℃暟
+     *
+     * @param prizeActivityId
+     * @return
+     */
+    @PostMapping("/addPrizeNum/{prizeActivityId}")
+    public Result addPrizeNum(@PathVariable String prizeActivityId, @RequestBody AddPrizeNumForm addPrizeNumForm) {
+        return prizeService.grantRecord(prizeActivityId);
+    }
 }
diff --git a/consumer/src/main/java/cn/lili/listener/PrizeMessageListener.java b/consumer/src/main/java/cn/lili/listener/PrizeMessageListener.java
new file mode 100644
index 0000000..8b9b878
--- /dev/null
+++ b/consumer/src/main/java/cn/lili/listener/PrizeMessageListener.java
@@ -0,0 +1,155 @@
+package cn.lili.listener;
+
+import cn.lili.cache.Cache;
+import cn.lili.common.enums.ResultCode;
+import cn.lili.common.exception.ServiceException;
+import cn.lili.elasticsearch.EsSuffix;
+import cn.lili.modules.lmk.domain.dto.VideoEsUpdateDTO;
+import cn.lili.modules.lmk.domain.entity.*;
+import cn.lili.modules.lmk.domain.es.VideoIndex;
+import cn.lili.modules.lmk.enums.general.PrizeDistributeStatusEnum;
+import cn.lili.modules.lmk.enums.general.PrizeGrantStatusEnums;
+import cn.lili.modules.lmk.enums.general.PrizeNumberUseEnum;
+import cn.lili.modules.lmk.enums.general.PrizeStatusEnum;
+import cn.lili.modules.lmk.service.*;
+import cn.lili.modules.promotion.service.MemberCouponService;
+import cn.lili.rocketmq.tags.VideoTagsEnum;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.common.message.MessageExt;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+/**
+ * 鎶藉娲诲姩
+ *
+ * @author paulG
+ * @since 2020/12/9
+ **/
+@Component
+@Slf4j
+@RocketMQMessageListener(topic = "${lili.data.rocketmq.prize-topic}", consumerGroup = "${lili.data.rocketmq.prize-group}")
+public class PrizeMessageListener implements RocketMQListener<MessageExt> {
+    @Autowired
+    private PrizeDrawService prizeDrawService;
+    @Autowired
+    private PrizeRecordService prizeRecordService;
+    @Autowired
+    private PrizeNumberService prizeNumberService;
+    @Autowired
+    private PrizeGrantRecordService prizeGrantRecordService;
+    @Autowired
+    private MemberCouponService memberCouponService;
+    @Autowired
+    private  RedissonClient redissonClient;
+
+    private final static String PRIZE_GRANT_KEY = "prize_grant_key:";
+    @Override
+    public void onMessage(MessageExt messageExt) {
+        try {
+            String msg = new String(messageExt.getBody());
+            log.info("鏀跺埌浜嗘娊濂栦俊鎭瘂}",msg);
+            switch (PrizeStatusEnum.valueOf(messageExt.getTags())) {
+                case WIN:
+                    PrizeRecord prizeRecord = JSON.parseObject(msg, PrizeRecord.class);
+                    RLock lock = redissonClient.getLock(PRIZE_GRANT_KEY + prizeRecord.getId());
+                    try {
+                        lock.lock();
+                        PrizeRecord source = prizeRecordService.getById(prizeRecord.getId());
+                        //褰撳墠涓璁板綍涓嶅瓨鍦ㄧ洿鎺ヨ繑鍥�
+                        if (source == null) {
+                            log.info("娌℃湁瀵瑰簲鐨勪腑濂杮}", prizeRecord.getId());
+                            return;
+                        }
+                        //濂栧搧涓嶆槸寰呭彂鏀剧姸鎬佺洿鎺ヨ繑鍥�
+                        if (!PrizeDistributeStatusEnum.WAIT.name().equals(source.getDistributeStatus())) {
+                            log.info("鍙戞斁鐘舵�佷笉鏄緟鍙戞斁{}", prizeRecord.getId());
+                            return;
+                        }
+                        //鎶藉鍗锋槸鍚︿竴鑷�
+                        if (!prizeRecord.getPrizeNumId().equals(source.getPrizeNumId())) {
+                            log.info("鎶藉鍗穒d涓嶄竴鑷磠}", prizeRecord.getId());
+                            return;
+                        }
+                        PrizeDraw prizeDraw = prizeDrawService.getById(prizeRecord.getPrizeId());
+                        if (prizeDraw == null) {
+                            log.info("褰撳墠濂栧搧涓嶅瓨鍦▄}", prizeRecord.getId());
+                            return;
+                        }
+                        PrizeNumber number = prizeNumberService.getById(prizeRecord.getPrizeNumId());
+                        if (number == null) {
+                            log.info("褰撳墠鎶藉鍒镐笉瀛樺湪{}", prizeRecord.getId());
+                            return;
+                        }
+                        if (!PrizeNumberUseEnum.USED.name().equals(number.getUseStatus())) {
+                            log.info("褰撳墠鎶藉鍒镐笉鏄凡浣跨敤鐘舵�亄}", prizeRecord.getId());
+                            return;
+                        }
+                        PrizeGrantRecord grantRecord = prizeGrantRecordService.getById(prizeRecord.getId());
+                        //褰撳墠濂栧搧宸茬粡璁板綍涓嶉渶瑕佸彂鏀�
+                        if (grantRecord != null) {
+                            log.info("褰撳墠涓璁板綍宸茬粡璁板綍{}", prizeRecord.getId());
+                            return;
+                        }
+                        grantRecord = new PrizeGrantRecord();
+                        //璁剧疆id鐩稿悓浣跨敤涓婚敭闃蹭綇閲嶅鍙戞斁
+                        grantRecord.setId(prizeRecord.getId());
+                        grantRecord.setUserId(prizeRecord.getUserId());
+                        grantRecord.setNickName(prizeRecord.getNickName());
+                        grantRecord.setActivityId(prizeRecord.getPrizeActivityId());
+                        grantRecord.setActivityName(prizeRecord.getPrizeActivityName());
+                        grantRecord.setPrizeNumId(prizeRecord.getPrizeNumId());
+                        grantRecord.setPrizeName(prizeRecord.getPrizeName());
+                        grantRecord.setPrizeContent(prizeRecord.getPrizeContent());
+                        grantRecord.setGrantStatus(PrizeGrantStatusEnums.SUCCESS.name());
+                        grantRecord.setPrizeId(prizeRecord.getPrizeId());
+                        source.setDistributeStatus(PrizeDistributeStatusEnum.SUCCESS.name());
+                        prizeGrantRecordService.save(grantRecord);
+                        try {
+                            memberCouponService.receiveCoupon(prizeDraw.getCouponId(), prizeRecord.getUserId() + "", prizeRecord.getNickName());
+                        } catch (Exception e) {
+                            log.error("濂栧搧鍙戞斁澶辫触",e);
+                            log.error("濂栧搧鍙戞斁澶辫触澶辫触鐨刬d鏄瘂}", prizeRecord.getId());
+                            //鎶ラ敊灏辩洿鎺ュ彂鏀惧け璐�
+                            source.setDistributeStatus(PrizeDistributeStatusEnum.FAILED.name());
+                            grantRecord.setGrantStatus(PrizeGrantStatusEnums.FAILED.name());
+                            if (e instanceof ServiceException) {
+                                ResultCode resultCode = ((ServiceException) e).getResultCode();
+                                if (ResultCode.COUPON_NOT_EXIST.equals(resultCode)) {
+                                    grantRecord.setDes(ResultCode.COUPON_NOT_EXIST.message());
+                                } else if (ResultCode.COUPON_RECEIVE_ERROR.equals(resultCode)) {
+                                    grantRecord.setDes(ResultCode.COUPON_RECEIVE_ERROR.message());
+                                } else if (ResultCode.COUPON_NUM_INSUFFICIENT_ERROR.equals(resultCode)) {
+                                    grantRecord.setDes(ResultCode.COUPON_NUM_INSUFFICIENT_ERROR.message());
+                                } else if (ResultCode.COUPON_LIMIT_ERROR.equals(resultCode)) {
+                                    grantRecord.setDes(ResultCode.COUPON_LIMIT_ERROR.message());
+                                }
+                            }
+                        }
+                        prizeGrantRecordService.updateById(grantRecord);
+                        //鏇存柊涓璁板綍琛ㄤ腑鐨勭姸鎬�
+                        prizeRecordService.updateById(source);
+                        break;
+                    } finally {
+                        if (lock.isHeldByCurrentThread()) {
+                            lock.unlock();
+                        }
+                    }
+                default:
+                    log.error("濂栧搧鍙戞斁娌℃湁鍖归厤鐨勬爣绛�");
+                    break;
+            }
+        } catch (Exception e) {
+            log.error("濂栧搧鍙戞斁寮傚父", e);
+        }
+    }
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/AddPrizeNumForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/AddPrizeNumForm.java
new file mode 100644
index 0000000..b5e4c40
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/AddPrizeNumForm.java
@@ -0,0 +1,21 @@
+package cn.lili.modules.lmk.domain.form;
+
+import lombok.Data;
+
+@Data
+public class AddPrizeNumForm {
+    /**
+     * 闇�瑕佹坊鍔犳娊濂栨鏁扮殑鐢ㄦ埛id
+     */
+    private String userId;
+    /**
+     * 娣诲姞绫诲瀷
+     */
+    private String addType;
+    /**
+     *鎶藉娲诲姩id
+     */
+    private String prizeActivityId;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java
index 02f535a..95f4d32 100644
--- a/framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java
@@ -6,6 +6,7 @@
 @Getter
 @AllArgsConstructor
 public enum PrizeUserActionEnum {
+    //todo 鍚庣画璧板悗鍙伴厤缃幏鍙�
     /**
      * 鑾峰彇浼樻儬鍗风殑鏂瑰紡
      */
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 bc0fc1f..c0359cf 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
@@ -420,6 +420,10 @@
             return Result.ok().data(0);
         }
         PrizeDetailVO data = prizeActivityService.prizeInfo(prizeActivityId);
+        String activityCover = data.getActivityCover();
+        if (StringUtils.isNotBlank(activityCover)&&!activityCover.contains("http")) {
+            data.setActivityCover(cosUtil.getPreviewUrl(activityCover));
+        }
         data.getPrizeInfoVOS().forEach(info -> {
             String prizeImg = info.getPrizeImg();
             String prizeCover = info.getPrizeCover();

--
Gitblit v1.8.0