|
|
@@ -310,14 +310,32 @@
|
|
|
|
|
|
<!-- 入库设置弹窗 -->
|
|
|
<el-dialog v-model="ingestDialogVisible" title="入库设置" width="400px">
|
|
|
- <el-form :model="ingestForm" label-width="100px">
|
|
|
- <el-form-item label="切分方式">
|
|
|
+ <el-form :model="ingestForm" :rules="ingestRules" ref="ingestFormRef" label-width="100px">
|
|
|
+ <el-form-item label="切分方式" prop="kb_method">
|
|
|
<el-select v-model="ingestForm.kb_method" placeholder="请选择切分方式" style="width: 100%">
|
|
|
<el-option label="按长度切分" value="length" />
|
|
|
<el-option label="按符号切分" value="symbol" />
|
|
|
<el-option label="父子段切分" value="parent_child" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="切分长度" v-if="ingestForm.kb_method === 'length'">
|
|
|
+ <el-select v-model="ingestForm.chunk_size" placeholder="请选择切分长度" style="width: 100%">
|
|
|
+ <el-option label="200" :value="200" />
|
|
|
+ <el-option label="500" :value="500" />
|
|
|
+ <el-option label="800" :value="800" />
|
|
|
+ <el-option label="1000" :value="1000" />
|
|
|
+ <el-option label="1200" :value="1200" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="切分符号" v-if="ingestForm.kb_method === 'symbol'">
|
|
|
+ <el-select v-model="ingestForm.separator" placeholder="请选择切分符号" style="width: 100%">
|
|
|
+ <el-option label="句号 (。)" value="。" />
|
|
|
+ <el-option label="换行符 (\n)" value="\n" />
|
|
|
+ <el-option label="分号 (;)" value=";" />
|
|
|
+ <el-option label="感叹号 (!)" value="!" />
|
|
|
+ <el-option label="问号 (?)" value="?" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
<span class="dialog-footer">
|
|
|
@@ -344,8 +362,8 @@
|
|
|
|
|
|
<!-- 上传文档对话框 -->
|
|
|
<el-dialog v-model="uploadDialogVisible" title="上传文档" width="500px">
|
|
|
- <el-form :model="uploadForm" label-width="120px">
|
|
|
- <el-form-item label="基本信息类型" required>
|
|
|
+ <el-form :model="uploadForm" :rules="commonRules" ref="uploadFormRef" label-width="120px">
|
|
|
+ <el-form-item label="基本信息类型" prop="table_type">
|
|
|
<el-select v-model="uploadForm.table_type" placeholder="请选择基本信息类型">
|
|
|
<el-option label="施工标准规范" value="standard" />
|
|
|
<el-option label="施工方案" value="construction_plan" />
|
|
|
@@ -353,8 +371,8 @@
|
|
|
<el-option label="其他文档" value="other" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="目标知识库">
|
|
|
- <el-select v-model="uploadForm.kb_id" placeholder="请选择目标知识库 (可选)" clearable style="width: 100%">
|
|
|
+ <el-form-item label="目标知识库" prop="kb_id">
|
|
|
+ <el-select v-model="uploadForm.kb_id" placeholder="请选择目标知识库">
|
|
|
<el-option
|
|
|
v-for="item in kbOptions"
|
|
|
:key="item.value"
|
|
|
@@ -363,7 +381,7 @@
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="文档标题" required>
|
|
|
+ <el-form-item label="文档标题" prop="title">
|
|
|
<el-input v-model="uploadForm.title" placeholder="请输入文档标题" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="文档链接" v-if="false">
|
|
|
@@ -399,11 +417,11 @@
|
|
|
|
|
|
<!-- 编辑文档对话框 -->
|
|
|
<el-dialog v-model="editDialogVisible" :title="formTitle" width="800px">
|
|
|
- <el-form :model="editForm" label-width="110px">
|
|
|
+ <el-form :model="editForm" :rules="commonRules" ref="editFormRef" label-width="110px">
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="目标知识库">
|
|
|
- <el-select v-model="editForm.kb_id" placeholder="请选择目标知识库" clearable style="width: 100%">
|
|
|
+ <el-form-item label="目标知识库" prop="kb_id">
|
|
|
+ <el-select v-model="editForm.kb_id" placeholder="请选择目标知识库" style="width: 100%" disabled>
|
|
|
<el-option
|
|
|
v-for="item in kbOptions"
|
|
|
:key="item.value"
|
|
|
@@ -414,8 +432,8 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item :label="titleLabel" required>
|
|
|
- <el-input v-model="editForm.title" :placeholder="'请输入' + titleLabel" />
|
|
|
+ <el-form-item :label="titleLabel" prop="title">
|
|
|
+ <el-input v-model="editForm.title" :placeholder="'请输入' + titleLabel" disabled />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
|
@@ -757,9 +775,33 @@ const previewDocType = ref('') // 'original' or 'md'
|
|
|
const ingesting = ref(false)
|
|
|
const ingestDialogVisible = ref(false)
|
|
|
const ingestForm = reactive({
|
|
|
- kb_method: 'length'
|
|
|
+ kb_method: 'length',
|
|
|
+ chunk_size: 500,
|
|
|
+ separator: '。'
|
|
|
})
|
|
|
|
|
|
+const ingestRules = {
|
|
|
+ kb_method: [
|
|
|
+ { required: true, message: '请选择切分方式', trigger: 'change' }
|
|
|
+ ]
|
|
|
+}
|
|
|
+
|
|
|
+const ingestFormRef = ref()
|
|
|
+const uploadFormRef = ref()
|
|
|
+const editFormRef = ref()
|
|
|
+
|
|
|
+const commonRules = {
|
|
|
+ kb_id: [
|
|
|
+ { required: true, message: '请选择目标知识库', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ title: [
|
|
|
+ { required: true, message: '请输入文档标题', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ table_type: [
|
|
|
+ { required: true, message: '请选择基本信息类型', trigger: 'change' }
|
|
|
+ ]
|
|
|
+}
|
|
|
+
|
|
|
const isOfficeDoc = ref(false)
|
|
|
const total = ref(0)
|
|
|
const statistics = ref({
|
|
|
@@ -816,7 +858,7 @@ const level2Options = ['临建工程', '路基工程', '其他', '桥梁工程',
|
|
|
const level3Options = ['/', 'TBM施工', '拌和站安、拆施工', '不良地质隧道施工', '常规桥梁', '挡土墙工程类', '辅助坑道施工', '复杂洞口工程施工', '钢筋加工场安、拆', '钢栈桥施工', '拱桥', '涵洞工程类', '滑坡体处理类', '路堤', '路堑', '其他', '深基坑', '隧道总体施工', '特殊结构隧道', '斜拉桥', '悬索桥']
|
|
|
const level4Options = ['/', '挡土墙', '顶管', '断层破碎带及软弱围岩', '钢筋砼箱涵', '高填路堤', '抗滑桩', '其他', '软岩大变形隧道', '上部结构', '深基坑开挖与支护', '深挖路堑', '隧道TBM', '隧道进洞', '隧道竖井', '隧道斜井', '特种设备', '瓦斯隧道', '下部结构', '小净距隧道', '岩爆隧道', '岩溶隧道', '涌水突泥隧道', '桩基础']
|
|
|
const documentTypeOptions = ['国家标准', '行业标准', '地方标准', '企业标准', '团体标准', '国际标准', '其他']
|
|
|
-const professionalFieldOptions = ['通用标准', '勘察钻探', '地基基础', '路基路面', '桥梁工程', '隧道工程', '交通工程', '港口航道', '铁路工程', '市政工程', '房建工程', '水利电力', '信息化', '试验检测', '安全环保']
|
|
|
+const professionalFieldOptions = ['法律法规','通用标准', '勘察钻探', '地基基础', '路基路面', '桥梁工程', '隧道工程', '交通工程', '港口航道', '铁路工程', '市政工程', '房建工程', '水利电力', '信息化', '试验检测', '安全环保']
|
|
|
|
|
|
// 列表项管理
|
|
|
const addListItem = (list: string[]) => {
|
|
|
@@ -994,14 +1036,23 @@ const confirmIngest = async () => {
|
|
|
ElMessage.warning('请先选择要入库的文档')
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+ if (!ingestFormRef.value) return
|
|
|
+
|
|
|
+ try {
|
|
|
+ await ingestFormRef.value.validate()
|
|
|
+ } catch (error) {
|
|
|
+ return
|
|
|
+ }
|
|
|
|
|
|
ingesting.value = true
|
|
|
try {
|
|
|
// 统一使用 batch-enter 接口
|
|
|
- // 不再传递 kb_id,由后端根据 source_type 自动匹配
|
|
|
const res = await request.post<ApiResponse>('/api/v1/sample/documents/batch-enter', {
|
|
|
ids: selectedIds.value,
|
|
|
kb_method: ingestForm.kb_method, // 使用用户选择的切分方式
|
|
|
+ chunk_size: ingestForm.chunk_size,
|
|
|
+ separator: ingestForm.separator,
|
|
|
table_type: searchQuery.table_type // 传递当前的表类型上下文
|
|
|
})
|
|
|
|
|
|
@@ -1011,12 +1062,11 @@ const confirmIngest = async () => {
|
|
|
selectedIds.value = []
|
|
|
ingestDialogVisible.value = false // 关闭弹窗
|
|
|
fetchDocuments()
|
|
|
- } else {
|
|
|
- ElMessage.error(res.message || '入库失败')
|
|
|
}
|
|
|
- } catch (error) {
|
|
|
- console.error('入库失败:', error)
|
|
|
- ElMessage.error('网络错误,请稍后重试')
|
|
|
+ } catch (error: any) {
|
|
|
+ if (error !== 'cancel') {
|
|
|
+ console.error('入库失败:', error)
|
|
|
+ }
|
|
|
} finally {
|
|
|
ingesting.value = false
|
|
|
}
|
|
|
@@ -1030,6 +1080,13 @@ const handleBatchEnter = async () => {
|
|
|
|
|
|
// 不再使用 confirm,改为显示入库设置弹窗
|
|
|
ingestForm.kb_method = 'length' // 重置为默认值
|
|
|
+ ingestForm.chunk_size = 500
|
|
|
+ ingestForm.separator = '。'
|
|
|
+
|
|
|
+ if (ingestFormRef.value) {
|
|
|
+ ingestFormRef.value.clearValidate()
|
|
|
+ }
|
|
|
+
|
|
|
ingestDialogVisible.value = true
|
|
|
}
|
|
|
|
|
|
@@ -1072,6 +1129,13 @@ const handleSingleEnter = async (doc: DocumentItem | null) => {
|
|
|
|
|
|
selectedIds.value = [doc.id]
|
|
|
ingestForm.kb_method = 'length' // 重置为默认值
|
|
|
+ ingestForm.chunk_size = 500
|
|
|
+ ingestForm.separator = '。'
|
|
|
+
|
|
|
+ if (ingestFormRef.value) {
|
|
|
+ ingestFormRef.value.clearValidate()
|
|
|
+ }
|
|
|
+
|
|
|
ingestDialogVisible.value = true
|
|
|
}
|
|
|
|
|
|
@@ -1290,13 +1354,19 @@ const handleUpload = () => {
|
|
|
if (uploadRef.value) {
|
|
|
uploadRef.value.clearFiles()
|
|
|
}
|
|
|
+ if (uploadFormRef.value) {
|
|
|
+ uploadFormRef.value.clearValidate()
|
|
|
+ }
|
|
|
loadKbOptions()
|
|
|
uploadDialogVisible.value = true
|
|
|
}
|
|
|
|
|
|
const submitUpload = async () => {
|
|
|
- if (!uploadForm.title) {
|
|
|
- return ElMessage.warning('请输入文档标题')
|
|
|
+ if (!uploadFormRef.value) return
|
|
|
+ try {
|
|
|
+ await uploadFormRef.value.validate()
|
|
|
+ } catch (error) {
|
|
|
+ return
|
|
|
}
|
|
|
submitting.value = true
|
|
|
try {
|
|
|
@@ -1353,6 +1423,10 @@ const handleEdit = async (row: DocumentItem) => {
|
|
|
editForm.effective_end_date = data.effective_end_date || ''
|
|
|
editForm.kb_id = data.kb_id || ''
|
|
|
|
|
|
+ if (editFormRef.value) {
|
|
|
+ editFormRef.value.clearValidate()
|
|
|
+ }
|
|
|
+
|
|
|
// 处理列表字段
|
|
|
if (data.participating_units) {
|
|
|
participatingUnitsList.value = data.participating_units.split(';').filter((i: string) => i.trim())
|
|
|
@@ -1386,8 +1460,11 @@ const handleEdit = async (row: DocumentItem) => {
|
|
|
}
|
|
|
|
|
|
const submitEdit = async () => {
|
|
|
- if (!editForm.title) {
|
|
|
- return ElMessage.warning('请输入文档标题')
|
|
|
+ if (!editFormRef.value) return
|
|
|
+ try {
|
|
|
+ await editFormRef.value.validate()
|
|
|
+ } catch (error) {
|
|
|
+ return
|
|
|
}
|
|
|
submitting.value = true
|
|
|
try {
|
|
|
@@ -1540,6 +1617,7 @@ const openInNewWindow = () => {
|
|
|
|
|
|
onMounted(() => {
|
|
|
fetchDocuments()
|
|
|
+ loadKbOptions()
|
|
|
// 5秒后开始第一次静默刷新,之后递归调用
|
|
|
refreshTimer.value = window.setTimeout(refreshDocumentsSilently, 5000)
|
|
|
})
|