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