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 2192dd6..f8a4a63 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 @@ -54,12 +54,16 @@ public class ExamWordsController { if (examWordsDO == null || examWordsDO.getWordIds().isEmpty()) { throw new RuntimeException("没有单词"); } + List vocabularyBankDOS = vocabularyService.findVocabularyBankDOListById(examWordsDO.getWordIds()); List assessmentWords = vocabularyBankDOS.stream().map(vocabularyBankDO -> Word.builder() .id(vocabularyBankDO.getId()) .title(vocabularyBankDO.getWord()) - .definition(vocabularyBankDO.getDefinition()) + .definition(vocabularyBankDO.getDefinition().length() > 6 ? vocabularyBankDO.getDefinition().substring(0, 6) : vocabularyBankDO.getDefinition()) .build()).toList(); + // bug: 获取单词后,单词的id会乱序、 需要重新更新考试记录中的 id + examWordsDO.setWordIds(assessmentWords.stream().map(Word::getId).toList()); + examWordsService.updateExamWordsWordIdsOrder(examWordsDO); List studentDetailList = studentService.getStudentDetailList(Collections.singletonList(studentId)); List> maps = studentDetailList.stream().map(studentDetail -> { diff --git a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsDOMapper.java b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsDOMapper.java index f154c56..096bbb5 100644 --- a/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsDOMapper.java +++ b/enlish-service/src/main/java/com/yinlihupo/enlish/service/domain/mapper/ExamWordsDOMapper.java @@ -7,4 +7,6 @@ public interface ExamWordsDOMapper { int insert(ExamWordsDO record); ExamWordsDO selectById(Integer id); + + void updateWordIdsOrder(ExamWordsDO examWordsDO); } \ No newline at end of file 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 f12524c..7505b11 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 @@ -11,4 +11,6 @@ public interface ExamWordsService { ExamWordsDO generateExamWords(Integer gradeId, Integer level, Integer studentId, Integer type); int saveExamWordsPngToDbAndLocal(MultipartFile file); + + void updateExamWordsWordIdsOrder(ExamWordsDO examWordsDO); } 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 883823f..16d6955 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 @@ -141,5 +141,10 @@ public class ExamWordsServiceImpl implements ExamWordsService { } + @Override + public void updateExamWordsWordIdsOrder(ExamWordsDO examWordsDO) { + examWordsDOMapper.updateWordIdsOrder(examWordsDO); + } + } 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 ba430da..27142b6 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 @@ -134,7 +134,7 @@ public class PngUtil { // 建议:如果光照不均匀,考虑使用 THRESH_OTSU 自动阈值,或者自适应阈值 Imgproc.threshold(gray, binary, 150, 255, Imgproc.THRESH_BINARY_INV); // 调试时打印 -// Imgcodecs.imwrite("output_binary.png", binary); + // Imgcodecs.imwrite("output_binary.png", binary); List answer = new ArrayList<>(); int words_index = 0; @@ -169,10 +169,10 @@ public class PngUtil { Mat region = binary.submat(rect); int countNonZero = Core.countNonZero(region); - if (countNonZero > 800) { + if (countNonZero > 500) { Integer id = wordIds.get(words_index); answer.add(id); - log.info("检测到标记(未背熟):ID={}", id); + log.info("检测到标记(未背熟):ID={}, 当前坐标 x = {} y = {} ", id, currentX + 1, currentY + 1); } region.release(); diff --git a/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml b/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml index c15def6..45bacc3 100644 --- a/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml +++ b/enlish-service/src/main/resources/mapper/ExamWordsDOMapper.xml @@ -18,6 +18,12 @@ VALUES (#{gradeId}, #{level}, #{title}, #{wordIds, typeHandler=com.yinlihupo.enlish.service.config.ListWordIdTypeHandler}, #{createdAt}) + + update exam_words + set word_ids = #{wordIds, typeHandler=com.yinlihupo.enlish.service.config.ListWordIdTypeHandler} + where id = #{id} + + diff --git a/enlish-service/src/main/resources/templates/assessment_v6.docx b/enlish-service/src/main/resources/templates/assessment_v6.docx new file mode 100644 index 0000000..dd81b41 Binary files /dev/null and b/enlish-service/src/main/resources/templates/assessment_v6.docx differ diff --git a/enlish-service/src/main/resources/templates/p3.png b/enlish-service/src/main/resources/templates/p3.png deleted file mode 100644 index 86996b3..0000000 Binary files a/enlish-service/src/main/resources/templates/p3.png and /dev/null differ 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 598e963..76590b8 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 @@ -35,9 +35,9 @@ public class TestVocabularyBankInsert { private GradeUnitDOMapper gradeUnitDOMapper; @Test void test() { - String file = "C:\\project\\java\\enlish_edu\\enlish\\enlish-service\\src\\test\\java\\com\\yinlihupo\\enlish\\service\\mapper\\3上.xlsx"; + String file = "C:\\project\\java\\enlish_edu\\enlish\\enlish-service\\src\\test\\java\\com\\yinlihupo\\enlish\\service\\mapper\\八下.xlsx"; HashMap map = new HashMap<>(); - int gradeId = 3; + int gradeId = 8; try (FileInputStream fis = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(fis)) { Sheet sheet = workbook.getSheetAt(0); @@ -49,15 +49,22 @@ public class TestVocabularyBankInsert { } +// String word = row.getCell(0).getStringCellValue(); +// String pronunciation = row.getCell(1) != null ? row.getCell(1).getStringCellValue() : ""; +// String pos = row.getCell(2) != null ? row.getCell(2).getStringCellValue() : ""; +// String meaning = row.getCell(3) != null ? row.getCell(3).getStringCellValue() : ""; +// String gradeUnit = row.getCell(4) != null ? row.getCell(4).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() : ""; - + String pronunciation = ""; + String pos = ""; if (word.contains("Unit")) { continue; } - int gradeUnitId = 0; + int gradeUnitId; if (map.containsKey(gradeUnit)) { gradeUnitId = map.get(gradeUnit); } else { @@ -80,7 +87,8 @@ public class TestVocabularyBankInsert { VocabularyBankDO vocabularyBankDO = VocabularyBankDO.builder() .word(word) .definition(meaning) - .pronunciation("") + .pronunciation(pronunciation) + .pos(pos) .unitId(gradeUnitId) .build(); vocabularyBankMapper.insertSelective(vocabularyBankDO); diff --git a/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java b/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java index 07ff7a5..50fdea9 100644 --- a/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java +++ b/enlish-service/src/test/java/com/yinlihupo/enlish/service/service/exam/ExamWordsJudgeServiceTest.java @@ -1,9 +1,16 @@ package com.yinlihupo.enlish.service.service.exam; +import com.yinlihupo.enlish.service.domain.dataobject.ExamWordsDO; import com.yinlihupo.enlish.service.domain.dataobject.ExamWordsJudgeResultDO; +import com.yinlihupo.enlish.service.domain.dataobject.VocabularyBankDO; +import com.yinlihupo.enlish.service.domain.mapper.ExamWordsDOMapper; +import com.yinlihupo.enlish.service.domain.mapper.VocabularyBankDOMapper; +import com.yinlihupo.enlish.service.model.bo.CoordinatesXY; +import com.yinlihupo.enlish.service.model.bo.StudentExamId; import com.yinlihupo.enlish.service.service.ExamWordsJudgeService; import com.yinlihupo.enlish.service.service.StudentService; import com.yinlihupo.enlish.service.utils.DifyArticleClient; +import com.yinlihupo.enlish.service.utils.PngUtil; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; @@ -22,9 +29,29 @@ public class ExamWordsJudgeServiceTest { private StudentService studentService; @Resource private DifyArticleClient difyArticleClient; + @Resource + private ExamWordsDOMapper examWordsDOMapper; + @Resource + private VocabularyBankDOMapper vocabularyBankDOMapper; + @Test public void judgeExamWords() { - examWordsJudgeService.judgeExamWords(1); + String ansSheetPath = "C:\\project\\java\\enlish_edu\\enlish\\enlish-service\\src\\main\\resources\\templates\\3.png"; + List coordinatesXIES = PngUtil.analysisXY(ansSheetPath); + // 从图片中获取学生 id 和考试 id + String tessdataPath = "C:\\project\\tess"; + StudentExamId studentExamId = PngUtil.analyzeExamWordsIdAndStudentId(ansSheetPath, tessdataPath, coordinatesXIES); + Integer examWordsId = 41; + + ExamWordsDO examWordsDO = examWordsDOMapper.selectById(examWordsId); + + List wordIds = examWordsDO.getWordIds(); + List unmemorizedWordIds = PngUtil.analyzePngForUnmemorizedWordIds(ansSheetPath, wordIds, coordinatesXIES); + List memorizedWordIds = wordIds.stream().filter(wordId -> !unmemorizedWordIds.contains(wordId)).toList(); + List vocabularyBankDOS = vocabularyBankDOMapper.selectVocabularyBankDOListByIds(unmemorizedWordIds); + for (VocabularyBankDO vocabularyBankDO : vocabularyBankDOS) { + log.info("未掌握的单词:{}", vocabularyBankDO); + } } @Test