From 475046a3c32103131287603b7b2521f4c03aaa5b Mon Sep 17 00:00:00 2001 From: root Date: Sun, 30 Nov 2025 19:54:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=B7=BB=E5=8A=A0=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E7=82=B9=E5=88=A0=E9=99=A4=E4=B8=8E=E6=92=A4=E9=94=80=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/repository/KeyPointsMapper.java | 15 ++++- .../service/IKeyPointsExplanationService.java | 6 ++ .../etendbiz/KeyPointsExplanationService.java | 44 ++++++++++++++ .../http/KeyPointsExplanationController.java | 57 +++++++++++++++++++ .../types/enums/GlobalServiceStatusCode.java | 3 +- 5 files changed, 121 insertions(+), 4 deletions(-) diff --git a/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/adapter/repository/KeyPointsMapper.java b/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/adapter/repository/KeyPointsMapper.java index 85b042e..a857334 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/adapter/repository/KeyPointsMapper.java +++ b/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/adapter/repository/KeyPointsMapper.java @@ -11,15 +11,15 @@ @Mapper public interface KeyPointsMapper { @Select("select knowledge_point_id as id, knowledge_point_name as keyPoints from knowledgePoint" + - " where user_id = #{userId} and parent_knowledge_point_id = #{knowledgeId}") + " where user_id = #{userId} and parent_knowledge_point_id = #{knowledgeId} and status != -1") List getSonKeyPoints(@Param("knowledgeId") String knowledgeId, @Param("userId") String userId); @Select("select knowledge_point_id as id, knowledge_point_name as keyPoints from knowledgePoint" + - " where user_id = #{userId} and parent_knowledge_point_id = #{subjectId} ") + " where user_id = #{userId} and parent_knowledge_point_id = #{subjectId} and status != -1 ") List getKeyPoints(int subjectId, String userId); @Select("select knowledge_desc from knowledgePoint" + - " where user_id = #{userId} and knowledge_point_id = #{knowledgeId} ") + " where user_id = #{userId} and knowledge_point_id = #{knowledgeId}") String getKnowledgedescById(String knowledgeId, String userId); @Select("select count(id) as updateCount, count(update_time >= now() - interval 7 day) as reviewCount from MistakeQuestion" + @@ -60,4 +60,13 @@ public interface KeyPointsMapper { @Select("insert into knowledgePoint(knowledge_point_id, knowledge_point_name, knowledge_desc, parent_knowledge_point_id, user_id)" + " values(#{node.pointId}, #{node.pointName}, #{node.pointDesc}, #{parentId}, #{userId})") void saveMindMapTree(String userId, SonPointVO node, String parentId); + + @Select("update knowledgePoint set status = -1 where user_id = #{userId} and knowledge_point_id = #{knowledgeId}") + void deleteKnowledgePoint(String knowledgeId, String userId); + + @Select("update knowledgePoint set status = 0 where user_id = #{userId} and knowledge_point_id = #{knowledgeId}") + void undoDeleteKnowledgePoint(String knowledgeId, String userId); + + @Select("delete from knowledgePoint where status = -1") + void deleteKnowledgeTure(); } diff --git a/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/IKeyPointsExplanationService.java b/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/IKeyPointsExplanationService.java index 2dfa329..deff5ad 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/IKeyPointsExplanationService.java +++ b/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/IKeyPointsExplanationService.java @@ -27,4 +27,10 @@ public interface IKeyPointsExplanationService { RelateQuestionVO getRelatedWrongQuestions(String knowledgeId, String userId); void addSonPoint(SonPointVO sonPointVOs, String userId, String parentId); + + void deleteKnowledgePoint(String knowledgeId, String userId); + + void undoDeleteKnowledgePoint(String knowledgeId, String userId); + + void deleteKnowledgeTure(); } diff --git a/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/etendbiz/KeyPointsExplanationService.java b/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/etendbiz/KeyPointsExplanationService.java index 1d0545a..253cbbc 100644 --- a/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/etendbiz/KeyPointsExplanationService.java +++ b/refine-domain/src/main/java/com/achobeta/domain/keypoints_explanation/service/etendbiz/KeyPointsExplanationService.java @@ -1,6 +1,7 @@ package com.achobeta.domain.keypoints_explanation.service.etendbiz; +import cn.hutool.core.date.DateTime; import com.achobeta.domain.keypoints_explanation.adapter.repository.KeyPointsMapper; import com.achobeta.domain.keypoints_explanation.adapter.repository.SubjectTransportMappeer; import com.achobeta.domain.keypoints_explanation.model.valobj.*; @@ -10,7 +11,9 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service @Transactional @@ -21,6 +24,7 @@ public class KeyPointsExplanationService implements IKeyPointsExplanationService @Autowired private MindMapService mindMapService; + /** * 获取子知识点 * @param knowledgeId 父知识点id @@ -137,6 +141,11 @@ public ToolTipVO gettooltipById(String knowledgeId, String userId) { return new ToolTipVO(total, count, lastReviewTime); } + /** + * 获取知识点相关错误题与笔记 + * @param knowledgeId + * @return + */ @Override public RelateQuestionVO getRelatedWrongQuestions(String knowledgeId, String userId) { List qestions = keyPointsMapper.getRelatedQuestions(knowledgeId, userId); @@ -145,11 +154,46 @@ public RelateQuestionVO getRelatedWrongQuestions(String knowledgeId, String user return new RelateQuestionVO(qestions, note); } + /** + * 添加子知识点 + */ @Override public void addSonPoint(SonPointVO sonPointVOs, String userId, String parentId) { saveMindMapNode(userId, sonPointVOs, parentId); } + /** + * 删除知识点 + * @param knowledgeId + */ + @Override + @Transactional + public void deleteKnowledgePoint(String knowledgeId, String userId) { + if(knowledgeId != null){ + List knowledges = keyPointsMapper.getSonKeyPoints(knowledgeId, userId); + keyPointsMapper.deleteKnowledgePoint(knowledgeId, userId); + for (KeyPointsVO knowledge : knowledges) { + deleteKnowledgePoint(knowledge.getId(), userId); + } + } + } + + @Override + public void undoDeleteKnowledgePoint(String knowledgeId, String userId) { + if(knowledgeId != null){ + List knowledges = keyPointsMapper.getSonKeyPoints(knowledgeId, userId); + keyPointsMapper.undoDeleteKnowledgePoint(knowledgeId, userId); + for (KeyPointsVO knowledge : knowledges) { + undoDeleteKnowledgePoint(knowledge.getId(), userId); + } + } + } + + @Override + public void deleteKnowledgeTure() { + keyPointsMapper.deleteKnowledgeTure(); + } + private void saveMindMapNode(String userId, SonPointVO node, String parentId) { node.setPointId(mindMapService.generateUUID()); keyPointsMapper.saveMindMapTree(userId, node, parentId); diff --git a/refine-trigger/src/main/java/com/achobeta/trigger/http/KeyPointsExplanationController.java b/refine-trigger/src/main/java/com/achobeta/trigger/http/KeyPointsExplanationController.java index eb7514a..099afc0 100644 --- a/refine-trigger/src/main/java/com/achobeta/trigger/http/KeyPointsExplanationController.java +++ b/refine-trigger/src/main/java/com/achobeta/trigger/http/KeyPointsExplanationController.java @@ -1,8 +1,10 @@ package com.achobeta.trigger.http; +import cn.hutool.core.date.DateTime; import com.achobeta.api.dto.*; import com.achobeta.domain.IRedisService; +import com.achobeta.domain.keypoints_explanation.adapter.repository.KeyPointsMapper; import com.achobeta.domain.keypoints_explanation.model.valobj.*; import com.achobeta.domain.keypoints_explanation.service.IKeyPointsExplanationService; import com.achobeta.types.Response; @@ -13,12 +15,18 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static com.achobeta.types.enums.GlobalServiceStatusCode.*; @@ -33,6 +41,7 @@ @RequestMapping("/api/${app.config.api-version}/keypoints_explanation") public class KeyPointsExplanationController { private final IKeyPointsExplanationService keyPointsExplanationService; + private final Map deleteList = new HashMap<>(); /** * 根据学科获取中心知识点 @@ -277,4 +286,52 @@ public Response addSonPoint(@PathVariable String knowledgeId, @RequestBo return Response.SYSTEM_SUCCESS("添加成功"); } + /** + * 删除知识点 + */ + @DeleteMapping("/{knowledgeId}/delete") + @GlobalInterception + public Response deleteKnowledgePoint(@PathVariable String knowledgeId ) { + String userId = UserContext.getUserId(); + try { + deleteList.put(knowledgeId, LocalDateTime.now()); + keyPointsExplanationService.deleteKnowledgePoint(knowledgeId, userId); + } catch (Exception e) { + return Response.CUSTOMIZE_ERROR(DELETE_KNOWLEDGE_POINT_FAIL); + } + return Response.SYSTEM_SUCCESS("删除成功"); + } + + /** + * 撤销删除知识点 + */ + @PostMapping("/{knowledgeId}/undo-delete") + @GlobalInterception + public Response undoDeleteKnowledgePoint(@PathVariable String knowledgeId ) { + String userId = UserContext.getUserId(); + try { + if(LocalDateTime.now().isAfter(deleteList.get(knowledgeId).minusMinutes(30))){ + deleteList.remove(knowledgeId); + keyPointsExplanationService.undoDeleteKnowledgePoint(knowledgeId, userId); + }else{ + deleteList.remove(knowledgeId); + return Response.SYSTEM_SUCCESS("删除超过30mins,撤销删除失败"); + } + } catch (Exception e) { + return Response.CUSTOMIZE_ERROR(UNDO_DELETE_KNOWLEDGE_POINT_FAIL); + } + return Response.SYSTEM_SUCCESS("撤销删除成功"); + } + + /** + * 定时任务:删除状态为“已删除”的知识点 status = -1 + */ + @Scheduled(cron = "0 0 3 * * *") + public void deleteKnowledgePoint() { + try { + keyPointsExplanationService.deleteKnowledgeTure(); + }catch (Exception e) { + log.error("定时任务:删除状态为“已删除”的知识点 status = -1 失败"); + } + } } diff --git a/refine-types/src/main/java/com/achobeta/types/enums/GlobalServiceStatusCode.java b/refine-types/src/main/java/com/achobeta/types/enums/GlobalServiceStatusCode.java index 1dc4ea5..61f0c99 100644 --- a/refine-types/src/main/java/com/achobeta/types/enums/GlobalServiceStatusCode.java +++ b/refine-types/src/main/java/com/achobeta/types/enums/GlobalServiceStatusCode.java @@ -87,6 +87,8 @@ public enum GlobalServiceStatusCode { RENAME_NODE_FAIL(10018, "重命名节点失败,请稍后再试"), SHOW_TOOLTIP_FAIL(10019, "显示提示失败,请稍后再试"), ADD_SON_POINT_FAIL(10020, "添加子知识点失败,请稍后再试"), + DELETE_KNOWLEDGE_POINT_FAIL(10021, "删除知识点失败,请稍后再试"), + UNDO_DELETE_KNOWLEDGE_POINT_FAIL(10022, "撤销删除知识点失败,请稍后再试"), /* 错因管理相关状态码 11001-11100 */ MISTAKE_REASON_SUCCESS(11001, "错因操作成功"), MISTAKE_REASON_TOGGLE_SUCCESS(11002, "错因状态切换成功"), @@ -95,7 +97,6 @@ public enum GlobalServiceStatusCode { STUDY_NOTE_SUBMIT_SUCCESS(11005, "错题笔记提交成功"), STUDY_NOTE_GET_SUCCESS(11006, "错题笔记获取成功"), - MISTAKE_REASON_NOT_FOUND(11101, "未找到对应的错题记录"), MISTAKE_REASON_INVALID_PARAM(11102, "错因参数无效"), MISTAKE_REASON_UPDATE_FAILED(11103, "错因状态更新失败"),