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 | 157 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 140 insertions(+), 17 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 c41225c..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,25 +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.rocketmq.tags.CommentTagsEnum; +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; @@ -37,10 +46,10 @@ import java.time.LocalTime; import java.time.ZoneId; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.function.Function; import java.util.stream.Collectors; +@Slf4j @Service @RequiredArgsConstructor public class PrizeServiceImpl implements PrizeService { @@ -55,6 +64,9 @@ private final RedissonClient redissonClient; 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) { @@ -110,13 +122,13 @@ //褰撳ぉ鎶藉璁板綍姹囨�� List<PrizeRecordTimeVO> prizeRecordListByTime; //杩樿兘鎶藉鍟嗗搧map闆嗗悎 - Map<Long, ActivityRefPrize> canPrizeMap; + Map<String, ActivityRefPrize> canPrizeMap; //寰呮瀯寤烘娊濂栨鐜囧晢鍝侀泦鍚� List<ActivityRefPrize> refPrizeList; //姒傜巼闆嗗悎 List<PrizeProbabilityVO> prizeProbabilityList; //涓鍟嗗搧id - Long prizeWon = null; + String prizeWon = null; prizeActivity = prizeActivityService.getById(prizeId); if (prizeActivity == null) { @@ -127,8 +139,8 @@ if (new Date().after(activityEndtime)) { throw new ServiceException("褰撳墠娲诲姩宸茬粡缁撴潫"); } - if (!EnableStatusEnums.ENABLE.name().equals(prizeActivity.getEnableStatus())) { - throw new ServiceException("娲诲姩杩樻病鏈夊紑濮�"); + if (!PrizeActivityStatusEnum.ON.name().equals(prizeActivity.getEnableStatus())) { + throw new ServiceException("娲诲姩杩樻病鏈夊惎鐢�"); } //鏌ヨ褰撳ぉ鐨勬娊濂栧嵎 LocalDate now = LocalDate.now(); @@ -167,20 +179,20 @@ refPrizes = activityRefPrizeService.list(prizeRefQuery); canPrizeMap = refPrizes.stream().filter(item -> { return item.getRemainNum() > 0; - }).collect(Collectors.toMap(ActivityRefPrize::getPrizeId, Function.identity())); + }).collect(Collectors.toMap(ActivityRefPrize::getId, Function.identity())); prizeRecordTimeQuery = new PrizeRecordTimeQuery(); prizeRecordTimeQuery.setStartTime(beginTime); prizeRecordTimeQuery.setEndTime(endTime); prizeRecordTimeQuery.setRecordActivityId(prizeId); prizeRecordListByTime = prizeRecordService.getPrizeRecordListByTime(prizeRecordTimeQuery); - prizeRecordListByTime.stream().filter(item->{ - return item.getPrizeId() != null; + prizeRecordListByTime.stream().filter(item -> { + return item.getActivityPrizeRefId() != null; }).forEach(item -> { - ActivityRefPrize activityRefPrize = canPrizeMap.get(Long.parseLong(item.getPrizeId())); + ActivityRefPrize activityRefPrize = canPrizeMap.get(item.getActivityPrizeRefId()); if (activityRefPrize != null) { //绉婚櫎褰撴棩涓婇檺鐨勫鍝佸苟涓旀坊鍔犲埌涓嶈兘鎶藉鍟嗗搧涓幓 if (activityRefPrize.getMaxPreDay() <= item.getTotal()) { - canPrizeMap.remove(Long.parseLong(item.getPrizeId())); + canPrizeMap.remove(item.getActivityPrizeRefId()); } } }); @@ -204,7 +216,7 @@ BigDecimal probabilityBegin = BigDecimal.ZERO; for (ActivityRefPrize item : refPrizeList) { PrizeProbabilityVO prizeProbabilityVO = new PrizeProbabilityVO(); - prizeProbabilityVO.setPrizeId(item.getPrizeId()); + prizeProbabilityVO.setActivityPrizeRefId(item.getId()); BigDecimal multiply = item.getPrizeProbability().multiply(BigDecimal.valueOf(100)); BigDecimal[][] position = {{probabilityBegin, multiply.add(probabilityBegin)}}; prizeProbabilityVO.setProbability(position); @@ -213,13 +225,44 @@ } 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]; if (bigDecimal.compareTo(minP) > 0 && bigDecimal.compareTo(maxP) <= 0) { - prizeWon = prizeProbabilityVO.getPrizeId(); + 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) { @@ -263,7 +306,7 @@ if (!update) { throw new ServiceException("褰撳墠娲诲姩澶伀鐖嗕簡璇风◢鍚庡啀璇�"); } - PrizeDraw prizeDraw = prizeDrawService.getById(prizeWon); + PrizeDraw prizeDraw = prizeDrawService.getById(activityRefPrize.getPrizeId()); //鍐欏叆鎶藉璁板綍 PrizeRecord prizeRecord = new PrizeRecord(); prizeRecord.setUserId(Long.parseLong(userId)); @@ -277,7 +320,7 @@ prizeRecord.setPrizeNumId(Long.parseLong(waitUserPrize.getId())); prizeRecord.setActivityPrizeRefId(Long.parseLong(activityRefPrize.getId())); prizeRecord.setDistributeStatus(PrizeDistributeStatusEnum.WAIT.name()); - prizeRecord.setPrizeId(prizeWon); + prizeRecord.setPrizeId(activityRefPrize.getPrizeId()); prizeRecord.setPrizeName(prizeDraw.getPrizeName()); prizeRecord.setPrizeActivityCover(prizeActivity.getActivityCover()); prizeRecord.setPrizeImg(prizeDraw.getPrizeImg()); @@ -287,6 +330,7 @@ // if (!lock.equals(nowLock)) { // throw new RuntimeException("褰撳墠娲诲姩澶伀鐖嗕簡璇风◢鍚庡啀璇�"); // } + String couponId = coupon.getId(); // 璧癿q寮傛澶勭悊 TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { @Override @@ -295,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) { @@ -328,6 +375,13 @@ PrizeActivity activity = prizeActivityService.getById(prizeId); if (activity == null) { throw new RuntimeException("褰撳墠娲诲姩涓嶅瓨鍦�"); + } + Date activityEndtime = activity.getEndTime(); + if (new Date().after(activityEndtime)) { + throw new ServiceException("褰撳墠娲诲姩宸茬粡缁撴潫"); + } + if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) { + throw new ServiceException("娲诲姩杩樻病鏈夊惎鐢�"); } //鑾峰彇鐢ㄦ埛鎶藉娆℃暟 Integer prizeNum = activity.getPrizeNum(); @@ -376,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); } } @@ -408,6 +462,75 @@ @Override public Result prizeInfo(String prizeActivityId) { + if (StringUtils.isBlank(prizeActivityId)) { + 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(); + if (StringUtils.isNotBlank(prizeImg) && !prizeImg.contains("http")) { + info.setPrizeImg(cosUtil.getPreviewUrl(prizeImg)); + } + if (StringUtils.isNotBlank(prizeCover) && !prizeCover.contains("http")) { + info.setPrizeCover(cosUtil.getPreviewUrl(prizeCover)); + } + }); + return Result.ok().data(data); + } + + @Override + 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