From ea1a62ba6484d6c6cb1ca67dcea938a95ba18fc6 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期一, 26 五月 2025 18:26:26 +0800
Subject: [PATCH] 新增加用户端接口

---
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 170 insertions(+), 0 deletions(-)

diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java
index be33f63..5c1bc6a 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java
@@ -1,10 +1,35 @@
 package com.ruoyi.goods.service.impl.lottery;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.uuid.IdUtils;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.goods.api.domain.LotteryEvent;
+import com.ruoyi.goods.api.domain.LotteryEventPrize;
+import com.ruoyi.goods.api.domain.UserLotteryEvent;
+import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo;
+import com.ruoyi.goods.domain.vo.LotteryEventVo;
+import com.ruoyi.goods.domain.vo.UserLotteryEventVo;
 import com.ruoyi.goods.mapper.lottery.LotteryEventMapper;
+import com.ruoyi.goods.service.lottery.ILotteryEventPrizeService;
 import com.ruoyi.goods.service.lottery.ILotteryEventService;
+import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsAnswersService;
+import com.ruoyi.goods.service.lottery.IUserLotteryEventService;
+import com.ruoyi.system.api.service.RemoteCouponService;
+import com.ruoyi.system.api.service.RemoteMemberService;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @author zhibing.pu
@@ -12,4 +37,149 @@
  */
 @Service
 public class LotteryEventServiceImpl extends ServiceImpl<LotteryEventMapper, LotteryEvent> implements ILotteryEventService {
+	
+	@Resource
+	private IUserLotteryEventService userLotteryEventService;
+	
+	@Resource
+	private ILotteryEventPrizeService lotteryEventPrizeService;
+	
+	@Resource
+	private RemoteCouponService remoteCouponService;
+	
+	@Resource
+	private RemoteMemberService remoteMemberService;
+	
+	@Resource
+	private RedissonClient redissonClient;
+	
+	@Resource
+	private IUserLotteryEventQuestionsAnswersService userLotteryEventQuestionsService;
+	
+	
+	/**
+	 * 根据id查询抽奖活动信息
+	 *
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public LotteryEventVo getLotteryEvent(String id) {
+		LotteryEvent lotteryEvent = this.getById(id);
+		//构建返回结果
+		LotteryEventVo vo = new LotteryEventVo();
+		vo.setId(lotteryEvent.getId());
+		vo.setName(lotteryEvent.getName());
+		vo.setActivityProfile(lotteryEvent.getActivityProfile());
+		List<UserLotteryEvent> userLotteryEvents = userLotteryEventService.list(new QueryWrapper<UserLotteryEvent>().eq("lottery_event_id", id));
+		vo.setLaveTimes(lotteryEvent.getTimes() - userLotteryEvents.size());
+		//查询抽检活动奖品
+		List<LotteryEventPrize> lotteryEventPrizeList = lotteryEventPrizeService.list(new QueryWrapper<LotteryEventPrize>().eq("lottery_event_id", id));
+		vo.setPrizeList(lotteryEventPrizeList);
+		
+		//构建我的奖品明细
+		List<UserLotteryEventVo> collect = userLotteryEvents.stream().map(s -> {
+			UserLotteryEventVo userLotteryEventVo = new UserLotteryEventVo();
+			userLotteryEventVo.setName(s.getObjectName());
+			userLotteryEventVo.setPrizeType(s.getPrizeType());
+			userLotteryEventVo.setNumber(s.getNumber());
+			userLotteryEventVo.setVerifyCode(s.getVerifyCode());
+			return userLotteryEventVo;
+		}).collect(Collectors.toList());
+		vo.setYourPrizeList(collect);
+		return vo;
+	}
+	
+	
+	/**
+	 * 抽奖操作
+	 *
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public R lotteryDraw(String id) {
+		Long userId = SecurityUtils.getUserId();
+		LotteryEvent lotteryEvent = this.getById(id);
+		//判断答题抽奖是否满足抽奖条件
+		if (lotteryEvent.getActivityType() == 5) {
+			BigDecimal correctAnswerRate = userLotteryEventQuestionsService.getCorrectAnswerRate(userId, id);
+			if (correctAnswerRate.compareTo(lotteryEvent.getAccuracy()) < 0) {
+				return R.fail("答题抽奖失败,答题正确率低于活动要求");
+			}
+		}
+		
+		//使用redis锁处理高并发
+		RLock lock = redissonClient.getLock("lottery_event::" + userId + "::" + id);
+		try {
+			boolean tryLock = lock.tryLock(30, TimeUnit.SECONDS);
+			if (tryLock) {
+				//判断抽奖次数是否用完
+				int count = userLotteryEventService.count(new QueryWrapper<UserLotteryEvent>().eq("lottery_event_id", id).eq("user_id", userId));
+				if (lotteryEvent.getTimes() <= count) {
+					return R.fail("抽奖次数已用完");
+				}
+				List<LotteryEventPrize> lotteryEventPrizeList = lotteryEventPrizeService.list(new QueryWrapper<LotteryEventPrize>().eq("lottery_event_id", id));
+				//开始抽奖,根据中奖概率来抽奖
+				List<LotteryEventPrize> list = new ArrayList<>();
+				for (LotteryEventPrize lotteryEventPrize : lotteryEventPrizeList) {
+					int winRate = lotteryEventPrize.getWinRate().intValue();
+					for (int i = 0; i < winRate; i++) {
+						LotteryEventPrize event = new LotteryEventPrize();
+						BeanUtil.copyProperties(lotteryEventPrize, event);
+						list.add(event);
+					}
+				}
+				//将待抽奖的集合进行随机排序
+				Collections.shuffle(list);
+				//开始获取随机数
+				int random = new Random().nextInt(list.size());
+				LotteryEventPrize lotteryEventPrize = lotteryEventPrizeList.get(random);
+				//添加中奖商品
+				UserLotteryEvent userLotteryEvent = new UserLotteryEvent();
+				userLotteryEvent.setId(IdUtils.simpleUUID());
+				userLotteryEvent.setUserId(userId);
+				userLotteryEvent.setLotteryEventId(id);
+				userLotteryEvent.setLotteryEventPrizeId(lotteryEventPrize.getId());
+				userLotteryEvent.setPrizeType(lotteryEventPrize.getPrizeType());
+				userLotteryEvent.setObjectId(lotteryEventPrize.getObjectId());
+				userLotteryEvent.setObjectName(lotteryEventPrize.getObjectName());
+				userLotteryEvent.setNumber(lotteryEventPrize.getNumber());
+				//商品需要生成核销码和核销状态
+				if (Arrays.asList(2, 3).contains(lotteryEventPrize.getPrizeType())) {
+					userLotteryEvent.setVerifyCode(IdUtils.simpleUUID());
+					userLotteryEvent.setIsVerify(0);
+				}
+				//中奖优惠券
+				if (1 == lotteryEventPrize.getPrizeType()) {
+					remoteCouponService.addMemberCoupon(lotteryEventPrize.getObjectId(), lotteryEventPrize.getNumber(), userId);
+				}
+				//中奖积分
+				if (4 == lotteryEventPrize.getPrizeType()) {
+					remoteMemberService.addIntegralRecord(lotteryEventPrize.getNumber(), userId, id);
+				}
+				userLotteryEvent.setCreateTime(LocalDateTime.now());
+				userLotteryEventService.save(userLotteryEvent);
+				return R.ok();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			lock.unlock();
+		}
+		return R.fail("抽奖失败");
+	}
+	
+	
+	/**
+	 * 获取APP抽奖列表
+	 *
+	 * @param page
+	 * @param userId
+	 * @return
+	 */
+	@Override
+	public List<AppLotteryEventPageVo> pageAppLotteryEvent(Page<AppLotteryEventPageVo> page, Long userId) {
+		return this.baseMapper.pageAppLotteryEvent(page, userId);
+	}
 }

--
Gitblit v1.7.1