Jelajahi Sumber

题目修改知识点

jinxia.mo 1 bulan lalu
induk
melakukan
635591bdeb

+ 166 - 9
back-ui/src/views/learn/questions/index.vue

@@ -582,11 +582,11 @@
                     <el-tree-select
                         node-key="id"
                         v-model="knowledgeQuestionForm.knowledgeId"
-                        :data="knowledgeTreeList"
+                        :data="groupedKnowledgeTreeList"
                         check-strictly
                         :render-after-expand="false"
                         style="width: 100%"
-                        :props="{ label: 'name', children: 'children' }"
+                        :props="{ label: 'name', children: 'children', disabled: 'disabled' }"
                         placeholder="请选择知识点"
                         filterable
                         clearable/>
@@ -675,6 +675,73 @@ const filteredKnowledgeTreeList = computed(() => {
     return filterKnowledgeTreeBySubjectId(knowledgeTreeList.value, queryParams.value.subjectId)
 })
 
+/** 按科目分组的知识点树(用于知识点关系编辑弹窗) */
+const groupedKnowledgeTreeList = computed(() => {
+    if (!knowledgeTreeList.value || knowledgeTreeList.value.length === 0) {
+        return []
+    }
+    
+    // 创建一个Map来存储按科目分组的知识点
+    const subjectMap = new Map()
+    
+    // 递归处理知识点树,按科目分组
+    const processNode = (node) => {
+        const subjectId = node.subjectId
+        if (!subjectId) {
+            // 如果没有subjectId,跳过
+            return null
+        }
+        
+        // 获取科目名称
+        const subjectName = getSubjectName(subjectId)
+        const subjectKey = `${subjectId}-${subjectName}`
+        
+        // 如果该科目还不存在,创建一个科目节点
+        if (!subjectMap.has(subjectKey)) {
+            subjectMap.set(subjectKey, {
+                id: `subject-${subjectId}`, // 使用特殊ID避免冲突
+                name: `${subjectId}-${subjectName}`,
+                subjectId: subjectId,
+                children: [],
+                disabled: true // 科目节点不可选择
+            })
+        }
+        
+        // 将当前节点添加到对应科目的children中
+        const subjectNode = subjectMap.get(subjectKey)
+        
+        // 创建节点副本,保留原有结构
+        const nodeCopy = {
+            ...node,
+            children: []
+        }
+        
+        // 如果有子节点,递归处理
+        if (node.children && node.children.length > 0) {
+            node.children.forEach(child => {
+                const processedChild = processNode(child)
+                if (processedChild) {
+                    nodeCopy.children.push(processedChild)
+                }
+            })
+        }
+        
+        subjectNode.children.push(nodeCopy)
+        return nodeCopy
+    }
+    
+    // 处理所有根节点
+    knowledgeTreeList.value.forEach(rootNode => {
+        processNode(rootNode)
+    })
+    
+    // 转换为数组并排序
+    return Array.from(subjectMap.values()).sort((a, b) => {
+        // 按科目ID排序
+        return (a.subjectId || 0) - (b.subjectId || 0)
+    })
+})
+
 /** 递归过滤知识点树 */
 function filterKnowledgeTreeBySubjectId(tree, subjectId) {
     if (!tree || !Array.isArray(tree)) {
@@ -990,7 +1057,7 @@ function handleShowOptions(row) {
 function handleShowKnowledgeTrees(row) {
     currentQuestionId.value = row.id
     knowledgeTreesLoading.value = true
-    // 如果 row.knowledgeTrees 存在,直接使用;否则通过 questionId 查询知识点关系
+    // 如果 row.knowledgeTrees 存在且不为空,直接使用;否则通过 questionId 查询知识点关系
     if (row.knowledgeTrees && row.knowledgeTrees.length > 0) {
         currentKnowledgeTreesList.value = row.knowledgeTrees.map(kt => ({
             id: kt.id,
@@ -1002,8 +1069,52 @@ function handleShowKnowledgeTrees(row) {
             subjectName: getSubjectName(kt.subjectId)
         }))
         knowledgeTreesLoading.value = false
-    } 
-    showKnowledgeTreesDialog.value = true
+        showKnowledgeTreesDialog.value = true
+    } else {
+        // 通过 questionId 查询知识点关系
+        listKnowledgeQuestion({ questionId: row.id }).then(response => {
+            if (response.rows && response.rows.length > 0) {
+                // 获取所有知识点ID
+                const knowledgeIds = response.rows.map(r => r.knowledgeId)
+                // 从 knowledgeTreeList 中查找对应的知识点
+                const knowledgeMap = new Map()
+                const findKnowledgeInTree = (tree) => {
+                    if (Array.isArray(tree)) {
+                        tree.forEach(node => {
+                            if (knowledgeIds.includes(node.id)) {
+                                knowledgeMap.set(node.id, node)
+                            }
+                            if (node.children) {
+                                findKnowledgeInTree(node.children)
+                            }
+                        })
+                    }
+                }
+                findKnowledgeInTree(knowledgeTreeList.value)
+                // 构建列表,保持顺序
+                currentKnowledgeTreesList.value = response.rows.map(r => {
+                    const kt = knowledgeMap.get(r.knowledgeId)
+                    return kt ? {
+                        id: kt.id,
+                        name: kt.name,
+                        pid: kt.pid,
+                        subjectId: kt.subjectId,
+                        questionId: kt.questionId,
+                        knowledgeQuestionId: r.id,
+                        subjectName: getSubjectName(kt.subjectId)
+                    } : null
+                }).filter(item => item !== null)
+            } else {
+                currentKnowledgeTreesList.value = []
+            }
+            knowledgeTreesLoading.value = false
+            showKnowledgeTreesDialog.value = true
+        }).catch(() => {
+            knowledgeTreesLoading.value = false
+            currentKnowledgeTreesList.value = []
+            showKnowledgeTreesDialog.value = true
+        })
+    }
 }
 
 /** 新增知识点关系 */
@@ -1065,6 +1176,52 @@ function cancelKnowledgeQuestion() {
     resetKnowledgeQuestionForm()
 }
 
+/** 刷新知识点列表 */
+function refreshKnowledgeTreesList() {
+    if (!currentQuestionId.value) return
+    knowledgeTreesLoading.value = true
+    listKnowledgeQuestion({ questionId: currentQuestionId.value }).then(response => {
+        if (response.rows && response.rows.length > 0) {
+            // 获取所有知识点ID
+            const knowledgeIds = response.rows.map(r => r.knowledgeId)
+            // 从 knowledgeTreeList 中查找对应的知识点
+            const knowledgeMap = new Map()
+            const findKnowledgeInTree = (tree) => {
+                if (Array.isArray(tree)) {
+                    tree.forEach(node => {
+                        if (knowledgeIds.includes(node.id)) {
+                            knowledgeMap.set(node.id, node)
+                        }
+                        if (node.children) {
+                            findKnowledgeInTree(node.children)
+                        }
+                    })
+                }
+            }
+            findKnowledgeInTree(knowledgeTreeList.value)
+            // 构建列表,保持顺序
+            currentKnowledgeTreesList.value = response.rows.map(r => {
+                const kt = knowledgeMap.get(r.knowledgeId)
+                return kt ? {
+                    id: kt.id,
+                    name: kt.name,
+                    pid: kt.pid,
+                    subjectId: kt.subjectId,
+                    questionId: kt.questionId,
+                    knowledgeQuestionId: r.id,
+                    subjectName: getSubjectName(kt.subjectId)
+                } : null
+            }).filter(item => item !== null)
+        } else {
+            currentKnowledgeTreesList.value = []
+        }
+        knowledgeTreesLoading.value = false
+    }).catch(() => {
+        knowledgeTreesLoading.value = false
+        currentKnowledgeTreesList.value = []
+    })
+}
+
 /** 提交知识点关系表单 */
 function submitKnowledgeQuestionForm() {
     proxy.$refs["knowledgeQuestionRef"].validate(valid => {
@@ -1073,8 +1230,8 @@ function submitKnowledgeQuestionForm() {
                 updateKnowledgeQuestion(knowledgeQuestionForm.value).then(response => {
                     proxy.$modal.msgSuccess("修改成功")
                     showKnowledgeQuestionDialog.value = false
-                    // 刷新知识点列表
-                    handleShowKnowledgeTrees({ id: currentQuestionId.value, knowledgeTrees: [] })
+                    // 刷新知识点列表(直接刷新,不重新打开弹窗)
+                    refreshKnowledgeTreesList()
                     // 刷新题目列表
                     getList()
                 })
@@ -1082,8 +1239,8 @@ function submitKnowledgeQuestionForm() {
                 addKnowledgeQuestion(knowledgeQuestionForm.value).then(response => {
                     proxy.$modal.msgSuccess("新增成功")
                     showKnowledgeQuestionDialog.value = false
-                    // 刷新知识点列表
-                    handleShowKnowledgeTrees({ id: currentQuestionId.value, knowledgeTrees: [] })
+                    // 刷新知识点列表(直接刷新,不重新打开弹窗)
+                    refreshKnowledgeTreesList()
                     // 刷新题目列表
                     getList()
                 })

+ 1 - 0
ie-system/src/main/java/com/ruoyi/learn/domain/LearnKnowledgeTree2.java

@@ -13,6 +13,7 @@ public class LearnKnowledgeTree2 extends LearnKnowledgeTree
     private static final long serialVersionUID = 1L;
 
     /** 题目ID */
+    private String subjectName;
     private Long questionId;
     private Long knowledgeQuestionId;
 }