|
|
@@ -1,21 +1,11 @@
|
|
|
package nju.seec.helper.service.impl;
|
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
-import nju.seec.helper.sys.bok.api.QuestionApi;
|
|
|
-import nju.seec.helper.sys.bok.api.QuestionQueryApi;
|
|
|
-import nju.seec.helper.sys.bok.api.RecordApi;
|
|
|
-import nju.seec.helper.sys.bok.api.UserInteractiveApi;
|
|
|
-import nju.seec.helper.sys.bok.dto.CollectDTO;
|
|
|
-import nju.seec.helper.sys.bok.dto.RateDTO;
|
|
|
-import nju.seec.helper.sys.bok.vo.InteractiveVO;
|
|
|
-import nju.seec.helper.sys.bok.vo.QuestionVO;
|
|
|
-import nju.seec.helper.sys.bok.vo.RecordQuestionVO;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import nju.seec.helper.aspect.auth.LoginUser;
|
|
|
-import nju.seec.helper.dao.ChooseDAO;
|
|
|
-import nju.seec.helper.dao.QuestionRecordDAO;
|
|
|
-import nju.seec.helper.dao.QuizDAO;
|
|
|
-import nju.seec.helper.dao.UserDAO;
|
|
|
+import nju.seec.helper.dao.*;
|
|
|
import nju.seec.helper.dto.question.BaseQuestionDTO;
|
|
|
+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;
|
|
|
@@ -23,6 +13,19 @@ import nju.seec.helper.enums.QuizState;
|
|
|
import nju.seec.helper.enums.UserRole;
|
|
|
import nju.seec.helper.exception.HelperException;
|
|
|
import nju.seec.helper.service.QuestionService;
|
|
|
+import nju.seec.helper.sys.bok.api.QuestionApi;
|
|
|
+import nju.seec.helper.sys.bok.api.QuestionQueryApi;
|
|
|
+import nju.seec.helper.sys.bok.api.RecordApi;
|
|
|
+import nju.seec.helper.sys.bok.api.UserInteractiveApi;
|
|
|
+import nju.seec.helper.sys.bok.dto.CollectDTO;
|
|
|
+import nju.seec.helper.sys.bok.dto.RateDTO;
|
|
|
+import nju.seec.helper.sys.bok.dto.RecordDTO;
|
|
|
+import nju.seec.helper.sys.bok.vo.InteractiveVO;
|
|
|
+import nju.seec.helper.sys.bok.vo.QuestionVO;
|
|
|
+import nju.seec.helper.sys.bok.vo.RecordQuestionVO;
|
|
|
+import nju.seec.helper.sys.dataanalysis.api.ExerciseApi;
|
|
|
+import nju.seec.helper.sys.dataanalysis.model.ExerciseRecord;
|
|
|
+import nju.seec.helper.sys.ml.api.RecommendationApi;
|
|
|
import nju.seec.helper.vo.question.BaseQuestionVO;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
@@ -33,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -47,30 +51,39 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
private final UserDAO userDAO;
|
|
|
private final QuestionRecordDAO questionRecordDAO;
|
|
|
private final ChooseDAO chooseDAO;
|
|
|
+ private final CourseDAO courseDAO;
|
|
|
|
|
|
private final QuestionApi questionApi;
|
|
|
private final QuestionQueryApi questionQueryApi;
|
|
|
private final UserInteractiveApi userInteractiveApi;
|
|
|
private final RecordApi recordApi;
|
|
|
+ private final RecommendationApi recommendationApi;
|
|
|
+ private final ExerciseApi exerciseApi;
|
|
|
|
|
|
@Autowired
|
|
|
public QuestionServiceImpl(QuizDAO quizDAO
|
|
|
, UserDAO userDAO
|
|
|
, QuestionRecordDAO questionRecordDAO
|
|
|
, ChooseDAO chooseDAO
|
|
|
+ , CourseDAO courseDAO
|
|
|
, QuestionApi questionApi
|
|
|
, QuestionQueryApi questionQueryApi
|
|
|
, UserInteractiveApi userInteractiveApi
|
|
|
, RecordApi recordApi
|
|
|
+ , RecommendationApi recommendationApi
|
|
|
+ , ExerciseApi exerciseApi
|
|
|
) {
|
|
|
this.quizDAO = quizDAO;
|
|
|
this.userDAO = userDAO;
|
|
|
this.questionRecordDAO = questionRecordDAO;
|
|
|
this.chooseDAO = chooseDAO;
|
|
|
+ this.courseDAO = courseDAO;
|
|
|
this.questionApi = questionApi;
|
|
|
this.questionQueryApi = questionQueryApi;
|
|
|
this.userInteractiveApi = userInteractiveApi;
|
|
|
this.recordApi = recordApi;
|
|
|
+ this.recommendationApi = recommendationApi;
|
|
|
+ this.exerciseApi = exerciseApi;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -80,19 +93,16 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
|
@Override
|
|
|
- public List<BaseQuestionVO> getQuestionsByQuiz(LoginUser user, Long quizId) {
|
|
|
+ public List<BaseQuestionVO> getQuestionsByQuizId(LoginUser user, Long quizId) {
|
|
|
Quiz quiz = quizDAO.findQuizById(quizId);
|
|
|
- List<String> questionIds = quiz.getQuestions();
|
|
|
- return questionQueryApi.getQuestionListById(questionIds)
|
|
|
+ return questionQueryApi.getQuestionListById(quiz.getQuestions())
|
|
|
.stream()
|
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, quiz.getState() == QuizState.CLOSED || user.getRole() == UserRole.TEACHER))
|
|
|
.collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
- @Transactional(readOnly = true)
|
|
|
@Override
|
|
|
- public List<BaseQuestionVO> getQuestionsByQuiz(Quiz quiz) {
|
|
|
- List<String> questionIds = quiz.getQuestions();
|
|
|
+ public List<BaseQuestionVO> getQuestionsByIds(List<String> questionIds) {
|
|
|
return questionQueryApi.getQuestionListById(questionIds)
|
|
|
.stream()
|
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
|
|
|
@@ -188,6 +198,53 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
return userInteractiveApi.getInteractive(String.valueOf(user.getPid()), questionId);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public List<BaseQuestionVO> getRecommendationQuestions(LoginUser user, List<String> knowledgeId, Integer questionNum) {
|
|
|
+ return questionQueryApi.getQuestionListById(recommendationApi.getRecommendResult(String.valueOf(user.getPid()), knowledgeId, questionNum))
|
|
|
+ .stream()
|
|
|
+ .map(questionVO -> BaseQuestionVO.convertBokQuestionToVO(questionVO, true))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(readOnly = true)
|
|
|
+ @Override
|
|
|
+ public List<BaseQuestionVO> getRecommendationQuestionsByCourse(LoginUser user, Long courseId, Integer questionNum) {
|
|
|
+ return this.getRecommendationQuestions(user, courseDAO.findCourseById(courseId).getKnowledgeId(), questionNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void record(LoginUser user, StudentAnswerDTO studentAnswerDTO) {
|
|
|
+ if (studentAnswerDTO.getRecords() == null || studentAnswerDTO.getRecords().isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ // 获取已有信息
|
|
|
+ String userId = String.valueOf(user.getPid());
|
|
|
+
|
|
|
+ Map<String, StudentAnswerDTO.AnswerRecordDTO> recordMap = studentAnswerDTO.getRecords();
|
|
|
+ List<BaseQuestionVO> baseQuestionVOList = questionQueryApi.getQuestionListById(Lists.newArrayList(recordMap.keySet()))
|
|
|
+ .stream()
|
|
|
+ .map(questionVO -> BaseQuestionVO.convertBokQuestionToVO(questionVO, true))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 创建两个列表
|
|
|
+ int size = recordMap.size();
|
|
|
+ List<ExerciseRecord> exerciseRecords = Lists.newArrayListWithExpectedSize(size);
|
|
|
+ List<RecordDTO> records = Lists.newArrayListWithExpectedSize(size);
|
|
|
+
|
|
|
+ // 填充列表
|
|
|
+ baseQuestionVOList.forEach(baseQuestionVO -> {
|
|
|
+ String questionId = baseQuestionVO.getId();
|
|
|
+ StudentAnswerDTO.AnswerRecordDTO answerRecord = recordMap.get(questionId);
|
|
|
+ Object answer = answerRecord.getAnswer();
|
|
|
+ Boolean pass = baseQuestionVO.pass(answer);
|
|
|
+ exerciseRecords.add(exerciseApi.createExerciseRecordDTO(userId, questionId, answerRecord.getStartAt(), answerRecord.getEndAt(), pass));
|
|
|
+ records.add(recordApi.createRecordDTO(userId, questionId, answer, pass, answerRecord.getStartAt(), answerRecord.getEndAt()));
|
|
|
+ });
|
|
|
+
|
|
|
+ exerciseApi.reportExercise(exerciseRecords);
|
|
|
+ recordApi.reportUserRecord(records);
|
|
|
+ }
|
|
|
+
|
|
|
private static final Set<QuizState> HIDE_QUESTION_ANSWER_STATES = Collections.singleton(QuizState.ONGOING);
|
|
|
|
|
|
private Page<BaseQuestionVO> convert(LoginUser user, Page<QuestionVO> questionVOList) {
|