Explorar el Código

修改枚举值,修改bug

chenkun hace 2 semanas
padre
commit
8b0ed94296

+ 5 - 0
src/api/document.ts

@@ -131,6 +131,11 @@ export const documentApi = {
     return request.post(`${API_PREFIX}/documents/batch-delete`, { ids })
   },
 
+  // 批量清空知识库片段
+  batchClear(ids: string[]): Promise<ApiResponse<null>> {
+    return request.post(`${API_PREFIX}/documents/batch-clear`, { ids })
+  },
+
   // 批量加入任务中心
   batchAddToTask(ids: string[], projectName: string, tags?: string[]): Promise<ApiResponse<any>> {
     return request.post(`${API_PREFIX}/documents/batch-add-to-task`, {

+ 2 - 2
src/views/admin/TaskManagement.vue

@@ -62,7 +62,7 @@
                   <el-button 
                     size="small" 
                     type="success" 
-                    :disabled="!row.task_id"
+                    :disabled="!row.task_id || (row.completed_count || 0) < (row.file_count || 1)"
                     @click="handleExportData(row)"
                   >
                     导出
@@ -127,7 +127,7 @@
                   <el-button 
                     size="small" 
                     type="success" 
-                    :disabled="!row.task_id"
+                    :disabled="!row.task_id || (row.completed_count || 0) < (row.file_count || 1)"
                     @click="handleExportData(row)"
                   >
                     导出

+ 13 - 13
src/views/basic-info/ConstructionPlan.vue

@@ -192,25 +192,25 @@
           </el-col>
           
           <el-col :span="12">
-            <el-form-item label="项目名称">
-              <el-input v-model="editForm.project_name" placeholder="请输入项目名称" />
+            <el-form-item label="编制单位">
+              <el-input v-model="editForm.issuing_authority" placeholder="请输入编制单位" />
             </el-form-item>
           </el-col>
+
           <el-col :span="12">
-            <el-form-item label="项目标段">
-              <el-input v-model="editForm.project_section" placeholder="请输入项目标段" />
+            <el-form-item label="编制日期">
+              <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">
-            <el-form-item label="编制单位">
-              <el-input v-model="editForm.issuing_authority" placeholder="请输入编制单位" />
+            <el-form-item label="项目名称">
+              <el-input v-model="editForm.project_name" placeholder="请输入项目名称" />
             </el-form-item>
           </el-col>
-
           <el-col :span="12">
-            <el-form-item label="编制日期">
-              <el-date-picker v-model="editForm.release_date" type="date" placeholder="选择日期" value-format="YYYY-MM-DD" style="width: 100%" />
+            <el-form-item label="项目标段">
+              <el-input v-model="editForm.project_section" placeholder="请输入项目标段" />
             </el-form-item>
           </el-col>
 
@@ -480,10 +480,10 @@ const searchForm = reactive<any>({
 })
 
 // 选项配置
-const planCategoryOptions = ['超危大方案', '超危大方案较大II级', '超危大方案特大IV级', '超危大方案一般I级', '超危大方案重大III级', '危大方案', '一般方案']
-const level2Options = ['临建工程', '路基工程', '其他', '桥梁工程', '隧道工程']
-const level3Options = ['/', 'TBM施工', '拌和站安、拆施工', '不良地质隧道施工', '常规桥梁', '挡土墙工程类', '辅助坑道施工', '复杂洞口工程施工', '钢筋加工场安、拆', '钢栈桥施工', '拱桥', '涵洞工程类', '滑坡体处理类', '路堤', '路堑', '其他', '深基坑', '隧道总体施工', '特殊结构隧道', '斜拉桥', '悬索桥']
-const level4Options = ['/', '挡土墙', '顶管', '断层破碎带及软弱围岩', '钢筋砼箱涵', '高填路堤', '抗滑桩', '其他', '软岩大变形隧道', '上部结构', '深基坑开挖与支护', '深挖路堑', '隧道TBM', '隧道进洞', '隧道竖井', '隧道斜井', '特种设备', '瓦斯隧道', '下部结构', '小净距隧道', '岩爆隧道', '岩溶隧道', '涌水突泥隧道', '桩基础']
+const planCategoryOptions = ['超危大方案', '超危大方案较大Ⅱ级', '超危大方案特大Ⅳ级', '超危大方案一般Ⅰ级', '超危大方案重大Ⅲ级', '危大方案', '一般方案']
+const level2Options = ['临建工程', '路基工程', '桥梁工程', '隧道工程', '其他']
+const level3Options = ['TBM施工', '拌和站安、拆施工', '不良地质隧道施工', '常规桥梁', '挡土墙工程类', '辅助坑道施工', '复杂洞口工程施工', '钢筋加工场安、拆', '钢栈桥施工', '拱桥', '涵洞工程类', '滑坡体处理类', '路堤', '路堑', '深基坑', '隧道总体施工', '特殊结构隧道', '斜拉桥', '悬索桥', '其他']
+const level4Options = ['挡土墙', '顶管', '断层破碎带及软弱围岩', '钢筋砼箱涵', '高填路堤', '抗滑桩', '软岩大变形隧道', '上部结构', '深基坑开挖与支护', '深挖路堑', '隧道TBM', '隧道进洞', '隧道竖井', '隧道斜井', '特种设备', '瓦斯隧道', '下部结构', '小净距隧道', '岩爆隧道', '岩溶隧道', '涌水突泥隧道', '桩基础', '其他']
 
 // 获取列表数据
 const loadData = async () => {

+ 1 - 1
src/views/basic-info/Regulation.vue

@@ -369,7 +369,7 @@ const searchForm = reactive<any>({
 })
 
 // 选项配置
-const documentTypeOptions = ['国家标准', '行业标准', '企业标准', '地方标准', '管理制度', '技术规范']
+const documentTypeOptions = ['国家标准', '行业标准', '部门规章', '地方标准', '企业标准', '管理制度', '技术规范', '团体标准', '国际标准', '国家法律', '地方法规', '其他']
 
 // 获取列表数据
 const loadData = async () => {

+ 2 - 2
src/views/basic-info/Standard.vue

@@ -605,8 +605,8 @@ const searchForm = reactive<any>({
 })
 
 // 选项配置
-const documentTypeOptions = ['国家标准', '行业标准', '企业标准', '地方标准', '管理制度', '技术规范']
-const professionalFieldOptions = ['建筑工程', '市政工程', '机电安装', '路桥工程', '装饰装修', '其他']
+const documentTypeOptions = ['国家标准', '行业标准', '部门规章', '地方标准', '企业标准', '管理制度', '技术规范', '团体标准', '国际标准', '国家法律', '地方法规', '其他']
+const professionalFieldOptions = ['法律法规', '通用标准', '勘察钻探', '地基基础', '路基路面', '桥梁工程', '隧道工程', '交通工程', '建筑工程', '市政工程', '机电安装', '路桥工程', '装饰装修', '港口航道', '铁路工程', '房建工程', '水利电力', '信息化', '试验检测', '安全环保', '其他']
 
 // 获取列表数据
 const loadData = async () => {

+ 109 - 14
src/views/documents/Index.vue

@@ -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;
 }