From 3012d0620b8a42ea055d773cf56925c35d00c71d Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期二, 18 六月 2024 09:27:34 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java | 28 ++++ src/main/java/com/ycl/jxkg/mapper/ExamMapper.java | 9 + src/main/java/com/ycl/jxkg/service/ExamService.java | 16 ++ src/main/java/com/ycl/jxkg/domain/vo/DoQuestionVO.java | 35 ++++- src/main/resources/mapper/ExamMapper.xml | 32 +++++ src/main/java/com/ycl/jxkg/domain/vo/ExamSubmitVO.java | 2 src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java | 133 +++++++++++++++++---- src/main/java/com/ycl/jxkg/domain/vo/FinishedQuestion.java | 24 ++++ src/main/java/com/ycl/jxkg/domain/vo/PaperFixQuestionVO.java | 26 ++++ 9 files changed, 261 insertions(+), 44 deletions(-) diff --git a/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java b/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java index d455f65..a3caa6f 100644 --- a/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java +++ b/src/main/java/com/ycl/jxkg/controller/student/StudentExamController.java @@ -1,14 +1,12 @@ package com.ycl.jxkg.controller.student; import com.ycl.jxkg.base.Result; +import com.ycl.jxkg.domain.query.ExamQuery; import com.ycl.jxkg.domain.vo.ExamSubmitVO; import com.ycl.jxkg.service.ExamService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @author锛歺p @@ -22,6 +20,28 @@ private final ExamService examService; /** + * 瀛﹀憳绔�冭瘯鍒嗛〉 + * + * @param query + * @return + */ + @PostMapping("/page") + public Result examList(ExamQuery query) { + return examService.studentPage(query); + } + + /** + * 寮�濮嬭�冭瘯 + * + * @param id + * @return + */ + @PostMapping("/start/{id}") + public Result start(@PathVariable("id") Integer id) { + return examService.start(id); + } + + /** * 涓诲姩鎻愪氦璇曞嵎 * * @param submitData diff --git a/src/main/java/com/ycl/jxkg/domain/vo/DoQuestionVO.java b/src/main/java/com/ycl/jxkg/domain/vo/DoQuestionVO.java index 30604d8..455d8d1 100644 --- a/src/main/java/com/ycl/jxkg/domain/vo/DoQuestionVO.java +++ b/src/main/java/com/ycl/jxkg/domain/vo/DoQuestionVO.java @@ -1,8 +1,10 @@ package com.ycl.jxkg.domain.vo; import com.ycl.jxkg.domain.base.AbsVo; +import com.ycl.jxkg.domain.question.QuestionItemObject; import lombok.Data; +import java.math.BigDecimal; import java.util.List; /** @@ -10,25 +12,40 @@ * @date锛�2024/6/13 15:27 */ @Data -public class DoQuestionVO extends AbsVo { +public class DoQuestionVO extends FinishedQuestion { + + private Integer id; /** 棰樼洰绫诲瀷 */ private Integer questionType; /** 棰樺共 */ - private String titleContent; + private String title; - /** 瀛﹀憳绛旀 */ - private String answer; - /** 瀛﹀憳澶氶�夐绛旀 */ - private List<String> answerList; + /** 棰樼洰绛旀 */ + private String questionAnswer; - /** 閫夐」json锛屽悗绔娇鐢� */ + /** 棰樼洰瑙f瀽锛岃�佸笀闃呭嵎浣跨敤 */ + private String analyze; + + /** 閫夐」json */ private String content; - /** 姝g‘涓庡惁锛屽悗绔垽鏂悗濉厖璇ュ�� */ + /** 棰樼洰闅惧害 */ + private Integer difficult; + + /** 閽堝鍗曢�夈�佸垽鏂�佸閫夌粰鍑烘纭笌鍚� */ private Boolean right; + /** 棰樼洰鍒嗘暟 */ + private BigDecimal questionScore; + + /** 璇煶棰橀煶棰� */ + private String audioFile; + + /** 闊抽鍘熷鍚� */ + private String originalFile; + /** 棰樼洰閫夐」 */ - private List<QuestionItemVO> questionItemList; + private List<QuestionItemObject> questionItemList; } diff --git a/src/main/java/com/ycl/jxkg/domain/vo/ExamSubmitVO.java b/src/main/java/com/ycl/jxkg/domain/vo/ExamSubmitVO.java index 007f69b..6a2d76f 100644 --- a/src/main/java/com/ycl/jxkg/domain/vo/ExamSubmitVO.java +++ b/src/main/java/com/ycl/jxkg/domain/vo/ExamSubmitVO.java @@ -19,5 +19,5 @@ private Integer doTime; /** 棰樼洰 */ - private List<DoQuestionVO> questionList; + private List<PaperFixQuestionVO> paperQuestionList; } diff --git a/src/main/java/com/ycl/jxkg/domain/vo/FinishedQuestion.java b/src/main/java/com/ycl/jxkg/domain/vo/FinishedQuestion.java new file mode 100644 index 0000000..71bb7b2 --- /dev/null +++ b/src/main/java/com/ycl/jxkg/domain/vo/FinishedQuestion.java @@ -0,0 +1,24 @@ +package com.ycl.jxkg.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author锛歺p + * @date锛�2024/6/17 16:53 + */ +@Data +public class FinishedQuestion { + + /** 瀛﹀憳绛旀 */ + private String answer; + + /** 瀛﹀憳澶氶�夐绛旀 */ + private List<String> answerList; + + /** 寰楀垎 */ + private BigDecimal score; + +} diff --git a/src/main/java/com/ycl/jxkg/domain/vo/PaperFixQuestionVO.java b/src/main/java/com/ycl/jxkg/domain/vo/PaperFixQuestionVO.java new file mode 100644 index 0000000..0534444 --- /dev/null +++ b/src/main/java/com/ycl/jxkg/domain/vo/PaperFixQuestionVO.java @@ -0,0 +1,26 @@ +package com.ycl.jxkg.domain.vo; + +import com.ycl.jxkg.domain.exam.PaperQuestion; +import lombok.Data; + +import java.util.List; + +/** + * 澶ф爣棰樺寘瑁归鐩垪琛� + * + * @author锛歺p + * @date锛�2024/6/17 16:35 + */ +@Data +public class PaperFixQuestionVO { + + /** 澶ф爣棰� */ + private String title; + + /** 棰樺瀷 */ + private Integer questionType; + + /** 棰樼洰鍒楄〃 */ + private List<DoQuestionVO> questionList; + +} diff --git a/src/main/java/com/ycl/jxkg/mapper/ExamMapper.java b/src/main/java/com/ycl/jxkg/mapper/ExamMapper.java index cb390c3..4b67ba4 100644 --- a/src/main/java/com/ycl/jxkg/mapper/ExamMapper.java +++ b/src/main/java/com/ycl/jxkg/mapper/ExamMapper.java @@ -29,6 +29,13 @@ /** * 鍒嗛〉 */ - IPage getPage(IPage page, @Param("query") ExamQuery query); + IPage getPage(IPage page, @Param("query") ExamQuery query, @Param("userId") Integer userId); + /** + * 瀛︾敓绔垎椤� + * + * @param page + * @param query + */ + IPage studentPage(IPage<ExamVO> page, @Param("query") ExamQuery query, @Param("userId") Integer userId); } diff --git a/src/main/java/com/ycl/jxkg/service/ExamService.java b/src/main/java/com/ycl/jxkg/service/ExamService.java index 36c0af8..e858dbb 100644 --- a/src/main/java/com/ycl/jxkg/service/ExamService.java +++ b/src/main/java/com/ycl/jxkg/service/ExamService.java @@ -88,4 +88,20 @@ * @return */ Result getMarkPaperInfo(Integer id); + + /** + * 瀛︾敓绔垎椤� + * + * @param query + * @return + */ + Result studentPage(ExamQuery query); + + /** + * 瀛︾敓绔紑濮嬭�冭瘯 + * + * @param id + * @return + */ + Result start(Integer id); } 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 a73b531..e2473ff 100644 --- a/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java +++ b/src/main/java/com/ycl/jxkg/service/impl/ExamServiceImpl.java @@ -5,11 +5,15 @@ import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.jxkg.context.WebContext; import com.ycl.jxkg.domain.entity.*; +import com.ycl.jxkg.domain.exam.PaperFixQuestionDTO; import com.ycl.jxkg.domain.vo.*; +import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperEditRequestVO; +import com.ycl.jxkg.enums.ExamPaperTypeEnum; import com.ycl.jxkg.enums.QuestionTypeEnum; import com.ycl.jxkg.enums.general.ExamStatusEnum; import com.ycl.jxkg.enums.general.ExamSubmitTempStatusEnum; import com.ycl.jxkg.mapper.*; +import com.ycl.jxkg.service.ExamPaperService; import com.ycl.jxkg.service.ExamService; import com.ycl.jxkg.base.Result; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -22,10 +26,7 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -44,6 +45,7 @@ private final ExamSubmitTempMapper examSubmitTempMapper; private final ClassesUserMapper classesUserMapper; private final ExamPaperMapper examPaperMapper; + private final ExamPaperService examPaperService; /** * 娣诲姞 @@ -110,7 +112,7 @@ @Override public Result page(ExamQuery query) { IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class); - baseMapper.getPage(page, query); + baseMapper.getPage(page, query, webContext.getCurrentUser().getId()); page.getRecords().stream().forEach(item -> { if (! StringUtils.hasText(item.getClassName())) { item.setClassName("鐝骇涓嶅瓨鍦ㄦ垨琚垹闄�"); @@ -122,6 +124,76 @@ } }); return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + + + @Override + public Result studentPage(ExamQuery query) { + IPage<ExamVO> page = PageUtil.getPage(query, ExamVO.class); + baseMapper.studentPage(page, query, webContext.getCurrentUser().getId()); + return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + + + @Override + public Result start(Integer id) { + Exam exam = baseMapper.selectById(id); + if (Objects.isNull(exam)) { + throw new RuntimeException("璇ヨ�冭瘯涓嶅瓨鍦�"); + } + if (Objects.isNull(exam.getExamPaperId())) { + throw new RuntimeException("鑰冭瘯鏈粦瀹氳瘯鍗�"); + } + // 鏌ュ嚭鑰冭瘯璇曞嵎 + ExamPaper examPaper = examPaperMapper.selectById(exam.getExamPaperId()); + if (Objects.isNull(examPaper)) { + throw new RuntimeException("璇曞嵎涓嶅瓨鍦�"); + } + if (StringUtils.hasText(examPaper.getContent())) { + throw new RuntimeException("璇曞嵎棰樼洰涓虹┖"); + } + // 灏嗛鐩浆鎹负鍙复鏃朵繚瀛樼殑棰樼洰缁撴瀯 + if (ExamPaperTypeEnum.Fixed.getCode().equals(examPaper.getPaperType()) + || ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) { + // 杞崲 + List<PaperFixQuestionVO> data = this.coverTo(examPaper); + return Result.ok().data(data); + } else if (ExamPaperTypeEnum.Random.getCode().equals(examPaper.getPaperType())) { + // todo 闅忔満棰樼洰鐢熸垚 + + } + return null; + } + + /** + * 灏嗘暟鎹簱瀛樺偍鐨勯鐩紝杞负鍙复鏃朵繚瀛樼殑棰樼洰缁撴瀯 + * + * @param examPaper 璇曞嵎 + * @return + */ + private List<PaperFixQuestionVO> coverTo(ExamPaper examPaper) { + List<PaperFixQuestionDTO> questionWarpList = JSON.parseArray(examPaper.getContent(), PaperFixQuestionDTO.class); + return questionWarpList.stream().map(item -> { + PaperFixQuestionVO vo = new PaperFixQuestionVO(); + vo.setTitle(item.getTitle()); + vo.setQuestionType(item.getQuestionType()); + List<DoQuestionVO> doQuestionVOS = item.getQuestionList().stream().map(question -> { + DoQuestionVO doQuestionVO = new DoQuestionVO(); + doQuestionVO.setTitle(question.getTitle()); + doQuestionVO.setQuestionType(item.getQuestionType()); + doQuestionVO.setQuestionItemList(question.getItems()); + doQuestionVO.setId(question.getId()); + doQuestionVO.setOriginalFile(question.getOriginalFile()); + doQuestionVO.setAudioFile(question.getAudioFile()); + return doQuestionVO; + }).collect(Collectors.toList()); + if (ExamPaperTypeEnum.RandomOrder.getCode().equals(examPaper.getPaperType())) { + // 闅忓簭璇曞嵎鎵撲贡椤哄簭 + Collections.shuffle(doQuestionVOS); + } + vo.setQuestionList(doQuestionVOS); + return vo; + }).collect(Collectors.toList()); } /** @@ -158,27 +230,31 @@ if (Objects.isNull(exam)) { throw new RuntimeException("璇ヨ�冭瘯涓嶅瓨鍦�"); } - // 鍒ゆ柇鍗曢�夈�佸閫夈�佸垽鏂瀵归敊 - List<Integer> questionIds = submitData.getQuestionList().stream().map(DoQuestionVO::getId).collect(Collectors.toList()); - List<Question> questionList = questionMapper.getAnswerInfo(questionIds); - Map<Integer, Question> answerMap = questionList.stream().collect(Collectors.toMap(Question::getId, entity -> entity)); - submitData.getQuestionList().stream().forEach(item -> { - Question question = answerMap.get(item.getId()); - if (Objects.nonNull(question) - && (QuestionTypeEnum.SingleChoice.getCode().equals(question.getQuestionType()) - || QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType()) - || QuestionTypeEnum.TrueFalse.getCode().equals(question.getQuestionType()) - )) { - String correct = question.getCorrect(); - if (QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())) { - // 濡傛灉鏄�夋嫨棰橈紝閭d箞灏嗙瓟妗堣浆涓簂ist - List<String> answerList = JSON.parseArray(correct, String.class); - item.setRight(answerList.containsAll(item.getAnswerList())); - } else { - item.setRight(question.getCorrect().equals(item.getAnswer())); - } - } - }); +// // 鍒ゆ柇鍗曢�夈�佸閫夈�佸垽鏂瀵归敊 +// List<Integer> questionIds = new ArrayList<>(24); +// submitData.getPaperQuestionList().forEach(item -> { +// List<Integer> ids = item.getQuestionList().stream().map(DoQuestionVO::getId).collect(Collectors.toList()); +// questionIds.addAll(ids); +// }); +// List<Question> questionList = questionMapper.getAnswerInfo(questionIds); +// Map<Integer, Question> answerMap = questionList.stream().collect(Collectors.toMap(Question::getId, entity -> entity)); +// submitData.getQuestionList().stream().forEach(item -> { +// Question question = answerMap.get(item.getId()); +// if (Objects.nonNull(question) +// && (QuestionTypeEnum.SingleChoice.getCode().equals(question.getQuestionType()) +// || QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType()) +// || QuestionTypeEnum.TrueFalse.getCode().equals(question.getQuestionType()) +// )) { +// String correct = question.getCorrect(); +// if (QuestionTypeEnum.MultipleChoice.getCode().equals(question.getQuestionType())) { +// // 濡傛灉鏄�夋嫨棰橈紝閭d箞灏嗙瓟妗堣浆涓簂ist +// List<String> answerList = JSON.parseArray(correct, String.class); +// item.setRight(answerList.containsAll(item.getAnswerList())); +// } else { +// item.setRight(question.getCorrect().equals(item.getAnswer())); +// } +// } +// }); // 闃呭嵎鍚庢墠寰�exam_paper_answer淇濆瓨鑰冭瘯鎴愮哗銆佷互鍙婁繚瀛樺埌exam_paper_customer_answer // 鐜板湪鍙渶瑕佷繚瀛樺埌涓�寮犱复鏃惰〃 // 璇ユ帴鍙f槸涓诲姩鎻愪氦锛屾墍浠ョ姸鎬侀兘璁剧疆涓哄畬鎴愶紝浠ヤ究鍚庣画鑰佸笀闃呭嵎 @@ -208,7 +284,7 @@ return; } one.setDoTime(submitData.getDoTime()); - one.setExamSubmit(JSON.toJSONString(submitData.getQuestionList())); + one.setExamSubmit(JSON.toJSONString(submitData.getPaperQuestionList())); one.setCreateTime(new Date()); one.setStatus(status); examSubmitTempMapper.updateById(one); @@ -218,7 +294,7 @@ examSubmitTemp.setDoTime(submitData.getDoTime()); examSubmitTemp.setStatus(status); examSubmitTemp.setUserId(webContext.getCurrentUser().getId()); - examSubmitTemp.setExamSubmit(JSON.toJSONString(submitData.getQuestionList())); + examSubmitTemp.setExamSubmit(JSON.toJSONString(submitData.getPaperQuestionList())); examSubmitTemp.setMarkPaperStatus(ExamSubmitTempStatusEnum.TEMP); examSubmitTempMapper.insert(examSubmitTemp); } @@ -264,4 +340,5 @@ markPaperVO.setSuggestTime(examPaper.getSuggestTime()); return Result.ok().data(markPaperVO); } + } diff --git a/src/main/resources/mapper/ExamMapper.xml b/src/main/resources/mapper/ExamMapper.xml index cdc7dd3..9c67ad9 100644 --- a/src/main/resources/mapper/ExamMapper.xml +++ b/src/main/resources/mapper/ExamMapper.xml @@ -61,7 +61,7 @@ TEP.name FROM t_exam TE - INNER JOIN t_user TU ON TU.id = TE.teacher_id AND TU.deleted = 0 + INNER JOIN t_user TU ON TU.id = TE.teacher_id AND TU.deleted = 0 AND TU.id = #{userId} LEFT JOIN t_classes TC ON TC.id = TE.classes_id AND TC.deleted = 0 LEFT JOIN t_exam_paper TEP ON TEP.id = TE.exam_paper_id AND TEP.deleted = 0 WHERE @@ -74,4 +74,34 @@ </if> </select> + + <select id="studentPage" resultMap="BaseResultMap"> + SELECT + TE.exam_name, + TE.exam_paper_id, + TE.classes_id, + TE.exam_paper_type, + TE.exam_place, + TE.status, + IF(TE.status != 'not_start', IF(TE.status == 'ing', 1, 2), 0) as orderc, + TE.start_time, + TE.end_time, + TE.create_time, + TE.teacher_id, + TE.id, + TC.class_name, + TEP.name + FROM + t_exam TE + INNER JOIN t_classes TC ON TC.id = TE.classes_id AND TC.deleted = 0 + INNER JOIN t_classes_user TCU ON TC.id = TCU.classes_id AND TC.deleted = 0 AND TCU.user_id = #{userId} + INNER JOIN t_exam_paper TEP ON TEP.id = TE.exam_paper_id AND TEP.deleted = 0 + WHERE + TE.deleted = 0 + <if test="query.examName != null and query.examName != ''"> + AND TE.exam_name like concat('%', #{query.examName}, '%') + </if> + ORDER BY orderc DESC + </select> + </mapper> -- Gitblit v1.8.0