|
|
@@ -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()
|
|
|
})
|