diff --git a/src/main/java/com/hotwj/platform/config/examPaperQuestion/domain/vo/ExamPaperQuestionDetailVo.java b/src/main/java/com/hotwj/platform/config/examPaperQuestion/domain/vo/ExamPaperQuestionDetailVo.java index 468cd11..9eba4f8 100644 --- a/src/main/java/com/hotwj/platform/config/examPaperQuestion/domain/vo/ExamPaperQuestionDetailVo.java +++ b/src/main/java/com/hotwj/platform/config/examPaperQuestion/domain/vo/ExamPaperQuestionDetailVo.java @@ -119,4 +119,9 @@ public class ExamPaperQuestionDetailVo implements Serializable { * 题库题目逻辑删除标记(hot_question_bank.is_deleted) */ private Long questionIsDeleted; + + /** + * 题目解析 + */ + private String caseDesc; } diff --git a/src/main/java/com/hotwj/platform/config/examPaperQuestion/service/impl/HotExamPaperQuestionServiceImpl.java b/src/main/java/com/hotwj/platform/config/examPaperQuestion/service/impl/HotExamPaperQuestionServiceImpl.java index 42fc356..c5ba865 100644 --- a/src/main/java/com/hotwj/platform/config/examPaperQuestion/service/impl/HotExamPaperQuestionServiceImpl.java +++ b/src/main/java/com/hotwj/platform/config/examPaperQuestion/service/impl/HotExamPaperQuestionServiceImpl.java @@ -84,6 +84,10 @@ public class HotExamPaperQuestionServiceImpl implements IHotExamPaperQuestionSer lqw.eq(bo.getQuestionId() != null, HotExamPaperQuestion::getQuestionId, bo.getQuestionId()); lqw.eq(bo.getSortOrder() != null, HotExamPaperQuestion::getSortOrder, bo.getSortOrder()); lqw.eq(bo.getScore() != null, HotExamPaperQuestion::getScore, bo.getScore()); + // 修复试卷试题顺序问题 + lqw.orderByAsc(HotExamPaperQuestion::getQuestionType) + .orderByAsc(HotExamPaperQuestion::getSortOrder) + .orderByAsc(HotExamPaperQuestion::getId); return lqw; } diff --git a/src/main/java/com/hotwj/platform/config/questionBank/domain/vo/HotQuestionBankImportVo.java b/src/main/java/com/hotwj/platform/config/questionBank/domain/vo/HotQuestionBankImportVo.java index 131574a..cc325cd 100644 --- a/src/main/java/com/hotwj/platform/config/questionBank/domain/vo/HotQuestionBankImportVo.java +++ b/src/main/java/com/hotwj/platform/config/questionBank/domain/vo/HotQuestionBankImportVo.java @@ -53,7 +53,7 @@ public class HotQuestionBankImportVo implements Serializable { @ExcelDictFormat(readConverterExp = "1=普通,2=困难,3=极难") private Long difficulty; - @ExcelProperty(value = "案例描述", index = 11) + @ExcelProperty(value = "解析", index = 11) private String caseDesc; @ExcelProperty(value = "题型分类", index = 12, converter = ExcelDictConvert.class) diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/controller/HotTrainingAnswerRecordController.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/controller/HotTrainingAnswerRecordController.java index 037a33b..5bd7d8c 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/controller/HotTrainingAnswerRecordController.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/controller/HotTrainingAnswerRecordController.java @@ -3,6 +3,7 @@ package com.hotwj.platform.securityManagement.trainingAnswer.controller; import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.SubmitTrainingAnswerBo; import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.TrainingAnswerRecordBo; import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingAnswerRecordVo; +import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingWrongQuestionReviewVo; import com.hotwj.platform.securityManagement.trainingAnswer.service.IHotTrainingAnswerRecordService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -12,6 +13,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.excel.utils.ExcelUtil; @@ -20,6 +22,7 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.web.core.BaseController; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -138,4 +141,16 @@ public class HotTrainingAnswerRecordController extends BaseController { public R submit(@RequestBody @Validated(AddGroup.class) SubmitTrainingAnswerBo bo) { return toAjax(hotTrainingAnswerRecordService.submitWithSignature(bo)); } + + @GetMapping("/wrongQuestion/review") + @Operation(summary = "查询错题回顾(当前用户)") + public R> wrongQuestionReview(TrainingAnswerRecordBo bo) { + Long companyId = LoginHelper.getCompanyId(); + String userId = LoginHelper.getBusinessUserId(); + if (StringUtils.isBlank(userId)) { + userId = LoginHelper.getUserIdStr(); + } + List result = hotTrainingAnswerRecordService.queryWrongQuestionReview(companyId, userId, bo); + return R.ok(result); + } } diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/HotTrainingAnswerRecord.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/HotTrainingAnswerRecord.java index 62fdf15..4901ce2 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/HotTrainingAnswerRecord.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/HotTrainingAnswerRecord.java @@ -130,6 +130,16 @@ public class HotTrainingAnswerRecord extends BaseEntity { */ private Date answerTime; + /** + * 错误次数 + */ + private Integer errorCount; + + /** + * 错误答案,逗号拼接 + */ + private String errorAnswers; + /** * 0=正常, 1=已删除 */ diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/bo/TrainingAnswerRecordBo.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/bo/TrainingAnswerRecordBo.java index 8375708..d49928e 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/bo/TrainingAnswerRecordBo.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/bo/TrainingAnswerRecordBo.java @@ -73,6 +73,10 @@ public class TrainingAnswerRecordBo extends BaseEntity { private Date answerTime; + private Integer errorCount; + + private String errorAnswers; + private Long isDeleted; } diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingAnswerRecordVo.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingAnswerRecordVo.java index 1ba174f..9ecf2bd 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingAnswerRecordVo.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingAnswerRecordVo.java @@ -216,5 +216,7 @@ public class HotTrainingAnswerRecordVo implements Serializable { private Boolean passed; + private Integer errorCount; + private String errorAnswers; } diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingWrongQuestionReviewVo.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingWrongQuestionReviewVo.java new file mode 100644 index 0000000..1534bfc --- /dev/null +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/domain/vo/HotTrainingWrongQuestionReviewVo.java @@ -0,0 +1,31 @@ +package com.hotwj.platform.securityManagement.trainingAnswer.domain.vo; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +@Data +public class HotTrainingWrongQuestionReviewVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long questionId; + private String questionType; + private String questionDesc; + private String imageUrl; + + private String optionA; + private String optionB; + private String optionC; + private String optionD; + private String optionE; + private String optionF; + + private String correctAnswers; + private String analysis; + + private Integer errorCount; + +} diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/mapper/HotTrainingAnswerRecordMapper.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/mapper/HotTrainingAnswerRecordMapper.java index 8eaf67f..924d0a2 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/mapper/HotTrainingAnswerRecordMapper.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/mapper/HotTrainingAnswerRecordMapper.java @@ -1,7 +1,10 @@ package com.hotwj.platform.securityManagement.trainingAnswer.mapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hotwj.platform.securityManagement.trainingAnswer.domain.HotTrainingAnswerRecord; +import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.TrainingAnswerRecordBo; import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingAnswerRecordVo; +import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingWrongQuestionReviewVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; @@ -27,4 +30,8 @@ public interface HotTrainingAnswerRecordMapper extends BaseMapperPlus selectWrongQuestionReviewList(@Param("companyId") Long companyId, + @Param("userId") String userId, + @Param("bo") TrainingAnswerRecordBo bo); + } diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/IHotTrainingAnswerRecordService.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/IHotTrainingAnswerRecordService.java index 2325872..8e546dd 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/IHotTrainingAnswerRecordService.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/IHotTrainingAnswerRecordService.java @@ -3,6 +3,7 @@ package com.hotwj.platform.securityManagement.trainingAnswer.service; import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.TrainingAnswerRecordBo; import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.SubmitTrainingAnswerBo; import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingAnswerRecordVo; +import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingWrongQuestionReviewVo; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -84,4 +85,6 @@ public interface IHotTrainingAnswerRecordService { * @return 是否成功 */ Boolean submitWithSignature(SubmitTrainingAnswerBo bo); + + List queryWrongQuestionReview(Long companyId, String userId, TrainingAnswerRecordBo bo); } diff --git a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/impl/HotTrainingAnswerRecordServiceImpl.java b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/impl/HotTrainingAnswerRecordServiceImpl.java index d00b4be..1cd1609 100644 --- a/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/impl/HotTrainingAnswerRecordServiceImpl.java +++ b/src/main/java/com/hotwj/platform/securityManagement/trainingAnswer/service/impl/HotTrainingAnswerRecordServiceImpl.java @@ -1,8 +1,11 @@ package com.hotwj.platform.securityManagement.trainingAnswer.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.hotwj.platform.config.examPaperQuestion.domain.vo.ExamPaperQuestionDetailVo; +import com.hotwj.platform.config.examPaperQuestion.mapper.HotExamPaperQuestionMapper; import com.hotwj.platform.flow.service.ISysFlowService; import com.hotwj.platform.integration.ocr.SignatureVerifyService; import com.hotwj.platform.noticeManagerment.systemNotification.domain.bo.HotSystemNotificationGroupBo; @@ -17,6 +20,7 @@ import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.SubmitTrai import com.hotwj.platform.securityManagement.trainingAnswer.domain.bo.TrainingAnswerRecordBo; import com.hotwj.platform.securityManagement.trainingAnswer.domain.enums.TrainingSceneType; import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingAnswerRecordVo; +import com.hotwj.platform.securityManagement.trainingAnswer.domain.vo.HotTrainingWrongQuestionReviewVo; import com.hotwj.platform.securityManagement.trainingAnswer.mapper.HotTrainingAnswerRecordMapper; import com.hotwj.platform.securityManagement.trainingAnswer.service.IHotTrainingAnswerRecordService; import com.hotwj.platform.securityManagement.trainingAudit.domain.HotTrainingAudit; @@ -64,6 +68,7 @@ public class HotTrainingAnswerRecordServiceImpl implements IHotTrainingAnswerRec private final TrainingProgressService trainingProgressService; private final HotTrainingAuditMapper trainingAuditMapper; private final SignatureVerifyService signatureVerifyService; + private final HotExamPaperQuestionMapper examPaperQuestionMapper; /** * 查询培训课程答题详情记录 @@ -392,6 +397,69 @@ public class HotTrainingAnswerRecordServiceImpl implements IHotTrainingAnswerRec return Boolean.TRUE; } + @Override + public List queryWrongQuestionReview(Long companyId, String userId, TrainingAnswerRecordBo bo) { + if (companyId == null || StringUtils.isBlank(userId)) { + return List.of(); + } + // 1.查询试卷题目 + List paperQuestions = loadPlanPaperQuestionList(bo); + if (CollUtil.isEmpty(paperQuestions)) { + return List.of(); + } + + // 2.查询本次培训计划中错题信息 + List wrongList = baseMapper.selectWrongQuestionReviewList(companyId, userId, bo); + if (CollUtil.isEmpty(wrongList)) { + return List.of(); + } + + // 3.组装返回给前端的错题信息 + Map wrongByQuestionId = wrongList.stream() + .filter(v -> v.getQuestionId() != null) + .collect(Collectors.toMap(HotTrainingWrongQuestionReviewVo::getQuestionId, Function.identity(), (a, b) -> a)); + + List orderedWrong = new ArrayList<>(); + Set addedQuestionIds = new HashSet<>(); + for (ExamPaperQuestionDetailVo questionDetail : paperQuestions) { + if (questionDetail == null || questionDetail.getQuestionId() == null) { + continue; + } + Long questionId = questionDetail.getQuestionId(); + if (!addedQuestionIds.add(questionId)) { + continue; + } + HotTrainingWrongQuestionReviewVo vo = wrongByQuestionId.get(questionId); + if (vo == null) { + continue; + } + vo.setQuestionType(questionDetail.getQuestionType()); + vo.setQuestionDesc(questionDetail.getQuestionDesc()); + vo.setImageUrl(questionDetail.getImageUrl()); + vo.setOptionA(questionDetail.getOptionA()); + vo.setOptionB(questionDetail.getOptionB()); + vo.setOptionC(questionDetail.getOptionC()); + vo.setOptionD(questionDetail.getOptionD()); + vo.setOptionE(questionDetail.getOptionE()); + vo.setOptionF(questionDetail.getOptionF()); + vo.setCorrectAnswers(questionDetail.getCorrectAnswers()); + vo.setAnalysis(questionDetail.getCaseDesc()); + orderedWrong.add(vo); + } + return orderedWrong; + } + + private List loadPlanPaperQuestionList(TrainingAnswerRecordBo bo) { + if (bo == null || bo.getExamId() == null) { + return List.of(); + } + List list = examPaperQuestionMapper.selectPaperQuestionDetailList(bo.getExamId()); + if (CollUtil.isEmpty(list)) { + return List.of(); + } + return list; + } + private void clearPlanAuditRecord(SubmitTrainingAnswerBo bo) { if (bo.getCompanyId() == null || bo.getTrainingId() == null || StringUtils.isBlank(bo.getUserId())) { return; diff --git a/src/main/resources/mapper/config/HotExamPaperQuestionMapper.xml b/src/main/resources/mapper/config/HotExamPaperQuestionMapper.xml index dcf73ca..468bf31 100644 --- a/src/main/resources/mapper/config/HotExamPaperQuestionMapper.xml +++ b/src/main/resources/mapper/config/HotExamPaperQuestionMapper.xml @@ -26,7 +26,8 @@ qb.option_f AS optionF, qb.correct_answers AS correctAnswers, qb.score AS questionScore, - qb.is_deleted AS questionIsDeleted + qb.is_deleted AS questionIsDeleted, + qb.case_desc AS caseDesc FROM hot_exam_paper_question epq LEFT JOIN hot_question_bank qb ON qb.id = epq.question_id WHERE epq.paper_id = #{paperId} diff --git a/src/main/resources/mapper/courseAnswer/HotTrainingAnswerRecordMapper.xml b/src/main/resources/mapper/courseAnswer/HotTrainingAnswerRecordMapper.xml index 2ff1f06..518bba9 100644 --- a/src/main/resources/mapper/courseAnswer/HotTrainingAnswerRecordMapper.xml +++ b/src/main/resources/mapper/courseAnswer/HotTrainingAnswerRecordMapper.xml @@ -136,4 +136,20 @@ ORDER BY ar.question_order ASC, ar.id ASC + +