|
|
@@ -503,31 +503,31 @@
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard'">
|
|
|
- <el-form-item label="标准编号">
|
|
|
+ <el-form-item label="* 标准编号">
|
|
|
<el-input v-model="editForm.standard_no" placeholder="请输入标准编号" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item :label="authorityLabel">
|
|
|
+ <el-form-item :label="'* ' + authorityLabel">
|
|
|
<el-input v-model="editForm.issuing_authority" :placeholder="'请输入' + authorityLabel" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item :label="dateLabel">
|
|
|
+ <el-form-item :label="'* ' + dateLabel">
|
|
|
<el-date-picker v-model="editForm.release_date" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard'">
|
|
|
- <el-form-item label="实施日期">
|
|
|
+ <el-form-item label="* 实施日期">
|
|
|
<el-date-picker v-model="editForm.implementation_date" type="date" placeholder="选择实施日期" value-format="YYYY-MM-DD" style="width: 100%" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard' || editForm.table_type === 'regulation'">
|
|
|
- <el-form-item label="文件类型">
|
|
|
+ <el-form-item :label="editForm.table_type === 'standard' ? '* 文件类型' : '文件类型'">
|
|
|
<el-select v-model="editForm.document_type" placeholder="请选择文件类型" style="width: 100%">
|
|
|
<el-option v-for="item in documentTypeOptions" :key="item" :label="item" :value="item" />
|
|
|
</el-select>
|
|
|
@@ -535,7 +535,7 @@
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard'">
|
|
|
- <el-form-item label="专业领域">
|
|
|
+ <el-form-item label="* 专业领域">
|
|
|
<el-select v-model="editForm.professional_field" placeholder="请选择专业领域" style="width: 100%">
|
|
|
<el-option v-for="item in professionalFieldOptions" :key="item" :label="item" :value="item" />
|
|
|
</el-select>
|
|
|
@@ -543,7 +543,7 @@
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard'">
|
|
|
- <el-form-item label="时效性">
|
|
|
+ <el-form-item label="* 时效性">
|
|
|
<el-select v-model="editForm.validity" placeholder="请选择时效性" style="width: 100%">
|
|
|
<el-option label="现行" value="现行" />
|
|
|
<el-option label="已废止" value="已废止" />
|
|
|
@@ -553,13 +553,13 @@
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard'">
|
|
|
- <el-form-item label="起草单位">
|
|
|
+ <el-form-item label="* 起草单位">
|
|
|
<el-input v-model="editForm.drafting_unit" placeholder="请输入起草单位" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
|
|
|
<el-col :span="12" v-if="editForm.table_type === 'standard'">
|
|
|
- <el-form-item label="批准部门">
|
|
|
+ <el-form-item label="* 批准部门">
|
|
|
<el-input v-model="editForm.approving_department" placeholder="请输入批准部门" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -602,7 +602,7 @@
|
|
|
|
|
|
<template v-if="editForm.table_type === 'construction_plan'">
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="项目名称">
|
|
|
+ <el-form-item label="* 项目名称">
|
|
|
<el-input v-model="editForm.project_name" placeholder="请输入项目名称" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -612,40 +612,40 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="方案类别">
|
|
|
+ <el-form-item label="* 方案类别">
|
|
|
<el-select v-model="editForm.plan_category" placeholder="请选择方案类别" style="width: 100%">
|
|
|
<el-option v-for="item in planCategoryOptions" :key="item" :label="item" :value="item" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="一级分类">
|
|
|
+ <el-form-item label="* 一级分类">
|
|
|
<el-input v-model="editForm.level_1_classification" disabled />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="二级分类">
|
|
|
+ <el-form-item label="* 二级分类">
|
|
|
<el-select v-model="editForm.level_2_classification" placeholder="请选择二级分类" style="width: 100%">
|
|
|
<el-option v-for="item in level2Options" :key="item" :label="item" :value="item" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="三级分类">
|
|
|
+ <el-form-item label="* 三级分类">
|
|
|
<el-select v-model="editForm.level_3_classification" placeholder="请选择三级分类" style="width: 100%">
|
|
|
<el-option v-for="item in level3Options" :key="item" :label="item" :value="item" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="12">
|
|
|
- <el-form-item label="四级分类">
|
|
|
+ <el-form-item label="* 四级分类">
|
|
|
<el-select v-model="editForm.level_4_classification" placeholder="请选择四级分类" style="width: 100%">
|
|
|
<el-option v-for="item in level4Options" :key="item" :label="item" :value="item" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="24">
|
|
|
- <el-form-item label="方案摘要">
|
|
|
+ <el-form-item label="* 方案摘要">
|
|
|
<el-input v-model="editForm.plan_summary" type="textarea" :rows="3" placeholder="请输入方案摘要" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
@@ -1177,27 +1177,108 @@ const confirmIngest = async () => {
|
|
|
}
|
|
|
|
|
|
ingesting.value = true
|
|
|
+
|
|
|
try {
|
|
|
- // 统一使用 batch-enter 接口
|
|
|
- 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 // 传递当前的表类型上下文
|
|
|
- })
|
|
|
+ // 1. 临时请求选中 ID 的详情数据,确保校验时数据是最新的且完整的
|
|
|
+ const detailPromises = selectedIds.value.map(id => documentApi.getDetail(id))
|
|
|
+ const detailResults = await Promise.all(detailPromises)
|
|
|
+ const selectedDocs = detailResults.map(res => res.data)
|
|
|
|
|
|
- if (res.code === 0) {
|
|
|
- ElMessage.success(res.message || '已加入入库队列')
|
|
|
- // 入库成功后清空选择并刷新列表
|
|
|
- selectedIds.value = []
|
|
|
- ingestDialogVisible.value = false // 关闭弹窗
|
|
|
- fetchDocuments()
|
|
|
+ // 2. 检查基本信息字段完善度
|
|
|
+ let isIncomplete = false
|
|
|
+ let missingFields: string[] = []
|
|
|
+
|
|
|
+ for (const doc of selectedDocs) {
|
|
|
+ const type = doc.source_type || searchQuery.table_type
|
|
|
+
|
|
|
+ if (type === 'standard') {
|
|
|
+ const standardFields = [
|
|
|
+ { key: 'standard_no', label: '标准编号' },
|
|
|
+ { key: 'issuing_authority', label: '发布单位' },
|
|
|
+ { key: 'release_date', label: '发布日期' },
|
|
|
+ { key: 'implementation_date', label: '实施日期' },
|
|
|
+ { key: 'document_type', label: '文件类型' },
|
|
|
+ { key: 'professional_field', label: '专业领域' },
|
|
|
+ { key: 'validity', label: '时效性' },
|
|
|
+ { key: 'drafting_unit', label: '起草单位' },
|
|
|
+ { key: 'approving_department', label: '批准部门' }
|
|
|
+ ]
|
|
|
+ for (const f of standardFields) {
|
|
|
+ const val = doc[f.key as keyof typeof doc]
|
|
|
+ if (val === null || val === undefined || (typeof val === 'string' && val.trim() === '')) {
|
|
|
+ isIncomplete = true
|
|
|
+ if (!missingFields.includes(f.label)) missingFields.push(f.label)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (type === 'construction_plan') {
|
|
|
+ const planFields = [
|
|
|
+ { key: 'issuing_authority', label: '编制单位' },
|
|
|
+ { key: 'release_date', label: '编制日期' },
|
|
|
+ { key: 'project_name', label: '项目名称' },
|
|
|
+ { key: 'plan_category', label: '方案类型' },
|
|
|
+ { key: 'level_1_classification', label: '一级分类' },
|
|
|
+ { key: 'level_2_classification', label: '二级分类' },
|
|
|
+ { key: 'level_3_classification', label: '三级分类' },
|
|
|
+ { key: 'level_4_classification', label: '四级分类' },
|
|
|
+ { key: 'plan_summary', label: '方案摘要' }
|
|
|
+ ]
|
|
|
+ for (const f of planFields) {
|
|
|
+ const val = doc[f.key as keyof typeof doc]
|
|
|
+ if (val === null || val === undefined || (typeof val === 'string' && val.trim() === '')) {
|
|
|
+ isIncomplete = true
|
|
|
+ if (!missingFields.includes(f.label)) missingFields.push(f.label)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isIncomplete && selectedIds.value.length === 1) break // 如果是单个,直接跳出
|
|
|
}
|
|
|
- } catch (error: any) {
|
|
|
- if (error !== 'cancel') {
|
|
|
- console.error('入库失败:', error)
|
|
|
+
|
|
|
+ const startIngest = async () => {
|
|
|
+ try {
|
|
|
+ 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
|
|
|
+ })
|
|
|
+
|
|
|
+ if (res.code === 0) {
|
|
|
+ ElMessage.success(res.message || '已加入入库队列')
|
|
|
+ selectedIds.value = []
|
|
|
+ ingestDialogVisible.value = false
|
|
|
+ fetchDocuments()
|
|
|
+ }
|
|
|
+ } catch (error: any) {
|
|
|
+ if (error !== 'cancel') {
|
|
|
+ console.error('入库失败:', error)
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ if (isIncomplete) {
|
|
|
+ ingesting.value = false // 弹窗前先结束 loading,方便用户操作
|
|
|
+ try {
|
|
|
+ await ElMessageBox.confirm(
|
|
|
+ '该文档基本信息其中某几个字段未补充完善,可能导致无法检索的问题,你是否继续?',
|
|
|
+ '提示',
|
|
|
+ {
|
|
|
+ confirmButtonText: '继续',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ }
|
|
|
+ )
|
|
|
+ ingesting.value = true // 继续后重新开启 loading
|
|
|
+ await startIngest()
|
|
|
+ } catch (error) {
|
|
|
+ // 用户取消
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ await startIngest()
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取详情或入库失败:', error)
|
|
|
+ ElMessage.error('入库准备失败,请重试')
|
|
|
} finally {
|
|
|
ingesting.value = false
|
|
|
}
|