From d6a0c57043e8cc20694a3c678bf8e3a8f28f6499 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 29 五月 2025 11:20:14 +0800
Subject: [PATCH] 新增加用户端接口

---
 ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java |  156 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 149 insertions(+), 7 deletions(-)

diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java
index 00834ab..aaec304 100644
--- a/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java
+++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/miniapp/AppLotteryEventController.java
@@ -3,16 +3,16 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 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.UserLotteryEvent;
-import com.ruoyi.goods.api.domain.UserLotteryEventQuestions;
+import com.ruoyi.goods.api.domain.*;
+import com.ruoyi.goods.domain.dto.AnswerQuestionDto;
+import com.ruoyi.goods.domain.dto.LotteryEventQuestionsDto;
 import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo;
 import com.ruoyi.goods.domain.vo.LotteryEventInfoVo;
+import com.ruoyi.goods.domain.vo.LotteryEventQuestionsVo;
 import com.ruoyi.goods.domain.vo.LotteryEventVo;
-import com.ruoyi.goods.service.lottery.ILotteryEventService;
-import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsService;
-import com.ruoyi.goods.service.lottery.IUserLotteryEventService;
+import com.ruoyi.goods.service.lottery.*;
 import com.ruoyi.system.api.domain.dto.LotteryEventListDto;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -23,8 +23,13 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author zhibing.pu
@@ -46,7 +51,14 @@
 	@Resource
 	private IUserLotteryEventQuestionsService userLotteryEventQuestionsService;
 	
+	@Resource
+	private IUserLotteryEventQuestionsAnswersService userLotteryEventQuestionsAnswersService;
 	
+	@Resource
+	private ILotteryEventQuestionsService lotteryEventServiceQuestionsService;
+	
+	@Resource
+	private ILotteryEventQuestionsAnswersService lotteryEventQuestionsAnswersService;
 	
 	
 	@ResponseBody
@@ -103,11 +115,141 @@
 		int count = userLotteryEventService.count(new QueryWrapper<UserLotteryEvent>().eq("lottery_event_id", id).eq("user_id", userId));
 		vo.setParticipation(count > 0);
 		//答题抽奖需要判断是否答题完成
-		if(5 == lotteryEvent.getActivityType()){
+		if (5 == lotteryEvent.getActivityType()) {
 			UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", id).eq("user_id", userId));
 			vo.setContinueAnswer(null != questionsServiceOne ? questionsServiceOne.getStatus() : 0);
+			vo.setAnswerStartTime(null != questionsServiceOne ? questionsServiceOne.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : null);
+			vo.setAnswerTimeLimit(lotteryEvent.getAnsweringTime());
 		}
 		return R.ok(vo);
 	}
 	
+	@ResponseBody
+	@PostMapping("/getLotteryEventQuestions")
+	@ApiOperation(value = "获取答题题目【2.0】", tags = "抽奖活动")
+	public R<LotteryEventQuestionsVo> getLotteryEventQuestions(@RequestBody LotteryEventQuestionsDto dto) {
+		Long userId = SecurityUtils.getUserId();
+		UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", dto.getId()).eq("user_id", userId));
+		LotteryEventQuestionsVo vo = new LotteryEventQuestionsVo();
+		int count = lotteryEventServiceQuestionsService.count(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()));
+		vo.setTotal(count);
+		//没有答题,直接从第一题开始
+		if (null == questionsServiceOne) {
+			if (-1 == dto.getStepOrDown()) {
+				return R.fail("操作失败");
+			}
+			LotteryEventQuestions questions = lotteryEventServiceQuestionsService.getOne(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()).orderByAsc("sort"));
+			vo.setCurrent(1);
+			vo.setName(questions.getName());
+			List<LotteryEventQuestionsAnswers> list = lotteryEventQuestionsAnswersService.list(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_questions_id", questions.getId()));
+			//封装答题
+			List<Map<String, String>> options = list.stream().map(item -> {
+				Map<String, String> map = new HashMap<>();
+				map.put("id", item.getId());
+				map.put("name", item.getAnswer());
+				return map;
+			}).collect(Collectors.toList());
+			vo.setOptions(options);
+		} else {
+			//上一题
+			Integer current = dto.getCurrent();
+			if (-1 == dto.getStepOrDown()) {
+				if (current - 1 <= 0) {
+					return R.fail("操作失败");
+				}
+				current--;
+			} else {
+				//下一题
+				if (current >= count) {
+					return R.fail("操作失败");
+				}
+				current++;
+			}
+			List<LotteryEventQuestions> list = lotteryEventServiceQuestionsService.list(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()).orderByAsc("sort"));
+			LotteryEventQuestions lotteryEventQuestions = list.get(current);
+			vo.setCurrent(current);
+			vo.setName(lotteryEventQuestions.getName());
+			List<LotteryEventQuestionsAnswers> list1 = lotteryEventQuestionsAnswersService.list(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_questions_id", lotteryEventQuestions.getId()));
+			//封装答题
+			List<Map<String, String>> options = list1.stream().map(item -> {
+				Map<String, String> map = new HashMap<>();
+				map.put("id", item.getId());
+				map.put("name", item.getAnswer());
+				return map;
+			}).collect(Collectors.toList());
+			if (-1 == dto.getStepOrDown()) {
+				UserLotteryEventQuestionsAnswers one = userLotteryEventQuestionsAnswersService.getOne(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("lottery_event_id", dto.getId()).eq("user_id", userId).orderByDesc("create_time").last(" limit 0, 1"));
+				if (null != one) {
+					vo.setAnswer(lotteryEventQuestionsAnswersService.getById(one.getLotteryEventQuestionsAnswersId()).getAnswer());
+				}
+			}
+			vo.setOptions(options);
+		}
+		return R.ok(vo);
+	}
+	
+	@ResponseBody
+	@PostMapping("/answerQuestion")
+	@ApiOperation(value = "答题操作【2.0】", tags = "抽奖活动")
+	public R answerQuestion(@RequestBody AnswerQuestionDto dto) {
+		List<LotteryEventQuestions> list = lotteryEventServiceQuestionsService.list(new QueryWrapper<LotteryEventQuestions>().eq("lottery_event_id", dto.getId()).orderByAsc("sort"));
+		LotteryEventQuestions lotteryEventQuestions = list.get(dto.getCurrent());
+		List<LotteryEventQuestionsAnswers> list1 = lotteryEventQuestionsAnswersService.list(new QueryWrapper<LotteryEventQuestionsAnswers>().eq("lottery_event_questions_id", lotteryEventQuestions.getId()));
+		LotteryEventQuestionsAnswers lotteryEventQuestionsAnswers = list1.stream().filter(item -> item.getAnswer().equals(dto.getAnswer())).findAny().orElse(null);
+		//构建答题数据
+		Long userId = SecurityUtils.getUserId();
+		UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", dto.getId()).eq("user_id", userId));
+		if (null == questionsServiceOne) {
+			questionsServiceOne = new UserLotteryEventQuestions();
+			questionsServiceOne.setId(IdUtils.simpleUUID());
+			questionsServiceOne.setUserId(userId);
+			questionsServiceOne.setLotteryEventId(dto.getId());
+			questionsServiceOne.setStatus(1);
+			questionsServiceOne.setCreateTime(LocalDateTime.now());
+			userLotteryEventQuestionsService.save(questionsServiceOne);
+		}
+		//构建或者修改答题数据
+		UserLotteryEventQuestionsAnswers one = userLotteryEventQuestionsAnswersService.getOne(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("lottery_event_question_id", lotteryEventQuestions.getId()).eq("user_id", userId));
+		if (null == one) {
+			one = new UserLotteryEventQuestionsAnswers();
+			one.setId(IdUtils.simpleUUID());
+			one.setLotteryEventId(dto.getId());
+			one.setUserId(userId);
+			one.setLotteryEventQuestionId(lotteryEventQuestions.getId());
+			one.setLotteryEventQuestionsAnswersId(lotteryEventQuestionsAnswers.getId());
+			one.setCreateTime(LocalDateTime.now());
+		}
+		one.setIsCorrect(0);
+		//答案正确
+		if (null != lotteryEventQuestionsAnswers && 1 == lotteryEventQuestionsAnswers.getIsRight()) {
+			one.setIsCorrect(1);
+		}
+		userLotteryEventQuestionsAnswersService.saveOrUpdate(one);
+		return R.ok();
+	}
+	
+	@ResponseBody
+	@PostMapping("/endAnswerQuestion/{id}")
+	@ApiOperation(value = "结束答题【2.0】", tags = "抽奖活动")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "id", value = "抽奖活动id", required = true, dataType = "String", paramType = "path")
+	})
+	public R<Boolean> endAnswerQuestion(@PathVariable("id") String id) {
+		Long userId = SecurityUtils.getUserId();
+		LotteryEvent lotteryEvent = lotteryEventService.getById(id);
+		UserLotteryEventQuestions questionsServiceOne = userLotteryEventQuestionsService.getOne(new QueryWrapper<UserLotteryEventQuestions>().eq("lottery_event_id", id).eq("user_id", userId));
+		questionsServiceOne.setStatus(2);
+		questionsServiceOne.setEndTime(LocalDateTime.now());
+		//计算正确率
+		List<UserLotteryEventQuestionsAnswers> list = userLotteryEventQuestionsAnswersService.list(new QueryWrapper<UserLotteryEventQuestionsAnswers>().eq("lottery_event_id", id).eq("user_id", userId));
+		int count = list.size();
+		int right = list.stream().filter(item -> 1 == item.getIsCorrect()).collect(Collectors.toList()).size();
+		BigDecimal multiply = new BigDecimal(right).divide(new BigDecimal(count), 4, BigDecimal.ROUND_HALF_UP).setScale(4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
+		questionsServiceOne.setCorrectAnswerRate(multiply);
+		userLotteryEventQuestionsService.updateById(questionsServiceOne);
+		if (multiply.compareTo(lotteryEvent.getAccuracy()) >= 0) {
+			return R.ok(true);
+		}
+		return R.ok(false);
+	}
 }

--
Gitblit v1.7.1