|
@@ -2,7 +2,16 @@ package nju.seec.helper.service.impl;
|
|
|
|
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
import nju.seec.helper.api.bok.QuestionApi;
|
|
import nju.seec.helper.api.bok.QuestionApi;
|
|
|
|
|
+import nju.seec.helper.api.bok.QuestionQueryApi;
|
|
|
|
|
+import nju.seec.helper.api.bok.RecordApi;
|
|
|
|
|
+import nju.seec.helper.api.bok.UserInteractiveApi;
|
|
|
|
|
+import nju.seec.helper.api.bok.dto.CollectDTO;
|
|
|
|
|
+import nju.seec.helper.api.bok.dto.RateDTO;
|
|
|
|
|
+import nju.seec.helper.api.bok.vo.InteractiveVO;
|
|
|
|
|
+import nju.seec.helper.api.bok.vo.QuestionVO;
|
|
|
|
|
+import nju.seec.helper.api.bok.vo.RecordQuestionVO;
|
|
|
import nju.seec.helper.aspect.auth.LoginUser;
|
|
import nju.seec.helper.aspect.auth.LoginUser;
|
|
|
|
|
+import nju.seec.helper.dao.ChooseDAO;
|
|
|
import nju.seec.helper.dao.QuestionRecordDAO;
|
|
import nju.seec.helper.dao.QuestionRecordDAO;
|
|
|
import nju.seec.helper.dao.QuizDAO;
|
|
import nju.seec.helper.dao.QuizDAO;
|
|
|
import nju.seec.helper.dao.UserDAO;
|
|
import nju.seec.helper.dao.UserDAO;
|
|
@@ -15,7 +24,6 @@ import nju.seec.helper.enums.UserRole;
|
|
|
import nju.seec.helper.exception.HelperException;
|
|
import nju.seec.helper.exception.HelperException;
|
|
|
import nju.seec.helper.service.QuestionService;
|
|
import nju.seec.helper.service.QuestionService;
|
|
|
import nju.seec.helper.vo.question.BaseQuestionVO;
|
|
import nju.seec.helper.vo.question.BaseQuestionVO;
|
|
|
-import nju.seec.helper.vo.question.BokQuestionVO;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.domain.Page;
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.PageImpl;
|
|
import org.springframework.data.domain.PageImpl;
|
|
@@ -23,6 +31,7 @@ import org.springframework.data.domain.Pageable;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
|
|
+import java.util.Collections;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
@@ -37,22 +46,36 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
private final QuizDAO quizDAO;
|
|
private final QuizDAO quizDAO;
|
|
|
private final UserDAO userDAO;
|
|
private final UserDAO userDAO;
|
|
|
private final QuestionRecordDAO questionRecordDAO;
|
|
private final QuestionRecordDAO questionRecordDAO;
|
|
|
|
|
+ private final ChooseDAO chooseDAO;
|
|
|
|
|
|
|
|
private final QuestionApi questionApi;
|
|
private final QuestionApi questionApi;
|
|
|
|
|
+ private final QuestionQueryApi questionQueryApi;
|
|
|
|
|
+ private final UserInteractiveApi userInteractiveApi;
|
|
|
|
|
+ private final RecordApi recordApi;
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
public QuestionServiceImpl(QuizDAO quizDAO
|
|
public QuestionServiceImpl(QuizDAO quizDAO
|
|
|
, UserDAO userDAO
|
|
, UserDAO userDAO
|
|
|
- , QuestionRecordDAO questionRecordDAO, QuestionApi questionApi) {
|
|
|
|
|
|
|
+ , QuestionRecordDAO questionRecordDAO
|
|
|
|
|
+ , ChooseDAO chooseDAO
|
|
|
|
|
+ , QuestionApi questionApi
|
|
|
|
|
+ , QuestionQueryApi questionQueryApi
|
|
|
|
|
+ , UserInteractiveApi userInteractiveApi
|
|
|
|
|
+ , RecordApi recordApi
|
|
|
|
|
+ ) {
|
|
|
this.quizDAO = quizDAO;
|
|
this.quizDAO = quizDAO;
|
|
|
this.userDAO = userDAO;
|
|
this.userDAO = userDAO;
|
|
|
this.questionRecordDAO = questionRecordDAO;
|
|
this.questionRecordDAO = questionRecordDAO;
|
|
|
|
|
+ this.chooseDAO = chooseDAO;
|
|
|
this.questionApi = questionApi;
|
|
this.questionApi = questionApi;
|
|
|
|
|
+ this.questionQueryApi = questionQueryApi;
|
|
|
|
|
+ this.userInteractiveApi = userInteractiveApi;
|
|
|
|
|
+ this.recordApi = recordApi;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public Page<BaseQuestionVO> getQuestions(LoginUser user, String stem, Pageable pageable) {
|
|
|
|
|
- return questionApi.bokFindByStemLike(stem, pageable).map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true));
|
|
|
|
|
|
|
+ public Page<BaseQuestionVO> getQuestions(LoginUser user, String stem, String tag, String knowledgeId, Pageable pageable) {
|
|
|
|
|
+ return questionApi.getQuestionList(stem, tag, knowledgeId, pageable).map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
@Transactional(readOnly = true)
|
|
@@ -60,7 +83,7 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
public List<BaseQuestionVO> getQuestionsByQuiz(LoginUser user, Long quizId) {
|
|
public List<BaseQuestionVO> getQuestionsByQuiz(LoginUser user, Long quizId) {
|
|
|
Quiz quiz = quizDAO.findQuizById(quizId);
|
|
Quiz quiz = quizDAO.findQuizById(quizId);
|
|
|
List<String> questionIds = quiz.getQuestions();
|
|
List<String> questionIds = quiz.getQuestions();
|
|
|
- return questionApi.bokFindByIdIn(questionIds)
|
|
|
|
|
|
|
+ return questionQueryApi.getQuestionListById(questionIds)
|
|
|
.stream()
|
|
.stream()
|
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, quiz.getState() == QuizState.CLOSED || user.getRole() == UserRole.TEACHER))
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, quiz.getState() == QuizState.CLOSED || user.getRole() == UserRole.TEACHER))
|
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
@@ -70,7 +93,7 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
@Override
|
|
@Override
|
|
|
public List<BaseQuestionVO> getQuestionsByQuiz(Quiz quiz) {
|
|
public List<BaseQuestionVO> getQuestionsByQuiz(Quiz quiz) {
|
|
|
List<String> questionIds = quiz.getQuestions();
|
|
List<String> questionIds = quiz.getQuestions();
|
|
|
- return questionApi.bokFindByIdIn(questionIds)
|
|
|
|
|
|
|
+ return questionQueryApi.getQuestionListById(questionIds)
|
|
|
.stream()
|
|
.stream()
|
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
|
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
@@ -78,7 +101,7 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public BaseQuestionVO getOneQuestion(LoginUser user, String questionId) {
|
|
public BaseQuestionVO getOneQuestion(LoginUser user, String questionId) {
|
|
|
- return BaseQuestionVO.convertBokQuestionToVO(questionApi.bokFindById(questionId), true);
|
|
|
|
|
|
|
+ return BaseQuestionVO.convertBokQuestionToVO(questionApi.getQuestionsById(questionId), true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -90,11 +113,11 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
questionId = IdUtil.fastSimpleUUID();
|
|
questionId = IdUtil.fastSimpleUUID();
|
|
|
} while (questionRecordDAO.existsByQuestionId(questionId));
|
|
} while (questionRecordDAO.existsByQuestionId(questionId));
|
|
|
|
|
|
|
|
- BokQuestionVO bokQuestionVO = questionApi.createQuestion(questionId, baseQuestionDTO);
|
|
|
|
|
|
|
+ QuestionVO questionVO = questionApi.createQuestion(questionId, baseQuestionDTO);
|
|
|
questionRecordDAO.save(new QuestionRecord()
|
|
questionRecordDAO.save(new QuestionRecord()
|
|
|
.setTeacher(userDAO.findUserById(user.getId()))
|
|
.setTeacher(userDAO.findUserById(user.getId()))
|
|
|
- .setQuestionId(bokQuestionVO.getId()));
|
|
|
|
|
- return BaseQuestionVO.convertBokQuestionToVO(bokQuestionVO, true);
|
|
|
|
|
|
|
+ .setQuestionId(questionVO.getId()));
|
|
|
|
|
+ return BaseQuestionVO.convertBokQuestionToVO(questionVO, true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Transactional(readOnly = true)
|
|
@Transactional(readOnly = true)
|
|
@@ -102,9 +125,9 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
public BaseQuestionVO modifyQuestion(LoginUser user, String questionId, BaseQuestionDTO baseQuestionDTO) {
|
|
public BaseQuestionVO modifyQuestion(LoginUser user, String questionId, BaseQuestionDTO baseQuestionDTO) {
|
|
|
QuestionRecord questionRecord = questionRecordDAO.findByTeacherAndQuestionId(userDAO.findUserById(user.getId()), questionId)
|
|
QuestionRecord questionRecord = questionRecordDAO.findByTeacherAndQuestionId(userDAO.findUserById(user.getId()), questionId)
|
|
|
.orElseThrow(() -> HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该问题"));
|
|
.orElseThrow(() -> HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该问题"));
|
|
|
- BokQuestionVO bokQuestionVO = questionApi.modifyQuestion(questionId, baseQuestionDTO);
|
|
|
|
|
|
|
+ QuestionVO questionVO = questionApi.updateQuestion(questionId, baseQuestionDTO);
|
|
|
questionRecordDAO.save(questionRecord);
|
|
questionRecordDAO.save(questionRecord);
|
|
|
- return BaseQuestionVO.convertBokQuestionToVO(bokQuestionVO, true);
|
|
|
|
|
|
|
+ return BaseQuestionVO.convertBokQuestionToVO(questionVO, true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -122,7 +145,7 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
Page<String> questionIdPage = questionRecordDAO.findQuestionIdsByTeacher(userDAO.findUserById(user.getId()), pageable);
|
|
Page<String> questionIdPage = questionRecordDAO.findQuestionIdsByTeacher(userDAO.findUserById(user.getId()), pageable);
|
|
|
|
|
|
|
|
return new PageImpl<>(
|
|
return new PageImpl<>(
|
|
|
- questionApi.bokFindByIdIn(questionIdPage.getContent())
|
|
|
|
|
|
|
+ questionQueryApi.getQuestionListById(questionIdPage.getContent())
|
|
|
.stream()
|
|
.stream()
|
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
|
|
.map(bokQuestion -> BaseQuestionVO.convertBokQuestionToVO(bokQuestion, true))
|
|
|
.collect(Collectors.toList())
|
|
.collect(Collectors.toList())
|
|
@@ -138,7 +161,40 @@ public class QuestionServiceImpl implements QuestionService {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public void starQuestion(LoginUser user, String questionId) {
|
|
|
|
|
- questionApi.starQuestion(String.valueOf(user.getId()), questionId);
|
|
|
|
|
|
|
+ public void collectQuestion(LoginUser user, String questionId, CollectDTO collectDTO) {
|
|
|
|
|
+ userInteractiveApi.collectQuestion(String.valueOf(user.getPid()), questionId, collectDTO);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void rateQuestion(LoginUser user, String questionId, RateDTO rateDTO) {
|
|
|
|
|
+ userInteractiveApi.rateQuestion(String.valueOf(user.getPid()), questionId, rateDTO);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(readOnly = true)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Page<BaseQuestionVO> getCollectedAndRatedQuestions(LoginUser user, Boolean collect, Boolean rate, Pageable pageable) {
|
|
|
|
|
+ return convert(user, userInteractiveApi.getCollectAndRateQuestions(String.valueOf(user.getPid()), collect, rate, pageable));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Transactional(readOnly = true)
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Page<BaseQuestionVO> getCompletedQuestions(LoginUser user, Pageable pageable) {
|
|
|
|
|
+ RecordQuestionVO recordQuestionVO = recordApi.getUserRecordQuestions(String.valueOf(user.getPid()), pageable);
|
|
|
|
|
+ return convert(user, new PageImpl<>(recordQuestionVO.getQuestions(), pageable, recordQuestionVO.getPage().getTotalElements()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<InteractiveVO> getInteractiveList(LoginUser user, String questionId) {
|
|
|
|
|
+ return userInteractiveApi.getInteractive(String.valueOf(user.getPid()), questionId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static final Set<QuizState> HIDE_QUESTION_ANSWER_STATES = Collections.singleton(QuizState.ONGOING);
|
|
|
|
|
+
|
|
|
|
|
+ private Page<BaseQuestionVO> convert(LoginUser user, Page<QuestionVO> questionVOList) {
|
|
|
|
|
+ List<String> hideQuestionIds = quizDAO.findByCourseIdInAndStateIn(chooseDAO.findCourseIdsByStudentId(user.getId()), HIDE_QUESTION_ANSWER_STATES)
|
|
|
|
|
+ .stream()
|
|
|
|
|
+ .flatMap(quiz -> quiz.getQuestions().stream())
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+ return questionVOList.map(questionVO -> BaseQuestionVO.convertBokQuestionToVO(questionVO, !hideQuestionIds.contains(questionVO.getId())));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|