|
|
@@ -109,7 +109,7 @@ public class PaperService {
|
|
|
}
|
|
|
|
|
|
public PageList<PaperView> getExamPapers(PaperQuery paperQuery) {
|
|
|
- long loginUser = paperQuery.getLoginUser();
|
|
|
+ long loginUser = UserContext.getUser();
|
|
|
int total = paperMapper.countByCriteria(paperQuery);
|
|
|
Page page = paperQuery.getPage();
|
|
|
List<Paper> list = paperMapper.findPaperByPage(page, paperQuery);
|
|
|
@@ -187,32 +187,71 @@ public class PaperService {
|
|
|
return questionInfo;
|
|
|
}
|
|
|
|
|
|
- public PaperDetail getPaperDetail(int paperId, int viewType) {
|
|
|
+ public PaperDetail getPaperDetail(int paperId, int viewType, long userId) {
|
|
|
long loginUser = UserContext.getUser();
|
|
|
ExamUser examUser = examUserMapper.findExamUser(paperId, loginUser);
|
|
|
if (examUser == null) {
|
|
|
- return null;
|
|
|
+ // 用户没有访问试卷的权限
|
|
|
+ return new PaperDetail(paperId, 1);
|
|
|
}
|
|
|
|
|
|
- int paperStatus = 1;
|
|
|
Paper paper = paperMapper.findById(paperId);
|
|
|
- int markType = paper.getMarkType();
|
|
|
int role = examUser.getRole();
|
|
|
|
|
|
Map<Long, QuestionAnswer> paperAnswers;
|
|
|
if (viewType == PaperViewType.PaperPreview.getCode()) {
|
|
|
+ if (role > 1) {
|
|
|
+ // 用户只有做题的权限
|
|
|
+ return new PaperDetail(paperId, 3);
|
|
|
+ }
|
|
|
+
|
|
|
paperAnswers = getPaperAnswersFromCorrect(paperId);
|
|
|
} else if (viewType == PaperViewType.PaperExam.getCode()) {
|
|
|
+ if (role == 1) {
|
|
|
+ // 用户只有管理的权限
|
|
|
+ return new PaperDetail(paperId, 2);
|
|
|
+ }
|
|
|
+
|
|
|
paperAnswers = getPaperAnswersFromCache(paperId, loginUser);
|
|
|
} else if (viewType == PaperViewType.PaperMark.getCode()) {
|
|
|
- paperAnswers = getPaperAnswersFromResult(paperId, loginUser);
|
|
|
+ int markType = paper.getMarkType();
|
|
|
+ if (markType == 2) {
|
|
|
+ // 自己批改
|
|
|
+ if (role > 1) {
|
|
|
+ // 试卷由用户自己批改
|
|
|
+ return new PaperDetail(paperId, 4);
|
|
|
+ }
|
|
|
+ } else if (markType == 3) {
|
|
|
+ // 他人批改
|
|
|
+ if (role > 1) {
|
|
|
+ // 用户只有做题的权限
|
|
|
+ return new PaperDetail(paperId, 3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 批改试卷不需要客观题
|
|
|
+ paperAnswers = getPaperAnswersFromResult(paperId, loginUser, false);
|
|
|
} else if (viewType == PaperViewType.PaperResult.getCode()) {
|
|
|
- paperAnswers = getPaperAnswersFromResult(paperId, loginUser);
|
|
|
+ if (role == 1) {
|
|
|
+ // 用户只有管理的权限
|
|
|
+ return new PaperDetail(paperId, 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ paperAnswers = getPaperAnswersFromResult(paperId, loginUser, true);
|
|
|
} else {
|
|
|
- paperAnswers = getEmptyPaperAnswers(paperId);
|
|
|
+ // 试卷访问类型 viewType 未知
|
|
|
+ return new PaperDetail(paperId, 5);
|
|
|
}
|
|
|
|
|
|
+ int paperStatus = 6;
|
|
|
+ Set<Integer> questionTypes = paperAnswers.values().stream()
|
|
|
+ .collect(Collectors.groupingBy(QuestionAnswer::getQuestionType))
|
|
|
+ .keySet();
|
|
|
Map<Integer, List<QuestionInfo>> questionMap = getPaperQuestions(paperId).stream()
|
|
|
+ .filter(questionInfo -> {
|
|
|
+ int questionType = questionInfo.getQuestionType();
|
|
|
+ return questionTypes.contains(questionType);
|
|
|
+ })
|
|
|
.collect(Collectors.groupingBy(QuestionInfo::getQuestionType));
|
|
|
UserResult userResult = new UserResult(paperId, paperAnswers);
|
|
|
return new PaperDetail(paper, paperStatus, questionMap, userResult);
|
|
|
@@ -290,7 +329,7 @@ public class PaperService {
|
|
|
return map;
|
|
|
}
|
|
|
|
|
|
- private Map<Long, QuestionAnswer> getPaperAnswersFromResult(int paperId, long userId) {
|
|
|
+ private Map<Long, QuestionAnswer> getPaperAnswersFromResult(int paperId, long userId, boolean hasObjective) {
|
|
|
PaperResult paperResult = getPaperResult(paperId, userId);
|
|
|
if (paperResult == null) {
|
|
|
log.error("userId:{} 的试卷 paperId:{} 结果不存在", userId, paperId);
|
|
|
@@ -298,7 +337,7 @@ public class PaperService {
|
|
|
}
|
|
|
|
|
|
int resultId = paperResult.getId();
|
|
|
- return getPaperAnswersFromResult0(paperId, resultId);
|
|
|
+ return getPaperAnswersFromResult0(paperId, resultId, hasObjective);
|
|
|
}
|
|
|
|
|
|
private PaperResult getPaperResult(int paperId, long userId) {
|
|
|
@@ -311,11 +350,16 @@ public class PaperService {
|
|
|
return list.isEmpty() ? null : list.get(0);
|
|
|
}
|
|
|
|
|
|
- private Map<Long, QuestionAnswer> getPaperAnswersFromResult0(int paperId, int resultId) {
|
|
|
+ private Map<Long, QuestionAnswer> getPaperAnswersFromResult0(int paperId, int resultId, boolean hasObjective) {
|
|
|
Map<Long, QuestionAnswer> map = new HashMap<>();
|
|
|
List<PaperAnswer> paperAnswerList = paperAnswerMapper.findByResultId(resultId);
|
|
|
paperAnswerList.forEach(paperAnswer -> {
|
|
|
long questionId = paperAnswer.getQuestionId();
|
|
|
+ int questionType = paperAnswer.getQuestionType();
|
|
|
+ if (questionType <= QuestionType.QUESTION3.getCode() && !hasObjective) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
PaperQuestion paperQuestion = paperQuestionMapper.findPaperQuestion(paperId, questionId);
|
|
|
int correctScore = paperQuestion.getScore();
|
|
|
QuestionAnswer questionAnswer = new QuestionAnswer(paperAnswer, correctScore);
|
|
|
@@ -343,10 +387,22 @@ public class PaperService {
|
|
|
String submitAnswer = paperAnswer.getAnswer();
|
|
|
List<Object> submitAnswerList;
|
|
|
if (type == QuestionType.QUESTION1.getCode() || type == QuestionType.QUESTION3.getCode()) {
|
|
|
+ // 单选题和判断题前端使用 radio, 需要 int 类型来表示选中的 radio
|
|
|
submitAnswerList = List.of(Integer.parseInt(submitAnswer));
|
|
|
} else if (type == QuestionType.QUESTION2.getCode()) {
|
|
|
+ // 多选题前端使用 checkbox, 使用 string[] 来表示选中的 checkbox
|
|
|
String[] answerArr = submitAnswer.split(",");
|
|
|
submitAnswerList = List.of(answerArr);
|
|
|
+ } else if (type == QuestionType.QUESTION4.getCode()) {
|
|
|
+ // 填空题
|
|
|
+ String[] answerArr = submitAnswer.split(",");
|
|
|
+ submitAnswerList = List.of(answerArr);
|
|
|
+ } else if (type == QuestionType.QUESTION5.getCode()) {
|
|
|
+ // 问答题
|
|
|
+ submitAnswerList = List.of(submitAnswer);
|
|
|
+ } else if (type == QuestionType.QUESTION6.getCode()) {
|
|
|
+ // 组合题
|
|
|
+ submitAnswerList = List.of(submitAnswer);
|
|
|
} else {
|
|
|
submitAnswerList = List.of(submitAnswer);
|
|
|
}
|