|
|
@@ -22,6 +22,9 @@
|
|
|
<el-button type="danger" :disabled="selectedIds.length === 0" @click="handleBatchDelete">
|
|
|
<el-icon><Delete /></el-icon> 批量删除
|
|
|
</el-button>
|
|
|
+ <el-button type="info" :disabled="selectedIds.length === 0" @click="handleBatchClear">
|
|
|
+ <el-icon><Refresh /></el-icon> 清空数据
|
|
|
+ </el-button>
|
|
|
<el-button type="warning" :disabled="selectedIds.length === 0" @click="handleBatchEnter">
|
|
|
<el-icon><CircleCheck /></el-icon> 批量入库
|
|
|
</el-button>
|
|
|
@@ -120,14 +123,23 @@
|
|
|
<el-table-column label="转换状态" min-width="180">
|
|
|
<template #default="scope">
|
|
|
<div class="conversion-cell">
|
|
|
- <el-tag
|
|
|
- :type="getConversionStatusTag(scope.row)"
|
|
|
- size="small"
|
|
|
- effect="light"
|
|
|
- class="status-tag"
|
|
|
+ <el-tooltip
|
|
|
+ :content="scope.row.conversion_error"
|
|
|
+ placement="top"
|
|
|
+ :disabled="scope.row.conversion_status !== 3 || !scope.row.conversion_error"
|
|
|
>
|
|
|
- {{ getConversionStatusText(scope.row) }}
|
|
|
- </el-tag>
|
|
|
+ <el-tag
|
|
|
+ :type="getConversionStatusTag(scope.row)"
|
|
|
+ size="small"
|
|
|
+ effect="light"
|
|
|
+ class="status-tag"
|
|
|
+ >
|
|
|
+ <el-icon v-if="scope.row.conversion_status === 3" style="vertical-align: middle; margin-right: 4px;">
|
|
|
+ <Warning />
|
|
|
+ </el-icon>
|
|
|
+ {{ getConversionStatusText(scope.row) }}
|
|
|
+ </el-tag>
|
|
|
+ </el-tooltip>
|
|
|
|
|
|
<div class="converted-file-links" v-if="scope.row.conversion_status === 2">
|
|
|
<div class="converted-file-name" v-if="scope.row.md_url">
|
|
|
@@ -668,6 +680,17 @@
|
|
|
<el-input v-model="editForm.note" type="textarea" :rows="2" placeholder="请输入备注" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
+
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="上传文件">
|
|
|
+ <div class="file-info-edit">
|
|
|
+ <el-tag type="info" size="large" class="file-tag">
|
|
|
+ <el-icon><Document /></el-icon>
|
|
|
+ <span>文件已锁定(编辑模式不可更改)</span>
|
|
|
+ </el-tag>
|
|
|
+ </div>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
</el-row>
|
|
|
</el-form>
|
|
|
<template #footer>
|
|
|
@@ -792,7 +815,7 @@
|
|
|
<script setup lang="ts">
|
|
|
import { ref, reactive, onMounted, onUnmounted, computed } from 'vue'
|
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
-import { Search, Filter, Upload, CircleCheck, Delete, Document, Warning, TopRight, Grid, DataAnalysis, Link, View, Switch, Edit, User, Download, Plus, Minus, Tickets } from '@element-plus/icons-vue'
|
|
|
+import { Search, Filter, Upload, CircleCheck, Delete, Document, Warning, TopRight, Grid, DataAnalysis, Link, View, Switch, Edit, User, Download, Plus, Minus, Tickets, Refresh } from '@element-plus/icons-vue'
|
|
|
import request from '@/api/request'
|
|
|
import axios from 'axios'
|
|
|
import { downloadFile } from '@/utils/download'
|
|
|
@@ -961,12 +984,12 @@ const participatingUnitsList = ref<string[]>([''])
|
|
|
const referenceBasisList = ref<string[]>([''])
|
|
|
const compilationBasisList = ref<string[]>([''])
|
|
|
|
|
|
-const planCategoryOptions = ['超危大方案', '超危大方案较大II级', '超危大方案特大IV级', '超危大方案一般I级', '超危大方案重大III级', '危大方案', '一般方案']
|
|
|
-const level2Options = ['临建工程', '路基工程', '其他', '桥梁工程', '隧道工程']
|
|
|
-const level3Options = ['/', 'TBM施工', '拌和站安、拆施工', '不良地质隧道施工', '常规桥梁', '挡土墙工程类', '辅助坑道施工', '复杂洞口工程施工', '钢筋加工场安、拆', '钢栈桥施工', '拱桥', '涵洞工程类', '滑坡体处理类', '路堤', '路堑', '其他', '深基坑', '隧道总体施工', '特殊结构隧道', '斜拉桥', '悬索桥']
|
|
|
-const level4Options = ['/', '挡土墙', '顶管', '断层破碎带及软弱围岩', '钢筋砼箱涵', '高填路堤', '抗滑桩', '其他', '软岩大变形隧道', '上部结构', '深基坑开挖与支护', '深挖路堑', '隧道TBM', '隧道进洞', '隧道竖井', '隧道斜井', '特种设备', '瓦斯隧道', '下部结构', '小净距隧道', '岩爆隧道', '岩溶隧道', '涌水突泥隧道', '桩基础']
|
|
|
-const documentTypeOptions = ['国家标准', '行业标准', '地方标准', '企业标准', '团体标准', '国际标准', '其他']
|
|
|
-const professionalFieldOptions = ['法律法规','通用标准', '勘察钻探', '地基基础', '路基路面', '桥梁工程', '隧道工程', '交通工程', '港口航道', '铁路工程', '市政工程', '房建工程', '水利电力', '信息化', '试验检测', '安全环保']
|
|
|
+const planCategoryOptions = ['超危大方案', '超危大方案较大Ⅱ级', '超危大方案特大Ⅳ级', '超危大方案一般Ⅰ级', '超危大方案重大Ⅲ级', '危大方案', '一般方案']
|
|
|
+const level2Options = ['临建工程', '路基工程', '桥梁工程', '隧道工程', '其他']
|
|
|
+const level3Options = ['TBM施工', '拌和站安、拆施工', '不良地质隧道施工', '常规桥梁', '挡土墙工程类', '辅助坑道施工', '复杂洞口工程施工', '钢筋加工场安、拆', '钢栈桥施工', '拱桥', '涵洞工程类', '滑坡体处理类', '路堤', '路堑', '深基坑', '隧道总体施工', '特殊结构隧道', '斜拉桥', '悬索桥', '其他']
|
|
|
+const level4Options = ['挡土墙', '顶管', '断层破碎带及软弱围岩', '钢筋砼箱涵', '高填路堤', '抗滑桩', '软岩大变形隧道', '上部结构', '深基坑开挖与支护', '深挖路堑', '隧道TBM', '隧道进洞', '隧道竖井', '隧道斜井', '特种设备', '瓦斯隧道', '下部结构', '小净距隧道', '岩爆隧道', '岩溶隧道', '涌水突泥隧道', '桩基础', '其他']
|
|
|
+const documentTypeOptions = ['国家标准', '行业标准', '部门规章', '地方标准', '企业标准', '管理制度', '技术规范', '团体标准', '国际标准', '国家法律', '地方法规', '其他']
|
|
|
+const professionalFieldOptions = ['法律法规', '通用标准', '勘察钻探', '地基基础', '路基路面', '桥梁工程', '隧道工程', '交通工程', '建筑工程', '市政工程', '机电安装', '路桥工程', '装饰装修', '港口航道', '铁路工程', '房建工程', '水利电力', '信息化', '试验检测', '安全环保', '其他']
|
|
|
|
|
|
// 列表项管理
|
|
|
const addListItem = (list: string[]) => {
|
|
|
@@ -1265,6 +1288,10 @@ const handleSingleEnter = async (doc: DocumentItem | null) => {
|
|
|
}
|
|
|
|
|
|
const handleDelete = async (row: DocumentItem) => {
|
|
|
+ if (isEntered(row.whether_to_enter)) {
|
|
|
+ ElMessage.warning(`文档 "${row.title}" 已入库,请先执行“清空数据”操作后再删除。`)
|
|
|
+ return
|
|
|
+ }
|
|
|
try {
|
|
|
await ElMessageBox.confirm(
|
|
|
`确定要删除文档 "${row.title}" 吗?此操作不可恢复。`,
|
|
|
@@ -1295,6 +1322,13 @@ const handleDelete = async (row: DocumentItem) => {
|
|
|
const handleBatchDelete = async () => {
|
|
|
if (selectedIds.value.length === 0) return
|
|
|
|
|
|
+ // 检查是否有已入库的数据
|
|
|
+ const enteredDocs = documents.value.filter(doc => selectedIds.value.includes(doc.id) && isEntered(doc.whether_to_enter))
|
|
|
+ if (enteredDocs.length > 0) {
|
|
|
+ ElMessage.warning(`选中数据中包含 ${enteredDocs.length} 份已入库文档,请先执行“清空数据”操作后再删除。`)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
try {
|
|
|
await ElMessageBox.confirm(
|
|
|
`确定要批量删除选中的 ${selectedIds.value.length} 条文档吗?此操作不可恢复。`,
|
|
|
@@ -1323,6 +1357,53 @@ const handleBatchDelete = async () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+const handleBatchClear = async () => {
|
|
|
+ if (selectedIds.value.length === 0) {
|
|
|
+ ElMessage.warning('请先选择要清空数据的文档')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 过滤出已入库的文档
|
|
|
+ const enteredIds = documents.value
|
|
|
+ .filter(doc => selectedIds.value.includes(doc.id) && isEntered(doc.whether_to_enter))
|
|
|
+ .map(doc => doc.id)
|
|
|
+
|
|
|
+ if (enteredIds.length === 0) {
|
|
|
+ ElMessage.info('所选文档均未入库,无需清空')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ await ElMessageBox.confirm(
|
|
|
+ `确定要清空选中的 ${enteredIds.length} 份文档的知识库片段吗?清空后文档将变为“未入库”状态,且可以被删除。`,
|
|
|
+ '确认清空数据',
|
|
|
+ {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ loading.value = true
|
|
|
+ const res = await documentApi.batchClear(enteredIds)
|
|
|
+
|
|
|
+ if (res.code === 0) {
|
|
|
+ ElMessage.success(res.message || '数据清空成功')
|
|
|
+ selectedIds.value = []
|
|
|
+ fetchDocuments()
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res.message || '数据清空失败')
|
|
|
+ }
|
|
|
+ } catch (error: any) {
|
|
|
+ if (error !== 'cancel') {
|
|
|
+ console.error('清空数据失败:', error)
|
|
|
+ ElMessage.error('操作失败')
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
const isEntered = (val: any) => {
|
|
|
return val === 1 || val === true
|
|
|
}
|
|
|
@@ -1779,6 +1860,20 @@ onUnmounted(() => {
|
|
|
min-height: 32px;
|
|
|
}
|
|
|
|
|
|
+.file-info-edit {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 8px;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.file-tag {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 5px;
|
|
|
+ width: fit-content;
|
|
|
+}
|
|
|
+
|
|
|
.tag-item {
|
|
|
margin: 2px 0;
|
|
|
}
|