From 16b4725365f3286c2d2a80945e26f35f89b53f24 Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期五, 28 六月 2024 11:37:06 +0800 Subject: [PATCH] answer表改为score表,阅卷代码 --- src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 251 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java index ce84882..43b3573 100644 --- a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java +++ b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java @@ -2,14 +2,13 @@ import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.jxkg.base.Result; +import com.ycl.jxkg.base.SystemCode; import com.ycl.jxkg.context.WebContext; -import com.ycl.jxkg.domain.entity.Exam; -import com.ycl.jxkg.domain.entity.ExamPaper; -import com.ycl.jxkg.domain.entity.ExamSubmitTemp; -import com.ycl.jxkg.domain.entity.Question; +import com.ycl.jxkg.domain.entity.*; import com.ycl.jxkg.domain.exam.PaperFixQuestionDTO; import com.ycl.jxkg.domain.exam.PaperQuestionSettingDTO; import com.ycl.jxkg.domain.form.AddTimeForm; @@ -18,6 +17,12 @@ import com.ycl.jxkg.domain.query.ExamQuery; import com.ycl.jxkg.domain.question.QuestionObject; import com.ycl.jxkg.domain.vo.*; +import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperEditRequestVO; +import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperMarkAnswerVO; +import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperMarkVO; +import com.ycl.jxkg.domain.vo.student.exam.ExamPaperReadVO; +import com.ycl.jxkg.domain.vo.student.exam.ExamPaperSubmitVO; +import com.ycl.jxkg.enums.DeductTypeEnum; import com.ycl.jxkg.enums.ExamPaperTypeEnum; import com.ycl.jxkg.enums.QuestionTypeEnum; import com.ycl.jxkg.enums.WebsocketCommendEnum; @@ -27,14 +32,18 @@ import com.ycl.jxkg.server.WebsocketServer; import com.ycl.jxkg.service.ExamPaperService; import com.ycl.jxkg.service.ExamService; +import com.ycl.jxkg.utils.JsonUtil; import com.ycl.jxkg.utils.PageUtil; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; +import org.springframework.context.annotation.Bean; import org.springframework.transaction.annotation.Transactional; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; @@ -56,6 +65,9 @@ private final ExamPaperMapper examPaperMapper; private final ExamPaperService examPaperService; private final WebsocketServer websocketServer; + private final UserMapper userMapper; + private final ExamPaperScoreMapper examPaperScoreMapper; + private final ExamPaperScoreDetailMapper examPaperScoreDetailMapper; /** * 娣诲姞 @@ -124,11 +136,11 @@ IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class); baseMapper.getPage(page, query, webContext.getCurrentUser().getId()); page.getRecords().stream().forEach(item -> { - if (! StringUtils.hasText(item.getClassName())) { + if (!StringUtils.hasText(item.getClassName())) { item.setClassName("鐝骇涓嶅瓨鍦ㄦ垨琚垹闄�"); item.setClassesId(null); } - if (! StringUtils.hasText(item.getExamPaperName())) { + if (!StringUtils.hasText(item.getExamPaperName())) { item.setExamPaperName("璇曞嵎涓嶅瓨鍦ㄦ垨琚垹闄�"); item.setExamPaperId(null); } @@ -191,7 +203,7 @@ return Result.ok().data(data); } else if (ExamPaperTypeEnum.Random.getCode().equals(examPaper.getPaperType())) { // 鏍规嵁闅忔満璇曞嵎鐨勯厤缃紝闅忔満鐢熸垚瀵瑰簲棰樼洰 - if (! StringUtils.hasText(examPaper.getContent())) { + if (!StringUtils.hasText(examPaper.getContent())) { throw new RuntimeException("璇曞嵎閰嶇疆寮傚父锛岃鑱旂郴鑰佸笀"); } List<PaperQuestionSettingDTO> paperSettingList = JSON.parseArray(examPaper.getContent(), PaperQuestionSettingDTO.class); @@ -226,11 +238,13 @@ } ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp(); examSubmitTemp.setExamId(id); - examSubmitTemp.setStatus(ExamSubmitTempStatusEnum.TEMP); + //TODO + examSubmitTemp.setStatus(ExamSubmitTempStatusEnum.temp); examSubmitTemp.setExamSubmit(JSON.toJSONString(examData)); examSubmitTemp.setCreateTime(new Date()); examSubmitTemp.setUserId(webContext.getCurrentUser().getId()); - examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.TEMP); + //TODO + examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.temp); examSubmitTempMapper.insert(examSubmitTemp); StartExamVO startExamVO = new StartExamVO(); startExamVO.setExamName(exam.getExamName()); @@ -249,7 +263,7 @@ * @return */ private List<PaperFixQuestionVO> coverTo(ExamPaper examPaper) { - if (! StringUtils.hasText(examPaper.getContent())) { + if (!StringUtils.hasText(examPaper.getContent())) { throw new RuntimeException("璇曞嵎鏈厤缃鐩紝璇疯仈绯昏�佸笀"); } List<PaperFixQuestionDTO> questionWarpList = JSON.parseArray(examPaper.getContent(), PaperFixQuestionDTO.class); @@ -350,7 +364,8 @@ // 闃呭嵎鍚庢墠寰�exam_paper_answer淇濆瓨鑰冭瘯鎴愮哗銆佷互鍙婁繚瀛樺埌exam_paper_customer_answer // 鐜板湪鍙渶瑕佷繚瀛樺埌涓�寮犱复鏃惰〃 // 璇ユ帴鍙f槸涓诲姩鎻愪氦锛屾墍浠ョ姸鎬侀兘璁剧疆涓哄畬鎴愶紝浠ヤ究鍚庣画鑰佸笀闃呭嵎 - saveTempExam(submitData, ExamSubmitTempStatusEnum.FINISH); + //TODO + saveTempExam(submitData, ExamSubmitTempStatusEnum.finish); return Result.ok(); } @@ -362,38 +377,45 @@ */ @Override public Result timingSubmit(StartExamVO submitData) { - saveTempExam(submitData, ExamSubmitTempStatusEnum.TEMP); + //TODO + saveTempExam(submitData, ExamSubmitTempStatusEnum.temp); return Result.ok(); } /** * 淇濆瓨璇曞嵎锛氬鏋滄帴鍙f槸瀹氭椂淇濆瓨閭d箞鏄复鏃惰瘯鍗枫�傚鏋滄帴鍙f槸鑷富鎻愪氦閭d箞鏄畬鎴愯瘯鍗� * - * @param submitData 鍓嶇浼犻�掔殑璇曞嵎鏁版嵁 - * @param status 璇曞嵎鐨勭姸鎬� + * @param submitData 鍓嶇浼犻�掔殑璇曞嵎鏁版嵁 + * @param status 璇曞嵎鐨勭姸鎬� */ public void saveTempExam(StartExamVO submitData, ExamSubmitTempStatusEnum status) { ExamSubmitTemp one = new LambdaQueryChainWrapper<>(examSubmitTempMapper) .eq(ExamSubmitTemp::getExamId, submitData.getId()) .eq(ExamSubmitTemp::getUserId, webContext.getCurrentUser().getId()) + .eq(ExamSubmitTemp::getDeleted,0) .one(); + if (Objects.nonNull(one)) { - if (ExamSubmitTempStatusEnum.FINISH.equals(one.getStatus())) { + long doTimeL = one.getUpdateTime().getTime() - one.getCreateTime().getTime(); + Integer doTime = (int) doTimeL; + //TODO + if (ExamSubmitTempStatusEnum.finish.equals(one.getStatus())) { return; } - one.setDoTime(submitData.getDoTime()); + one.setDoTime(doTime); one.setExamSubmit(JSON.toJSONString(submitData.getTitleList())); - one.setCreateTime(new Date()); + one.setUpdateTime(new Date()); one.setStatus(status); examSubmitTempMapper.updateById(one); } else { ExamSubmitTemp examSubmitTemp = new ExamSubmitTemp(); examSubmitTemp.setExamId(submitData.getId()); - examSubmitTemp.setDoTime(submitData.getDoTime()); + examSubmitTemp.setDoTime(0); examSubmitTemp.setStatus(status); examSubmitTemp.setUserId(webContext.getCurrentUser().getId()); examSubmitTemp.setExamSubmit(JSON.toJSONString(submitData.getTitleList())); - examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.TEMP); + //TODO + examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.temp); examSubmitTempMapper.insert(examSubmitTemp); } } @@ -414,7 +436,8 @@ // 鍙傝�冧汉鏁� Integer joinExamNum = examSubmitTempList.size(); // 鍙傝�冧絾鏈畬鎴愭彁浜や汉鏁� - Integer joinButNotFinishedNum = Math.toIntExact(examSubmitTempList.stream().filter(item -> ExamSubmitTempStatusEnum.TEMP.equals(item.getStatus())).count()); + //TODO + Integer joinButNotFinishedNum = Math.toIntExact(examSubmitTempList.stream().filter(item -> ExamSubmitTempStatusEnum.temp.equals(item.getStatus())).count()); List<StudentExamInfoVO> studentExamList = classesUserMapper.getClassesUserList(exam.getClassesId()); // 搴旇�冧汉鏁� @@ -442,6 +465,7 @@ @Override public Result getMarkPaperInfo(Integer examId, Integer userId) { + //瀛︾敓绛旈琛� ExamSubmitTemp userExam = new LambdaQueryChainWrapper<>(examSubmitTempMapper) .eq(ExamSubmitTemp::getExamId, examId) .eq(ExamSubmitTemp::getUserId, userId) @@ -449,14 +473,214 @@ if (Objects.isNull(userExam)) { throw new RuntimeException("璇ュ鍛樿�冭瘯璁板綍涓嶅瓨鍦�"); } - ExamSubmitVO vo = new ExamSubmitVO(); - vo.setExamId(userExam.getExamId()); - vo.setDoTime(userExam.getDoTime()); - vo.setUpdateTime(userExam.getUpdateTime()); - if (StringUtils.hasText(userExam.getExamSubmit())) { - vo.setPaperQuestionList(JSON.parseArray(userExam.getExamSubmit(), PaperFixQuestionVO.class)); + ExamVO exam = examMapper.getById(examId); + User student = userMapper.getUserById(userId); + //灏佽闃呭嵎鍩烘湰鏁版嵁 + ExamPaperMarkVO paperMarkVO = createVO(userExam, exam, student); + //TODO:琛ュ厖棰樼洰绛旀銆佽В鏋� + List<PaperFixQuestionVO> titleItems = paperMarkVO.getTitleItems(); + for (PaperFixQuestionVO titleItem : titleItems) { + for (DoQuestionVO doQuestionVO : titleItem.getQuestionList()) { + + } } - return Result.ok(vo); + //闃呭嵎锛屽瑙傞鎵撳垎 + Result InnerError = markPaper(paperMarkVO); + if (InnerError != null) return InnerError; + + return Result.ok(paperMarkVO); + } + //鎻愪氦鎵规敼 + @Override + @Transactional(rollbackFor = Exception.class) + public Result submitMarkPaper(ExamPaperMarkVO examPaperMark) { + Integer userId = webContext.getCurrentUser().getId(); + //鎻掑叆exam_paper_answer(鎴愮哗琛�) + ExamPaperScore examPaperScore = new ExamPaperScore(); + BeanUtils.copyProperties(examPaperMark,examPaperScore); + examPaperScore.setUserScore(new BigDecimal(examPaperMark.getScore())); + examPaperScore.setPaperScore(new BigDecimal(examPaperMark.getTotalScore())); + examPaperScore.setJudgeUser(userId); + examPaperScore.setCreateUser(examPaperMark.getUserId()); + examPaperScore.setAnswerTime(examPaperMark.getSubmitTime()); + examPaperScore.setPaperContent(JSON.toJSONString(examPaperMark.getTitleItems())); + long questionCorrect =0; + long questionCount=0; + if(!CollectionUtils.isEmpty(examPaperMark.getAnswers())){ + questionCorrect = examPaperMark.getAnswers().stream().filter(ExamPaperMarkAnswerVO::getRight).count(); + questionCount = examPaperMark.getAnswers().size(); + } + examPaperScore.setQuestionCorrect(Integer.valueOf(questionCorrect+"")); + examPaperScore.setQuestionCount(Integer.valueOf(questionCount+"")); + examPaperScoreMapper.insert(examPaperScore); + return Result.ok(); + } + + //闃呭嵎 + private Result markPaper(ExamPaperMarkVO paperMarkVO) { + List<PaperFixQuestionVO> titleItems = paperMarkVO.getTitleItems(); + //鍒濆鍖栭鐩簭鍙� + Integer num = 1; + List<ExamPaperMarkAnswerVO> answers = new ArrayList<>(); + for (PaperFixQuestionVO titleItem : titleItems) { + for (DoQuestionVO doQuestionVO : titleItem.getQuestionList()) { + //鍑嗗棰樼洰搴忓彿渚涘墠绔烦杞娇鐢� + ExamPaperMarkAnswerVO answerVO = new ExamPaperMarkAnswerVO(); + //鑾峰彇璇曞嵎绫诲瀷 + Integer questionType = doQuestionVO.getQuestionType(); + /* 濡傛灉鏄畝绛斻�佽绠椼�佸垎鏋愶紝涓嶈缃畆ight鍙缃鐩簭鍙� */ + if (QuestionTypeEnum.ShortAnswer.getCode().equals(questionType) || QuestionTypeEnum.Calculate.getCode().equals(questionType) || QuestionTypeEnum.Analysis.getCode().equals(questionType)) { + answerVO.setItemOrder(num); + doQuestionVO.setItemOrder(num); + } + /* 濡傛灉鏄崟閫夈�佽闊炽�佸垽鏂�(鍒ゆ柇绛旀鏄疉銆丅) */ + else if (QuestionTypeEnum.SingleChoice.getCode().equals(questionType) || QuestionTypeEnum.Audio.getCode().equals(questionType) || QuestionTypeEnum.TrueFalse.getCode().equals(questionType)) { + answerVO.setItemOrder(num); + doQuestionVO.setItemOrder(num); + if (StringUtils.isEmpty(doQuestionVO.getQuestionAnswer())) { + return Result.fail(SystemCode.InnerError.getCode(), doQuestionVO.getTitle() + ",姝ら鐩己灏戠瓟妗堬紝璇峰厛瀹屽杽"); + } + trueOrFalse(doQuestionVO, answerVO, doQuestionVO.getQuestionAnswer().equals(doQuestionVO.getAnswer())); + } + /* 濡傛灉鏄閫� */ + else if (QuestionTypeEnum.MultipleChoice.getCode().equals(questionType)) { + answerVO.setItemOrder(num); + doQuestionVO.setItemOrder(num); + if (StringUtils.isEmpty(doQuestionVO.getQuestionAnswer())) { + return Result.fail(SystemCode.InnerError.getCode(), doQuestionVO.getTitle() + ",姝ら鐩己灏戠瓟妗堬紝璇峰厛瀹屽杽"); + } + //瀛︾敓绛旀 + List<String> answerList = doQuestionVO.getAnswerList(); + String questionAnswer = doQuestionVO.getQuestionAnswer(); + //棰樼洰绛旀 + List<String> questionAnswerList = Arrays.asList(questionAnswer.split(",")); + //瀛︾敓绛旀涓虹┖锛屽垽鏂负閿� + if (CollectionUtils.isEmpty(answerList)) { + trueOrFalse(doQuestionVO, answerVO, false); + continue; + } + //绛旀鏁伴噺锛屼笉闇�瑕佽�冭檻椤哄簭 + int answerCount = answerList.size(); + Set<String> set1 = new HashSet<>(answerList); + Set<String> set2 = new HashSet<>(questionAnswerList); + //绛旀瀹屽叏涓�鑷达紝婊″垎 + if (set1.equals(set2)) { + trueOrFalse(doQuestionVO, answerVO, true); + continue; + } + if (paperMarkVO.getDeductType() == null) { + return Result.fail(SystemCode.InnerError.getCode(), "璇曞嵎娌℃湁閰嶇疆澶氶�夊緱鍒嗙被鍨嬶紝璇疯仈绯荤鐞嗗憳"); + } + //濡傛灉澶氶�夊緱鍒嗙被鍨嬩负 绛旈敊涓嶅緱鍒� + if (Integer.valueOf(DeductTypeEnum.AllCorrect.getCode()).equals(paperMarkVO.getDeductType())) { + trueOrFalse(doQuestionVO, answerVO, false); + } + //濡傛灉澶氶�夊緱鍒嗙被鍨嬩负 婕忛�夊緱鍥哄畾鍒嗗��,鍖呭惈閿欒閫夐」涓嶅緱鍒� + else if (Integer.valueOf(DeductTypeEnum.PartCorrect.getCode()).equals(paperMarkVO.getDeductType())) { + //瀛︾敓绛旀绉婚櫎鎵�鏈夋纭瓟妗堬紝濡傛灉杩樻湁鍏冪礌璇存槑鍖呭惈閿欒閫夐」 + answerList.removeAll(questionAnswerList); + if (!CollectionUtils.isEmpty(answerList)) { + trueOrFalse(doQuestionVO, answerVO, false); + } else { + answerVO.setRight(false); + doQuestionVO.setRight(false); + //婕忛�夊緱鍥哄畾鍒� + doQuestionVO.setScore(paperMarkVO.getDeductScore()); + } + } + //濡傛灉澶氶�夊緱鍒嗙被鍨嬩负 姣忓涓�棰樺緱鐩稿簲鍒嗗��,鍖呭惈閿欒閫夐」涓嶅緱鍒� + else if (Integer.valueOf(DeductTypeEnum.EachCorrect.getCode()).equals(paperMarkVO.getDeductType())) { + //瀛︾敓绛旀绉婚櫎鎵�鏈夋纭瓟妗堬紝濡傛灉杩樻湁鍏冪礌璇存槑鍖呭惈閿欒閫夐」 + answerList.removeAll(questionAnswerList); + if (!CollectionUtils.isEmpty(answerList)) { + trueOrFalse(doQuestionVO, answerVO, false); + } else { + answerVO.setRight(false); + doQuestionVO.setRight(false); + //婕忛�夊緱鍒� + doQuestionVO.setScore(paperMarkVO.getDeductScore().multiply(new BigDecimal(answerCount))); + } + } + } + /* 濡傛灉鏄~绌� */ + else if (QuestionTypeEnum.GapFilling.getCode().equals(questionType)) { + answerVO.setItemOrder(num); + doQuestionVO.setItemOrder(num); + if (StringUtils.isEmpty(doQuestionVO.getQuestionAnswer())) { + return Result.fail(SystemCode.InnerError.getCode(), doQuestionVO.getTitle() + ",姝ら鐩己灏戠瓟妗堬紝璇峰厛瀹屽杽"); + } + //瀛︾敓绛旀 + List<String> answerList = doQuestionVO.getAnswerList(); + String questionAnswer = doQuestionVO.getQuestionAnswer(); + //棰樼洰绛旀 + List<String> questionAnswerList = Arrays.asList(questionAnswer.split(",")); + //瀛︾敓绛旀涓虹┖锛屽垽鏂负閿� + if (CollectionUtils.isEmpty(answerList)) { + trueOrFalse(doQuestionVO, answerVO, false); + continue; + } + //鎬荤┖鐨勬暟閲� + int questionAnswerCount = questionAnswerList.size(); + //绛旀瀹屽叏涓�鑷达紝婊″垎 + if (answerList.equals(questionAnswerList)) { + trueOrFalse(doQuestionVO, answerVO, true); + } else { + answerVO.setRight(false); + doQuestionVO.setRight(false); + //鍋氬鐨勬暟閲�,闇�瑕佹寜椤哄簭姣旇緝 + int count = 0; + for (int i = 0; i < answerList.size(); i++) { + if(answerList.get(i).equals(questionAnswerList.get(i))){ + count++; + } + } + //杩欎釜棰樼殑鎬诲垎 + BigDecimal questionScore = doQuestionVO.getQuestionScore(); + //姣忎釜绌虹殑鍒嗘暟 + BigDecimal scoreEach = questionScore.divide(new BigDecimal(questionAnswerCount), 1, RoundingMode.DOWN); + BigDecimal score = scoreEach.multiply(new BigDecimal(count)); + doQuestionVO.setScore(score); + } + + } + num++; + answers.add(answerVO); + } + } + paperMarkVO.setAnswers(answers); + return null; + } + + //璁剧疆鍏ㄥ鎴栧叏閿� + private void trueOrFalse(DoQuestionVO doQuestionVO, ExamPaperMarkAnswerVO answerVO, Boolean isCorrect) { + if (isCorrect) { + //姝g‘ + answerVO.setRight(isCorrect); + doQuestionVO.setRight(isCorrect); + doQuestionVO.setScore(doQuestionVO.getQuestionScore()); + } else { + //閿欒 + answerVO.setRight(isCorrect); + doQuestionVO.setRight(isCorrect); + doQuestionVO.setScore(BigDecimal.ZERO); + } + } + + //灏佽闃呭嵎杩斿洖鏁版嵁 + private ExamPaperMarkVO createVO(ExamSubmitTemp userExam, ExamVO exam, User student) { + ExamPaperMarkVO paperMarkVO = new ExamPaperMarkVO(); + BeanUtils.copyProperties(userExam, paperMarkVO); + paperMarkVO.setPaperId(exam.getExamPaperId()); + //TODO: 璇曞嵎鎬诲垎銆�(澶氶�夊緱鍒嗙被鍨嬨�佸閫夊緱鍒嗗垎鏁�)闇�瑕佸彇ExamSubmitTemp + paperMarkVO.setExamName(exam.getExamName()); + paperMarkVO.setPaperType(exam.getExamPaperType()); + paperMarkVO.setSubmitTime(userExam.getUpdateTime()); + paperMarkVO.setUserName(student.getRealName()); + paperMarkVO.setTitleItems(JSON.parseArray(userExam.getExamSubmit(), PaperFixQuestionVO.class)); + paperMarkVO.setTotalScore("100"); + paperMarkVO.setDeductType(DeductTypeEnum.AllCorrect.getCode()); + paperMarkVO.setDeductScore(BigDecimal.ZERO); + return paperMarkVO; } @Override -- Gitblit v1.8.0