From 065da854eef76f08d4f811c405a608ad6a6751fc Mon Sep 17 00:00:00 2001 From: lbw <1192299468@qq.com> Date: Thu, 18 Dec 2025 17:21:37 +0800 Subject: [PATCH] =?UTF-8?q?feat(exam):=20=E6=94=AF=E6=8C=81=E6=8C=89?= =?UTF-8?q?=E5=8D=95=E4=B8=AA=E5=AD=A6=E7=94=9F=E5=92=8C=E8=80=83=E8=AF=95?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E7=94=9F=E6=88=90=E8=80=83=E8=AF=95=E8=AF=95?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改生成试题按钮仅在选中特定一个学生时可用,避免多选时误操作 - 在考试生成对话框新增“类型”选择项,支持“摸底”和“期中|期末”类型 - 调整后台接口,使用单个学生ID和考试类型替代学生ID列表参数 - 优化考试生成服务,新增摸底考试生成逻辑,按年级分区随机抽词汇 - 考试相关数据对象新增类型字段,保持数据完整性和一致性 - 修改考试判卷服务,将错误信息字段统一为msg,避免字段混淆 - 调整数据库操作,支持单个学生考试与词汇随机获取 - 同步更新测试用例和词汇库数据插入逻辑,确保环境一致性 - 修复界面生成按钮状态和对话框提交按钮的校验逻辑,提升用户体验 --- .../service/constant/ExamWordsConstant.java | 106 +++++++++++++++++- .../controller/ExamWordsController.java | 13 ++- .../domain/dataobject/ExamWordsDO.java | 2 + .../dataobject/ExamWordsJudgeResultDO.java | 4 +- .../mapper/ExamWordsJudgeResultDOMapper.java | 2 +- .../mapper/StudentExamWordsDOMapper.java | 2 +- .../domain/mapper/VocabularyBankDOMapper.java | 2 + .../model/vo/exam/GenerateExamWordsReqVO.java | 3 +- .../service/service/ExamWordsService.java | 2 +- .../service/exam/ExamWordsServiceImpl.java | 66 ++++++++--- .../judge/ExamWordsJudgeServiceImpl.java | 14 +-- .../enlish/service/utils/PngUtil.java | 2 - .../resources/mapper/ExamWordsDOMapper.xml | 1 + .../mapper/ExamWordsJudgeResultDOMapper.xml | 7 +- .../mapper/StudentExamWordsDOMapper.xml | 2 - .../mapper/VocabularyBankDOMapper.xml | 12 ++ .../resources/templates/assessment_v5.docx | Bin 25458 -> 25489 bytes .../mapper/TestVocabularyBankInsert.java | 23 ++-- .../enlish/service/service/exam/ExamTest.java | 2 +- .../layouts/components/ExamGenerateDialog.vue | 15 ++- enlish-vue/src/pages/class.vue | 2 +- 21 files changed, 228 insertions(+), 54 deletions(-) diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/ExamWordsConstant.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/ExamWordsConstant.java index 73ce3cc..ed6260d 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/ExamWordsConstant.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/constant/ExamWordsConstant.java @@ -1,6 +1,108 @@ package com.yinlihupo.enlish.service.constant; -public interface ExamWordsConstant { +public class ExamWordsConstant { - int PGN_COL = 53; + public static final int PGN_COL = 53; + + public static final int GRADE_1 = 1; + public static final int GRADE_2 = 2; + public static final int GRADE_3 = 3; + public static final int GRADE_4 = 4; + public static final int GRADE_5 = 5; + public static final int GRADE_6 = 7; + public static final int GRADE_7 = 8; + public static final int GRADE_8 = 9; + + public static final int ZONE_A_SIZE = 10; + public static final int ZONE_B_SIZE = 20; + public static final int ZONE_C_SIZE = 28; + public static final int ZONE_D_SIZE = 21; + public static final int ZONE_E_SIZE = 14; + public static final int ZONE_F_SIZE = 7; + + + public static final int EXAM_TYPE_BASELINE = 1; + + public static int getZoneA(int gradeId) { + return switch (gradeId) { + case GRADE_1 -> GRADE_2; + case GRADE_2 -> GRADE_3; + case GRADE_3 -> GRADE_4; + case GRADE_4 -> GRADE_5; + case GRADE_5 -> GRADE_6; + case GRADE_6 -> GRADE_7; + case GRADE_7 -> GRADE_8; + default -> 0; + }; + } + + public static int getZoneB(int gradeId) { + return switch (gradeId) { + case GRADE_1 -> GRADE_1; + case GRADE_2 -> GRADE_2; + case GRADE_3 -> GRADE_3; + case GRADE_4 -> GRADE_4; + case GRADE_5 -> GRADE_5; + case GRADE_6 -> GRADE_6; + case GRADE_7 -> GRADE_7; + case GRADE_8 -> GRADE_8; + default -> 0; + }; + } + + public static int getZoneC(int gradeId) { + return switch (gradeId) { + case GRADE_1 -> GRADE_1; + case GRADE_2 -> GRADE_1; + case GRADE_3 -> GRADE_2; + case GRADE_4 -> GRADE_3; + case GRADE_5 -> GRADE_4; + case GRADE_6 -> GRADE_5; + case GRADE_7 -> GRADE_6; + case GRADE_8 -> GRADE_7; + default -> 0; + }; + } + + public static int getZoneD(int gradeId) { + return switch (gradeId) { + case GRADE_1 -> GRADE_1; + case GRADE_2 -> GRADE_1; + case GRADE_3 -> GRADE_1; + case GRADE_4 -> GRADE_2; + case GRADE_5 -> GRADE_3; + case GRADE_6 -> GRADE_4; + case GRADE_7 -> GRADE_5; + case GRADE_8 -> GRADE_6; + default -> 0; + }; + } + + public static int getZoneE(int gradeId) { + return switch (gradeId) { + case GRADE_1 -> GRADE_1; + case GRADE_2 -> GRADE_1; + case GRADE_3 -> GRADE_1; + case GRADE_4 -> GRADE_1; + case GRADE_5 -> GRADE_2; + case GRADE_6 -> GRADE_3; + case GRADE_7 -> GRADE_4; + case GRADE_8 -> GRADE_5; + default -> 0; + }; + } + + public static int getZoneF(int gradeId) { + return switch (gradeId) { + case GRADE_1 -> GRADE_1; + case GRADE_2 -> GRADE_1; + case GRADE_3 -> GRADE_1; + case GRADE_4 -> GRADE_1; + case GRADE_5 -> GRADE_1; + case GRADE_6 -> GRADE_2; + case GRADE_7 -> GRADE_3; + case GRADE_8 -> GRADE_4; + default -> 0; + }; + } } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java index 5522368..074d177 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/controller/ExamWordsController.java @@ -44,12 +44,13 @@ public class ExamWordsController { public void generateFeltExamWords(@RequestBody GenerateExamWordsReqVO generateExamWordsReqVO, HttpServletResponse response) { Integer gradeId = generateExamWordsReqVO.getGradeId(); Integer level = generateExamWordsReqVO.getLevel(); - List studentIds = generateExamWordsReqVO.getStudentIds(); - if (studentIds == null || studentIds.isEmpty() || gradeId == null || level == null) { + Integer type = generateExamWordsReqVO.getType(); + Integer studentId = generateExamWordsReqVO.getStudentId(); + if (studentId == null || gradeId == null || level == null) { throw new RuntimeException("参数错误"); } try { - ExamWordsDO examWordsDO = examWordsService.generateExamWords(gradeId, level, studentIds); + ExamWordsDO examWordsDO = examWordsService.generateExamWords(gradeId, level, studentId, type); if (examWordsDO == null || examWordsDO.getWordIds().isEmpty()) { throw new RuntimeException("没有单词"); } @@ -60,7 +61,7 @@ public class ExamWordsController { .definition(vocabularyBankDO.getDefinition()) .build()).toList(); - List studentDetailList = studentService.getStudentDetailList(studentIds); + List studentDetailList = studentService.getStudentDetailList(Collections.singletonList(studentId)); List> maps = studentDetailList.stream().map(studentDetail -> { Map data = new HashMap<>(); data.put("examId", examWordsDO.getId()); @@ -115,7 +116,7 @@ public class ExamWordsController { .correctWordCount(examWordsJudgeResultDO.getCorrectWordCount()) .wrongWordCount(examWordsJudgeResultDO.getWrongWordCount()) .isFinished(examWordsJudgeResultDO.getIsFinished()) - .errorMsg(examWordsJudgeResultDO.getErrorMsg()) + .errorMsg(examWordsJudgeResultDO.getMsg()) .build() ).toList(); return PageResponse.success(list, page, total, size); @@ -134,7 +135,7 @@ public class ExamWordsController { .correctWordCount(examWordsJudgeResultDO.getCorrectWordCount()) .wrongWordCount(examWordsJudgeResultDO.getWrongWordCount()) .isFinished(examWordsJudgeResultDO.getIsFinished()) - .errorMsg(examWordsJudgeResultDO.getErrorMsg()) + .errorMsg(examWordsJudgeResultDO.getMsg()) .correctWordIds(examWordsJudgeResultDO.getCorrectWordIds()) .wrongWordIds(examWordsJudgeResultDO.getWrongWordIds()) .build(); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsDO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsDO.java index a417953..93734ab 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsDO.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsDO.java @@ -19,6 +19,8 @@ public class ExamWordsDO { private Integer level; + private Integer type; + private String title; private LocalDateTime createdAt; diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsJudgeResultDO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsJudgeResultDO.java index 33c7b16..015f30f 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsJudgeResultDO.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/dataobject/ExamWordsJudgeResultDO.java @@ -27,12 +27,14 @@ public class ExamWordsJudgeResultDO { private Integer isFinished; + private Integer ansGradeId; + private LocalDateTime startDate; private List correctWordIds; private List wrongWordIds; - private String errorMsg; + private String msg; } \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsJudgeResultDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsJudgeResultDOMapper.java index fa1fc4a..a8b0bba 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsJudgeResultDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsJudgeResultDOMapper.java @@ -11,7 +11,7 @@ public interface ExamWordsJudgeResultDOMapper { List selectUnfinishedExamWordsJudgeResultDOList(int count); - int updateErrorMsg(@Param("id") Integer id, @Param("errorMsg") String errorMsg); + int updateMsg(@Param("id") Integer id, @Param("msg") String msg); int updateExamWordsJudgeResultDO(@Param("examWordsJudgeResultDO") ExamWordsJudgeResultDO examWordsJudgeResultDO); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/StudentExamWordsDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/StudentExamWordsDOMapper.java index 142b49b..9a1113a 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/StudentExamWordsDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/StudentExamWordsDOMapper.java @@ -8,7 +8,7 @@ import java.util.List; public interface StudentExamWordsDOMapper { - int insertStudentsExam(@Param("studentIds") List studentIds, @Param("examWordsId") Integer examWordsId); + int insertStudentsExam(@Param("studentId") Integer studentId, @Param("examWordsId") Integer examWordsId); StudentExamWordsDO selectByStudentIdAndExamWordsId(@Param("studentId") Integer studentId, @Param("examWordsId") Integer examWordsId); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java index c51a82d..55d3df3 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/VocabularyBankDOMapper.java @@ -21,5 +21,7 @@ public interface VocabularyBankDOMapper { List selectVocabularyBankListSelfCheck(@Param("gradeId") Integer gradeId, @Param("studentId") Integer studentId, @Param("ids") List ids, @Param("wordCount") Integer wordCount); + List selectVocabularyBankListByGradeIdRandom(@Param("gradeId") Integer gradeId, @Param("wordCount") Integer wordCount); + Integer selectWordTotal(); } \ No newline at end of file diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/GenerateExamWordsReqVO.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/GenerateExamWordsReqVO.java index da093ba..ffdceec 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/GenerateExamWordsReqVO.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/model/vo/exam/GenerateExamWordsReqVO.java @@ -16,5 +16,6 @@ public class GenerateExamWordsReqVO { private Integer gradeId; private Integer level; - private List studentIds; + private Integer type; + private Integer studentId; } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java index 3c4066f..f12524c 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/ExamWordsService.java @@ -8,7 +8,7 @@ import java.util.List; public interface ExamWordsService { - ExamWordsDO generateExamWords(Integer gradeId, Integer level, List studentIds); + ExamWordsDO generateExamWords(Integer gradeId, Integer level, Integer studentId, Integer type); int saveExamWordsPngToDbAndLocal(MultipartFile file); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java index c7d667d..f49f84f 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/exam/ExamWordsServiceImpl.java @@ -1,7 +1,9 @@ package com.yinlihupo.enlish.service.service.exam; +import com.yinlihupo.enlish.service.constant.ExamWordsConstant; import com.yinlihupo.enlish.service.domain.dataobject.ExamWordsDO; import com.yinlihupo.enlish.service.domain.dataobject.ExamWordsJudgeResultDO; +import com.yinlihupo.enlish.service.domain.dataobject.StudentDO; import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO; import com.yinlihupo.enlish.service.domain.mapper.*; import com.yinlihupo.enlish.service.service.ExamWordsService; @@ -16,6 +18,7 @@ import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -33,6 +36,9 @@ public class ExamWordsServiceImpl implements ExamWordsService { private StudentExamWordsDOMapper studentExamWordsDOMapper; @Resource private ExamWordsJudgeResultDOMapper examWordsJudgeResultDOMapper; + @Resource + private StudentDOMapper studentDOMapper; + @Value("${templates.count}") private Integer wordCount; @Value("${tmp.png}") @@ -40,23 +46,55 @@ public class ExamWordsServiceImpl implements ExamWordsService { @Override @Transactional(rollbackFor = RuntimeException.class) - public ExamWordsDO generateExamWords(Integer gradeId, Integer level, List studentIds) { + public ExamWordsDO generateExamWords(Integer gradeId, Integer level, Integer studentId, Integer type) { - List unitIds = gradeUnitDOMapper.selectUnitIdsByGradeId(gradeId); - List vocabularyBankDOS = new ArrayList<>(); - int count = wordCount; - for (Integer unitId : unitIds) { - List words = vocabularyBankDOMapper.selectVocabularyBankDOListByUnitId(unitId, 20); - vocabularyBankDOS.addAll(words); - count -= 20; - if (count <= 0) { - break; - } + + ExamWordsDO examWordsDO; + + if (type == ExamWordsConstant.EXAM_TYPE_BASELINE) { + log.info("生成摸底测试"); + examWordsDO = generateBaselineExamWords(studentId); + } else { + // todo 生成期中考试待实现 + examWordsDO = null; } + + return examWordsDO; + } + + private ExamWordsDO generateBaselineExamWords(Integer studentId) { + StudentDO studentDO = studentDOMapper.selectStudentById(studentId); + Integer gradeId = studentDO.getGradeId(); + + int zoneA = ExamWordsConstant.getZoneA(gradeId); + int zoneASize = ExamWordsConstant.ZONE_A_SIZE; + List vocabularyBankDOS = new ArrayList<>(vocabularyBankDOMapper.selectVocabularyBankListByGradeIdRandom(zoneA, zoneASize)); + + int zoneB = ExamWordsConstant.getZoneB(gradeId); + int zoneBSize = ExamWordsConstant.ZONE_B_SIZE; + vocabularyBankDOS.addAll(vocabularyBankDOMapper.selectVocabularyBankListByGradeIdRandom(zoneB, zoneBSize)); + + int zoneC = ExamWordsConstant.getZoneC(gradeId); + int zoneCSize = ExamWordsConstant.ZONE_C_SIZE; + vocabularyBankDOS.addAll(vocabularyBankDOMapper.selectVocabularyBankListByGradeIdRandom(zoneC, zoneCSize)); + + int zoneD = ExamWordsConstant.getZoneD(gradeId); + int zoneDSize = ExamWordsConstant.ZONE_D_SIZE; + vocabularyBankDOS.addAll(vocabularyBankDOMapper.selectVocabularyBankListByGradeIdRandom(zoneD, zoneDSize)); + + int zoneE = ExamWordsConstant.getZoneE(gradeId); + int zoneESize = ExamWordsConstant.ZONE_E_SIZE; + vocabularyBankDOS.addAll(vocabularyBankDOMapper.selectVocabularyBankListByGradeIdRandom(zoneE, zoneESize)); + + int zoneF = ExamWordsConstant.getZoneF(gradeId); + int zoneFSize = ExamWordsConstant.ZONE_F_SIZE; + vocabularyBankDOS.addAll(vocabularyBankDOMapper.selectVocabularyBankListByGradeIdRandom(zoneF, zoneFSize)); + ExamWordsDO examWordsDO = ExamWordsDO.builder() .gradeId(gradeId) - .level(level) - .title(LocalDateTime.now() + "测试") + .level(1) + .type(ExamWordsConstant.EXAM_TYPE_BASELINE) + .title("摸低测试测试" + studentDO.getName()) .createdAt(LocalDateTime.now()) .wordIds(vocabularyBankDOS.stream().map(VocabularyBankDO::getId).toList()) .build(); @@ -66,7 +104,7 @@ public class ExamWordsServiceImpl implements ExamWordsService { throw new RuntimeException("插入考试失败"); } - int insertStudentsExam = studentExamWordsDOMapper.insertStudentsExam(studentIds, examWordsDO.getId()); + int insertStudentsExam = studentExamWordsDOMapper.insertStudentsExam(studentId, examWordsDO.getId()); if (insertStudentsExam <= 0) { throw new RuntimeException("插入学生关联考试失败"); } diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/judge/ExamWordsJudgeServiceImpl.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/judge/ExamWordsJudgeServiceImpl.java index 351974f..5dffabf 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/judge/ExamWordsJudgeServiceImpl.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/service/judge/ExamWordsJudgeServiceImpl.java @@ -51,7 +51,7 @@ public class ExamWordsJudgeServiceImpl implements ExamWordsJudgeService { StudentExamId studentExamId = PngUtil.analyzeExamWordsIdAndStudentId(ansSheetPath, tessdataPath, coordinatesXIES); Integer examWordsJudgeResultDOId = examWordsJudgeResultDO.getId(); if (studentExamId == null) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "未识别学生 id 和考试 id"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "未识别学生 id 和考试 id"); continue; } @@ -59,18 +59,18 @@ public class ExamWordsJudgeServiceImpl implements ExamWordsJudgeService { Integer examWordsId = studentExamId.getExamId(); StudentExamWordsDO studentExamWordsDO = studentExamWordsDOMapper.selectByStudentIdAndExamWordsId(studentId, examWordsId); if (studentExamWordsDO == null) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "未找到学生 id 和考试 id 对应的考试记录"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "未找到学生 id 和考试 id 对应的考试记录"); continue; } log.info("studentId:{},examWordsId:{}", studentId, examWordsId); if (studentExamWordsDO.getIsCompleted() == 1) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "考试记录此前已识别"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "考试记录此前已识别"); continue; } ExamWordsDO examWordsDO = examWordsDOMapper.selectById(examWordsId); if(examWordsDO == null) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "未找到考试"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "未找到考试"); continue; } @@ -90,7 +90,7 @@ public class ExamWordsJudgeServiceImpl implements ExamWordsJudgeService { .build(); int updated = examWordsJudgeResultDOMapper.updateExamWordsJudgeResultDO(wordsJudgeResultDO); if (updated != 1) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "更新考试记录失败"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "更新考试记录失败"); continue; } log.info("更新考试记录成功"); @@ -114,13 +114,13 @@ public class ExamWordsJudgeServiceImpl implements ExamWordsJudgeService { ).toList()); int batched = wordMasteryLogDOMapper.batchUpdateStudentMastery(wordMasteryLogDOS); if (batched == 0) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "更新学生记忆力记录失败"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "更新学生记忆力记录失败"); continue; } int updateStudentExamWordsFinished = studentExamWordsDOMapper.updateStudentExamWordsFinished(studentId, examWordsId); if (updateStudentExamWordsFinished != 1) { - examWordsJudgeResultDOMapper.updateErrorMsg(examWordsJudgeResultDOId, "更新学生考试为结束时失败"); + examWordsJudgeResultDOMapper.updateMsg(examWordsJudgeResultDOId, "更新学生考试为结束时失败"); } boolean delete = new File(ansSheetPath).delete(); diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/PngUtil.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/PngUtil.java index 5584b6a..ba430da 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/PngUtil.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/utils/PngUtil.java @@ -3,7 +3,6 @@ package com.yinlihupo.enlish.service.utils; import com.yinlihupo.enlish.service.constant.ExamWordsConstant; import com.yinlihupo.enlish.service.model.bo.CoordinatesXY; import com.yinlihupo.enlish.service.model.bo.StudentExamId; -import com.yinlihupo.enlish.service.model.bo.Word; import lombok.extern.slf4j.Slf4j; import net.sourceforge.tess4j.ITesseract; import net.sourceforge.tess4j.Tesseract; @@ -13,7 +12,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.opencv.core.*; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; -import org.springframework.beans.factory.annotation.Value; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; diff --git a/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml b/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml index c9191a2..c15def6 100644 --- a/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml @@ -7,6 +7,7 @@ + diff --git a/enlish-service/src/main/resources/mapper/ExamWordsJudgeResultDOMapper.xml b/enlish-service/src/main/resources/mapper/ExamWordsJudgeResultDOMapper.xml index 7763ead..632a0cc 100644 --- a/enlish-service/src/main/resources/mapper/ExamWordsJudgeResultDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/ExamWordsJudgeResultDOMapper.xml @@ -11,7 +11,8 @@ - + + @@ -31,9 +32,9 @@ limit #{count} - + update exam_words_judge_result - set error_msg = #{errorMsg} + set msg = #{msg} and is_finished = 2 where id = #{id} diff --git a/enlish-service/src/main/resources/mapper/StudentExamWordsDOMapper.xml b/enlish-service/src/main/resources/mapper/StudentExamWordsDOMapper.xml index 4af9a98..9e52f3d 100644 --- a/enlish-service/src/main/resources/mapper/StudentExamWordsDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/StudentExamWordsDOMapper.xml @@ -13,9 +13,7 @@ insert into student_exam_words (student_id, exam_words_id, is_completed, start_data) values - (#{studentId}, #{examWordsId}, 0, now()) - + + \ No newline at end of file diff --git a/enlish-service/src/main/resources/templates/assessment_v5.docx b/enlish-service/src/main/resources/templates/assessment_v5.docx index 2b93caa8c1f934d0a5c1624d14d1bfe9e3352356..eed6fbc8e8b444da6bf02e5dcaa08fb11270d585 100644 GIT binary patch delta 15765 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 diff --git a/enlish-service/src/test/java/com/yinlihupo/enlish/service/mapper/TestVocabularyBankInsert.java b/enlish-service/src/test/java/com/yinlihupo/enlish/service/mapper/TestVocabularyBankInsert.java index c3beb1d..598e963 100644 --- a/enlish-service/src/test/java/com/yinlihupo/enlish/service/mapper/TestVocabularyBankInsert.java +++ b/enlish-service/src/test/java/com/yinlihupo/enlish/service/mapper/TestVocabularyBankInsert.java @@ -1,7 +1,9 @@ package com.yinlihupo.enlish.service.mapper; +import com.yinlihupo.enlish.service.domain.dataobject.GradeUnitDO; import com.yinlihupo.enlish.service.domain.dataobject.UnitDO; import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO; +import com.yinlihupo.enlish.service.domain.mapper.GradeUnitDOMapper; import com.yinlihupo.enlish.service.domain.mapper.UnitDOMapper; import com.yinlihupo.enlish.service.domain.mapper.VocabularyBankDOMapper; import com.yinlihupo.enlish.service.domain.mapper.WordMasteryLogDOMapper; @@ -29,11 +31,13 @@ public class TestVocabularyBankInsert { private UnitDOMapper unitDOMapper; @Resource private WordMasteryLogDOMapper wordMasteryLogDOMapper; - + @Resource + private GradeUnitDOMapper gradeUnitDOMapper; @Test void test() { - String file = "C:\\project\\java\\enlish_edu\\enlish\\enlish-service\\src\\test\\java\\com\\yinlihupo\\enlish\\service\\mapper\\min.xlsx"; + String file = "C:\\project\\java\\enlish_edu\\enlish\\enlish-service\\src\\test\\java\\com\\yinlihupo\\enlish\\service\\mapper\\3上.xlsx"; HashMap map = new HashMap<>(); + int gradeId = 3; try (FileInputStream fis = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(fis)) { Sheet sheet = workbook.getSheetAt(0); @@ -44,10 +48,14 @@ public class TestVocabularyBankInsert { continue; } - String gradeUnit = row.getCell(0).getStringCellValue(); - String word = row.getCell(1).getStringCellValue(); - String phonetic = row.getCell(2) != null ? row.getCell(2).getStringCellValue() : ""; - String meaning = row.getCell(3) != null ? row.getCell(3).getStringCellValue() : ""; + + String word = row.getCell(0).getStringCellValue(); + String meaning = row.getCell(1) != null ? row.getCell(1).getStringCellValue() : ""; + String gradeUnit = row.getCell(2) != null ? row.getCell(2).getStringCellValue() : ""; + + if (word.contains("Unit")) { + continue; + } int gradeUnitId = 0; if (map.containsKey(gradeUnit)) { @@ -61,6 +69,7 @@ public class TestVocabularyBankInsert { .createAt(LocalDateTime.now()) .build(); unitDOMapper.insert(unitDO); + gradeUnitDOMapper.insert(GradeUnitDO.builder().unitId(unitDO.getId()).gradeId(gradeId).build()); gradeUnitId = unitDO.getId(); } else { gradeUnitId = unitDO.getId(); @@ -71,7 +80,7 @@ public class TestVocabularyBankInsert { VocabularyBankDO vocabularyBankDO = VocabularyBankDO.builder() .word(word) .definition(meaning) - .pronunciation(phonetic) + .pronunciation("") .unitId(gradeUnitId) .build(); vocabularyBankMapper.insertSelective(vocabularyBankDO); diff --git a/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamTest.java b/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamTest.java index c798ea9..b087d87 100644 --- a/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamTest.java +++ b/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamTest.java @@ -26,7 +26,7 @@ public class ExamTest { private VocabularyService vocabularyService; @Test public void test() { - ExamWordsDO examWordsDO = examWordsService.generateExamWords(5, 0, List.of(1)); + ExamWordsDO examWordsDO = examWordsService.generateExamWords(5, 0, 1, 0); log.info("{}", examWordsDO); List vocabularyBankDOS = vocabularyService.findVocabularyBankDOListById(examWordsDO.getWordIds()); List assessmentWords = vocabularyBankDOS.stream().map(vocabularyBankDO -> Word.builder() diff --git a/enlish-vue/src/layouts/components/ExamGenerateDialog.vue b/enlish-vue/src/layouts/components/ExamGenerateDialog.vue index 2433cf3..b5d8d42 100644 --- a/enlish-vue/src/layouts/components/ExamGenerateDialog.vue +++ b/enlish-vue/src/layouts/components/ExamGenerateDialog.vue @@ -14,6 +14,12 @@ + + + + + +
已选学生数量:{{ studentIds.length }} @@ -22,7 +28,7 @@ @@ -49,7 +55,7 @@ const loading = ref(false) const gradeOptions = ref([]) const gradeId = ref(null) const level = ref(null) - +const type = ref(null) async function fetchGrades() { loading.value = true try { @@ -65,11 +71,12 @@ async function fetchGrades() { } async function handleGenerate() { - if (!gradeId.value || !level.value || props.studentIds.length === 0) return + if (!gradeId.value || !level.value || !type.value || props.studentIds.length === 0) return await generateExamWords({ gradeId: Number(gradeId.value), level: Number(level.value), - studentIds: props.studentIds + type: Number(type.value), + studentId: props.studentIds[0] }) ElMessage.success('生成任务已提交,正在下载') visible.value = false diff --git a/enlish-vue/src/pages/class.vue b/enlish-vue/src/pages/class.vue index cf275e5..87fa643 100644 --- a/enlish-vue/src/pages/class.vue +++ b/enlish-vue/src/pages/class.vue @@ -45,7 +45,7 @@ selectedGradeId }}) 查询 重置 - 生成试题