From f812a5d9c4a973930a79581e0c1de91a7054b547 Mon Sep 17 00:00:00 2001
From: riku <risaku@163.com>
Date: 星期二, 29 七月 2025 14:57:01 +0800
Subject: [PATCH] 中间数据产品 1. 新增报告生成提示; 2. 新增报告文件下载; 3. 修复报告页面展示时,相同名称的列数据无法正确展示的问题;

---
 src/views/fysp/data-product/components/BaseDataProduct.vue |  111 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 74 insertions(+), 37 deletions(-)

diff --git a/src/views/fysp/data-product/components/BaseDataProduct.vue b/src/views/fysp/data-product/components/BaseDataProduct.vue
index 7054740..8f462ba 100644
--- a/src/views/fysp/data-product/components/BaseDataProduct.vue
+++ b/src/views/fysp/data-product/components/BaseDataProduct.vue
@@ -23,11 +23,11 @@
     </template>
     <template #buttons>
       <CompReportDownloadDialog
-        name="闂涓庢暣鏀规眹鎬诲垎鏋愪笌鍔ㄦ�佽窡韪竻鍗�"
+        :name="fileName"
         :locations="formSearch.locations"
         :scenetype="formSearch.scenetype"
         :time="formSearch.time"
-        @submit="handleSearch"
+        @submit="(e) => handleSearch(e, true)"
       ></CompReportDownloadDialog>
     </template>
   </FYSearchBar>
@@ -57,27 +57,27 @@
       <el-table-column
         v-for="(item, index) in activeExcelData.head"
         :key="index"
-        :prop="item.name"
+        :prop="item.prop"
         :label="item.name"
       >
         <template v-if="item.children" #default="{ row }">
-          <span v-html="row[item.name]"></span>
+          <span v-html="row[item.prop]"></span>
           <el-table-column
             v-for="(item1, index1) in item.children"
             :key="index1"
-            :prop="item1.name"
+            :prop="item1.prop"
             :label="item1.name"
           >
             <template v-if="item1.children" #default="scope1">
-              <span v-html="scope1.row[item1.name]"></span>
+              <span v-html="scope1.row[item1.prop]"></span>
               <el-table-column
                 v-for="(item2, index2) in item1.children"
                 :key="index2"
-                :prop="item2.name"
+                :prop="item2.prop"
                 :label="item2.name"
               >
                 <template v-if="item2.children" #default="scope2">
-                  <span v-html="scope2.row[item2.name]"></span>
+                  <span v-html="scope2.row[item2.prop]"></span>
                 </template>
               </el-table-column>
             </template>
@@ -102,12 +102,16 @@
 //寮曞叆鐩稿叧鏍峰紡
 import '@vue-office/excel/lib/index.css';
 
-import { ref, onMounted } from 'vue';
+import { ref, onMounted, computed } from 'vue';
 import dayjs from 'dayjs';
 import * as XLSX from 'xlsx';
 import * as ExcelJS from 'exceljs';
 import dataproductApi from '@/api/fysp/dataproductApi';
 import CompReportDownloadDialog from './CompReportDownloadDialog.vue';
+import { Base64 } from 'js-base64';
+import { useBgtaskStore } from '@/stores/bgtaskStore';
+
+const bgtaskStore = useBgtaskStore();
 
 const emit = defineEmits(['search']);
 
@@ -125,6 +129,19 @@
   headNum: {
     type: Number,
     default: 1
+  }
+});
+
+const fileName = computed(() => {
+  switch (props.productType) {
+    case 1:
+      return '闂涓庢暣鏀规眹鎬诲垎鏋愪笌鍔ㄦ�佽窡韪竻鍗�';
+    case 2:
+      return '瑙勮寖鎬ц瘎浼颁笌鍒嗘瀽娓呭崟';
+    case 3:
+      return '闂涓庢暣鏀瑰垎甯冨垎鏋愭竻鍗�';
+    default:
+      return '鎶ュ憡娓呭崟';
   }
 });
 
@@ -158,7 +175,7 @@
   getTable(activeSheet.value);
 }
 
-function handleSearch(forceUpdate) {
+function handleSearch(forceUpdate, isDownload) {
   const locations = formSearch.value.locations;
   const time = formSearch.value.time;
   const scenetype = formSearch.value.scenetype;
@@ -178,30 +195,47 @@
   dataproductApi
     .downloadProduct(area, props.productType, forceUpdate ? forceUpdate : false)
     .then(async (res) => {
-      // const data = new Uint8Array(res);
-      res.arrayBuffer().then((data) => {
-        workbook = XLSX.read(data, { type: 'array' });
-        sheetNames.value = workbook.SheetNames;
-        activeSheet.value = sheetNames.value[0];
-        getTable(activeSheet.value);
-      });
+      if (res == false) {
+        alert('鎶ュ憡鐢熸垚涓紝鍙湪鍚庡彴浠诲姟鏌ョ湅鐢熸垚杩涘害');
+        bgtaskStore.dialogShow = true;
+        bgtaskStore.fetchTask();
+      } else {
+        if (isDownload) {
+          const name = Base64.decode(res.headers.get('filename'));
+          const url = window.URL.createObjectURL(res.data);
+          const link = document.createElement('a');
+          link.href = url;
+          link.setAttribute('download', name);
+          document.body.appendChild(link);
+          link.click();
+          document.body.removeChild(link);
+          window.URL.revokeObjectURL(url);
+        } else {
+          res.data.arrayBuffer().then((data) => {
+            workbook = XLSX.read(data, { type: 'array' });
+            sheetNames.value = workbook.SheetNames;
+            activeSheet.value = sheetNames.value[0];
+            getTable(activeSheet.value);
+          });
+        }
 
-      // const workbook = new ExcelJS.Workbook();
-      // await workbook.xlsx.load(res);
-      // workbook.eachSheet(function (worksheet, sheetId) {
-      //   console.log(worksheet.name);
-      // });
-      // const sheet1 = workbook.worksheets[0]
-      // const row = sheet1.getRow(1)
-      // console.log(row);
+        // const workbook = new ExcelJS.Workbook();
+        // await workbook.xlsx.load(res);
+        // workbook.eachSheet(function (worksheet, sheetId) {
+        //   console.log(worksheet.name);
+        // });
+        // const sheet1 = workbook.worksheets[0]
+        // const row = sheet1.getRow(1)
+        // console.log(row);
 
-      // console.log(res);
-      // console.log(new ArrayBuffer(res));
-      // res.arrayBuffer().then(r=>{
-      //   excel.value = r
-      // })
+        // console.log(res);
+        // console.log(new ArrayBuffer(res));
+        // res.arrayBuffer().then(r=>{
+        //   excel.value = r
+        // })
 
-      // excel.value = new ArrayBuffer(res)
+        // excel.value = new ArrayBuffer(res)
+      }
     })
     .finally(() => (loading.value = false));
 }
@@ -229,7 +263,7 @@
     // console.log(tableData);
 
     const t = strToTableObj(tableData);
-    console.log(t);
+    // console.log(t);
     // console.log(head);
     // console.log(data);
     excelDatas.value.set(sheetName, t);
@@ -296,14 +330,17 @@
     const row = rows[i];
     if (lastHead.length == 0) {
       row.forEach((r, y) => {
-        lastHead.push({ name: r });
-        dataKeys.push(r);
+        const prop = r == '' ? r : `id-${r}-${y}`;
+        lastHead.push({ name: r, prop });
+        dataKeys.push(prop);
       });
     } else {
       const newHead = [];
       row.forEach((r, y) => {
+        const prop = `id-${r}-${y}`;
         if (dataKeys[y] == '') {
-          dataKeys[y] = r;
+          // lastHead[y] = { name: r, prop };
+          dataKeys[y] = prop;
         }
 
         const last = lastHead[y];
@@ -311,7 +348,7 @@
           console.log(last);
         }
         if (last.name == '') {
-          newHead.push({ name: r });
+          newHead.push({ name: r, prop });
           offset++;
         } else if (r != '') {
           newHead.push({
@@ -320,7 +357,7 @@
           });
           offset = 1;
         } else {
-          newHead.push({ name: '' });
+          newHead.push({ name: '', prop });
           let _index = newHead.length - 1 - offset;
           _index = _index >= 0 ? _index : 0;
           newHead[_index].children.push(last);

--
Gitblit v1.9.3