|
@@ -193,7 +193,14 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
<el-col :span="12">
|
|
|
<el-form-item label="文档名称" required>
|
|
<el-form-item label="文档名称" required>
|
|
|
|
|
+ <el-input
|
|
|
|
|
+ v-if="dialogType === 'edit'"
|
|
|
|
|
+ v-model="formData.doc_name"
|
|
|
|
|
+ style="width: 100%"
|
|
|
|
|
+ disabled
|
|
|
|
|
+ />
|
|
|
<el-select
|
|
<el-select
|
|
|
|
|
+ v-else
|
|
|
v-model="formData.doc_name"
|
|
v-model="formData.doc_name"
|
|
|
placeholder="请输入文档名称进行搜索"
|
|
placeholder="请输入文档名称进行搜索"
|
|
|
filterable
|
|
filterable
|
|
@@ -289,19 +296,9 @@
|
|
|
class="view-dialog"
|
|
class="view-dialog"
|
|
|
>
|
|
>
|
|
|
<el-descriptions :column="2" border class="detail-descriptions">
|
|
<el-descriptions :column="2" border class="detail-descriptions">
|
|
|
- <el-descriptions-item label="系统ID (PK)" label-class-name="desc-label">
|
|
|
|
|
- <span class="copyable-text">{{ viewData.id }}</span>
|
|
|
|
|
- </el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="片段编号" label-class-name="desc-label">{{ viewData.code }}</el-descriptions-item>
|
|
|
|
|
<el-descriptions-item label="文档名称" label-class-name="desc-label">{{ viewData.doc_name }}</el-descriptions-item>
|
|
<el-descriptions-item label="文档名称" label-class-name="desc-label">{{ viewData.doc_name }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="所属知识库" label-class-name="desc-label">{{ viewData.collection_name }}</el-descriptions-item>
|
|
|
|
|
|
|
+ <el-descriptions-item label="所属知识库" label-class-name="desc-label">{{ getKbName(viewData.collection_name) }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="字符数量" label-class-name="desc-label">{{ viewData.char_count }}</el-descriptions-item>
|
|
<el-descriptions-item label="字符数量" label-class-name="desc-label">{{ viewData.char_count }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="Document ID" label-class-name="desc-label">
|
|
|
|
|
- <span class="copyable-text">{{ viewData.document_id || '-' }}</span>
|
|
|
|
|
- </el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="Parent ID" label-class-name="desc-label">
|
|
|
|
|
- <span class="copyable-text">{{ viewData.parent_id || '-' }}</span>
|
|
|
|
|
- </el-descriptions-item>
|
|
|
|
|
<el-descriptions-item label="创建时间" label-class-name="desc-label">{{ viewData.created_at || '-' }}</el-descriptions-item>
|
|
<el-descriptions-item label="创建时间" label-class-name="desc-label">{{ viewData.created_at || '-' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="标签" :span="2" label-class-name="desc-label">
|
|
<el-descriptions-item label="标签" :span="2" label-class-name="desc-label">
|
|
|
<div class="tags-container">
|
|
<div class="tags-container">
|
|
@@ -324,10 +321,23 @@
|
|
|
<div class="view-content-section" v-if="viewData.parent_id && viewData.parent_id !== '0'">
|
|
<div class="view-content-section" v-if="viewData.parent_id && viewData.parent_id !== '0'">
|
|
|
<div class="section-title">
|
|
<div class="section-title">
|
|
|
<el-icon><Connection /></el-icon> 父段内容
|
|
<el-icon><Connection /></el-icon> 父段内容
|
|
|
- <span class="sub-title">(ID: {{ viewData.parent_id }})</span>
|
|
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="content-box parent-content" v-loading="parentLoading">
|
|
|
|
|
- {{ parentContent || '暂无内容' }}
|
|
|
|
|
|
|
+ <div v-loading="parentLoading">
|
|
|
|
|
+ <el-tabs v-if="parentSegments.length > 1" v-model="activeParentTab" type="card">
|
|
|
|
|
+ <el-tab-pane
|
|
|
|
|
+ v-for="(seg, idx) in parentSegments"
|
|
|
|
|
+ :key="seg.id || idx"
|
|
|
|
|
+ :label="`父段片段 ${idx + 1}`"
|
|
|
|
|
+ :name="String(idx)"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="content-box parent-content">
|
|
|
|
|
+ {{ seg.content || '暂无内容' }}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-tab-pane>
|
|
|
|
|
+ </el-tabs>
|
|
|
|
|
+ <div v-else class="content-box parent-content">
|
|
|
|
|
+ {{ parentSegments[0]?.content || '暂无内容' }}
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -472,7 +482,8 @@ const loadDocOptions = async (query: string) => {
|
|
|
// View Dialog
|
|
// View Dialog
|
|
|
const viewDialogVisible = ref(false)
|
|
const viewDialogVisible = ref(false)
|
|
|
const viewData = ref<Snippet>({} as Snippet)
|
|
const viewData = ref<Snippet>({} as Snippet)
|
|
|
-const parentContent = ref('')
|
|
|
|
|
|
|
+const parentSegments = ref<any[]>([])
|
|
|
|
|
+const activeParentTab = ref('0')
|
|
|
const parentLoading = ref(false)
|
|
const parentLoading = ref(false)
|
|
|
|
|
|
|
|
const currentKbSchema = ref<any[]>([]) // 当前选中知识库的自定义Schema
|
|
const currentKbSchema = ref<any[]>([]) // 当前选中知识库的自定义Schema
|
|
@@ -796,7 +807,6 @@ const handleSubmit = async () => {
|
|
|
// 编辑模式下的处理...
|
|
// 编辑模式下的处理...
|
|
|
await updateSnippet(formData.id, {
|
|
await updateSnippet(formData.id, {
|
|
|
collection_name: formData.collection_name,
|
|
collection_name: formData.collection_name,
|
|
|
- doc_name: formData.doc_name, // 编辑时通常不改文档归属,或者需要同样的逻辑
|
|
|
|
|
content: formData.content,
|
|
content: formData.content,
|
|
|
custom_fields: {
|
|
custom_fields: {
|
|
|
...formData.custom_fields,
|
|
...formData.custom_fields,
|
|
@@ -853,19 +863,26 @@ const handleView = async (row: Snippet) => {
|
|
|
viewData.value = { ...row }
|
|
viewData.value = { ...row }
|
|
|
|
|
|
|
|
// 加载父段内容
|
|
// 加载父段内容
|
|
|
- parentContent.value = ''
|
|
|
|
|
|
|
+ parentSegments.value = []
|
|
|
|
|
+ activeParentTab.value = '0'
|
|
|
if (row.parent_id && row.parent_id !== '0' && row.parent_id !== '') {
|
|
if (row.parent_id && row.parent_id !== '0' && row.parent_id !== '') {
|
|
|
parentLoading.value = true
|
|
parentLoading.value = true
|
|
|
try {
|
|
try {
|
|
|
const res = await getSnippetDetail(row.collection_name, row.parent_id)
|
|
const res = await getSnippetDetail(row.collection_name, row.parent_id)
|
|
|
if (res.code === 0 && res.data) {
|
|
if (res.code === 0 && res.data) {
|
|
|
- parentContent.value = res.data.content || '无内容'
|
|
|
|
|
|
|
+ if (Array.isArray(res.data.parent_segments) && res.data.parent_segments.length > 0) {
|
|
|
|
|
+ parentSegments.value = res.data.parent_segments
|
|
|
|
|
+ } else if (res.data.parent_content) {
|
|
|
|
|
+ parentSegments.value = [{ id: '', content: res.data.parent_content }]
|
|
|
|
|
+ } else {
|
|
|
|
|
+ parentSegments.value = []
|
|
|
|
|
+ }
|
|
|
} else {
|
|
} else {
|
|
|
- parentContent.value = '未找到父段内容'
|
|
|
|
|
|
|
+ parentSegments.value = []
|
|
|
}
|
|
}
|
|
|
} catch (e) {
|
|
} catch (e) {
|
|
|
console.error(e)
|
|
console.error(e)
|
|
|
- parentContent.value = '加载失败'
|
|
|
|
|
|
|
+ parentSegments.value = []
|
|
|
} finally {
|
|
} finally {
|
|
|
parentLoading.value = false
|
|
parentLoading.value = false
|
|
|
}
|
|
}
|
|
@@ -878,6 +895,11 @@ const handleSelectionChange = (val: any) => {
|
|
|
console.log(val)
|
|
console.log(val)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+const getKbName = (collectionName: string | undefined) => {
|
|
|
|
|
+ if (!collectionName) return '-'
|
|
|
|
|
+ return kbOptions.value.find(k => k.value === collectionName)?.label || '未知知识库'
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
const formatMetaInfo = (row: Snippet) => {
|
|
const formatMetaInfo = (row: Snippet) => {
|
|
|
// 优先展示 metadata 字段中的信息
|
|
// 优先展示 metadata 字段中的信息
|
|
|
if (row.metadata) {
|
|
if (row.metadata) {
|