tangjunhao 3 місяців тому
батько
коміт
32161ba599
3 змінених файлів з 96 додано та 7 видалено
  1. 35 0
      src/utils/request.ts
  2. 8 2
      src/views/home.vue
  3. 53 5
      src/views/titlecomponent/Exreport.vue

+ 35 - 0
src/utils/request.ts

@@ -56,6 +56,10 @@ axios.interceptors.request.use(config => {
 axios.interceptors.response.use(res => {
   const request = JSON.stringify(res.config.url) + (!!res.config.data ? JSON.stringify(res.config.data) : JSON.stringify(res.config.params))
   requestList.splice(requestList.findIndex(item => item === request), 1)
+  // 如果是 Blob 类型响应(导出文件情况),直接返回原始响应
+  if (res.config.responseType === 'blob') {
+    return Promise.resolve(res);
+  }
   if (res.status === 200) {
     let { data } = res
     if (data.returnCode == successCode) {
@@ -142,6 +146,36 @@ const request = (params, channelNo = 'service', method = 'post') => {
   })
 }
 
+const requestblobfile = (
+  params,
+  options = { responseType: 'blob' },
+  channelNo = 'service',
+  method = 'post',
+) => {
+  const url = getUrl(channelNo);
+  const data = getParams(params, channelNo);
+
+  const config = {
+    method,
+    url,
+    responseType: options.responseType || 'json',
+    ...(method === 'get' ? { params: data } : { data }),
+  };
+
+  return new Promise((resolve, reject) => {
+    axios(config)
+      .then(res => {
+        // 返回完整的响应对象而不是仅返回data
+        resolve(res);
+      })
+      .catch(err => {
+        reject(err);
+      });
+  });
+};
+
+
+
 // 文件上传
 const uploadFile = (params, channelNo = 'service', callback1) => {
   let config = {
@@ -213,6 +247,7 @@ const enPassword = (password) => {
 
 export {
   request,
+  requestblobfile,
   uploadFile,
   downloadFile,
   getCode,

+ 8 - 2
src/views/home.vue

@@ -1007,11 +1007,11 @@
                 <h4 :id="titleId" :class="titleClass">导出报告:</h4>
               </div>
             </template>
-            <Exreport />
+            <Exreport  ref="exportref"/>
             <template #footer>
               <div class="dialog-footer">
                 <el-button @click="dialog.exportreport = false">取消</el-button>
-                <el-button type="primary" @click="dialog.exportreport = false">
+                <el-button type="primary" @click="dialog.exportreport = false;exprotre()">
                   确定
                 </el-button>
               </div>
@@ -1779,6 +1779,7 @@ let Fsiref=ref();
 let Flightref=ref();
 let MathFuncref=ref();
 let Tacsref=ref();
+let exportref = ref();
 let f4ce = ref("优化问题组件");
 let modelban = ref("学科分析组件");
 let undmodel=ref('优化器组件');
@@ -4560,6 +4561,11 @@ const lbjkheaderCellClassName = ({ columnIndex }) => {
   }
 }
 
+const exprotre = () => {
+  if(exportref.value) {
+    exportref.value.exportreport(pid.value)
+  }
+}
 
 </script>
 <style lang="scss" scoped>

+ 53 - 5
src/views/titlecomponent/Exreport.vue

@@ -4,10 +4,10 @@
     <el-form-item label="导出格式" :label-width="formLabelWidth">
     </el-form-item>
     <el-radio-group v-model="exformat">
-      <el-radio :value="doc">doc</el-radio>
-      <el-radio :value="pdf">pdf</el-radio>
-      <el-radio :value="HTML">HTML</el-radio>
-      <el-radio :value="image">image</el-radio>
+      <el-radio label="2">doc</el-radio>
+      <el-radio label="1">pdf</el-radio>
+      <el-radio label="3">HTML</el-radio>
+      <el-radio label="4">image</el-radio>
     </el-radio-group>
     <!-- <div style="text-align: center;width: 100%;">
       <el-transfer 
@@ -70,13 +70,15 @@
 import { ref, onMounted, reactive, provide, nextTick } from "vue"
 import { ElMessage, ElButton, ElDialog, ElSelect } from "element-plus"
 import { Edit, CaretBottom } from "@element-plus/icons-vue"
+import { requestblobfile, uploadFile } from "@/utils/request"
 
 import fileUploads from "../components/fileuploads.vue";
 const meshFileImgSrc = new URL("@/assets/img/open.png", import.meta.url).href;
 
 let formLabelWidth = ref(90)
 
-let exformat = ref('pdf')
+let pid = ref()
+let exformat = ref('2')
 
 let selectedvalue = ref([])
 let selflietype = ref('Adobe PDF(*.pdf)')
@@ -95,4 +97,50 @@ let flietypelist = ref([
   { label:"All Image Files(*.png,*.jpg,*.jpeg,*.gif)", value:"img" },
 ])
 
+const exportreport = (id) => {
+  pid.value = id;
+  const params = {
+    transCode: "MDO0082",
+    pid: pid.value,
+    type: exformat.value
+  };
+
+  requestblobfile(params)
+    .then(res => {
+      // 1. 获取服务器返回的文件名(从 Content-Disposition)
+      const contentDisposition = res.headers['content-disposition'];
+      let fileName = `报告_${pid.value}.docx`; // 默认文件名(如果解析失败)
+
+      if (contentDisposition) {
+        const fileNameMatch = contentDisposition.match(/filename=(.+)/i);
+        if (fileNameMatch && fileNameMatch[1]) {
+          fileName = fileNameMatch[1].trim(); // 提取服务器返回的文件名
+        }
+      }
+
+      // 2. 获取正确的 MIME 类型(从 Content-Type)
+      const contentType = res.headers['content-type'] || 'application/octet-stream';
+
+      // 3. 创建 Blob 并下载
+      const blob = new Blob([res.data], { type: contentType });
+      const link = document.createElement('a');
+      const blobUrl = URL.createObjectURL(blob);
+      link.href = blobUrl;
+      link.download = fileName; // 使用服务器返回的文件名
+      document.body.appendChild(link);
+      link.click();
+
+      // 清理资源
+      URL.revokeObjectURL(blobUrl);
+      document.body.removeChild(link);
+    })
+    .catch(err => {
+      ElMessage.error('导出报告失败');
+      console.error('导出错误:', err);
+    });
+};
+
+defineExpose({
+  exportreport
+})
 </script>