QuizServiceImpl.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package nju.seec.helper.service.impl;
  2. import com.google.common.collect.ImmutableMap;
  3. import com.google.common.collect.ImmutableSet;
  4. import nju.seec.helper.aspect.auth.LoginUser;
  5. import nju.seec.helper.aspect.message.Message;
  6. import nju.seec.helper.dao.*;
  7. import nju.seec.helper.dto.quiz.QuizDTO;
  8. import nju.seec.helper.entity.Quiz;
  9. import nju.seec.helper.entity.Slide;
  10. import nju.seec.helper.enums.*;
  11. import nju.seec.helper.exception.HelperException;
  12. import nju.seec.helper.service.QuizService;
  13. import nju.seec.helper.vo.quiz.QuizVO;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.dao.DataIntegrityViolationException;
  16. import org.springframework.data.domain.Page;
  17. import org.springframework.data.domain.Pageable;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Set;
  23. /**
  24. * @author xst
  25. * <p>
  26. * updated by cst
  27. */
  28. @Service
  29. public class QuizServiceImpl implements QuizService {
  30. private final SlideDAO slideDAO;
  31. private final QuizDAO quizDAO;
  32. private final QuizStudentAnswerDAO quizStudentAnswerDAO;
  33. private final ChooseDAO chooseDAO;
  34. private final UserDAO userDAO;
  35. @Autowired
  36. public QuizServiceImpl(SlideDAO slideDAO, QuizDAO quizDAO, QuizStudentAnswerDAO quizStudentAnswerDAO, ChooseDAO chooseDAO, UserDAO userDAO) {
  37. this.slideDAO = slideDAO;
  38. this.quizDAO = quizDAO;
  39. this.quizStudentAnswerDAO = quizStudentAnswerDAO;
  40. this.chooseDAO = chooseDAO;
  41. this.userDAO = userDAO;
  42. }
  43. private static final Map<SlideState, Map<QuizType, QuizState>> MAP = ImmutableMap.of(
  44. SlideState.DRAFT, ImmutableMap.of(
  45. QuizType.BEFORE_CLASS, QuizState.NOT_STARTED,
  46. QuizType.IN_CLASS, QuizState.NOT_STARTED,
  47. QuizType.AFTER_CLASS, QuizState.NOT_STARTED
  48. ),
  49. SlideState.BEFORE_CLASS, ImmutableMap.of(
  50. QuizType.BEFORE_CLASS, QuizState.ONGOING,
  51. QuizType.IN_CLASS, QuizState.NOT_STARTED,
  52. QuizType.AFTER_CLASS, QuizState.NOT_STARTED
  53. ),
  54. SlideState.IN_CLASS, ImmutableMap.of(
  55. QuizType.BEFORE_CLASS, QuizState.CLOSED,
  56. QuizType.IN_CLASS, QuizState.ONGOING,
  57. QuizType.AFTER_CLASS, QuizState.NOT_STARTED
  58. ),
  59. SlideState.AFTER_CLASS, ImmutableMap.of(
  60. QuizType.BEFORE_CLASS, QuizState.CLOSED,
  61. QuizType.IN_CLASS, QuizState.CLOSED,
  62. QuizType.AFTER_CLASS, QuizState.ONGOING
  63. ),
  64. SlideState.FINISH, ImmutableMap.of(
  65. QuizType.BEFORE_CLASS, QuizState.CLOSED,
  66. QuizType.IN_CLASS, QuizState.CLOSED,
  67. QuizType.AFTER_CLASS, QuizState.CLOSED
  68. )
  69. );
  70. @Message(MessageType.QUIZ_NEW)
  71. @Transactional(rollbackFor = Exception.class)
  72. @Override
  73. public QuizVO createQuiz(LoginUser user, QuizDTO quizDTO) {
  74. Slide slide = slideDAO.findSlideById(quizDTO.getSlideId());
  75. Quiz quiz = new Quiz()
  76. .setCourse(slide.getCourse())
  77. .setSlide(slide)
  78. .setTeacher(slide.getTeacher())
  79. .setType(quizDTO.getType())
  80. .setState(MAP.get(slide.getState()).get(quizDTO.getType()))
  81. .setName(quizDTO.getName())
  82. .setMaxSubmitNumber(quizDTO.getMaxSubmitTime())
  83. .setQuestions(quizDTO.getQuestions());
  84. if (!existsAddAuth(user, quiz)) {
  85. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权创建该测试");
  86. }
  87. try {
  88. quiz = quizDAO.save(quiz);
  89. return new QuizVO(quiz);
  90. } catch (DataIntegrityViolationException e) {
  91. throw HelperException.of(ExceptionType.CONFLICT, "创建失败,请检查测试信息是否正确且不与已有测试冲突");
  92. }
  93. }
  94. @Message(MessageType.QUIZ_NEW)
  95. @Transactional(rollbackFor = Exception.class)
  96. @Override
  97. public QuizVO modifyQuiz(LoginUser user, Long quizId, QuizDTO quizDTO) {
  98. Quiz quiz = quizDAO.findQuizById(quizId);
  99. if (existsUpdateAuth(user, quiz)) {
  100. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权修改该测试");
  101. }
  102. if (quizStudentAnswerDAO.existsByQuiz(quiz)) {
  103. throw HelperException.of(ExceptionType.FORBIDDEN, "该测试已有提交,无法修改");
  104. }
  105. try {
  106. quiz = quizDAO.save(quiz
  107. .setType(quizDTO.getType())
  108. .setState(MAP.get(quiz.getSlide().getState()).get(quizDTO.getType()))
  109. .setName(quizDTO.getName())
  110. .setMaxSubmitNumber(quizDTO.getMaxSubmitTime())
  111. .setQuestions(quizDTO.getQuestions()));
  112. return new QuizVO(quiz);
  113. } catch (DataIntegrityViolationException e) {
  114. throw HelperException.of(ExceptionType.CONFLICT, "修改失败,请检查测试信息是否正确且不与已有测试冲突");
  115. }
  116. }
  117. @Transactional(rollbackFor = Exception.class)
  118. @Override
  119. public void deleteQuiz(LoginUser user, Long quizId) {
  120. Quiz quiz = quizDAO.findQuizById(quizId);
  121. if (!existsDelAuth(user, quiz)) {
  122. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权删除该测试");
  123. }
  124. quiz.setDeleteAt(System.currentTimeMillis());
  125. quizDAO.save(quiz);
  126. }
  127. private static final Set<QuizState> STATES_NOT_GET_BY_STUDENT_SET = ImmutableSet.of(QuizState.NOT_STARTED);
  128. @Transactional(readOnly = true)
  129. @Override
  130. public Page<QuizVO> teacherGetQuizzesBySlide(LoginUser user, Long slideId, String key, Pageable pageable) {
  131. return quizDAO.findBySlideAndNameContains(slideDAO.findSlideById(slideId), key, pageable).map(QuizVO::new);
  132. }
  133. @Transactional(readOnly = true)
  134. @Override
  135. public Page<QuizVO> studentGetQuizzesBySlide(LoginUser user, Long slideId, String key, Pageable pageable) {
  136. return quizDAO.findBySlideAndStateNotInAndNameContains(slideDAO.findSlideById(slideId), STATES_NOT_GET_BY_STUDENT_SET, key, pageable).map(QuizVO::new);
  137. }
  138. @Transactional(readOnly = true)
  139. @Override
  140. public Page<QuizVO> teacherGetQuizzesByState(LoginUser user, QuizState state, String key, Pageable pageable) {
  141. return quizDAO.findByTeacherAndStateAndNameContains(userDAO.findUserById(user.getId()), state, key, pageable).map(QuizVO::new);
  142. }
  143. @Transactional(readOnly = true)
  144. @Override
  145. public Page<QuizVO> studentGetQuizzesByState(LoginUser user, QuizState state, String key, Pageable pageable) {
  146. if (STATES_NOT_GET_BY_STUDENT_SET.contains(state)) {
  147. throw HelperException.of(ExceptionType.FORBIDDEN, "您暂时无法获取该状态的测试");
  148. }
  149. Set<Long> courseIds = chooseDAO.findCourseIdsByStudentId(user.getId());
  150. return quizDAO.findByCourseIdInAndStateAndNameContains(courseIds, state, key, pageable).map(QuizVO::new);
  151. }
  152. @Transactional(readOnly = true)
  153. @Override
  154. public QuizVO getOneQuiz(LoginUser user, Long quizId) {
  155. Quiz quiz = quizDAO.findQuizById(quizId);
  156. if (!existsGetAuth(user, quiz)) {
  157. throw HelperException.of(ExceptionType.FORBIDDEN, "您无权查看该测试");
  158. }
  159. return new QuizVO(quiz);
  160. }
  161. @Message(MessageType.QUIZ_NEW)
  162. @Transactional(rollbackFor = Exception.class)
  163. @Override
  164. public void modifyQuizState(Slide slide) {
  165. List<Quiz> quizzes = quizDAO.findBySlide(slide);
  166. quizzes.forEach(quiz -> quiz.setState(MAP.get(slide.getState()).get(quiz.getType())));
  167. }
  168. @Override
  169. public boolean existsAddAuth(LoginUser user, Quiz quiz) {
  170. return quiz.getCourse().getTeacher().getId().equals(user.getId());
  171. }
  172. @Override
  173. public boolean existsDelAuth(LoginUser user, Quiz quiz) {
  174. return quiz.getTeacher().getId().equals(user.getId());
  175. }
  176. @Override
  177. public boolean existsUpdateAuth(LoginUser user, Quiz quiz) {
  178. return quiz.getTeacher().getId().equals(user.getId());
  179. }
  180. @Override
  181. public boolean existsGetAuth(LoginUser user, Quiz quiz) {
  182. return user.getRole() == UserRole.TEACHER
  183. || !STATES_NOT_GET_BY_STUDENT_SET.contains(quiz.getState());
  184. }
  185. }