From e3cac4fb5b540b45d6ec1a53a534d08c03d7c174 Mon Sep 17 00:00:00 2001
From: fei <791364011@qq.com>
Date: 星期六, 15 十一月 2025 16:36:08 +0800
Subject: [PATCH] 打的修改

---
 src/views/archiveManager/archiveMaterial/index.vue |  290 ++++++---
 src/views/archiveManager/arMAutoUser.vue           |   11 
 src/views/system/user/index.vue                    |    8 
 src/assets/12.xls                                  |    0 
 src/views/archiveManager/seleUser.vue              |    8 
 package-lock.json                                  |   55 +
 src/views/system/user/profile/userInfo.vue         |    8 
 package.json                                       |    3 
 src/views/archiveManager/index.vue                 | 1108 +++++++++++++++++++++++++++++++++++--
 src/views/archiveDoublePdf/index.vue               |  219 +++++++
 src/api/system/dpdf.js                             |    9 
 11 files changed, 1,536 insertions(+), 183 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 022a088..a46a4f2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,6 +10,8 @@
       "license": "MIT",
       "dependencies": {
         "@riophae/vue-treeselect": "0.4.0",
+        "@vue-office/excel": "^1.7.14",
+        "@vue/composition-api": "^1.7.2",
         "axios": "0.28.1",
         "clipboard": "2.0.8",
         "core-js": "3.37.1",
@@ -29,6 +31,7 @@
         "vue": "2.6.12",
         "vue-count-to": "1.0.13",
         "vue-cropper": "0.5.5",
+        "vue-demi": "^0.14.10",
         "vue-router": "3.4.9",
         "vuedraggable": "2.24.3",
         "vuex": "3.6.0"
@@ -2019,6 +2022,23 @@
       "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==",
       "dev": true
     },
+    "node_modules/@vue-office/excel": {
+      "version": "1.7.14",
+      "resolved": "https://registry.npmjs.org/@vue-office/excel/-/excel-1.7.14.tgz",
+      "integrity": "sha512-pVUgt+emDQUnW7q22CfnQ+jl43mM/7IFwYzOg7lwOwPEbiVB4K4qEQf+y/bc4xGXz75w1/e3Kz3G6wAafmFBFg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "peerDependencies": {
+        "@vue/composition-api": "^1.7.1",
+        "vue": "^2.0.0 || >=3.0.0",
+        "vue-demi": "^0.14.6"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@vue/babel-helper-vue-jsx-merge-props": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz",
@@ -2656,6 +2676,15 @@
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@vue/composition-api": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmjs.org/@vue/composition-api/-/composition-api-1.7.2.tgz",
+      "integrity": "sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==",
+      "license": "MIT",
+      "peerDependencies": {
+        "vue": ">= 2.5 < 2.7"
       }
     },
     "node_modules/@vue/preload-webpack-plugin": {
@@ -16945,6 +16974,32 @@
       "resolved": "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.5.5.tgz",
       "integrity": "sha512-5mGaBlS1EwLxUFwHHX2Q8zOZSiVfBUjOfolR+ZNKwu7Rh3u+GhwHYOyFkgZHhhoQBBNdyVB28O6W+MpMimhCbA=="
     },
+    "node_modules/vue-demi": {
+      "version": "0.14.10",
+      "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
+      "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "bin": {
+        "vue-demi-fix": "bin/vue-demi-fix.js",
+        "vue-demi-switch": "bin/vue-demi-switch.js"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "@vue/composition-api": "^1.0.0-rc.1",
+        "vue": "^3.0.0-0 || ^2.6.0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/composition-api": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/vue-hot-reload-api": {
       "version": "2.3.4",
       "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
diff --git a/package.json b/package.json
index 768081f..a143e68 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,8 @@
   },
   "dependencies": {
     "@riophae/vue-treeselect": "0.4.0",
+    "@vue-office/excel": "^1.7.14",
+    "@vue/composition-api": "^1.7.2",
     "axios": "0.28.1",
     "clipboard": "2.0.8",
     "core-js": "3.37.1",
@@ -44,6 +46,7 @@
     "vue": "2.6.12",
     "vue-count-to": "1.0.13",
     "vue-cropper": "0.5.5",
+    "vue-demi": "^0.14.10",
     "vue-router": "3.4.9",
     "vuedraggable": "2.24.3",
     "vuex": "3.6.0"
diff --git a/src/api/system/dpdf.js b/src/api/system/dpdf.js
new file mode 100644
index 0000000..da90a00
--- /dev/null
+++ b/src/api/system/dpdf.js
@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛�
+export function getPdfFile(id) {
+  return request({
+    url: '/system/doublePdf/downLoadFile/' + id,
+    method: 'get',
+  })
+}
\ No newline at end of file
diff --git a/src/assets/12.xls b/src/assets/12.xls
new file mode 100644
index 0000000..e6c141c
--- /dev/null
+++ b/src/assets/12.xls
Binary files differ
diff --git a/src/views/archiveDoublePdf/index.vue b/src/views/archiveDoublePdf/index.vue
new file mode 100644
index 0000000..c5b58dc
--- /dev/null
+++ b/src/views/archiveDoublePdf/index.vue
@@ -0,0 +1,219 @@
+<template>
+  <div class="app-container">
+    <!-- 姘村钩鎺掑垪瀹瑰櫒 -->
+    <div style="display: flex; align-items: center; gap: 20px;">
+      <!-- 涓婁紶鍖哄煙 -->
+      <div class="upload-container" style="width: 400px; height: 200px;">
+        <el-upload
+            class="upload-demo"
+            ref="upload"
+            :action="uploadUrl"
+            :headers="uploadHeaders"
+            :on-success="handleUploadSuccess"
+            :on-error="handleUploadError"
+            :before-upload="beforeUpload"
+            accept=".pdf"
+            :auto-upload="true"
+            drag
+          >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+          <div class="el-upload__tip" slot="tip">鏀寔鍗曚釜鎴栨壒閲忎笂浼狅紝璇烽�夋嫨PDF鏂囦欢</div>
+        </el-upload>
+      </div>
+      
+      <!-- 涓嬭浇鎸夐挳鍖哄煙 - 涓婁紶鍓嶇鐢紝涓婁紶鍚庡彲鐢� -->
+      <div class="download-container" style="white-space: nowrap;">
+        <el-button 
+          type="primary" 
+          icon="el-icon-download" 
+          @click="downloadFile"
+          :disabled="!canDownload"
+        >
+          鑾峰彇涓嬭浇閾炬帴
+        </el-button>
+        <!-- 鏄剧ず涓嬭浇閾炬帴鍖哄煙 -->
+        <div v-if="showDownloadLink" style="margin-left: 10px;">
+          <div style="margin-bottom: 5px;">
+            <span>涓嬭浇閾炬帴:</span>
+          </div>
+          <div style="margin-bottom: 5px;">
+            <a :href="displayedDownloadLink" target="_blank" style="color: #409EFF; word-break: break-all; max-width: 400px; display: inline-block;">
+              {{ displayedDownloadLink }}
+            </a>
+          </div>
+          <div>
+            <el-button 
+              type="text" 
+              icon="el-icon-copy-document" 
+              @click="copyLink"
+              size="small"
+            >
+              澶嶅埗
+            </el-button>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getToken } from '@/utils/auth'
+import { getPdfFile } from '@/api/system/dpdf'
+export default {
+  name: "DoublePdf",
+  data() {
+    return {
+      fid: '',
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 銆愯濉啓鍔熻兘鍚嶇О銆戣〃鏍兼暟鎹�
+      categoryList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        numb: null,
+        nname: null
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        numb: [
+          { required: true, message: '璇疯緭鍏ョ紪鍙�', trigger: 'blur' }
+        ],
+        nname: [
+          { required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }
+        ]
+      },
+      // 鏂囦欢涓婁紶鐩稿叧
+      uploadUrl: process.env.VUE_APP_BASE_API + "/system/doublePdf/upload", // 涓婁紶鎺ュ彛
+      uploadHeaders: {
+        Authorization: 'Bearer ' + getToken()
+      },
+      // 鏂囦欢涓嬭浇鐩稿叧
+      canDownload: false, // 鏄惁鍙互涓嬭浇
+      uploadedFileName: '', // 宸蹭笂浼犵殑鏂囦欢鍚�
+      downloadUrl: '', // 涓嬭浇閾炬帴
+      showDownloadLink: false, // 鏄惁鏄剧ず涓嬭浇閾炬帴
+      displayedDownloadLink: '' // 鏄剧ず鐨勪笅杞介摼鎺�
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    /** 鏌ヨ銆愯濉啓鍔熻兘鍚嶇О銆戝垪琛� */
+    getList() {
+      this.loading = true
+    },
+    
+    /** 涓婁紶鍓嶆鏌� */
+    beforeUpload(file) {
+      const isPdf = file.type === 'application/pdf'
+      const isLt50M = file.size / 1024 / 1024 < 50
+      
+      if (!isPdf) {
+        this.$message.error('涓婁紶鏂囦欢鍙兘鏄� PDF 鏍煎紡!')
+      }
+      if (!isLt50M) {
+        this.$message.error('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 50MB!')
+      }
+      
+      return isPdf && isLt50M
+    },
+    
+    /** 涓婁紶鎴愬姛澶勭悊 */
+    handleUploadSuccess(response) {
+      console.log(response)
+      console.log("-------------")
+      if (response.code === 200) {
+        this.$message.success('涓婁紶鎴愬姛')
+        // 璁剧疆涓嬭浇鐩稿叧淇℃伅
+        this.canDownload = true
+        // 鍋囪鍝嶅簲涓寘鍚枃浠跺悕鍜屼笅杞介摼鎺�
+        this.fid = (response.data.data)
+        // this.uploadedFileName = response.fileName || '涓婁紶鐨勬枃浠�'
+        // this.downloadUrl = response.downloadUrl || (process.env.VUE_APP_BASE_API + "/system/doublePdf/download?fileId=" + response.fileId)
+        // // 鍙互鍦ㄨ繖閲屽埛鏂板垪琛ㄦ暟鎹�
+        // // this.getList()
+      } else {
+        this.$message.error(response.msg || '涓婁紶澶辫触')
+      }
+    },
+    
+    /** 鑾峰彇涓嬭浇閾炬帴 */
+    downloadFile() {
+      // 鍙戣捣ajax璇锋眰鑾峰彇涓嬭浇閾炬帴
+      getPdfFile(this.fid).then(response => {
+        console.log(response)
+          // 纭繚response.data.data鏄瓧绗︿覆绫诲瀷
+          const dataStr = String(response.data.data)
+          alert(dataStr)
+          if(dataStr.includes("浠诲姟灏氭湭缁撴潫锛屾棤娉曡幏鍙栨枃浠�")) {
+            this.$message.success("鏂囦欢娌℃湁澶勭悊瀹岋紝绋嶇瓑鐗囧埢")
+            return;
+          }
+        if (response.code === 200 && response.data) {
+          // 鍋囪鍝嶅簲涓寘鍚笅杞介摼鎺�
+          this.displayedDownloadLink = response.data.data || response.data.downloadUrl || response.data
+          this.showDownloadLink = true
+          this.$message.success('涓嬭浇閾炬帴宸茶幏鍙�')
+        } else {
+          this.$message.error('鑾峰彇涓嬭浇閾炬帴澶辫触: ' + (response.msg || '鏈煡閿欒'))
+        }
+      }).catch(error => {
+        console.error('鑾峰彇涓嬭浇閾炬帴澶辫触:', error)
+        this.$message.error('鑾峰彇涓嬭浇閾炬帴澶辫触锛岃閲嶈瘯')
+      })
+    },
+    
+    /** 澶嶅埗閾炬帴鍒板壀璐存澘 */
+    copyLink() {
+      if (this.displayedDownloadLink) {
+        // 鍒涘缓涓存椂鏂囨湰鍖哄煙
+        const textarea = document.createElement('textarea')
+        textarea.value = this.displayedDownloadLink
+        textarea.style.position = 'fixed'
+        textarea.style.opacity = '0'
+        document.body.appendChild(textarea)
+        textarea.select()
+        
+        try {
+          document.execCommand('copy')
+          this.$message.success('閾炬帴宸插鍒跺埌鍓创鏉�')
+        } catch (err) {
+          this.$message.error('澶嶅埗澶辫触锛岃鎵嬪姩澶嶅埗')
+          console.error('Copy error:', err)
+        } finally {
+          document.body.removeChild(textarea)
+        }
+      }
+    },
+    
+    /** 涓婁紶澶辫触澶勭悊 */
+    handleUploadError(err) {
+      this.$message.error('涓婁紶澶辫触锛岃閲嶈瘯')
+      console.error('Upload error:', err)
+    }
+  }
+}
+    /** 鎻愪氦鎸夐挳 */
+
+</script>
diff --git a/src/views/archiveManager/arMAutoUser.vue b/src/views/archiveManager/arMAutoUser.vue
index c55c7e6..d7eb9ef 100644
--- a/src/views/archiveManager/arMAutoUser.vue
+++ b/src/views/archiveManager/arMAutoUser.vue
@@ -48,7 +48,7 @@
           v-hasPermi="['system:role:remove']"
         >鎵归噺鍙栨秷鎺堟潈</el-button>
       </el-col> -->
-      <el-col :span="1.5">
+    <!--  <el-col :span="1.5">
         <el-button
           type="warning"
           plain
@@ -56,7 +56,7 @@
           size="mini"
           @click="handleClose"
         >鍏抽棴</el-button>
-      </el-col>
+      </el-col> -->
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
@@ -148,7 +148,7 @@
   created() {
     const roleId = this.$route.params && this.$route.params.roleId
     const recordId = this.$route.params && this.$route.params.archiveRecordsId
-   
+
     if (roleId && recordId) {
       this.queryParams.roleId = roleId
       // 杩涜绫诲瀷杞崲
@@ -164,7 +164,7 @@
       // 鍒涘缓涓�涓柊瀵硅薄锛屽皢瀛楃涓茬被鍨嬬殑archiveRecordsId杞崲涓烘暟瀛楃被鍨�
       const params = {
         ...this.queryParams,
-        archiveRecordsId: !isNaN(Number(this.queryParams.archiveRecordsId)) ? 
+        archiveRecordsId: !isNaN(Number(this.queryParams.archiveRecordsId)) ?
                     Number(this.queryParams.archiveRecordsId) : 0
       }
       listArchiverecordstouser(params).then(response => {
@@ -176,8 +176,9 @@
     /** 鎵撳紑鎺堟潈鐢ㄦ埛琛ㄥ脊绐� */
     openSelectUser() {
       // 纭繚浼犻�掔粰select缁勪欢鐨剅ecordId鏄暟瀛楃被鍨�
-      const recordId = !isNaN(Number(this.queryParams.archiveRecordsId)) ? 
+      const recordId = !isNaN(Number(this.queryParams.archiveRecordsId)) ?
                     Number(this.queryParams.archiveRecordsId) : 0
+
       this.$refs.select.show(recordId)
     },
     // 杩斿洖鎸夐挳
diff --git a/src/views/archiveManager/archiveMaterial/index.vue b/src/views/archiveManager/archiveMaterial/index.vue
index 83b9619..7551f1d 100644
--- a/src/views/archiveManager/archiveMaterial/index.vue
+++ b/src/views/archiveManager/archiveMaterial/index.vue
@@ -2,8 +2,17 @@
     <div class="app-container">
          <h2 class="title-border">娣诲姞妗堝嵎璇︾粏璁板綍</h2>
  <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+
+   <el-row>
+     <el-col :span="8">
+           <el-form-item label="鏂囦欢缂栧彿" prop="documentNumber">
+             <el-input ref="documentNumberInput" v-model="form.documentNumber" placeholder="璇疯緭鍏ユ枃浠剁紪鍙�" />
+           </el-form-item>
+           </el-col>
+   </el-row>
+
     <el-row>
-    <el-col :span="8">
+    <el-col :span="16">
           <el-form-item label="璐d换鑰�" prop="creator">
             <el-input v-model="form.creator" placeholder="璇疯緭鍏ヨ矗浠昏��" />
           </el-form-item>
@@ -11,7 +20,7 @@
   </el-row>
   <el-row>
 
-  <el-col :span="8">
+  <el-col :span="16">
           <el-form-item label="鏂囦欢棰樺悕" prop="title">
             <el-input v-model="form.title" placeholder="璇疯緭鍏ユ枃浠堕鍚�" />
           </el-form-item>
@@ -42,20 +51,56 @@
               :value="item.value"
             />
           </el-select>
-          
+
         </el-form-item>
-        <el-form-item label="椤靛彿" 
+        <el-form-item label="椤靛彿"
           prop="pageNumber"
           v-if=" form.fileStyle !== '鍏朵粬鏉愭枡'">
       <el-col :span="8">
-  <el-input 
-    v-model.number="form.pageNumber" 
-    placeholder="璇疯緭鍏ラ〉鍙凤紙鏁板瓧绫诲瀷锛�" 
-    type="number" 
+  <el-input
+    v-model.number="form.pageNumber"
+    placeholder="璇疯緭鍏ラ〉鍙凤紙鏁板瓧绫诲瀷锛�"
+    type="number"
     min="1"
     oninput="value=value.replace(/[^\d]/g,'')" style="width: 450px;"
   /></el-col>
 </el-form-item>
+
+          <el-form-item label="澶囨敞" prop="remarks">
+              <el-col :span="8">
+            <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" />
+                </el-col>
+          </el-form-item>
+
+    <el-form-item label="鍏紑灞炴��" prop="publicity">
+          <el-select
+            v-model="form.publicity"
+            placeholder="璇烽�夋嫨鍏紑灞炴��"
+            clearable
+          >
+            <el-option
+              v-for="item in publicityOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+    <el-form-item label="鏄惁涓洪檮浠�" prop="isAttachment">
+          <el-select
+            v-model="form.isAttachment"
+            placeholder="璇烽�夋嫨鏄惁涓洪檮浠�"
+          >
+            <el-option
+              v-for="item in isAttachmentOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+
+
           <el-form-item label="鎵�澶勯樁娈�" prop="stage">
           <el-select
             v-model="form.stage"
@@ -69,13 +114,14 @@
             />
           </el-select>
         </el-form-item>
-          <el-form-item label="鍏紑灞炴��" prop="publicity">
+
+   <el-form-item label="瀵嗙骇" prop="securityLevel">
           <el-select
-            v-model="form.publicity"
-            placeholder="璇烽�夋嫨鍏紑灞炴��"
+            v-model="form.securityLevel"
+            placeholder="璇烽�夋嫨瀵嗙骇"
           >
             <el-option
-              v-for="item in publicityOptions"
+              v-for="item in securityLevelOptions"
               :key="item.value"
               :label="item.label"
               :value="item.value"
@@ -83,19 +129,6 @@
           </el-select>
         </el-form-item>
 
-          <el-form-item label="鏄惁涓洪檮浠�" prop="isAttachment">
-          <el-select
-            v-model="form.isAttachment"
-            placeholder="璇烽�夋嫨鏄惁涓洪檮浠�"
-          >
-            <el-option
-              v-for="item in isAttachmentOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
 
           <el-form-item label="淇濈鏈熼檺" prop="retentionPeriod">
           <el-select
@@ -112,19 +145,7 @@
         </el-form-item>
 
       <!-- 瀵硅瘽妗嗚〃鍗曚腑鐨勫瘑绾� -->
-      <el-form-item label="瀵嗙骇" prop="securityLevel">
-          <el-select
-            v-model="form.securityLevel"
-            placeholder="璇烽�夋嫨瀵嗙骇"
-          >
-            <el-option
-              v-for="item in securityLevelOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
+
 
 
 
@@ -200,6 +221,16 @@
         </el-col>
         <el-col :span="1.5">
           <el-button
+            type="warning"
+            plain
+            icon="el-icon-download"
+            size="mini"
+            @click="handleExport"
+
+          >瀵煎嚭</el-button>
+        </el-col>
+        <el-col :span="1.5">
+          <el-button
             type="danger"
             plain
             icon="el-icon-delete"
@@ -209,16 +240,7 @@
             v-hasPermi="['system:materials:remove']"
           >鍒犻櫎</el-button>
         </el-col>
-        <el-col :span="1.5">
-          <el-button
-            type="warning"
-            plain
-            icon="el-icon-download"
-            size="mini"
-            @click="handleExport"
-            v-hasPermi="['system:materials:export']"
-          >瀵煎嚭</el-button>
-        </el-col>
+
           <el-col :span="1.5">
           <el-button
             type="success"
@@ -236,8 +258,8 @@
       class="upload-demo"
       ref="upload"
       :action="uploadUrl"
-         :headers="headers"
-               :data="uploadParams"
+      :headers="headers"
+      :data="uploadParams"
       :on-success="handleSuccess"
       :on-error="handleError"
       :on-preview="handlePreview"
@@ -288,7 +310,33 @@
 
       <el-table v-loading="loading" :data="materialsList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding ">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:materials:edit']"
+                >淇敼</el-button>
+        <!--        <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:materials:edit']"
+                >瀵煎叆闄勪欢</el-button> -->
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:materials:remove']"
+                >鍒犻櫎</el-button>
+              </template>
+            </el-table-column>
                 <el-table-column label="鏂囦欢鏉愭枡搴忓彿" align="center" prop="fileNumber" />
+        <el-table-column label="鏂囦欢缂栧彿" align="center" prop="documentNumber" />
 
         <el-table-column label="璐d换鑰�" align="center" prop="creator" />
         <el-table-column label="鏂囦欢棰樺悕" align="center" prop="title" />
@@ -297,15 +345,18 @@
             <span>{{ parseTime(scope.row.date, '{y}-{m}-{d}') }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="椤靛彿" sortable align="center" prop="pageNumber"  /> 
-                <el-table-column label="椤垫" sortable align="center" prop="pageOrder"  /> 
+        <el-table-column label="椤靛彿" sortable align="center" prop="pageNumber"  />
+        <el-table-column label="澶囨敞" align="center" prop="remarks" />
+                <el-table-column label="椤垫" sortable align="center" prop="pageOrder"  />
 
-        <el-table-column label="鎵�澶勯樁娈�" sortable align="center" prop="stage" />
-        <el-table-column label="鍏紑灞炴��" sortable align="center" prop="publicity" />
+        <el-table-column label="鎵�澶勯樁娈�" sortable align="center" width="180" prop="stage" />
+        <el-table-column label="鍏紑灞炴��" sortable align="center" width="180" prop="publicity" />
         <el-table-column label="鏄惁涓洪檮鍥惧強闄勪欢" align="center" prop="isAttachment" />
 
         <el-table-column label="淇濈鏈熼檺" align="center" prop="retentionPeriod" />
         <el-table-column label="瀵嗙骇" align="center" prop="securityLevel" />
+        <el-table-column label="鏉愭枡绫诲瀷" align="fileStyle" prop="fileStyle" />
+
         <el-table-column label="鏄惁娑夊瘑鍙婃晱鎰熶俊鎭�" align="center" prop="isSensitive" />
         <el-table-column label="鏄惁娉ㄩ攢" align="center" prop="isCanceled" />
         <el-table-column label="鏍煎紡" align="center" prop="format" />
@@ -317,31 +368,8 @@
         <el-table-column label="澶у皬" align="center" prop="fileSize" />
         <el-table-column label="闄勪欢鍙婂巻鍙插彂鏂囧彿" align="center" prop="attachmentHistoryNumbers" />
 
-        <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding ">
-          <template slot-scope="scope">
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-edit"
-              @click="handleUpdate(scope.row)"
-              v-hasPermi="['system:materials:edit']"
-            >淇敼</el-button>
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-edit"
-              @click="handleUpdate(scope.row)"
-              v-hasPermi="['system:materials:edit']"
-            >瀵煎叆闄勪欢</el-button>
-            <el-button
-              size="mini"
-              type="text"
-              icon="el-icon-delete"
-              @click="handleDelete(scope.row)"
-              v-hasPermi="['system:materials:remove']"
-            >鍒犻櫎</el-button>
-          </template>
-        </el-table-column>
+
+
       </el-table>
 
       <pagination
@@ -354,18 +382,22 @@
       <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
 
         <el-form ref="forms" :model="forms" :rules="rules" label-width="100px">
+
+
+          <el-form-item label="鏂囦欢缂栧彿" prop="documentNumber">
+              <el-input v-model="forms.documentNumber" placeholder="璇疯緭鍏ユ枃浠剁紪鍙�" />
+            </el-form-item>
            <el-row>
-           <el-col :span="8">
+           <el-col :span="16">
                <el-form-item label="璐d换鑰�" prop="creator">
                    <el-input v-model="forms.creator" placeholder="璇疯緭鍏ヨ矗浠昏��" />
                  </el-form-item>
            </el-col>
-               <el-col :span="8">
-                 <el-form-item label="鏂囦欢棰樺悕" prop="title">
-                   <el-input v-model="forms.title" placeholder="璇疯緭鍏ユ枃浠堕鍚�" />
-                 </el-form-item>
-           </el-col>
+
            </el-row>
+           <el-form-item label="鏂囦欢棰樺悕" prop="title">
+             <el-input v-model="forms.title" placeholder="璇疯緭鍏ユ枃浠堕鍚�" />
+           </el-form-item>
                  <el-form-item label="鏃ユ湡" prop="date">
                   <el-input v-model="forms.date" placeholder="璇疯緭鍏ユ棩鏈� (鏍煎紡锛歽yyy-mm-dd)" style="width: 200px;" />
                    <!-- <el-date-picker clearable
@@ -394,7 +426,9 @@
           </el-select>
         </el-form-item>
 
-
+       <el-form-item label="澶囨敞" prop="remarks">
+              <el-input v-model="forms.remarks" placeholder="璇疯緭鍏ュ娉�" />
+            </el-form-item>
                  <el-form-item label="鎵�澶勯樁娈�" prop="stage">
                  <el-select
                    v-model="forms.stage"
@@ -706,7 +740,7 @@
       uploadUrl:  process.env.VUE_APP_BASE_API +'/system/materials/upload/'+this.recordId, // 鏇挎崲涓哄疄闄呯殑涓婁紶鎺ュ彛
            headers: {
         Authorization: 'Bearer ' + getToken()
-      },     
+      },
       uploadParams: {
         type: 'material' // 鑷畾涔変笂浼犵被鍨�
       },
@@ -722,8 +756,9 @@
         securityLevelOptions: [
           { value: '绉樺瘑', label: '绉樺瘑' },
           { value: '鏅��', label: '鏅��' },
-                    { value: '璇ラ〉鍙﹀瓨', label: '璇ラ〉鍙﹀瓨' }
-
+           { value: '璇ラ〉鍙﹀瓨', label: '璇ラ〉鍙﹀瓨' },
+          { value: '鍐呴儴鐢ㄩ��', label: '鍐呴儴鐢ㄩ��' },
+          { value: '鍐呴儴鐢ㄥ浘', label: '鍐呴儴鐢ㄥ浘' },
         ],
           // 娣诲姞淇濈鏈熼檺閫夐」
           retentionPeriodOptions: [
@@ -813,19 +848,22 @@
         // 琛ㄥ崟鏍¢獙
         rules: {
           creator: [
-            { required: true, message: "鍒涘缓鑰呬笉鑳戒负绌�", trigger: "blur" }
+           // { required: true, message: "鍒涘缓鑰呬笉鑳戒负绌�", trigger: "blur" }
           ],
           title: [
             { required: true, message: "妗堝嵎棰樺悕涓嶈兘涓虹┖", trigger: "blur" }
           ],
           date: [
-            { required: true, message: "鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" },
+          //  { required: true, message: "鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" },
             { pattern: /^\d{4}-\d{2}-\d{2}$/, message: "鏃ユ湡鏍煎紡蹇呴』涓簓yyy-mm-dd", trigger: "blur" }
           ],
           pageNumber: [
             { required: true, message: "椤靛彿涓嶈兘涓虹┖", trigger: "blur" },
             { type: 'number', message: '椤靛彿蹇呴』涓烘暟瀛楃被鍨�', trigger: ['blur', 'change'] },
             { pattern: /^\d+$/, message: '璇疯緭鍏ユ鏁存暟', trigger: 'blur' }
+          ],
+          stage: [
+            { required: true, message: "鎵�澶勯樁娈典笉鑳戒负绌�", trigger: "change" }
           ]
         }
       }
@@ -1069,11 +1107,69 @@
         console.log(this.form)
         this.form.recordId = this.recordId
         console.log("==============+++++++++++++++============")
+
+        // 淇濆瓨褰撳墠琛ㄥ崟涓渶瑕佷繚鐣欑殑瀛楁鍊�
+        const preservedValues = {
+          documentNumber: this.form.documentNumber,
+          creator: this.form.creator,
+          title: this.form.title,
+          date: this.form.date,
+          pageNumber: this.form.pageNumber,
+          remarks: this.form.remarks,
+          stage: this.form.stage // 鎵�澶勯樁娈典繚鎸佽窡涓婁竴鏉′竴鑷�
+        };
+        this.$refs.form.validate(valid => {
+        if (valid) {
         addMaterials(this.form).then(response => {
           this.$modal.msgSuccess("鏂板鎴愬姛")
-        //  this.opens = false
-       
+
+          // 鍒涘缓鏂拌〃鍗曪紝淇濈暀鐗瑰畾瀛楁锛岄噸缃叾浠栧瓧娈�
+          this.form = {
+            materialId: null,
+            recordId: this.recordId,
+            // 淇濈暀鐨勫瓧娈�
+            documentNumber: preservedValues.documentNumber,
+            creator: preservedValues.creator,
+            title: preservedValues.title,
+            date: preservedValues.date,
+            pageNumber: preservedValues.pageNumber,
+            remarks: preservedValues.remarks,
+            stage: preservedValues.stage,
+            // 閲嶇疆涓虹┖鐨勫瓧娈�
+            publicity: null,
+            // 閲嶇疆涓洪粯璁ゅ�肩殑瀛楁
+            fileStyle: '鏂囧瓧鏉愭枡', // 鏉愭枡绫诲瀷榛樿涓烘枃瀛楁潗鏂�
+            securityLevel: '鏅��', // 瀵嗙骇榛樿涓烘櫘閫�
+            isAttachment: '鍚�', // 鏄惁涓洪檮浠堕粯璁や负鍚�
+            isSensitive: '鍚�', // 鏄惁鏁忔劅榛樿涓哄惁
+            isCanceled: '鍚�', // 鏄惁娉ㄩ攢榛樿涓哄惁
+            // 鍏朵粬闇�瑕侀噸缃殑瀛楁
+            isDiagram: '鍚�',
+            retentionPeriod: '姘镐箙',
+            format: null,
+            sizeType: null,
+            horizontalResolution: null,
+            verticalResolution: null,
+            width: null,
+            height: null,
+            fileSize: null,
+            attachmentHistoryNumbers: null,
+            createdAt: null,
+            updatedAt: null
+          };
+
+          // 淇濆瓨鎴愬姛鍚庯紝鍏夋爣璺冲洖鏂囦欢缂栧彿杈撳叆妗�
+          this.$nextTick(() => {
+            this.$refs.documentNumberInput.focus();
+          });
           this.getList()
+        })
+        }
+        else
+        {
+          this.$message.error('璇峰~鍐欐墍鏈夊繀濉瓧娈�');
+
+        }
         })
       },
       /** 鎻愪氦鎸夐挳 */
@@ -1083,6 +1179,10 @@
             if (this.forms.materialId != null) {
               updateMaterials(this.forms).then(response => {
                 this.$modal.msgSuccess("淇敼鎴愬姛")
+                // 淇敼鎴愬姛鍚庯紝鍏夋爣璺冲洖鏂囦欢缂栧彿杈撳叆妗�
+                this.$nextTick(() => {
+                  this.$refs.documentNumberInput.focus();
+                });
                 this.open = false
                 this.getList()
               })
@@ -1153,7 +1253,7 @@
     },
      /** 鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */
     cancelAuthUser(row) {
-      const recordId =  this.recordId 
+      const recordId =  this.recordId
       var userId = store.state.user.id
       var _this = this
       // alert(userId)
@@ -1174,7 +1274,7 @@
         _this.$router.push('/archiveManager/infoManager')
         _this.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛")
       })
-    
+
       }).catch(() => {})
     },
     }
diff --git a/src/views/archiveManager/index.vue b/src/views/archiveManager/index.vue
index 50eb592..690a203 100644
--- a/src/views/archiveManager/index.vue
+++ b/src/views/archiveManager/index.vue
@@ -287,6 +287,78 @@
 
     <el-table v-loading="loading" :data="recordsList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
+
+
+
+            <el-table-column label="鎿嶄綔" align="center" width="190" class-name="small-padding fixed-width">
+              <template slot-scope="scope">
+                <el-button
+                v-if="scope.row.ownData"
+
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleInfo(scope.row)"
+                  v-hasPermi="['system:records:edit']"
+                >妗堝嵎璇︾粏淇℃伅</el-button>
+
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleCheck(scope.row)"
+                >鏌ョ湅</el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-printer"
+                  @click="viewAndPrintExcel(scope.row)"
+                  title="鏌ョ湅骞舵墦鍗癊xcel鏂囦欢"
+                >鎵撳嵃棰勬暣鐞嗘竻鍗�</el-button>
+          <el-button
+                v-if="userId!==1&&scope.row.ownData"
+
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleSubmit(scope.row)"
+                  v-hasPermi="['system:records:edit']"
+                >鎻愪氦妗堝嵎</el-button>
+                <el-button
+                v-if="scope.row.ownData||userId===1"
+
+                  size="mini"
+                  type="text"
+                  icon="el-icon-edit"
+                  @click="handleUpdate(scope.row)"
+                  v-hasPermi="['system:records:edit']"
+                >淇敼</el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDelete(scope.row)"
+                  v-hasPermi="['system:records:remove']"
+                >鍒犻櫎</el-button>
+                <el-dropdown size="mini" v-hasPermi="['system:records:remove']" @command="(command) => handleCommand(command, scope.row)">
+                  <el-button size="mini" type="text" icon="el-icon-d-arrow-right">鏇村</el-button>
+                  <el-dropdown-menu slot="dropdown">
+
+                    <el-dropdown-item command="handleAuthUser" icon="el-icon-user"
+                  >鍒嗛厤鐢ㄦ埛</el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </template>
+            </el-table-column>
+
+            <el-table-column label="鐘舵��" align="center" prop="recordStatus" width="120">
+              <template slot-scope="scope">
+                <el-button :type="scope.row.recordStatus === '鏈綍鍏�' ? 'danger' : 'success'" size="mini">
+                  {{ scope.row.recordStatus }}
+                </el-button>
+              </template>
+            </el-table-column>
+
 <!--      <el-table-column label="${comment}" align="center" prop="id" /> -->
       <el-table-column label="妗f鍙�" align="center" prop="recordId" />
       <el-table-column label="鍙戞枃鍙�" align="center" prop="inquiryNumber" />
@@ -313,69 +385,7 @@
       <el-table-column label="缂╁井鍙�" align="center" prop="microfilmNumber" />
       <el-table-column label="澶囨敞" align="center" prop="remarks" />
       <el-table-column label="鍘嗗彶鐩稿叧鍙戞枃鍙�" align="center" prop="historicalReferenceNumber" />
-     
-           <el-table-column label="鐘舵��" align="center" prop="recordStatus">
-  <template slot-scope="scope">
-    <el-button :type="scope.row.recordStatus === '鏈綍鍏�' ? 'danger' : 'success'" size="mini">
-      {{ scope.row.recordStatus }}
-    </el-button>
-  </template>
-</el-table-column>
 
-     
-      <el-table-column label="鎿嶄綔" align="center" width="190" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <el-button
-          v-if="scope.row.ownData"
-
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleInfo(scope.row)"
-            v-hasPermi="['system:records:edit']"
-          >妗堝嵎璇︾粏淇℃伅</el-button>
-
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleCheck(scope.row)"
-          >鏌ョ湅</el-button>
-    <el-button
-          v-if="userId!==1&&scope.row.ownData"
-
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleSubmit(scope.row)"
-            v-hasPermi="['system:records:edit']"
-          >鎻愪氦妗堝嵎</el-button>
-          <el-button
-          v-if="scope.row.ownData||userId===1"
-
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:records:edit']"
-          >淇敼</el-button>
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:records:remove']"
-          >鍒犻櫎</el-button>
-          <el-dropdown size="mini" v-hasPermi="['system:records:remove']" @command="(command) => handleCommand(command, scope.row)">
-            <el-button size="mini" type="text" icon="el-icon-d-arrow-right">鏇村</el-button>
-            <el-dropdown-menu slot="dropdown">
-
-              <el-dropdown-item command="handleAuthUser" icon="el-icon-user"
-            >鍒嗛厤鐢ㄦ埛</el-dropdown-item>
-            </el-dropdown-menu>
-          </el-dropdown>
-        </template>
-      </el-table-column>
     </el-table>
 
     <pagination
@@ -385,6 +395,86 @@
       :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
+    <!-- Excel鎿嶄綔寮圭獥 -->
+    <el-dialog :visible.sync="excelDialogVisible" class="excel-dialog-overlay" @click="closeExcelDialog">
+      <div class="excel-dialog" @click.stop>
+        <div class="excel-dialog-header">
+          <h3>Excel鎿嶄綔</h3>
+                    <p class="excel-dialog-tip">璇烽�夋嫨浠ヤ笅鎿嶄綔澶勭悊Excel鏂囦欢</p>
+
+          <!-- <button class="excel-dialog-close" @click="closeExcelDialog">脳</button> -->
+        </div>
+        <div class="excel-dialog-body">
+          <!-- 閫夋嫨妗嗗尯鍩� -->
+          <div class="excel-options-section">
+            <!-- 浜岀淮鐮侀�夋嫨 -->
+            <div class="option-group">
+              <label class="option-label">
+                <input type="checkbox" v-model="excelOptions.includeQrCode">
+                <span>鍖呭惈浜岀淮鐮�</span>
+              </label>
+            </div>
+
+            <!-- 娉ㄨВ閫夋嫨 -->
+            <div class="option-group">
+              <div class="option-label">閫夋嫨娉ㄨВ:</div>
+              <div class="annotation-options">
+                <label v-for="i in 5" :key="i" class="annotation-checkbox">
+                  <input type="checkbox" v-model="excelOptions.selectedAnnotations" :value="i">
+                  <span>娉ㄨВ{{ i }}</span>
+                </label>
+              </div>
+            </div>
+
+            <!-- 绛惧悕鏍忛�夋嫨 -->
+            <div class="option-group">
+              <div class="option-label">绛惧悕鏍忚缃�:</div>
+              <div class="signature-options">
+                <div class="signature-checkboxes">
+                  <label v-for="i in 3" :key="i" class="signature-checkbox">
+                    <input type="checkbox" v-model="excelOptions.selectedSignatures" :value="i">
+                    <span>绛惧悕鏍弡{ i }}</span>
+                  </label>
+                </div>
+<!--                <p v-if="excelOptions.selectedSignatures.length === 0" class="option-tip">璇烽�夋嫨鑷冲皯涓�涓鍚嶆爮</p> -->
+              </div>
+            </div>
+          </div>
+        </div>
+    <!-- 浼樺寲鐨凟xcel棰勮缁勪欢 -->
+    <div class="excel-preview-wrapper" v-if="excelDialogVisible">
+      <!-- 涓昏棰勮缁勪欢 -->
+      <vue-office-excel
+        v-if="currentExcelUrl"
+        :src="currentExcelUrl"
+        style="width: 100%; height: 500px;"
+        @rendered="renderedHandler"
+        @error="handleExcelRenderError"
+      />
+
+      <!-- 閿欒鎻愮ず -->
+      <div v-if="excelRenderError" class="excel-error-message">
+        <h3>Excel娓叉煋澶辫触</h3>
+        <p>{{ excelRenderError }}</p>
+        <p>璇峰皾璇曚互涓嬭В鍐虫柟妗堬細</p>
+        <ul>
+          <li>涓嬭浇鏂囦欢鍚庝娇鐢‥xcel杞欢鎵撳紑</li>
+          <li>纭鏂囦欢鏍煎紡鏄惁涓烘敮鎸佺殑.xls鎴�.xlsx</li>
+        </ul>
+        <button class="excel-dialog-btn download-btn" @click="handleDownloadClick">涓嬭浇Excel鏂囦欢</button>
+      </div>
+    </div>
+
+        <div class="excel-dialog-footer">
+          <button class="excel-dialog-btn preview-btn" @click="handlePreviewClick">棰勮</button>
+          <button class="excel-dialog-btn print-btn" @click="handlePrintClick">鎵撳嵃</button>
+          <button class="excel-dialog-btn download-btn" @click="handleDownloadClick">涓嬭浇</button>
+        </div>
+      </div>
+
+
+
+    </el-dialog>
     <!--  鏌ョ湅鏁版嵁鎸夐挳  -->
     <el-dialog :title="title" :visible.sync="open_check" width="800px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
@@ -696,14 +786,24 @@
 </template>
 
 <script>
+import VueOfficeExcel from '@vue-office/excel'
+import '@vue-office/excel/lib/index.css'
+
+import axios from 'axios'
+import { getToken } from '@/utils/auth'
 import { enload, batchSubmitRecords,updateStatusById,listRecords,getMaxId, getRecords, delRecords, addRecords, updateRecords } from "@/api/system/records"
 import { listAllCategory } from "@/api/system/category"
 import { listAllProjectName } from "@/api/system/projectName"
 import { listPlaceName, listAllPlaceName } from "@/api/system/placeName"
 export default {
+     components: {
+        VueOfficeExcel
+    },
   name: "Records",
   data() {
     return {
+                  excel: 'http://localhost:8080/profile/upload/12.xls', //璁剧疆鏂囨。缃戠粶鍦板潃锛屽彲浠ユ槸鐩稿鍦板潃
+
       open_check: false,
       securityLevelOptions: [
         { value: '绉樺瘑', label: '绉樺瘑' },
@@ -774,6 +874,21 @@
         remarks: null,
         historicalReferenceNumber: null
       },
+    // Excel寮圭獥鐩稿叧鏁版嵁
+    excelDialogVisible: false,
+    currentExcelUrl: '',
+    currentExcelBlob: null,
+    currentExcelId: '',
+    excelLoading: false,
+    excelPreviewTimeout: null,
+    excelRenderError: '', // Excel娓叉煋閿欒淇℃伅
+    // Excel閫夐」閰嶇疆
+    excelOptions: {
+      includeQrCode: false, // 鏄惁鍖呭惈浜岀淮鐮�
+      selectedAnnotations: [], // 閫変腑鐨勬敞瑙e垪琛�
+      includeSignature: false, // 鏄惁鍖呭惈绛惧悕鏍�
+      signaturePosition: 'bottom' // 绛惧悕鏍忎綅缃細top/bottom
+    },
       // 琛ㄥ崟鍙傛暟
       form: {
         recordSeq: '',
@@ -802,7 +917,8 @@
     }
   },
   created() {
-
+    // 鐩戝惉ESC閿叧闂脊绐�
+    document.addEventListener('keydown', this.handleKeyDown);
     this.userId = this.$store.state.user.id;
 
 // 鑾峰彇鐢ㄦ埛瑙掕壊
@@ -832,7 +948,42 @@
       immediate: true
     }
   },
+  beforeDestroy() {
+    // 娓呯悊浜嬩欢鐩戝惉鍣ㄥ拰瀹氭椂鍣�
+    document.removeEventListener('keydown', this.handleKeyDown);
+    if (this.excelPreviewTimeout) {
+      clearTimeout(this.excelPreviewTimeout);
+    }
+    if (this.currentExcelUrl) {
+      URL.revokeObjectURL(this.currentExcelUrl);
+    }
+  },
   methods: {
+      /** Excel娓叉煋瀹屾垚澶勭悊 */
+        renderedHandler() {
+            console.log("Excel娓叉煋瀹屾垚");
+            this.excelLoading = false;
+            this.excelRenderError = '';
+        },
+        /** Excel娓叉煋閿欒澶勭悊 */
+        handleExcelRenderError(error) {
+            console.error("Excel娓叉煋澶辫触:", error);
+            this.excelLoading = false;
+
+            // 璁剧疆鍙嬪ソ鐨勯敊璇俊鎭�
+            if (error && error.message) {
+                this.excelRenderError = error.message;
+            } else {
+                this.excelRenderError = '鏃犳硶娓叉煋姝xcel鏂囦欢锛屽彲鑳芥槸鏂囦欢鏍煎紡涓嶅吋瀹规垨宸叉崯鍧忋��';
+            }
+
+            // 灏濊瘯澶囬�夋柟妗�
+            this.tryAlternativePreview();
+        },
+        /** 灏濊瘯澶囬�夐瑙堟柟妗� */
+        tryAlternativePreview() {
+            console.log('灏濊瘯澶囬�夐瑙堟柟妗�...');
+        },
     getId()
     {
       var _this = this;
@@ -849,19 +1000,19 @@
     // 鐢熸垚妗堝嵎棰樺悕
     generateCaseTitle() {
       let titleParts = [];
-      
+
       if (this.form.constructionUnit) {
         titleParts.push(this.form.constructionUnit);
       }
-      
+
       if (this.form.constructionAddress) {
         titleParts.push(this.form.constructionAddress);
       }
-      
+
       if (this.form.projectName) {
         titleParts.push(this.form.projectName);
       }
-      
+
       this.form.caseTitle = titleParts.join('');
     },
     async getZoneOptions()
@@ -1057,7 +1208,7 @@
   .map(item => item.id);
           // 妫�鏌ラ�変腑鐨処D鏄惁鍏ㄩ儴灞炰簬鑷繁
     const invalidIds = this.ids.filter(id => !myValidIds.includes(id));
-    
+
     if (invalidIds.length > 0) {
       this.$message.error(`鍖呭惈鏃犳潈鎿嶄綔鐨処D: ${invalidIds.join(',')}`);
       return false;
@@ -1166,10 +1317,518 @@
     },
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     handleExport() {
-      this.download('system/records/export', {
-        ...this.queryParams
-      }, `records_${new Date().getTime()}.xlsx`)
+      // 妫�鏌ユ槸鍚︽湁閫変腑鐨勮褰�
+      //alert(234)
+     // alert(this.ids.length)
+      if (this.ids && this.ids.length > 0) {
+        // 鍙鍑洪�変腑鐨勮褰�
+        this.download('system/records/export', {
+          ids: this.ids.join(',') // 灏嗛�変腑鐨処D鏁扮粍杞崲涓洪�楀彿鍒嗛殧鐨勫瓧绗︿覆
+        }, `records_${new Date().getTime()}.xlsx`)
+      } else {
+        // 娌℃湁閫変腑璁板綍鏃讹紝瀵煎嚭绗﹀悎鏌ヨ鏉′欢鐨勬墍鏈夎褰�
+        this.download('system/records/export', {
+          ...this.queryParams
+        }, `records_${new Date().getTime()}.xlsx`)
+      }
     },
+
+    /** 鏌ョ湅骞舵墦鍗癊xcel鏂囦欢 */
+    viewAndPrintExcel(row) {
+      const id = row.id || this.ids;
+      this.$modal.loading('姝e湪鑾峰彇Excel鏂囦欢锛岃绋嶅��...');
+
+      // 浠庡悗绔幏鍙朎xcel鏂囦欢
+      this.getExcelFile(id).then(blob => {
+        this.$modal.closeLoading();
+        // 淇濆瓨鏂囦欢淇℃伅骞舵樉绀洪潤鎬佸脊绐�
+        this.currentExcelUrl = URL.createObjectURL(blob);
+        this.currentExcelBlob = blob;
+        this.currentExcelId = id;
+        this.excelDialogVisible = true;
+        this.excelLoading = false;
+      }).catch(error => {
+        this.$modal.closeLoading();
+        console.error('鑾峰彇Excel鏂囦欢澶辫触:', error);
+        this.$modal.msgError('鑾峰彇Excel鏂囦欢澶辫触锛岃绋嶅悗閲嶈瘯');
+      });
+    },
+
+    /** 澶勭悊閿洏浜嬩欢 - ESC閿叧闂脊绐� */
+    handleKeyDown(e) {
+      if (e.key === 'Escape' && this.excelDialogVisible) {
+        this.closeExcelDialog();
+      }
+    },
+
+    /** 鍏抽棴Excel寮圭獥骞舵竻鐞嗚祫婧� */
+    closeExcelDialog() {
+      this.excelDialogVisible = false;
+      if (this.excelPreviewTimeout) {
+        clearTimeout(this.excelPreviewTimeout);
+        this.excelPreviewTimeout = null;
+      }
+      if (this.currentExcelUrl) {
+        URL.revokeObjectURL(this.currentExcelUrl);
+        this.currentExcelUrl = '';
+      }
+      this.currentExcelBlob = null;
+    },
+
+    /** 澶勭悊棰勮鎸夐挳鐐瑰嚮 */
+    handlePreviewClick() {
+      this.excelLoading = true;
+      this.excelRenderError = '';
+
+      // 閲嶇疆vue-office-excel缁勪欢
+      if (this.currentExcelUrl) {
+        const tempUrl = this.currentExcelUrl;
+        this.currentExcelUrl = '';
+        this.$nextTick(() => {
+          this.currentExcelUrl = tempUrl;
+        });
+      }
+
+      const previewContainer = this.$refs.excelPreviewContainer;
+
+      // 娓呯┖棰勮瀹瑰櫒
+      if (previewContainer) {
+        previewContainer.innerHTML = '';
+
+        // 灏濊瘯浣跨敤寰蒋Office Online棰勮鏈嶅姟浣滀负澶囬��
+        const officeOnlineUrl = `https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(this.currentExcelUrl)}`;
+
+        // 鍒涘缓iframe鐢ㄤ簬棰勮
+        const iframe = document.createElement('iframe');
+        iframe.style.width = '100%';
+        iframe.style.height = '100%';
+        iframe.style.border = 'none';
+        iframe.style.minHeight = '600px';
+        iframe.src = officeOnlineUrl;
+        iframe.title = 'Excel鏂囦欢棰勮';
+
+        // 鍒涘缓鍔犺浇鎸囩ず鍣�
+        const loadingIndicator = document.createElement('div');
+        loadingIndicator.className = 'loading-indicator';
+        loadingIndicator.innerHTML = `
+          <div class="loading-spinner"></div>
+          <p>姝e湪鍔犺浇Excel鏂囦欢锛岃绋嶅��...</p>
+        `;
+        previewContainer.style.position = 'relative';
+        previewContainer.appendChild(iframe);
+        previewContainer.appendChild(loadingIndicator);
+
+        // 鐩戝惉iframe鍔犺浇瀹屾垚
+        iframe.onload = () => {
+          this.excelLoading = false;
+          if (loadingIndicator && loadingIndicator.parentNode) {
+            loadingIndicator.parentNode.removeChild(loadingIndicator);
+          }
+        };
+
+        // 璁剧疆瓒呮椂澶勭悊
+        this.excelPreviewTimeout = setTimeout(() => {
+          this.excelLoading = false;
+          if (loadingIndicator && loadingIndicator.parentNode) {
+            loadingIndicator.parentNode.removeChild(loadingIndicator);
+          }
+
+          // 灏濊瘯鐩存帴棰勮浣滀负澶囬�夋柟妗�
+          previewContainer.innerHTML = '';
+          const directIframe = document.createElement('iframe');
+          directIframe.style.width = '100%';
+          directIframe.style.height = '100%';
+          directIframe.style.border = 'none';
+          directIframe.style.minHeight = '600px';
+          directIframe.src = this.currentExcelUrl;
+
+          const fallbackMessage = document.createElement('div');
+          fallbackMessage.textContent = 'Office棰勮鏈嶅姟鍔犺浇瓒呮椂锛屾鍦ㄥ皾璇曠洿鎺ラ瑙�...';
+          fallbackMessage.style.cssText = `
+            position: absolute;
+            top: 0;
+            left: 0;
+            right: 0;
+            padding: 10px;
+            background-color: #f56c6c;
+            color: white;
+            text-align: center;
+            font-size: 14px;
+            z-index: 10;
+          `;
+
+          previewContainer.appendChild(directIframe);
+          previewContainer.appendChild(fallbackMessage);
+
+          directIframe.onload = () => {
+            if (fallbackMessage && fallbackMessage.parentNode) {
+              fallbackMessage.parentNode.removeChild(fallbackMessage);
+            }
+          };
+
+          // 浜屾瓒呮椂澶勭悊
+          setTimeout(() => {
+            if (directIframe && directIframe.parentNode) {
+              directIframe.parentNode.removeChild(directIframe);
+            }
+            const errorMessage = document.createElement('div');
+            errorMessage.innerHTML = `
+              <div style="text-align: center; padding: 40px;">
+                <h3 style="color: #f56c6c; margin-bottom: 20px;">棰勮澶辫触</h3>
+                <p style="color: #666; margin-bottom: 30px;">鏃犳硶鍦ㄦ祻瑙堝櫒涓瑙圗xcel鏂囦欢锛岃鐐瑰嚮涓嬫柟鎸夐挳涓嬭浇鏂囦欢鍚庢煡鐪嬨��</p>
+                <button onclick="this.parentNode.parentNode.querySelector('.download-btn').click()"
+                        style="padding: 8px 20px; background: #409EFF; color: white; border: none; border-radius: 4px; cursor: pointer;">
+                  涓嬭浇Excel鏂囦欢
+                </button>
+              </div>
+            `;
+            previewContainer.appendChild(errorMessage);
+          }, 20000);
+        }, 25000);
+      }
+    },
+
+    /** 澶勭悊鎵撳嵃鎸夐挳鐐瑰嚮 */
+    handlePrintClick() {
+      if (this.currentExcelUrl) {
+        // 鍒涘缓涓�涓复鏃秈frame鐢ㄤ簬鎵撳嵃
+        const iframe = document.createElement('iframe');
+        iframe.style.position = 'absolute';
+        iframe.style.left = '-9999px';
+        iframe.style.top = '-9999px';
+        iframe.style.width = '210mm';
+        iframe.style.height = '297mm';
+        document.body.appendChild(iframe);
+
+        // 鐩戝惉iframe鍔犺浇瀹屾垚
+        iframe.onload = () => {
+          try {
+            // 鎵ц鎵撳嵃
+            iframe.contentWindow.print();
+
+            // 璁剧疆瓒呮椂绉婚櫎iframe
+            setTimeout(() => {
+              if (iframe && iframe.parentNode) {
+                iframe.parentNode.removeChild(iframe);
+              }
+            }, 1000);
+          } catch (error) {
+            console.error('Print error:', error);
+            // 鎵撳嵃澶辫触鏃讹紝鎻愮ず鐢ㄦ埛涓嬭浇
+            this.$confirm('鎵撳嵃澶辫触锛屾槸鍚︿笅杞芥枃浠讹紵', '鎻愮ず', {
+              confirmButtonText: '涓嬭浇',
+              cancelButtonText: '鍙栨秷',
+              type: 'warning'
+            }).then(() => {
+              this.handleDownloadClick();
+            });
+
+            // 绉婚櫎iframe
+            if (iframe && iframe.parentNode) {
+              iframe.parentNode.removeChild(iframe);
+            }
+          }
+        };
+
+        // 璁剧疆iframe鐨剆rc
+        iframe.src = this.currentExcelUrl;
+      }
+    },
+
+    /** 澶勭悊涓嬭浇鎸夐挳鐐瑰嚮 */
+    handleDownloadClick() {
+      if (this.currentExcelUrl) {
+        // 鑾峰彇鐢ㄦ埛閫夋嫨鐨勯�夐」
+        const { includeQrCode, selectedAnnotations } = this.excelOptions;
+        console.log('涓嬭浇閫夐」:', { includeQrCode, selectedAnnotations });
+
+        // 鍒涘缓涓嬭浇閾炬帴锛屾枃浠跺悕鍖呭惈閫夐」淇℃伅
+        const link = document.createElement('a');
+        link.href = this.currentExcelUrl;
+
+        // 鏋勫缓鏂囦欢鍚嶏紝鍖呭惈閫夐」淇℃伅
+        let filename = `record_${this.currentExcelId}`;
+        if (includeQrCode) filename += '_qr';
+        if (selectedAnnotations.length > 0) {
+          filename += `_anno${selectedAnnotations.join('')}`;
+        }
+        filename += `_${new Date().getTime()}.xlsx`;
+
+        link.download = filename;
+
+        // 瑙﹀彂涓嬭浇
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+
+        // 鎻愮ず涓嬭浇鎴愬姛
+        this.$modal.msgSuccess('Excel鏂囦欢涓嬭浇鎴愬姛');
+      }
+    },
+
+    /** 妫�鏌ユ祻瑙堝櫒鏄惁鍙兘鏀寔鐩存帴棰勮Excel */
+    canPreviewExcelInBrowser() {
+      // 鐜板湪鎴戜滑浣跨敤寰蒋Office Online鏈嶅姟锛屽鎵�鏈夌幇浠f祻瑙堝櫒閮芥敮鎸侀瑙�
+      return true;
+    },
+
+    /** 澶勭悊Excel棰勮瓒呮椂鎯呭喌 */
+    handleExcelPreviewTimeout(url, iframe) {
+      // 瓒呮椂鍚庯紝鎻愪緵鍦ㄦ柊绐楀彛鎵撳紑鐨勯�夐」
+      this.$confirm('Excel鏂囦欢鍔犺浇瓒呮椂锛屾槸鍚﹀湪鏂扮獥鍙d腑鎵撳紑锛�', '鎻愮ず', {
+        confirmButtonText: '鎵撳紑',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        window.open(url, '_blank');
+      }).finally(() => {
+        // 娓呯悊锛氱Щ闄frame骞堕噴鏀綰RL瀵硅薄
+        this.cleanupExcelPreview(iframe, url);
+      });
+    },
+
+    /** 娓呯悊Excel棰勮鐩稿叧璧勬簮 */
+    cleanupExcelPreview(iframe, url) {
+      setTimeout(() => {
+        if (iframe && iframe.parentNode) {
+          document.body.removeChild(iframe);
+        }
+        if (url) {
+          URL.revokeObjectURL(url);
+        }
+        this.excelRenderError = '';
+      }, 1000);
+    },
+
+    /** 浠庡悗绔幏鍙朎xcel鏂囦欢 */
+    getExcelFile(id) {
+      return new Promise((resolve, reject) => {
+        // 棣栧厛灏濊瘯浣跨敤axios锛堥」鐩凡鏈夌殑HTTP瀹㈡埛绔級
+        try {
+          axios({
+            method: 'Post',
+            url: `${process.env.VUE_APP_BASE_API}/system/records/model`,
+            params: { id: id },
+            responseType: 'blob',
+            headers: { 'Authorization': 'Bearer ' + getToken() }
+          }).then(response => {
+            resolve(response.data);
+          }).catch(error => {
+            // 濡傛灉axios澶辫触锛屽洖閫�鍒癤MLHttpRequest
+            console.warn('Axios璇锋眰澶辫触锛屽皾璇曚娇鐢╔MLHttpRequest:', error);
+            this.fallbackGetExcelFile(id, resolve, reject);
+          });
+        } catch (e) {
+          // 鎹曡幏浠讳綍鎰忓閿欒
+          reject(new Error('鑾峰彇Excel鏂囦欢鏃跺彂鐢熼敊璇�: ' + e.message));
+        }
+      });
+    },
+
+    /** 澶囩敤鐨刋MLHttpRequest鑾峰彇Excel鏂囦欢鏂规硶 */
+    fallbackGetExcelFile(id, resolve, reject) {
+      try {
+        const xhr = new XMLHttpRequest();
+        // 灏濊瘯涓嶅悓鐨凙PI璺緞锛屼互閫傚簲鍙兘鐨勫悗绔疄鐜�
+        const apiUrls = [
+          `${process.env.VUE_APP_BASE_API}/system/records/model?id=${id}`,
+          `${process.env.VUE_APP_BASE_API}/system/records/model`
+        ];
+
+        let currentUrlIndex = 0;
+
+        const tryNextUrl = () => {
+          if (currentUrlIndex >= apiUrls.length) {
+            reject(new Error('鎵�鏈堿PI璺緞閮借姹傚け璐�'));
+            return;
+          }
+
+          const url = apiUrls[currentUrlIndex];
+          currentUrlIndex++;
+
+          xhr.open('GET', url, true);
+          xhr.setRequestHeader('Authorization', 'Bearer ' + getToken());
+          xhr.responseType = 'blob';
+
+          xhr.onload = () => {
+            if (xhr.status === 200) {
+              // 楠岃瘉杩斿洖鐨勬槸鍚︿负鏈夋晥鐨凚lob
+              if (xhr.response instanceof Blob && xhr.response.size > 0) {
+                resolve(xhr.response);
+              } else {
+                console.warn('杩斿洖鐨勬暟鎹笉鏄湁鏁堢殑Blob锛屽皾璇曚笅涓�涓猆RL');
+                tryNextUrl();
+              }
+            } else if (currentUrlIndex < apiUrls.length) {
+              console.warn(`URL ${url} 璇锋眰澶辫触 (${xhr.status})锛屽皾璇曚笅涓�涓猆RL`);
+              tryNextUrl();
+            } else {
+              reject(new Error(`璇锋眰澶辫触: ${xhr.status} ${xhr.statusText}`));
+            }
+          };
+
+          xhr.onerror = () => {
+            if (currentUrlIndex < apiUrls.length) {
+              console.warn(`URL ${url} 缃戠粶閿欒锛屽皾璇曚笅涓�涓猆RL`);
+              tryNextUrl();
+            } else {
+              reject(new Error('缃戠粶閿欒锛屾棤娉曡幏鍙朎xcel鏂囦欢'));
+            }
+          };
+
+          // 璁剧疆璇锋眰瓒呮椂
+          xhr.timeout = 30000; // 30绉�
+          xhr.ontimeout = () => {
+            if (currentUrlIndex < apiUrls.length) {
+              console.warn(`URL ${url} 璇锋眰瓒呮椂锛屽皾璇曚笅涓�涓猆RL`);
+              tryNextUrl();
+            } else {
+              reject(new Error('璇锋眰瓒呮椂锛屾棤娉曡幏鍙朎xcel鏂囦欢'));
+            }
+          };
+
+          xhr.send();
+        };
+
+        // 寮�濮嬪皾璇曠涓�涓猆RL
+        tryNextUrl();
+      } catch (e) {
+        reject(new Error('XMLHttpRequest璇锋眰澶辫触: ' + e.message));
+      }
+    },
+
+    /** 鎵归噺鎵撳嵃Excel鏂囦欢 */
+    batchPrintExcel() {
+      if (this.ids.length === 0) {
+        this.$modal.msgWarning('璇烽�夋嫨瑕佹墦鍗扮殑璁板綍');
+        return;
+      }
+
+      this.$confirm(`纭畾瑕佹墦鍗伴�変腑鐨� ${this.ids.length} 鏉¤褰曞悧锛焋, '鎵归噺鎵撳嵃纭', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        // 瀵逛簬鎵归噺鎿嶄綔锛屾垜浠彲浠ラ�夋嫨锛�
+        // 1. 濡傛灉鍚庣鏀寔鎵归噺瀵煎嚭锛岀洿鎺ヨ皟鐢ㄦ壒閲忓鍑烘帴鍙�
+        this.$modal.loading('姝e湪鍑嗗鎵归噺鎵撳嵃鏂囦欢锛岃绋嶅��...');
+
+        // 灏濊瘯鎵归噺瀵煎嚭API
+        this.getBatchExcelFile(this.ids).then(blob => {
+          this.$modal.closeLoading();
+          this.handleExcelBlobForPrint(blob, 'batch_records');
+        }).catch(error => {
+          this.$modal.closeLoading();
+          console.warn('鎵归噺瀵煎嚭澶辫触锛屽皾璇曢�愪釜澶勭悊:', error);
+
+          // 2. 濡傛灉鎵归噺瀵煎嚭澶辫触锛屾彁绀虹敤鎴烽�愪釜鎵撳嵃鎴栦笅杞�
+          this.$confirm('鎵归噺鎵撳嵃澶辫触锛屾槸鍚︿笅杞芥墍鏈夋枃浠讹紵', '鎻愮ず', {
+            confirmButtonText: '涓嬭浇',
+            cancelButtonText: '鍙栨秷',
+            type: 'warning'
+          }).then(() => {
+            // 閫愪釜涓嬭浇鏂囦欢
+            this.downloadMultipleExcelFiles(this.ids);
+          }).catch(() => {});
+        });
+      }).catch(() => {});
+    },
+
+    /** 鑾峰彇鎵归噺Excel鏂囦欢 */
+    getBatchExcelFile(ids) {
+      return new Promise((resolve, reject) => {
+        try {
+          if (typeof axios !== 'undefined') {
+            axios({
+              method: 'get',
+              url: `${process.env.VUE_APP_BASE_API}/system/records/batchExport`,
+              params: { ids: ids.join(',') },
+              responseType: 'blob',
+              headers: { 'Authorization': 'Bearer ' + this.getToken() }
+            }).then(response => {
+              resolve(response.data);
+            }).catch(reject);
+          } else {
+            reject(new Error('鎵归噺瀵煎嚭鍔熻兘涓嶅彲鐢�'));
+          }
+        } catch (e) {
+          reject(e);
+        }
+      });
+    },
+
+    /** 澶勭悊Excel Blob鐢ㄤ簬鎵撳嵃 */
+    handleExcelBlobForPrint(blob, prefix = 'record') {
+      const url = URL.createObjectURL(blob);
+
+      if (this.canPreviewExcelInBrowser()) {
+        const iframe = document.createElement('iframe');
+        iframe.style.display = 'none';
+        document.body.appendChild(iframe);
+
+        iframe.src = url;
+
+        const timeoutId = setTimeout(() => {
+          this.handleExcelPreviewTimeout(url, iframe);
+        }, 5000);
+
+        iframe.onload = () => {
+          clearTimeout(timeoutId);
+          this.$confirm('Excel鏂囦欢宸插噯澶囧ソ锛屾槸鍚︽墦鍗帮紵', '鎵撳嵃纭', {
+            confirmButtonText: '鎵撳嵃',
+            cancelButtonText: '鍙栨秷',
+            type: 'warning'
+          }).then(() => {
+            try {
+              iframe.contentWindow.print();
+            } catch (e) {
+              this.$modal.msgWarning('鎵撳嵃澶辫触锛屽皢鍦ㄦ柊绐楀彛鎵撳紑鏂囦欢');
+              window.open(url, '_blank');
+            } finally {
+              this.cleanupExcelPreview(iframe, url);
+            }
+          }).catch(() => {
+            window.open(url, '_blank');
+            this.cleanupExcelPreview(iframe, url);
+          });
+        };
+      } else {
+        // 鐩存帴涓嬭浇
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = `${prefix}_${new Date().getTime()}.xlsx`;
+        document.body.appendChild(link);
+        link.click();
+        document.body.removeChild(link);
+        URL.revokeObjectURL(url);
+      }
+    },
+
+    /** 涓嬭浇澶氫釜Excel鏂囦欢 */
+    downloadMultipleExcelFiles(ids) {
+      // 杩欓噷绠�鍗曞鐞嗕负閫愪釜涓嬭浇
+      // 瀹為檯搴旂敤涓彲鑳介渶瑕佽�冭檻鎬ц兘浼樺寲鎴栦娇鐢ㄥ帇缂╁寘
+      ids.forEach((id, index) => {
+        // 浣跨敤setTimeout閬垮厤娴忚鍣ㄩ檺鍒跺悓鏃朵笅杞�
+        setTimeout(() => {
+          this.getExcelFile(id).then(blob => {
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = `record_${id}_${new Date().getTime()}.xlsx`;
+            document.body.appendChild(link);
+            link.click();
+            document.body.removeChild(link);
+            URL.revokeObjectURL(url);
+          });
+        }, index * 1000); // 姣忎釜鏂囦欢闂撮殧1绉掍笅杞�
+      });
+    },
+
+    // /** 鑾峰彇Token鐨勮緟鍔╂柟娉� */
+    // getToken() {
+    //   return localStorage.getItem('token') || '';
+    // },
          /** 瀵煎叆妯℃澘涓嬭浇鎿嶄綔*/
     handleExportTemplate()
     {
@@ -1218,7 +1877,7 @@
   });
 
     }
-    
+
 
 
   }
@@ -1247,4 +1906,309 @@
 ::v-deep .el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
   background: #2f91ec;
 }
+
+/* Excel鎿嶄綔寮圭獥鏍峰紡 */
+.excel-dialog-overlay {
+  position: fixed;
+  top: 0;
+  left: 0;
+}
+
+/* Excel棰勮鍖呰鍣ㄦ牱寮� */
+.excel-preview-wrapper {
+  width: 100%;
+  height: 100%;
+  min-height: 500px;
+  display: flex;
+  flex-direction: column;
+  background: #f9f9f9;
+  border-radius: 8px;
+  padding: 10px;
+  margin-bottom: 20px;
+}
+
+/* Excel閿欒鎻愮ず鏍峰紡 */
+.excel-error-message {
+  background: #fff2f0;
+  border: 1px solid #ffccc7;
+  border-radius: 8px;
+  padding: 20px;
+  margin: 10px 0;
+  color: #f56c6c;
+}
+
+.excel-error-message h3 {
+  margin-top: 0;
+  margin-bottom: 10px;
+  color: #f56c6c;
+  font-size: 16px;
+}
+
+.excel-error-message p {
+  margin: 8px 0;
+  line-height: 1.5;
+}
+
+.excel-error-message ul {
+  text-align: left;
+  margin: 10px 0;
+}
+
+.excel-error-message li {
+  margin: 5px 0;
+  padding-left: 5px;
+}
+
+/* 浼樺寲鎸夐挳鏍峰紡 */
+.excel-dialog-btn.download-btn {
+  background: #67c23a;
+  border-color: #67c23a;
+  color: white;
+  margin-top: 10px;
+}
+
+.excel-dialog-btn.download-btn:hover {
+  background: #85ce61;
+  border-color: #85ce61;
+}
+
+/* 閫夋嫨妗嗗尯鍩熸牱寮� */
+.excel-options-section {
+  background: #f5f7fa;
+  border-radius: 8px;
+  padding: 20px;
+  margin-bottom: 20px;
+}
+
+/* 閫夐」缁勬牱寮� */
+.option-group {
+  margin-bottom: 15px;
+}
+
+.option-group:last-child {
+  margin-bottom: 0;
+}
+
+/* 閫夐」鏍囩鏍峰紡 */
+.option-label {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  color: #303133;
+  cursor: pointer;
+  margin-bottom: 10px;
+}
+
+/* 澶嶉�夋鏍峰紡 */
+.option-label input[type="checkbox"] {
+  width: 16px;
+  height: 16px;
+  margin-right: 8px;
+  cursor: pointer;
+}
+
+/* 娉ㄨВ閫夐」瀹瑰櫒 */
+.annotation-options {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 15px;
+  margin-top: 10px;
+}
+
+/* 娉ㄨВ澶嶉�夋鏍峰紡 */
+.annotation-checkbox {
+  display: flex;
+  align-items: center;
+  font-size: 14px;
+  color: #303133;
+  cursor: pointer;
+  background: white;
+  padding: 8px 12px;
+  border-radius: 4px;
+  border: 1px solid #dcdfe6;
+  transition: all 0.3s;
+}
+
+.annotation-checkbox:hover {
+  border-color: #c0c4cc;
+  background: #fafafa;
+}
+
+.annotation-checkbox input[type="checkbox"] {
+  width: 14px;
+  height: 14px;
+  margin-right: 6px;
+  cursor: pointer;
+}
+.excel-dialog {
+  background-color: white;
+  border-radius: 8px;
+  width: 96%;
+  max-width: 900px;
+  max-height: 100vh;
+  overflow: hidden;
+  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
+  animation: slideUp 0.3s ease;
+  display: flex;
+  flex-direction: column;
+}
+
+.excel-dialog-header {
+  padding: 20px 24px;
+  border-bottom: 1px solid #e9ecef;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  background-color: #f8f9fa;
+}
+
+.excel-dialog-header h3 {
+  margin: 0;
+  font-size: 18px;
+  font-weight: 600;
+  color: #333;
+}
+
+.excel-dialog-close {
+  background: none;
+  border: none;
+  font-size: 24px;
+  cursor: pointer;
+  color: #666;
+  width: 32px;
+  height: 32px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border-radius: 4px;
+  transition: all 0.2s;
+}
+
+.excel-dialog-close:hover {
+  background-color: #e9ecef;
+  color: #333;
+}
+
+.excel-dialog-body {
+  padding: 24px;
+  flex: 1;
+  overflow-y: auto;
+}
+
+.excel-preview-container {
+  width: 100%;
+  height: 400px;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  margin-bottom: 16px;
+  position: relative;
+  background-color: #f8f9fa;
+  overflow: hidden;
+}
+
+.loading-indicator {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(255, 255, 255, 0.9);
+  color: #666;
+  z-index: 10;
+}
+
+.loading-spinner {
+  width: 40px;
+  height: 40px;
+  border: 3px solid #f3f3f3;
+  border-top: 3px solid #2f91ec;
+  border-radius: 50%;
+  animation: spin 1s linear infinite;
+  margin-bottom: 10px;
+}
+
+.excel-dialog-tip {
+  margin: 0;
+  color: #666;
+  text-align: center;
+  font-size: 14px;
+}
+
+.excel-dialog-footer {
+  padding: 16px 24px;
+  border-top: 1px solid #e9ecef;
+  display: flex;
+  justify-content: center;
+  gap: 16px;
+  background-color: #f8f9fa;
+}
+
+.excel-dialog-btn {
+  padding: 10px 24px;
+  border: none;
+  border-radius: 4px;
+  cursor: pointer;
+  font-size: 14px;
+  font-weight: 500;
+  transition: all 0.2s;
+  min-width: 100px;
+}
+
+.preview-btn {
+  background-color: #2f91ec;
+  color: white;
+}
+
+.preview-btn:hover {
+  background-color: #1c7ed6;
+  transform: translateY(-1px);
+  box-shadow: 0 2px 8px rgba(47, 145, 236, 0.3);
+}
+
+.print-btn {
+  background-color: #20c997;
+  color: white;
+}
+
+.print-btn:hover {
+  background-color: #17a589;
+  transform: translateY(-1px);
+  box-shadow: 0 2px 8px rgba(32, 201, 151, 0.3);
+}
+
+.download-btn {
+  background-color: #6c757d;
+  color: white;
+}
+
+.download-btn:hover {
+  background-color: #5a6268;
+  transform: translateY(-1px);
+  box-shadow: 0 2px 8px rgba(108, 117, 125, 0.3);
+}
+
+@keyframes fadeIn {
+  from { opacity: 0; }
+  to { opacity: 1; }
+}
+
+@keyframes slideUp {
+  from {
+    opacity: 0;
+    transform: translateY(20px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
+
+@keyframes spin {
+  0% { transform: rotate(0deg); }
+  100% { transform: rotate(360deg); }
+}
 </style>
diff --git a/src/views/archiveManager/seleUser.vue b/src/views/archiveManager/seleUser.vue
index 1c61ea5..0b313c2 100644
--- a/src/views/archiveManager/seleUser.vue
+++ b/src/views/archiveManager/seleUser.vue
@@ -111,7 +111,7 @@
       }
       this.queryParams.roleId = this.roleId
       this.queryParams.archiveRecordsId = this.archiveRecordsId
-  
+
       this.getList()
       this.visible = true
     },
@@ -146,15 +146,15 @@
     handleSelectUser() {
       const archiveRecordsId = this.queryParams.archiveRecordsId
       const userIds = this.userIds.join(",")
-  
+
       if (userIds == "") {
         this.$modal.msgError("璇烽�夋嫨瑕佸垎閰嶇殑鐢ㄦ埛")
         return
       }
-      
+
       // 鍒涘缓杞崲鍚庣殑鍙傛暟锛岀‘淇漴ecordId鏄暟瀛楃被鍨�
       const convertedRecordId = !isNaN(Number(archiveRecordsId)) ? Number(archiveRecordsId) : 0
-      
+
       authRecordToUser({ recordId: convertedRecordId, userIds: userIds }).then(res => {
         if(res.code === 200) {
           this.$modal.msgSuccess(res.msg)
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 2bde078..7b4e627 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -99,8 +99,8 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�" maxlength="30" />
+            <el-form-item label="鐢ㄦ埛濮撳悕" prop="userName">
+              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰鍚�" maxlength="30" />
             </el-form-item>
           </el-col>
 
@@ -165,7 +165,7 @@
               </el-select>
             </el-form-item>
           </el-col> -->
-     
+
         </el-row>
         <el-row>
           <el-col :span="24">
@@ -490,6 +490,8 @@
     },
     /** 鎻愪氦鎸夐挳 */
     submitForm: function() {
+      console.log(this.form)
+      console.log("---------")
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.userId != undefined) {
diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue
index ad41eb8..3cc41ad 100644
--- a/src/views/system/user/profile/userInfo.vue
+++ b/src/views/system/user/profile/userInfo.vue
@@ -1,8 +1,8 @@
 <template>
   <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-    <el-form-item label="鐢ㄦ埛鍚嶇О" prop="nickName">
+    <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
       <el-input v-model="form.nickName" maxlength="30" />
-    </el-form-item> 
+    </el-form-item>
     <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber">
       <el-input v-model="form.phonenumber" maxlength="11" />
     </el-form-item>
@@ -40,7 +40,7 @@
           { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }
         ],
         email: [
-          { required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" },
+         // { required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" },
           {
             type: "email",
             message: "璇疯緭鍏ユ纭殑閭鍦板潃",
@@ -48,7 +48,7 @@
           }
         ],
         phonenumber: [
-          { required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" },
+         // { required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" },
           {
             pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
             message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",

--
Gitblit v1.9.1