Browse Source

提交练习

yangfeng 1 year ago
parent
commit
45b45b2a1d

+ 3 - 3
web/src/main/java/com/ynfy/buss/exam/exam/service/impl/ExamServiceImpl.java

@@ -616,13 +616,13 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
                 //单选,多选,判断题获取并设置答案
                 String[] answers = o.getAnswers();
                 if (!userExamQuestion.getQuestionType().equals(QuestionType.BLANK.getCode())) {
-                    if (!Objects.isNull(o.getAnswers()) && o.getAnswers().length > 0) {
+                    if (!Objects.isNull(answers) && answers.length > 0) {
                         userExamQuestion.setAnswer(String.join(",", answers));
                     }
                 }
 
                 //填空题获取答案
-                String blankAwnswer = o.getBlankAnswer();
+                String blankAnswer = o.getBlankAnswer();
 
                 //提交的答案和题目答案对比
                 Question question = questionMap.get(userExamQuestion.getQuestionId());
@@ -640,7 +640,7 @@ public class ExamServiceImpl extends ServiceImpl<ExamMapper, Exam> implements IE
                         }
                         break;
                     case BLANK: //填空题
-                        score += compareBlankToScore(userExamQuestion, blankAwnswer, question, userExamQuestion.getCanBlankOption());
+                        score += compareBlankToScore(userExamQuestion, blankAnswer, question, userExamQuestion.getCanBlankOption());
                         break;
                 }
             }

+ 3 - 3
web/src/main/java/com/ynfy/buss/practice/userpractice/controller/UserPracticeController.java

@@ -3,8 +3,8 @@ package com.ynfy.buss.practice.userpractice.controller;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ynfy.buss.exam.exam.dto.ExamSubmitDTO;
 import com.ynfy.buss.practice.userpractice.entity.UserPractice;
+import com.ynfy.buss.practice.userpractice.entity.dto.UserPracticeDTO;
 import com.ynfy.buss.practice.userpractice.service.IUserPracticeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -176,9 +176,9 @@ public class UserPracticeController extends JeecgController<UserPractice, IUserP
      *
      * @return
      */
-    @ApiOperation(value = "考试-交卷")
+    @ApiOperation(value = "提交练习")
     @PostMapping(value = "/submitPractice")
-    public Result<?> submitPractice(@RequestBody ExamSubmitDTO dto) {
+    public Result<?> submitPractice(@RequestBody UserPracticeDTO dto) {
         userPracticeService.submitPractice(dto);
         return Result.ok("提交练习成功!");
     }

+ 2 - 2
web/src/main/java/com/ynfy/buss/practice/userpractice/entity/UserPractice.java

@@ -70,13 +70,13 @@ public class UserPractice implements Serializable {
      */
     @Excel(name = "答对数量", width = 15)
     @ApiModelProperty(value = "答对数量")
-    private String rightNumber;
+    private Integer rightNumber;
     /**
      * 总题数量
      */
     @Excel(name = "总题数量", width = 15)
     @ApiModelProperty(value = "总题数量")
-    private String totalNumber;
+    private Integer totalNumber;
     /**
      * 正确率
      */

+ 40 - 0
web/src/main/java/com/ynfy/buss/practice/userpractice/entity/dto/PracticeQuestionDTO.java

@@ -0,0 +1,40 @@
+package com.ynfy.buss.practice.userpractice.entity.dto;
+
+import lombok.Data;
+
+@Data
+public class PracticeQuestionDTO {
+
+    /**
+     * 题目id
+     */
+    private String id;
+
+    /**
+     * 题目类型
+     */
+    private Integer type;
+
+    /**
+     * 所属题库
+     */
+    private String repositoryId;
+
+    /**
+     * 是否已答
+     */
+    private Boolean answered;
+
+
+    /**
+     * 是否正确
+     */
+    private Boolean isRight;
+
+    /**
+     * 题目序号
+     */
+    private Integer questionIndex;
+}
+
+

+ 36 - 0
web/src/main/java/com/ynfy/buss/practice/userpractice/entity/dto/UserPracticeDTO.java

@@ -0,0 +1,36 @@
+package com.ynfy.buss.practice.userpractice.entity.dto;
+
+
+import com.ynfy.buss.exam.exam.dto.ExamAnswerDTO;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 提交练习
+ */
+@Data
+public class UserPracticeDTO {
+
+    /**
+     * 题库id
+     */
+    private String repositoryId;
+
+    /**
+     * 练习模式:1.顺序练习,2.随机练习,3.题型练习
+     */
+    private Integer mode;
+
+    /**
+     * 题型
+     */
+    private Integer questionType;
+
+    private List<PracticeQuestionDTO> questionList;
+
+    /**
+     * 答案
+     */
+    private List<ExamAnswerDTO> answers;
+}

+ 2 - 2
web/src/main/java/com/ynfy/buss/practice/userpractice/service/IUserPracticeService.java

@@ -1,8 +1,8 @@
 package com.ynfy.buss.practice.userpractice.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ynfy.buss.exam.exam.dto.ExamSubmitDTO;
 import com.ynfy.buss.practice.userpractice.entity.UserPractice;
+import com.ynfy.buss.practice.userpractice.entity.dto.UserPracticeDTO;
 
 import java.util.List;
 
@@ -22,5 +22,5 @@ public interface IUserPracticeService extends IService<UserPractice> {
      */
     List<UserPractice> getRecentPractice();
 
-    void submitPractice(ExamSubmitDTO dto);
+    void submitPractice(UserPracticeDTO dto);
 }

+ 64 - 9
web/src/main/java/com/ynfy/buss/practice/userpractice/service/impl/UserPracticeServiceImpl.java

@@ -1,28 +1,37 @@
 package com.ynfy.buss.practice.userpractice.service.impl;
 
+import cn.hutool.core.util.NumberUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ynfy.buss.exam.exam.dto.ExamSubmitDTO;
+import com.ynfy.buss.exam.exam.dto.ExamAnswerDTO;
+import com.ynfy.buss.exam.question.enums.QuestionType;
 import com.ynfy.buss.practice.userpractice.entity.UserPractice;
+import com.ynfy.buss.practice.userpractice.entity.dto.PracticeQuestionDTO;
+import com.ynfy.buss.practice.userpractice.entity.dto.UserPracticeDTO;
 import com.ynfy.buss.practice.userpractice.mapper.UserPracticeMapper;
 import com.ynfy.buss.practice.userpractice.service.IUserPracticeService;
+import com.ynfy.buss.practice.userpracticequestion.entity.UserPracticeQuestion;
+import com.ynfy.buss.practice.userpracticequestion.service.IUserPracticeQuestionService;
 import org.apache.shiro.SecurityUtils;
+import org.jeecg.common.exception.JeecgBootException;
 import org.jeecg.common.system.vo.LoginUser;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
-/**
- * @Description: 用户练习表
- * @Author: jeecg-boot
- * @Date: 2023-11-19
- * @Version: V1.0
- */
 @Service
 public class UserPracticeServiceImpl extends ServiceImpl<UserPracticeMapper, UserPractice> implements IUserPracticeService {
 
+    @Autowired
+    private IUserPracticeQuestionService userPracticeQuestionService;
+
     /**
      * 获取用户最近的练习
      *
@@ -41,7 +50,53 @@ public class UserPracticeServiceImpl extends ServiceImpl<UserPracticeMapper, Use
     }
 
     @Override
-    public void submitPractice(ExamSubmitDTO dto) {
-
+    @Transactional(rollbackFor = Exception.class)
+    public void submitPractice(UserPracticeDTO dto) {
+        if (CollectionUtils.isEmpty(dto.getQuestionList())) {
+            throw new JeecgBootException("练习题目为空");
+        }
+        UserPractice userPractice = new UserPractice();
+        LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+        userPractice.setUserId(user.getId());
+        userPractice.setType(1);
+        userPractice.setRepositoryId(dto.getRepositoryId());
+        userPractice.setMode(dto.getMode());
+        userPractice.setQuestionType(dto.getQuestionType());
+        List<PracticeQuestionDTO> questionList = dto.getQuestionList();
+        Long count = questionList.stream().filter(q -> !Objects.isNull(q.getIsRight()) && q.getIsRight()).count();
+        userPractice.setRightNumber(count.intValue());
+        userPractice.setTotalNumber(questionList.size());
+        //正确率
+        userPractice.setAccuracy(NumberUtil.div(NumberUtil.mul(count.intValue(), 100), questionList.size(), 2));
+        save(userPractice);
+        String userPracticeId = userPractice.getId();
+        List<ExamAnswerDTO> answerList = dto.getAnswers();
+        int sort = 1;
+        List<UserPracticeQuestion> userPracticeQuestionList = new ArrayList<>();
+        for (PracticeQuestionDTO item : questionList) {
+            UserPracticeQuestion upq = new UserPracticeQuestion();
+            upq.setUserPracticeId(userPracticeId);
+            upq.setQuestionId(item.getId());
+            upq.setQuestionType(item.getType());
+            upq.setAnswered(item.getAnswered());
+            upq.setIsRight(item.getIsRight());
+            upq.setSort(sort);
+            ExamAnswerDTO answerDTO = answerList.stream().filter(a -> a.getIndex().equals(item.getQuestionIndex())).findFirst().orElse(null);
+            if (!Objects.isNull(answerDTO)) {
+                String[] answers = answerDTO.getAnswers();
+                if (!item.getType().equals(QuestionType.BLANK.getCode())) { //单选,多选,判断
+                    if (!Objects.isNull(answers) && answers.length > 0) {
+                        upq.setAnswer(String.join(",", answers));
+                    }
+                } else {//填空
+                    upq.setAnswer(answerDTO.getBlankAnswer());
+                }
+            }
+            userPracticeQuestionList.add(upq);
+            sort++;
+        }
+        if (!CollectionUtils.isEmpty(userPracticeQuestionList)) {
+            userPracticeQuestionService.saveBatch(userPracticeQuestionList);
+        }
     }
 }

+ 1 - 6
web/src/main/java/com/ynfy/buss/practice/userpracticequestion/entity/UserPracticeQuestion.java

@@ -77,12 +77,7 @@ public class UserPracticeQuestion implements Serializable {
     @Excel(name = "答案", width = 15)
     @ApiModelProperty(value = "答案")
     private String answer;
-    /**
-     * 按序作答
-     */
-    @Excel(name = "按序作答", width = 15)
-    @ApiModelProperty(value = "按序作答")
-    private Boolean canBlankOption;
+
     /**
      * 创建人
      */