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