From ce90ab33af565527c285c04a2e37321098a69d62 Mon Sep 17 00:00:00 2001 From: YOLO <3372134858@qq.com> Date: Sun, 30 Nov 2025 18:40:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E6=94=B9id=E5=90=8E?= =?UTF-8?q?=E7=BB=AD=E9=94=99=E8=AF=AF;ocr=E6=97=B6=E5=BD=95=E5=85=A5?= =?UTF-8?q?=E5=AD=A6=E7=A7=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/achobeta/api/dto/MistakeQuestionDTO.java | 2 +- refine-app/src/main/resources/AnalyzeKnowledge.txt | 12 ++++++------ .../domain/ocr/model/entity/QuestionEntity.java | 5 +++++ .../ocr/service/impl/MistakeQuestionServiceImpl.java | 5 +++++ .../question/adapter/port/AiGenerationService.java | 8 +++++++- .../adapter/repository/IKnowledgeRepository.java | 2 +- .../question/model/entity/MistakeQuestionEntity.java | 2 +- .../domain/question/model/po/MistakeKnowledgePO.java | 2 +- .../question/service/impl/QuestionServiceImpl.java | 2 +- .../adapter/repository/KnowledgeRepository.java | 2 +- .../repository/MistakeQuestionRepository.java | 2 +- .../adapter/repository/MistakeRepository.java | 4 +++- .../infrastructure/dao/IMistakeQuestionMapper.java | 2 +- .../achobeta/infrastructure/dao/KnowledgeMapper.java | 2 +- .../achobeta/infrastructure/dao/po/MistakePO.java | 2 +- .../com/achobeta/trigger/http/OcrController.java | 11 ++++++----- 16 files changed, 42 insertions(+), 23 deletions(-) diff --git a/refine-api/src/main/java/com/achobeta/api/dto/MistakeQuestionDTO.java b/refine-api/src/main/java/com/achobeta/api/dto/MistakeQuestionDTO.java index 45e45e0..f412e3a 100644 --- a/refine-api/src/main/java/com/achobeta/api/dto/MistakeQuestionDTO.java +++ b/refine-api/src/main/java/com/achobeta/api/dto/MistakeQuestionDTO.java @@ -22,6 +22,6 @@ public class MistakeQuestionDTO { // 科目 private String subject; // 知识点id - private Integer knowledgePointId; + private String knowledgePointId; } diff --git a/refine-app/src/main/resources/AnalyzeKnowledge.txt b/refine-app/src/main/resources/AnalyzeKnowledge.txt index c7256b7..857f264 100644 --- a/refine-app/src/main/resources/AnalyzeKnowledge.txt +++ b/refine-app/src/main/resources/AnalyzeKnowledge.txt @@ -1,13 +1,13 @@ 我只给一道题目给你,请严格按照以下规则提取题目核心知识点,仅输出结果,不添加任何额外解释: -1. 领域分类优先:先明确题目所属大领域(如“化学”“Java编程”“数据结构”“小学数学”),再补充子分类(如需),最后聚焦核心考点; +1. 领域分类优先:先明确题目所属大领域(如“化学”“Java编程”“数据结构”“数学”),再补充子分类(如需),最后聚焦核心考点; 2. 去冗余去细节:忽略题目中的具体数值、案例、干扰项等非关键信息,只保留“考察什么能力/概念/公式/方法”; -3. 格式统一规范:采用“大领域-子分类-核心知识点”的层级结构(子分类可省略,核心知识点不超过15字); +3. 格式统一规范:采用“subject:大领域, knowledgeName:子分类+核心知识点”的层级结构(子分类可省略,核心知识点不超过15字); 4. 精准不泛化:不扩大知识点范围,也不缩小(如题目考“氧化还原反应配平”,不写成“化学反应”或“氧化还原反应细节”); 5. 多知识点限制:若题目跨多个考点,仅提取2个最核心的,用“|”分隔。 示例: -- 题目:“写出H₂+O₂=H₂O的配平化学方程式” → 输出:“化学-化学反应-氧化还原反应配平” -- 题目:“Spring Boot中如何通过注解实现属性注入?” → 输出:“Java编程-Spring Boot-@Value属性注入” -- 题目:“一个长方形长5cm、宽3cm,求它的周长” → 输出:“小学数学-几何图形-长方形周长计算” -- 题目:“简述哈希表的原理及解决冲突的方法” → 输出:“数据结构-哈希表-原理|哈希冲突解决” +- 题目:“写出H₂+O₂=H₂O的配平化学方程式” → 输出:“subject:化学, knowledgeName:化学反应-氧化还原反应配平” +- 题目:“Spring Boot中如何通过注解实现属性注入?” → 输出:“subject:Java编程, knowledgeName:Spring Boot-@Value属性注入” +- 题目:“一个长方形长5cm、宽3cm,求它的周长” → 输出:“subject:数学, knowledgeName:几何图形-长方形周长计算” +- 题目:“简述哈希表的原理及解决冲突的方法” → 输出:“subject:数据结构, knowledgeName:哈希表-原理|哈希冲突解决” diff --git a/refine-domain/src/main/java/com/achobeta/domain/ocr/model/entity/QuestionEntity.java b/refine-domain/src/main/java/com/achobeta/domain/ocr/model/entity/QuestionEntity.java index 2d2176b..0dffe69 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/ocr/model/entity/QuestionEntity.java +++ b/refine-domain/src/main/java/com/achobeta/domain/ocr/model/entity/QuestionEntity.java @@ -31,6 +31,11 @@ public class QuestionEntity implements Serializable { */ private String questionText; + /** + * 学科 + */ + private String subject; + /** * 知识点名称 */ diff --git a/refine-domain/src/main/java/com/achobeta/domain/ocr/service/impl/MistakeQuestionServiceImpl.java b/refine-domain/src/main/java/com/achobeta/domain/ocr/service/impl/MistakeQuestionServiceImpl.java index 857499e..6a1772e 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/ocr/service/impl/MistakeQuestionServiceImpl.java +++ b/refine-domain/src/main/java/com/achobeta/domain/ocr/service/impl/MistakeQuestionServiceImpl.java @@ -44,6 +44,11 @@ public boolean saveMistakeQuestion(QuestionEntity questionEntity) { return false; } + if (questionEntity.getSubject() == null || questionEntity.getSubject().isEmpty()){ + log.warn("学科为空,无法保存错题"); + return false; + } + if (questionEntity.getKnowledgePointId() == null || questionEntity.getKnowledgePointId().isEmpty()) { log.warn("知识点id为空,无法保存错题"); return false; diff --git a/refine-domain/src/main/java/com/achobeta/domain/question/adapter/port/AiGenerationService.java b/refine-domain/src/main/java/com/achobeta/domain/question/adapter/port/AiGenerationService.java index 98c91d9..cad626e 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/question/adapter/port/AiGenerationService.java +++ b/refine-domain/src/main/java/com/achobeta/domain/question/adapter/port/AiGenerationService.java @@ -29,6 +29,12 @@ public interface AiGenerationService { // 知识点分析 @SystemMessage(fromResource = "AnalyzeKnowledge.txt") - String knowledgeAnalysis(String questionText); + knowledgePoint knowledgeAnalysis(String questionText); + + record knowledgePoint(String subject, String knowledgeName) { + public boolean isEmpty() { + return subject == null || subject.isEmpty() || knowledgeName == null || knowledgeName.isEmpty(); + } + } } diff --git a/refine-domain/src/main/java/com/achobeta/domain/question/adapter/repository/IKnowledgeRepository.java b/refine-domain/src/main/java/com/achobeta/domain/question/adapter/repository/IKnowledgeRepository.java index f44b9fa..dc0b00b 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/question/adapter/repository/IKnowledgeRepository.java +++ b/refine-domain/src/main/java/com/achobeta/domain/question/adapter/repository/IKnowledgeRepository.java @@ -2,6 +2,6 @@ public interface IKnowledgeRepository { - String findKnowledgeNameById(Integer knowledgePointId); + String findKnowledgeNameById(String knowledgePointId); } diff --git a/refine-domain/src/main/java/com/achobeta/domain/question/model/entity/MistakeQuestionEntity.java b/refine-domain/src/main/java/com/achobeta/domain/question/model/entity/MistakeQuestionEntity.java index 1db635c..049b670 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/question/model/entity/MistakeQuestionEntity.java +++ b/refine-domain/src/main/java/com/achobeta/domain/question/model/entity/MistakeQuestionEntity.java @@ -47,7 +47,7 @@ public class MistakeQuestionEntity { /** * 知识点归属ID */ - private Integer knowledgePointId; + private String knowledgePointId; /** * 学习笔记 diff --git a/refine-domain/src/main/java/com/achobeta/domain/question/model/po/MistakeKnowledgePO.java b/refine-domain/src/main/java/com/achobeta/domain/question/model/po/MistakeKnowledgePO.java index 6764801..af11df6 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/question/model/po/MistakeKnowledgePO.java +++ b/refine-domain/src/main/java/com/achobeta/domain/question/model/po/MistakeKnowledgePO.java @@ -7,5 +7,5 @@ @Builder public class MistakeKnowledgePO { private String subject; - private Integer knowledgeId; + private String knowledgeId; } diff --git a/refine-domain/src/main/java/com/achobeta/domain/question/service/impl/QuestionServiceImpl.java b/refine-domain/src/main/java/com/achobeta/domain/question/service/impl/QuestionServiceImpl.java index 78f0b5e..063cd68 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/question/service/impl/QuestionServiceImpl.java +++ b/refine-domain/src/main/java/com/achobeta/domain/question/service/impl/QuestionServiceImpl.java @@ -52,7 +52,7 @@ public QuestionResponseDTO questionGeneration(String userId, String mistakeQuest MistakeKnowledgePO po = mistakeRepository.findSubjectAndKnowledgeIdById(mistakeQuestionId); String subject = po.getSubject(); - Integer knowledgeId = po.getKnowledgeId(); + String knowledgeId = po.getKnowledgeId(); String knowledgePointName = knowledgeRepository.findKnowledgeNameById(knowledgeId); if (null == subject) { diff --git a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/KnowledgeRepository.java b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/KnowledgeRepository.java index 7007ad4..dce3376 100644 --- a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/KnowledgeRepository.java +++ b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/KnowledgeRepository.java @@ -12,7 +12,7 @@ public class KnowledgeRepository implements IKnowledgeRepository { private final KnowledgeMapper knowledgeMapper; @Override - public String findKnowledgeNameById(Integer knowledgePointId) { + public String findKnowledgeNameById(String knowledgePointId) { return knowledgeMapper.findKnowledgeNameById(knowledgePointId); } diff --git a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeQuestionRepository.java b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeQuestionRepository.java index d5dc2ff..7d29c21 100644 --- a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeQuestionRepository.java +++ b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeQuestionRepository.java @@ -38,9 +38,9 @@ public boolean save(QuestionEntity questionEntity) { mistakeQuestion.setQuestionId(questionEntity.getQuestionId()); mistakeQuestion.setQuestionContent(questionEntity.getQuestionText()); mistakeQuestion.setKnowledgePointId(questionEntity.getKnowledgePointId()); + mistakeQuestion.setSubject(questionEntity.getSubject()); // 设置默认值 - mistakeQuestion.setSubject("未分类"); // 默认学科 mistakeQuestion.setIsCareless(0); mistakeQuestion.setIsUnfamiliar(0); mistakeQuestion.setIsCalculateErr(0); diff --git a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeRepository.java b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeRepository.java index 3b32d0c..c6727a6 100644 --- a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeRepository.java +++ b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/adapter/repository/MistakeRepository.java @@ -12,6 +12,7 @@ import com.achobeta.types.exception.AppException; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Repository; @@ -19,6 +20,7 @@ @Repository @RequiredArgsConstructor +@Slf4j public class MistakeRepository implements IMistakeRepository { @Resource @@ -38,7 +40,7 @@ public void save(MistakeQuestionEntity mistakeEntity) { public MistakeKnowledgePO findSubjectAndKnowledgeIdById(String mistakeQuestionId) { MistakeKnowledgePO po = mistakeQuestionMapper.findSubjectAndKnowledgeIdById(mistakeQuestionId); if (null == po) { - throw new AppException("可能是数据库一致性问题,mistakeQuestionId:"+mistakeQuestionId); + log.warn("可能是数据库一致性问题,mistakeQuestionId:"+mistakeQuestionId); } return po; } diff --git a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/IMistakeQuestionMapper.java b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/IMistakeQuestionMapper.java index fe4be61..05e4dca 100644 --- a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/IMistakeQuestionMapper.java +++ b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/IMistakeQuestionMapper.java @@ -16,6 +16,6 @@ public interface IMistakeQuestionMapper { "VALUES (#{userId}, #{questionId}, #{questionContent}, #{subject}, #{otherReason}, #{knowledgePointId}, #{createTime}, #{updateTime})") void insert(MistakePO mistakePO); - @Select("SELECT subject, knowledge_point_id AS knowledgeId FROM MistakeQuestion WHERE id = #{mistakeQuestionId}") + @Select("SELECT subject, knowledge_point_id AS knowledgeId FROM MistakeQuestion WHERE question_id = #{mistakeQuestionId}") MistakeKnowledgePO findSubjectAndKnowledgeIdById(String mistakeQuestionId); } \ No newline at end of file diff --git a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/KnowledgeMapper.java b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/KnowledgeMapper.java index 6ba1605..ffb847f 100644 --- a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/KnowledgeMapper.java +++ b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/KnowledgeMapper.java @@ -12,6 +12,6 @@ public interface KnowledgeMapper { * @return 知识点名称 */ @Select("SELECT knowledge_point_name FROM knowledgePoint WHERE knowledge_point_id = #{knowledgePointId}") - String findKnowledgeNameById(Integer knowledgePointId); + String findKnowledgeNameById(String knowledgePointId); } diff --git a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/po/MistakePO.java b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/po/MistakePO.java index 7656faf..ff1da5b 100644 --- a/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/po/MistakePO.java +++ b/refine-infrastructure/src/main/java/com/achobeta/infrastructure/dao/po/MistakePO.java @@ -22,7 +22,7 @@ public class MistakePO { private String questionContent; private String subject; private String otherReason; - private Integer knowledgePointId; + private String knowledgePointId; private LocalDateTime createTime; private LocalDateTime updateTime; // 领域层Entity无需关注的字段 } \ No newline at end of file diff --git a/refine-trigger/src/main/java/com/achobeta/trigger/http/OcrController.java b/refine-trigger/src/main/java/com/achobeta/trigger/http/OcrController.java index 3657a91..be21e90 100644 --- a/refine-trigger/src/main/java/com/achobeta/trigger/http/OcrController.java +++ b/refine-trigger/src/main/java/com/achobeta/trigger/http/OcrController.java @@ -77,22 +77,23 @@ public Response extractFirst(@RequestPart("file") Multi //TODO // ai根据向量库(和mysql知识点表里的完全一致)(新建一个表)查询有没有相似知识点,再返回知识点名称 - String knowledgeName = aiGenerationService.knowledgeAnalysis(questionEntity.getQuestionText()); - if (knowledgeName == null || knowledgeName.isEmpty()) { + AiGenerationService.knowledgePoint knowledgePoint = aiGenerationService.knowledgeAnalysis(questionEntity.getQuestionText()); + if (knowledgePoint == null || knowledgePoint.isEmpty()) { log.warn("ai生成的知识点为空,请检查ai生成知识点的逻辑"); } String knowledgePointId = UUID.fastUUID().toString(); //把新知识点录入数据库中 threadPoolExecutor.execute(() -> { try { - keyPointsMapper.insertNewPoint4MistakeQuestion(userId, knowledgePointId, knowledgeName); - log.info("ai生成知识点录入表成功, knowledgeName:{} 题目id:{}", knowledgeName, questionEntity.getQuestionId()); + keyPointsMapper.insertNewPoint4MistakeQuestion(userId, knowledgePointId, knowledgePoint.knowledgeName()); + log.info("ai生成知识点录入表成功, knowledgeName:{} 题目id:{}", knowledgePoint, questionEntity.getQuestionId()); } catch (Exception e) { - log.error("ai生成知识点录入表失败, knowledgeName:{} 题目id:{}", knowledgeName, questionEntity.getQuestionId(), e); + log.error("ai生成知识点录入表失败, knowledgeName:{} 题目id:{}", knowledgePoint, questionEntity.getQuestionId(), e); } }); // 将错题数据保存到数据库中 + questionEntity.setSubject(knowledgePoint.subject()); questionEntity.setKnowledgePointId(knowledgePointId); boolean saveSuccess = mistakeQuestionService.saveMistakeQuestion(questionEntity); if (!saveSuccess) {