Przeglądaj źródła

improvement: 修改测试提交做题情况接口

ChenSiTong 6 lat temu
rodzic
commit
6bbc970345

+ 1 - 1
src/main/java/nju/seec/helper/aspect/record/ExerciseRecordAspect.java

@@ -3,7 +3,7 @@
 //import nju.seec.helper.sys.bok.api.RecordApi;
 //import nju.seec.helper.sys.dataanalysis.api.ExerciseApi;
 //import nju.seec.helper.aspect.auth.LoginUser;
-//import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+//import nju.seec.helper.dto.question.StudentAnswerDTO;
 //import nju.seec.helper.vo.quiz.QuizStudentAnswerVO;
 //import org.aspectj.lang.annotation.AfterReturning;
 //import org.aspectj.lang.annotation.Aspect;

+ 1 - 1
src/main/java/nju/seec/helper/controller/QuestionController.java

@@ -6,7 +6,7 @@ import nju.seec.helper.controller.response.PageResponse;
 import nju.seec.helper.dto.groups.Create;
 import nju.seec.helper.dto.groups.Modify;
 import nju.seec.helper.dto.question.BaseQuestionDTO;
-import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+import nju.seec.helper.dto.question.StudentAnswerDTO;
 import nju.seec.helper.enums.UserRole;
 import nju.seec.helper.service.QuestionService;
 import nju.seec.helper.sys.bok.dto.CollectDTO;

+ 1 - 1
src/main/java/nju/seec/helper/controller/QuizController.java

@@ -10,7 +10,7 @@ import nju.seec.helper.controller.response.PageResponse;
 import nju.seec.helper.dto.groups.Create;
 import nju.seec.helper.dto.groups.Modify;
 import nju.seec.helper.dto.quiz.QuizDTO;
-import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+import nju.seec.helper.dto.question.StudentAnswerDTO;
 import nju.seec.helper.enums.QuizState;
 import nju.seec.helper.enums.UserRole;
 import nju.seec.helper.service.QuizService;

+ 38 - 0
src/main/java/nju/seec/helper/dto/question/StudentAnswerDTO.java

@@ -0,0 +1,38 @@
+package nju.seec.helper.dto.question;
+
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Past;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * @author cst
+ */
+@Data
+public class StudentAnswerDTO implements Serializable {
+    private static final long serialVersionUID = -5846899734313166305L;
+//    @NotEmpty(message = "回答不能为空")
+//    private Map<String, Object> answers;
+
+    @NotNull(message = "缺少做题记录")
+    @Valid
+    private Map<String, AnswerRecordDTO> records;
+
+    @Data
+    public static class AnswerRecordDTO {
+        @NotNull(message = "缺少答案")
+        private Object answer;
+
+        @NotNull(message = "缺少做题开始时间")
+        @Past(message = "开始时间错误")
+        private LocalDateTime startAt;
+
+        @NotNull(message = "缺少做题结束时间")
+        @Past(message = "结束时间错误")
+        private LocalDateTime endAt;
+    }
+}

+ 2 - 1
src/main/java/nju/seec/helper/entity/QuizStudentAnswer.java

@@ -12,6 +12,7 @@ import javax.persistence.Table;
 import javax.persistence.*;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -41,7 +42,7 @@ public class QuizStudentAnswer {
 
     @Type(type = "json")
     @Column(columnDefinition = "json", nullable = false)
-    private Map<String, Object> answers;
+    private Map<String, Object> answers = new HashMap<>();
 
     @Column(name = "submit_at", nullable = false)
     @UpdateTimestamp

+ 1 - 1
src/main/java/nju/seec/helper/service/QuestionService.java

@@ -2,7 +2,7 @@ package nju.seec.helper.service;
 
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.dto.question.BaseQuestionDTO;
-import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+import nju.seec.helper.dto.question.StudentAnswerDTO;
 import nju.seec.helper.sys.bok.dto.CollectDTO;
 import nju.seec.helper.sys.bok.dto.RateDTO;
 import nju.seec.helper.sys.bok.vo.InteractiveVO;

+ 1 - 1
src/main/java/nju/seec/helper/service/QuizStudentAnswerService.java

@@ -1,7 +1,7 @@
 package nju.seec.helper.service;
 
 import nju.seec.helper.aspect.auth.LoginUser;
-import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+import nju.seec.helper.dto.question.StudentAnswerDTO;
 import nju.seec.helper.vo.quiz.QuizStudentAnswerStatisticVO;
 import nju.seec.helper.vo.quiz.QuizStudentAnswerVO;
 import org.springframework.data.domain.Page;

+ 1 - 1
src/main/java/nju/seec/helper/service/impl/QuestionServiceImpl.java

@@ -7,7 +7,7 @@ import nju.seec.helper.dao.QuestionRecordDAO;
 import nju.seec.helper.dao.QuizDAO;
 import nju.seec.helper.dao.UserDAO;
 import nju.seec.helper.dto.question.BaseQuestionDTO;
-import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+import nju.seec.helper.dto.question.StudentAnswerDTO;
 import nju.seec.helper.entity.QuestionRecord;
 import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.enums.ExceptionType;

+ 12 - 6
src/main/java/nju/seec/helper/service/impl/QuizStudentAnswerServiceImpl.java

@@ -1,11 +1,12 @@
 package nju.seec.helper.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.google.common.collect.Maps;
 import nju.seec.helper.aspect.auth.LoginUser;
 import nju.seec.helper.dao.QuizDAO;
 import nju.seec.helper.dao.QuizStudentAnswerDAO;
 import nju.seec.helper.dao.UserDAO;
-import nju.seec.helper.dto.quiz.StudentAnswerDTO;
+import nju.seec.helper.dto.question.StudentAnswerDTO;
 import nju.seec.helper.entity.Quiz;
 import nju.seec.helper.entity.QuizStudentAnswer;
 import nju.seec.helper.entity.User;
@@ -26,7 +27,6 @@ import java.math.RoundingMode;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 
 /**
  * @author cst
@@ -53,7 +53,7 @@ public class QuizStudentAnswerServiceImpl implements QuizStudentAnswerService {
 
         switch (quiz.getState()) {
             case NOT_STARTED:
-                throw HelperException.of(ExceptionType.FORBIDDEN, "测试未开始");
+                throw HelperException.of(ExceptionType.FORBIDDEN, "测试未开始,无法提交");
             case CLOSED:
                 throw HelperException.of(ExceptionType.FORBIDDEN, "测试已关闭,无法提交");
             default:
@@ -65,7 +65,7 @@ public class QuizStudentAnswerServiceImpl implements QuizStudentAnswerService {
         QuizStudentAnswer quizStudentAnswer = quizStudentAnswerDAO.findByQuizAndStudent(quiz, student).orElse(new QuizStudentAnswer());
 
         if (quizStudentAnswer.getSubmitNumber() >= quiz.getMaxSubmitNumber()) {
-            throw HelperException.of(ExceptionType.FORBIDDEN, String.format("已达最大提交次数%d次,无法再提交", quiz.getMaxSubmitNumber()));
+            throw HelperException.of(ExceptionType.FORBIDDEN, StrUtil.format("已达最大提交次数{}次,无法再提交", quiz.getMaxSubmitNumber()));
         }
 
         // 计算得分
@@ -75,10 +75,17 @@ public class QuizStudentAnswerServiceImpl implements QuizStudentAnswerService {
 
         Map<String, StudentAnswerDTO.AnswerRecordDTO> records = studentAnswerDTO.getRecords();
         questionVOList.forEach(baseQuestionVO -> {
+            String questionId = baseQuestionVO.getId();
             Object answer;
-            if ((answer = records.get(baseQuestionVO.getId()).getAnswer()) != null && baseQuestionVO.pass(answer)) {
+            if (records.get(questionId) != null) {
+                answer = records.get(questionId).getAnswer();
+            } else {
+                answer = quizStudentAnswer.getAnswers().get(questionId);
+            }
+            if (baseQuestionVO.pass(answer)) {
                 correct.getAndIncrement();
             }
+            quizStudentAnswer.getAnswers().put(questionId, answer);
         });
 
         BigDecimal score = BigDecimal.valueOf(correct.get() * 100).divide(BigDecimal.valueOf(questionVOList.size()), 2, RoundingMode.HALF_UP);
@@ -87,7 +94,6 @@ public class QuizStudentAnswerServiceImpl implements QuizStudentAnswerService {
         quizStudentAnswer.setQuiz(quiz)
                 .setStudent(student)
                 .setSubmitNumber(quizStudentAnswer.getSubmitNumber() + 1)
-                .setAnswers(records.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, recordEntry -> recordEntry.getValue().getAnswer())))
                 .setScore(score);
 
         questionService.record(user, studentAnswerDTO);

+ 2 - 0
src/main/java/nju/seec/helper/vo/question/BaseQuestionVO.java

@@ -32,6 +32,8 @@ public abstract class BaseQuestionVO {
                 return new ChoiceQuestionVO(questionVO, withAnswer);
             case true_false:
                 return new TrueOrFalseQuestionVO(questionVO, withAnswer);
+//            case multiple_choice:
+//                return new MultipleChoiceQuestionVO(questionVO, withAnswer);
             default:
                 return null;
         }

+ 36 - 0
src/main/java/nju/seec/helper/vo/question/MultipleChoiceQuestionVO.java

@@ -0,0 +1,36 @@
+//package nju.seec.helper.vo.question;
+//
+//import lombok.Data;
+//import lombok.EqualsAndHashCode;
+//import nju.seec.helper.sys.bok.vo.QuestionVO;
+//
+//import java.util.Arrays;
+//
+///**
+// * @author cst
+// */
+//@EqualsAndHashCode(callSuper = true)
+//@Data
+//public class MultipleChoiceQuestionVO extends BaseQuestionVO {
+//    private String[] answer;
+//
+//    public MultipleChoiceQuestionVO(QuestionVO questionVO, boolean withAnswer) {
+//        super(questionVO);
+//
+//        if (withAnswer) {
+//            this.answer = questionVO.getAnswer().split(";");
+//        }
+//    }
+//
+//    @Override
+//    public boolean pass(Object answer) {
+//        if (!(answer instanceof String[])) {
+//            return false;
+//        }
+//
+//        Arrays.sort((String[]) answer);
+//        Arrays.sort(this.answer);
+//
+//        return Arrays.equals((String[]) answer, this.answer);
+//    }
+//}