From ebe3507d1382bb124c1fb895a5e27f7063fdffdc Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 13 一月 2026 16:19:14 +0800
Subject: [PATCH] fix: 规章制度加一个附件功能

---
 src/components/Dialog/FileListDialog.vue |  152 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 149 insertions(+), 3 deletions(-)

diff --git a/src/components/Dialog/FileListDialog.vue b/src/components/Dialog/FileListDialog.vue
index ea269d7..ebe81dd 100644
--- a/src/components/Dialog/FileListDialog.vue
+++ b/src/components/Dialog/FileListDialog.vue
@@ -5,6 +5,37 @@
     :width="width" 
     :before-close="handleClose"
   >
+    <div class="file-list-toolbar" v-if="showToolbar">
+      <template v-if="useBuiltInUpload">
+        <el-upload
+          v-model:file-list="uploadFileList"
+          class="upload-demo"
+          :action="uploadAction"
+          :headers="uploadHeaders"
+          :show-file-list="false"
+          :on-success="handleDefaultUploadSuccess"
+          :on-error="handleDefaultUploadError"
+        >
+          <el-button 
+            v-if="showUploadButton" 
+            type="primary" 
+            size="small"
+          >
+            涓婁紶闄勪欢
+          </el-button>
+        </el-upload>
+      </template>
+      <template v-else>
+        <el-button 
+          v-if="showUploadButton" 
+          type="primary" 
+          size="small" 
+          @click="handleUpload"
+        >
+          鏂板闄勪欢
+        </el-button>
+      </template>
+    </div>
     <el-table :data="tableData" border :height="tableHeight">
       <el-table-column 
         :label="nameColumnLabel" 
@@ -38,6 +69,15 @@
           >
             棰勮
           </el-button>
+          <el-button
+            v-if="showDeleteButton"
+            link
+            type="danger"
+            size="small"
+            @click="handleDelete(scope.row, scope.$index)"
+          >
+            鍒犻櫎
+          </el-button>
           <slot name="actions" :row="scope.row"></slot>
         </template>
       </el-table-column>
@@ -49,7 +89,9 @@
 
 <script setup>
 import { ref, computed, getCurrentInstance } from 'vue'
+import { ElMessage } from 'element-plus'
 import filePreview from '@/components/filePreview/index.vue'
+import { getToken } from '@/utils/auth'
 
 const props = defineProps({
   modelValue: {
@@ -82,7 +124,7 @@
   },
   actionColumnWidth: {
     type: [String, Number],
-    default: 100
+    default: 160
   },
   showActions: {
     type: Boolean,
@@ -96,6 +138,14 @@
     type: Boolean,
     default: true
   },
+  showUploadButton: {
+    type: Boolean,
+    default: false
+  },
+  showDeleteButton: {
+    type: Boolean,
+    default: false
+  },
   urlField: {
     type: String,
     default: 'url'
@@ -107,13 +157,30 @@
   previewMethod: {
     type: Function,
     default: null
+  },
+  uploadMethod: {
+    type: Function,
+    default: null
+  },
+  deleteMethod: {
+    type: Function,
+    default: null
+  },
+  rulesRegulationsManagementId: {
+    type: [String, Number],
+    default: ''
+  },
+  uploadUrl: {
+    type: String,
+    default: `${import.meta.env.VITE_APP_BASE_API}/file/upload`
   }
 })
 
-const emit = defineEmits(['update:modelValue', 'close', 'download', 'preview'])
+const emit = defineEmits(['update:modelValue', 'close', 'download', 'preview', 'upload', 'delete'])
 
 const { proxy } = getCurrentInstance()
 const filePreviewRef = ref(null)
+const uploadFileList = ref([])
 
 const dialogVisible = computed({
   get: () => props.modelValue,
@@ -121,6 +188,12 @@
 })
 
 const tableData = ref([])
+const showToolbar = computed(() => props.showUploadButton)
+const useBuiltInUpload = computed(() => !props.uploadMethod)
+const uploadAction = computed(() => props.uploadUrl)
+const uploadHeaders = computed(() => ({
+  Authorization: `Bearer ${getToken()}`
+}))
 
 const handleClose = () => {
   emit('close')
@@ -154,11 +227,84 @@
   tableData.value = list || []
 }
 
+const handleUpload = async () => {
+  if (props.uploadMethod) {
+    const newItem = await props.uploadMethod()
+    if (newItem) {
+      addAttachment(newItem)
+    }
+  }
+  emit('upload')
+}
+
+const handleDelete = async (row, index) => {
+  if (props.deleteMethod) {
+    const result = await props.deleteMethod(row, index)
+    if (result === false) {
+      return
+    }
+    // 濡傛灉鎻愪緵浜� deleteMethod锛岀敱鐖剁粍浠惰礋璐e埛鏂板垪琛紝涓嶅湪杩欓噷鍒犻櫎
+  } else {
+    // 濡傛灉娌℃湁鎻愪緵 deleteMethod锛屾墠鍦ㄧ粍浠跺唴閮ㄥ垹闄�
+    removeAttachment(index)
+  }
+  emit('delete', row)
+}
+
+const addAttachment = (item) => {
+  tableData.value = [...tableData.value, item]
+}
+
+const handleDefaultUploadSuccess = async (res, file) => {
+  if (res?.code !== 200) {
+    ElMessage.error(res?.msg || '鏂囦欢涓婁紶澶辫触')
+    return
+  }
+  if (!props.rulesRegulationsManagementId) {
+    ElMessage.error('缂哄皯瑙勭珷鍒跺害ID锛屾棤娉曚繚瀛橀檮浠�')
+    return
+  }
+  const fileName = res?.data?.originalName || file?.name
+  const fileUrl = res?.data?.tempPath || res?.data?.url
+  const payload = {
+    fileName,
+    fileUrl,
+    rulesRegulationsManagementId: props.rulesRegulationsManagementId,
+    raw: res?.data || {}
+  }
+  emit('upload', payload)
+}
+
+const handleDefaultUploadError = () => {
+  ElMessage.error('鏂囦欢涓婁紶澶辫触')
+}
+
+const removeAttachment = (index) => {
+  if (index > -1 && index < tableData.value.length) {
+    const newList = [...tableData.value]
+    newList.splice(index, 1)
+    tableData.value = newList
+  }
+}
+
+const setList = (list) => {
+  tableData.value = list || []
+}
+
 defineExpose({
-  open
+  open,
+  addAttachment,
+  removeAttachment,
+  setList,
+  handleUpload,
+  handleDelete
 })
 </script>
 
 <style scoped>
+.file-list-toolbar {
+  margin-bottom: 8px;
+  text-align: right;
+}
 </style>
 

--
Gitblit v1.9.3