From 61569d13baf15119cbc060441c6487a2c1eb895f Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期一, 30 六月 2025 15:58:57 +0800
Subject: [PATCH] 最新版本541200007

---
 admin/src/components/business/OperaCompanyDocumentsWindow.vue                                |    8 +
 admin/src/components/common/UploadFile.vue                                                   |   16 ++
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java |   50 +++++++++
 admin/src/api/system/common.js                                                               |    8 +
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DownloadFileDTO.java |   23 ++++
 admin/package-lock.json                                                                      |  165 ++++++++++++++++----------------
 admin/src/components/system/dict/OperaDictDataWindow.vue                                     |    2 
 admin/package.json                                                                           |    1 
 admin/src/views/business/companyDocuments.vue                                                |   10 +
 9 files changed, 188 insertions(+), 95 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index 9c49bda..5c1bdfc 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -1876,6 +1876,63 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "ssri": {
           "version": "8.0.1",
           "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1883,6 +1940,28 @@
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
           }
         }
       }
@@ -4994,6 +5073,11 @@
       "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz",
       "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=",
       "dev": true
+    },
+    "downloadjs": {
+      "version": "1.4.7",
+      "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz",
+      "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
     },
     "duplexer": {
       "version": "0.1.2",
@@ -13904,87 +13988,6 @@
           "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
           "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
           "dev": true
-        }
-      }
-    },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
diff --git a/admin/package.json b/admin/package.json
index 78ce443..2a8afaa 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -19,6 +19,7 @@
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
     "dayjs": "^1.11.13",
+    "downloadjs": "^1.4.7",
     "echarts": "^5.4.3",
     "el-tree-transfer": "^2.4.7",
     "element-tiptap": "^1.27.1",
diff --git a/admin/src/api/system/common.js b/admin/src/api/system/common.js
index 0c4b120..cc299e9 100644
--- a/admin/src/api/system/common.js
+++ b/admin/src/api/system/common.js
@@ -71,3 +71,11 @@
 export function upload (data) {
   return request.post('/visitsAdmin/cloudService/public/upload', data)
 }
+
+// 涓嬭浇缃戠粶闄勪欢
+export function downloadFile(data) {
+  return request.post('/visitsAdmin/cloudService/public/downloadFile', data, {
+    trim: true,
+    download: true
+  })
+}
diff --git a/admin/src/components/business/OperaCompanyDocumentsWindow.vue b/admin/src/components/business/OperaCompanyDocumentsWindow.vue
index 84fb7ad..309c455 100644
--- a/admin/src/components/business/OperaCompanyDocumentsWindow.vue
+++ b/admin/src/components/business/OperaCompanyDocumentsWindow.vue
@@ -27,7 +27,7 @@
             noResultsText="娌℃湁鍖归厤鐨勭粨鏋�" />
       </el-form-item>
       <el-form-item label="闄勪欢鍦板潃" prop="fileurl">
-        <UploadFile :uploadData="{ folder: 'company_documents',fileType:'' }" :fileList="fileList" @uploadSuccess="uploadFileBiz" />
+        <UploadFile :uploadData="{ folder: 'company_documents',fileType:'.zip,.war,.pdf' }" :fileList="fileList"  @uploadSuccess="uploadFileBiz" />
 
 <!--        <UploadFile width="100px" height="100px" :list="[]"  folder="company_documents" @success="uploadFileBiz($event, 2)" />-->
       </el-form-item>
@@ -35,7 +35,7 @@
         <el-input type="textarea" v-model="form.content" placeholder="璇疯緭鍏ラ檮浠舵弿杩�" v-trim/>
       </el-form-item>
       <el-form-item label="鎺掑簭鐮侊紙闄嶅簭锛�" prop="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+        <el-input type="number" v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -106,6 +106,7 @@
       this.title = title
       this.visible = true
       this.getCate()
+      this.fileList = []
       this.getCompany()
       // 鏂板缓缁勭粐
       if (target == null) {
@@ -120,6 +121,9 @@
         for (const key in this.form) {
           this.form[key] = target[key]
         }
+        if(this.form.fileurl){
+          this.fileList = [{ fileurl: this.form.fileurl, fileurlFull:this.form.fileurlFull, name: this.form.fileName,fileSize:this.form.fileSize }]
+        }
       })
     },
     uploadFileBiz (file) {
diff --git a/admin/src/components/common/UploadFile.vue b/admin/src/components/common/UploadFile.vue
index cf30d02..180ca08 100644
--- a/admin/src/components/common/UploadFile.vue
+++ b/admin/src/components/common/UploadFile.vue
@@ -2,7 +2,7 @@
   <div>
     <el-upload
       class="upload-demo"
-      :accept="uploadData.fileTyp"
+      :accept="uploadData.fileType"
       :action="uploadImgUrl"
       :limit="this.fileLength"
       :on-exceed="handleExceed"
@@ -11,7 +11,12 @@
       :before-upload="beforeFileUpload"
       :file-list="fileList">
     <el-button size="small" type="primary">鐐瑰嚮涓婁紶</el-button>
-    <div slot="tip" class="el-upload__tip"  >鍙兘涓婁紶{{ this.fileLength }}涓枃浠讹紝鏁伴噺瓒呰繃璇峰垹闄ゅ凡浼犻檮浠堕噸鏂颁笂浼�</div>
+    <div slot="tip" class="el-upload__tip"  >
+      鍙兘涓婁紶{{ this.fileLength }}涓枃浠�,
+      {{uploadData.fileType?('鍙敮鎸佷笂浼犮��'+uploadData.fileType+'銆戠被鍨嬫枃浠�'):''}}
+      鏂囦欢澶у皬涓嶈兘瓒呰繃30MB,
+      鏁伴噺瓒呰繃璇峰垹闄ゅ凡浼犻檮浠堕噸鏂颁笂浼�
+     </div>
   </el-upload>
   </div>
 
@@ -67,9 +72,14 @@
     //
     beforeFileUpload(file) {
       if(this.fileList && this.fileList.length >= this.fileLength){
-        this.$message.error('鍙厑璁镐笂浼犮��'+this.fileLength+'w鏂囦欢銆�')
+        this.$message.error('鍙厑璁镐笂浼犮��'+this.fileLength+'涓枃浠躲��')
         return false;
       }
+      const isLt2M = file.size / 1024 / 1024 <= 30; // 妫�鏌ユ枃浠跺ぇ灏忔槸鍚﹀皬浜�30MB
+      if (!isLt2M) {
+        this.$message.error('涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 30MB!');
+        return false; // 涓嶅厑璁镐笂浼犺秴杩囨寚瀹氬ぇ灏忕殑鏂囦欢
+      }
       this.$emit('uploadBegin')
       return true
     }
diff --git a/admin/src/components/system/dict/OperaDictDataWindow.vue b/admin/src/components/system/dict/OperaDictDataWindow.vue
index f51c43e..1d9970e 100644
--- a/admin/src/components/system/dict/OperaDictDataWindow.vue
+++ b/admin/src/components/system/dict/OperaDictDataWindow.vue
@@ -41,7 +41,7 @@
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
 import RichEditor from '@/components/common/RichEditor'
-import UploadFile from "@/components/common/UploadFile";
+import UploadFile from "@/components/common/UploadFile"
 export default {
   name: 'OperaDictDataWindow',
   extends: BaseOpera,
diff --git a/admin/src/views/business/companyDocuments.vue b/admin/src/views/business/companyDocuments.vue
index 465bd37..7cad0c1 100644
--- a/admin/src/views/business/companyDocuments.vue
+++ b/admin/src/views/business/companyDocuments.vue
@@ -68,6 +68,8 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaCompanyDocumentsWindow from '@/components/business/OperaCompanyDocumentsWindow'
+import {downloadFile} from "@/api/system/common";
+
 export default {
   name: 'CompanyDocuments',
   extends: BaseTable,
@@ -91,10 +93,10 @@
     })
     this.search()
   },
-  methods:{
-    download(row){
-      if(row.fileurlFull){
-        window.open(row.fileurlFull)
+  methods: {
+    download (row) {
+      if (row.fileurlFull) {
+        downloadFile({ url: row.fileurlFull, fileName:row.fileName })
       }
     }
   }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java
index eb2fc5e..3af671e 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java
@@ -1,5 +1,6 @@
 package com.doumee.cloud.common;
 
+import cn.hutool.core.io.IoUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.api.BaseController;
@@ -15,7 +16,9 @@
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.FtpUtil;
+import com.doumee.core.utils.HttpsUtil;
 import com.doumee.core.utils.aliyun.ALiYunUtil;
+import com.doumee.dao.business.dto.DownloadFileDTO;
 import com.doumee.dao.system.model.SystemDict;
 import com.doumee.dao.system.model.SystemDictData;
 import io.swagger.annotations.Api;
@@ -23,6 +26,9 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.archivers.zip.Zip64Mode;
+import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -30,12 +36,12 @@
 import org.springframework.web.multipart.MultipartHttpServletRequest;
 import org.springframework.web.multipart.commons.CommonsMultipartResolver;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
 import java.util.*;
 
 /**
@@ -151,6 +157,42 @@
         return;
     }
 
+    @ApiOperation(value = "涓嬭浇缃戠粶鏂囦欢")
+    @RequestMapping(method= RequestMethod.POST,value="/downloadFile")
+    @ResponseBody
+    public void downloadFile(@RequestBody DownloadFileDTO param,  HttpServletRequest request, HttpServletResponse response) throws Exception {
+        if(StringUtils.isBlank(param.getUrl())){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        InputStream inputStream = HttpsUtil.connectionInputsteam(param.getUrl(),"GET","",null);
+        if(inputStream == null){
+            if(StringUtils.isBlank(param.getUrl())){
+                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏂囦欢涓嬭浇澶辫触锛岃妫�鏌ユ枃浠惰矾寰勬槸鍚﹀悎娉曪紒");
+            }
+        }
+        if(StringUtils.isBlank(param.getFileName())){
+            param.setFileName(System.currentTimeMillis()+"");
+            if(param.getUrl().lastIndexOf(".") >0){
+                String nfix = param.getUrl().substring(param.getUrl().lastIndexOf("."));
+                param.setFileName(System.currentTimeMillis()+"."+nfix);
+            }
+        }
+        String encodeFileName = URLEncoder.encode(param.getFileName(), Charset.forName("UTF-8").toString());
+        response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
+        response.setContentType("application/octet-stream");
+        response.setHeader("eva-opera-type", "download");
+        response.setHeader("eva-download-filename", encodeFileName);
+        ServletOutputStream os = response.getOutputStream();
+        byte[] buffer = new byte[4096];
+        int bytesRead;
+
+        while ((bytesRead = inputStream.read(buffer)) != -1) {
+            os.write(buffer, 0, bytesRead);
+        }
+        os.flush();
+        os.close();
+        inputStream.close();
+    }
     @ApiOperation(value = "涓婁紶鏂囦欢鍒癋TP")
     @RequestMapping(method= RequestMethod.POST,value="/upload")
     @ResponseBody
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DownloadFileDTO.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DownloadFileDTO.java
new file mode 100644
index 0000000..30d5cfc
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DownloadFileDTO.java
@@ -0,0 +1,23 @@
+package com.doumee.dao.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/5/20 14:54
+ */
+@Data
+public class DownloadFileDTO {
+
+    @ApiModelProperty(value = "缃戠粶闄勪欢鍦板潃")
+    private String url  ;
+
+    @ApiModelProperty(value = "闄勪欢鍚嶇О")
+    private String fileName;
+
+
+
+}

--
Gitblit v1.9.3