From 6043c55ce5a3c4f146e20286a707f67d09384674 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期五, 28 六月 2024 16:00:07 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev --- src/main/java/com/ycl/jxkg/service/impl/ExamPaperScoreServiceImpl.java | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 290 insertions(+), 0 deletions(-) diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamPaperScoreServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamPaperScoreServiceImpl.java new file mode 100644 index 0000000..4c8ac51 --- /dev/null +++ b/src/main/java/com/ycl/jxkg/service/impl/ExamPaperScoreServiceImpl.java @@ -0,0 +1,290 @@ +package com.ycl.jxkg.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ycl.jxkg.domain.ExamPaperAnswerInfo; +import com.ycl.jxkg.domain.entity.*; +import com.ycl.jxkg.domain.other.ExamPaperAnswerUpdate; +import com.ycl.jxkg.domain.other.KeyValue; +import com.ycl.jxkg.domain.vo.admin.paper.ExamPaperAnswerPageRequestVO; +import com.ycl.jxkg.domain.vo.student.exam.ExamPaperSubmitItemVO; +import com.ycl.jxkg.domain.vo.student.exam.ExamPaperSubmitVO; +import com.ycl.jxkg.domain.vo.student.exampaper.ExamPaperAnswerPageResponseVO; +import com.ycl.jxkg.domain.vo.student.exampaper.ExamPaperAnswerPageVO; +import com.ycl.jxkg.enums.ExamPaperAnswerStatusEnum; +import com.ycl.jxkg.enums.ExamPaperTypeEnum; +import com.ycl.jxkg.enums.QuestionTypeEnum; +import com.ycl.jxkg.mapper.ExamPaperScoreMapper; +import com.ycl.jxkg.mapper.ExamPaperMapper; +import com.ycl.jxkg.mapper.QuestionMapper; +import com.ycl.jxkg.mapper.TaskExamCustomerAnswerMapper; +import com.ycl.jxkg.service.ExamPaperScoreService; +import com.ycl.jxkg.service.ExamPaperScoreDetailService; +import com.ycl.jxkg.service.TextContentService; +import com.ycl.jxkg.utils.DateTimeUtil; +import com.ycl.jxkg.utils.ExamUtil; +import com.ycl.jxkg.utils.JsonUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ExamPaperScoreServiceImpl extends ServiceImpl<ExamPaperScoreMapper, ExamPaperScore> implements ExamPaperScoreService { + + private final ExamPaperScoreMapper examPaperScoreMapper; + private final ExamPaperMapper examPaperMapper; + private final TextContentService textContentService; + private final QuestionMapper questionMapper; + private final ExamPaperScoreDetailService examPaperScoreDetailService; + private final TaskExamCustomerAnswerMapper taskExamCustomerAnswerMapper; + + + @Override + public PageInfo<ExamPaperScore> studentPage(ExamPaperAnswerPageVO requestVM) { + return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize(), "id desc").doSelectPageInfo(() -> + examPaperScoreMapper.studentPage(requestVM)); + } + + + @Override + public ExamPaperAnswerInfo calculateExamPaperAnswer(ExamPaperSubmitVO examPaperSubmitVO, User user) { + ExamPaperAnswerInfo examPaperAnswerInfo = new ExamPaperAnswerInfo(); + Date now = new Date(); + ExamPaper examPaper = examPaperMapper.selectById(examPaperSubmitVO.getId()); + ExamPaperTypeEnum paperTypeEnum = ExamPaperTypeEnum.fromCode(examPaper.getPaperType()); + //浠诲姟璇曞嵎鍙兘鍋氫竴娆� + if (paperTypeEnum == ExamPaperTypeEnum.RandomOrder) { + ExamPaperScore examPaperScore = examPaperScoreMapper.getByPidUid(examPaperSubmitVO.getId(), user.getId()); + if (null != examPaperScore) + return null; + } + //TODO:寰呭畬鎴� +// String frameTextContent = textContentService.getById(examPaper.getFrameTextContentId()).getContent(); +// List<ExamPaperTitleItemObject> examPaperTitleItemObjects = JsonUtil.toJsonListObject(frameTextContent, ExamPaperTitleItemObject.class); +// List<Integer> questionIds = examPaperTitleItemObjects.stream().flatMap(t -> t.getQuestionItems().stream().map(q -> q.getId())).collect(Collectors.toList()); +// List<Question> questions = questionMapper.selectByIds(questionIds); +// //灏嗛鐩粨鏋勭殑杞寲涓洪鐩瓟妗� +// List<ExamPaperQuestionCustomerAnswer> examPaperQuestionCustomerAnswers = examPaperTitleItemObjects.stream() +// .flatMap(t -> t.getQuestionItems().stream() +// .map(q -> { +// Question question = questions.stream().filter(tq -> tq.getId().equals(q.getId())).findFirst().get(); +// ExamPaperSubmitItemVO customerQuestionAnswer = examPaperSubmitVO.getAnswerItems().stream() +// .filter(tq -> tq.getQuestionId().equals(q.getId())) +// .findFirst() +// .orElse(null); +// return ExamPaperQuestionCustomerAnswerFromVM(question, customerQuestionAnswer, examPaper, q.getItemOrder(), user, now); +// }) +// ).collect(Collectors.toList()); +// +// ExamPaperAnswer examPaperAnswer = ExamPaperAnswerFromVM(examPaperSubmitVO, examPaper, examPaperQuestionCustomerAnswers, user, now); +// examPaperAnswerInfo.setExamPaper(examPaper); +// examPaperAnswerInfo.setExamPaperAnswer(examPaperAnswer); +// examPaperAnswerInfo.setExamPaperQuestionCustomerAnswers(examPaperQuestionCustomerAnswers); + return examPaperAnswerInfo; + } + + @Override + @Transactional + public String judge(ExamPaperSubmitVO examPaperSubmitVO) { +// ExamPaperScore examPaperScore = examPaperScoreMapper.selectById(examPaperSubmitVO.getId()); +// List<ExamPaperSubmitItemVO> judgeItems = examPaperSubmitVO.getAnswerItems().stream().filter(d -> d.getDoRight() == null).collect(Collectors.toList()); +// List<ExamPaperAnswerUpdate> examPaperAnswerUpdates = new ArrayList<>(judgeItems.size()); +// Integer customerScore = examPaperScore.getUserScore(); +// Integer questionCorrect = examPaperScore.getQuestionCorrect(); +// for (ExamPaperSubmitItemVO d : judgeItems) { +// ExamPaperAnswerUpdate examPaperAnswerUpdate = new ExamPaperAnswerUpdate(); +// examPaperAnswerUpdate.setId(d.getId()); +// examPaperAnswerUpdate.setCustomerScore(ExamUtil.scoreFromVM(d.getScore())); +// boolean doRight = examPaperAnswerUpdate.getCustomerScore().equals(ExamUtil.scoreFromVM(d.getQuestionScore())); +// examPaperAnswerUpdate.setDoRight(doRight); +// examPaperAnswerUpdates.add(examPaperAnswerUpdate); +// customerScore += examPaperAnswerUpdate.getCustomerScore(); +// if (examPaperAnswerUpdate.getDoRight()) { +// ++questionCorrect; +// } +// } +// examPaperScore.setUserScore(customerScore); +// examPaperScore.setQuestionCorrect(questionCorrect); +// examPaperScore.setStatus(ExamPaperAnswerStatusEnum.Complete.getCode()); +// examPaperScoreMapper.updateById(examPaperScore); +// examPaperScoreDetailService.updateScore(examPaperAnswerUpdates); +// +// ExamPaperTypeEnum examPaperTypeEnum = ExamPaperTypeEnum.fromCode(examPaperScore.getPaperType()); +// switch (examPaperTypeEnum) { +// case RandomOrder: + //TODO:寰呭畬鎴� + //浠诲姟璇曞嵎鎵规敼瀹屾垚鍚庯紝闇�瑕佹洿鏂颁换鍔$殑鐘舵�� +// ExamPaper examPaper = examPaperMapper.selectById(examPaperAnswer.getExamPaperId()); +// Integer taskId = examPaper.getTaskExamId(); +// Integer userId = examPaperAnswer.getCreateUser(); +// TaskExamCustomerAnswer taskExamCustomerAnswer = taskExamCustomerAnswerMapper.getByTUid(taskId, userId); +// TextContent textContent = textContentService.getById(taskExamCustomerAnswer.getTextContentId()); +// List<TaskItemAnswerObject> taskItemAnswerObjects = JsonUtil.toJsonListObject(textContent.getContent(), TaskItemAnswerObject.class); +// taskItemAnswerObjects.stream() +// .filter(d -> d.getExamPaperAnswerId().equals(examPaperAnswer.getId())) +// .findFirst().ifPresent(taskItemAnswerObject -> taskItemAnswerObject.setStatus(examPaperAnswer.getStatus())); +// textContentService.jsonConvertUpdate(textContent, taskItemAnswerObjects, null); +// textContentService.updateById(textContent); +// break; +// default: +// break; +// } +// return ExamUtil.scoreToVM(customerScore); + return "1"; + } + + @Override + public ExamPaperSubmitVO examPaperAnswerToVM(Integer id) { + ExamPaperSubmitVO examPaperSubmitVO = new ExamPaperSubmitVO(); +// ExamPaperScore examPaperScore = examPaperScoreMapper.selectById(id); +// examPaperSubmitVO.setId(examPaperScore.getId()); +// examPaperSubmitVO.setDoTime(examPaperScore.getDoTime()); +// examPaperSubmitVO.setScore(ExamUtil.scoreToVM(examPaperScore.getUserScore())); +// List<ExamPaperScoreDetail> examPaperScoreDetails = examPaperScoreDetailService.selectListByPaperAnswerId(examPaperScore.getId()); +// List<ExamPaperSubmitItemVO> examPaperSubmitItemVOS = examPaperScoreDetails.stream() +// .map(a -> examPaperScoreDetailService.examPaperQuestionCustomerAnswerToVM(a)) +// .collect(Collectors.toList()); +// examPaperSubmitVO.setAnswerItems(examPaperSubmitItemVOS); + return examPaperSubmitVO; + } + + @Override + public Integer selectAllCount() { + return examPaperScoreMapper.selectAllCount(); + } + + @Override + public Integer selectAllQuestionCount() { + return examPaperScoreMapper.selectAllQuestionCount(); + } + + + @Override + public List<Integer> selectMothCount() { + Date startTime = DateTimeUtil.getMonthStartDay(); + Date endTime = DateTimeUtil.getMonthEndDay(); + List<KeyValue> mouthCount = examPaperScoreMapper.selectCountByDate(startTime, endTime); + List<String> mothStartToNowFormat = DateTimeUtil.MothStartToNowFormat(); + return mothStartToNowFormat.stream().map(md -> { + KeyValue keyValue = mouthCount.stream().filter(kv -> kv.getName().equals(md)).findAny().orElse(null); + return null == keyValue ? 0 : keyValue.getValue(); + }).collect(Collectors.toList()); + } + + + /** + * 鐢ㄦ埛鎻愪氦绛旀鐨勮浆鍖栧瓨鍌ㄥ璞� + * + * @param question question + * @param customerQuestionAnswer customerQuestionAnswer + * @param examPaper examPaper + * @param itemOrder itemOrder + * @param user user + * @param now now + * @return ExamPaperQuestionCustomerAnswer + */ + private ExamPaperScoreDetail ExamPaperQuestionCustomerAnswerFromVM(Question question, ExamPaperSubmitItemVO customerQuestionAnswer, ExamPaper examPaper, Integer itemOrder, User user, Date now) { + ExamPaperScoreDetail examPaperScoreDetail = new ExamPaperScoreDetail(); + examPaperScoreDetail.setQuestionId(question.getId()); + examPaperScoreDetail.setExamPaperId(examPaper.getId()); + examPaperScoreDetail.setQuestionScore(null); + examPaperScoreDetail.setSubjectId(examPaper.getSubjectId()); + examPaperScoreDetail.setItemOrder(itemOrder); + examPaperScoreDetail.setCreateTime(now); + examPaperScoreDetail.setCreateUser(user.getId()); + examPaperScoreDetail.setQuestionType(question.getQuestionType()); + examPaperScoreDetail.setQuestionContent(question.getContent()); + if (null == customerQuestionAnswer) { + examPaperScoreDetail.setCustomerScore(0); + } else { + setSpecialFromVM(examPaperScoreDetail, question, customerQuestionAnswer); + } + return examPaperScoreDetail; + } + + /** + * 鍒ゆ柇鎻愪氦绛旀鏄惁姝g‘锛屼繚鐣欑敤鎴锋彁浜ょ殑绛旀 + * + * @param examPaperScoreDetail examPaperQuestionCustomerAnswer + * @param question question + * @param customerQuestionAnswer customerQuestionAnswer + */ + private void setSpecialFromVM(ExamPaperScoreDetail examPaperScoreDetail, Question question, ExamPaperSubmitItemVO customerQuestionAnswer) { + QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(examPaperScoreDetail.getQuestionType()); + switch (questionTypeEnum) { + case SingleChoice: + case TrueFalse: + examPaperScoreDetail.setAnswer(customerQuestionAnswer.getContent()); + examPaperScoreDetail.setDoRight(question.getCorrect().equals(customerQuestionAnswer.getContent())); + examPaperScoreDetail.setCustomerScore(examPaperScoreDetail.getDoRight() ? null : 0); + break; + case MultipleChoice: + String customerAnswer = ExamUtil.contentToString(customerQuestionAnswer.getContentArray()); + examPaperScoreDetail.setAnswer(customerAnswer); + examPaperScoreDetail.setDoRight(customerAnswer.equals(question.getCorrect())); + examPaperScoreDetail.setCustomerScore(examPaperScoreDetail.getDoRight() ? null : 0); + break; + case GapFilling: + String correctAnswer = JsonUtil.toJsonStr(customerQuestionAnswer.getContentArray()); + examPaperScoreDetail.setAnswer(correctAnswer); + examPaperScoreDetail.setCustomerScore(0); + break; + default: + examPaperScoreDetail.setAnswer(customerQuestionAnswer.getContent()); + examPaperScoreDetail.setCustomerScore(0); + break; + } + } + + private ExamPaperScore ExamPaperAnswerFromVM(ExamPaperSubmitVO examPaperSubmitVO, ExamPaper examPaper, List<ExamPaperScoreDetail> examPaperScoreDetails, User user, Date now) { + Integer systemScore = examPaperScoreDetails.stream().mapToInt(a -> a.getCustomerScore()).sum(); + long questionCorrect = examPaperScoreDetails.stream().filter(a -> a.getCustomerScore().equals(a.getQuestionScore())).count(); + ExamPaperScore examPaperScore = new ExamPaperScore(); + //TODO:寰呭畬鎴� +// examPaperAnswer.setPaperName(examPaper.getName()); +// examPaperAnswer.setDoTime(examPaperSubmitVO.getDoTime()); +// examPaperAnswer.setExamPaperId(examPaper.getId()); +// examPaperAnswer.setCreateUser(user.getId()); +// examPaperAnswer.setCreateTime(now); +// examPaperAnswer.setSubjectId(examPaper.getSubjectId()); +// examPaperAnswer.setQuestionCount(examPaper.getQuestionCount()); +// examPaperAnswer.setPaperScore(examPaper.getScore()); +// examPaperAnswer.setPaperType(examPaper.getPaperType()); +// examPaperAnswer.setSystemScore(systemScore); +// examPaperAnswer.setUserScore(systemScore); +// examPaperAnswer.setTaskExamId(examPaper.getTaskExamId()); +// examPaperAnswer.setQuestionCorrect((int) questionCorrect); +// boolean needJudge = examPaperQuestionCustomerAnswers.stream().anyMatch(d -> QuestionTypeEnum.needSaveTextContent(d.getQuestionType())); +// if (needJudge) { +// examPaperAnswer.setStatus(ExamPaperAnswerStatusEnum.WaitJudge.getCode()); +// } else { +// examPaperAnswer.setStatus(ExamPaperAnswerStatusEnum.Complete.getCode()); +// } + return examPaperScore; + } + + + @Override + public PageInfo<ExamPaperAnswerPageResponseVO> adminPage(ExamPaperAnswerPageRequestVO requestVM) { + return PageHelper.startPage(requestVM.getPageIndex(), requestVM.getPageSize()).doSelectPageInfo(() -> + examPaperScoreMapper.adminPage(requestVM)); + } + + @Override + public List<ExamPaperAnswerPageResponseVO> list(ExamPaperAnswerPageRequestVO requestVM) { + return examPaperScoreMapper.adminPage(requestVM); + } + + @Override + public PageInfo<ExamPaperAnswerPageResponseVO> pageExamPaper(ExamPaperAnswerPageRequestVO model) { + return PageHelper.startPage(model.getPageIndex(), model.getPageSize()).doSelectPageInfo(() -> + examPaperScoreMapper.pageExamPaper(model)); + } +} -- Gitblit v1.8.0