feat(复习): 支持会话维度复习 + 标准导图按会话过滤(后端)

- MindMapNode 新增 sessionNum 字段
- BuiltinMindMapGenerator 生成节点时填充 sessionNum
- MindMapTreeTool.filterBySession() 按会话过滤标准导图
- recallCompare 接受 sessionNum 参数
- ReviewRecallRecordEntity 新增 sessionNum 字段
- Flyway V20260705_1: review_recall_records 加 session_num 列
- 新增 GET /study-sessions/tasks/{taskNum}/sessions 端点
This commit is contained in:
2026-07-05 14:40:38 +08:00
parent 22cc5dc871
commit a636e516d1
13 changed files with 144 additions and 3 deletions
@@ -35,6 +35,8 @@ public class MindMapNode {
private String notes;
private String sourceType;
private Integer sourceId;
/** 可选:节点来源会话编码(REPORT/FRAGMENT 节点使用) */
private String sessionNum;
private List<MindMapNode> children;
public MindMapNode(String title) {
@@ -51,6 +53,7 @@ public class MindMapNode {
map.put("notes", notes != null ? notes : "");
if (sourceType != null) map.put("sourceType", sourceType);
if (sourceId != null) map.put("sourceId", sourceId);
if (sessionNum != null) map.put("sessionNum", sessionNum);
List<Object> childMaps = new ArrayList<>();
if (children != null) {
for (MindMapNode c : children) {
@@ -70,6 +73,7 @@ public class MindMapNode {
if (map.containsKey("sourceId") && map.get("sourceId") != null) {
node.setSourceId(((Number) map.get("sourceId")).intValue());
}
node.setSessionNum((String) map.get("sessionNum"));
Object raw = map.getOrDefault("children", map.get("nodes"));
List<MindMapNode> children = new ArrayList<>();
if (raw instanceof List<?> list) {