Tony Kang 9 часов назад
Родитель
Сommit
b7485add41
2 измененных файлов с 52 добавлено и 9 удалено
  1. 50 9
      app/public/report/js/rpt_main.js
  2. 2 0
      app/reports/rpt_component/jpc_cross_tab.js

+ 50 - 9
app/public/report/js/rpt_main.js

@@ -823,17 +823,58 @@ let rptControlObj = {
             var start = new Date().getTime();
             while(true)  if(new Date().getTime()-start > n) break;
         }
+        const _splitMasterDetailPageData = (pageData) => {
+            // 这个专门服务于TASK 5565:导出Excel报表时,根据主从关系分多个sheet导出。
+            const newPageDatas = [];
+            const sheetNames = [];
+            for (let segIdx = 0; segIdx < pageData.excelExportOptions.segsAmt; segIdx++) {
+                const splitSeg = pageData.excelExportOptions.segs[`_${segIdx}`];
+                const newPageData = {};
+                const newContrl = {};
+                const newFont = {};
+                const newStyle = {};
+                const custMergeBands = [];
+                mergeProperties(newContrl, pageData[JV.NODE_CONTROL_COLLECTION]);
+                mergeProperties(newFont, pageData[JV.NODE_FONT_COLLECTION]);
+                mergeProperties(newStyle, pageData[JV.NODE_STYLE_COLLECTION]);
+                newPageData[JV.NODE_CONTROL_COLLECTION] = newContrl;
+                newPageData[JV.NODE_FONT_COLLECTION] = newFont;
+                newPageData[JV.NODE_STYLE_COLLECTION] = newStyle;
+                newPageData[JV.NODE_PAGE_INFO] = JSON.parse(JSON.stringify(pageData[JV.NODE_PAGE_INFO]));
+                sheetNames.push(splitSeg.sheetName || `${segIdx + 1}`);
+                newPageData[JV.BAND_PROP_MERGE_BAND] = pageData[JV.BAND_PROP_MERGE_BAND];
+                newPageData.items = [];
+                for (let piIdx = 0; piIdx < pageData.items.length; piIdx++) {
+                    if (splitSeg.pages.includes(piIdx + 1)) {
+                        newPageData.items.push(pageData.items[piIdx]);
+                    }
+                }
+                newPageDatas.push(newPageData);
+            }
+            return {sheetNames, newPageDatas};
+        };
         const private_download = async function(currentIndex) {
             if (currentIndex < pageDataArr.length) {
                 //这里的数据应该在调用前己处理
                 const rptName = rpt_names[currentIndex];
-                const singlePage = true;
-                let role_rel_list = signatureRelArr[currentIndex];
-                // await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, ROLE_REL_LIST, null);
-                const dtlSignCells = [];
-                filterSignCells(pageDataArr[currentIndex], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false);
-                await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, role_rel_list, null, getStageStatus() !== 3);
-                restoreSignCells(pageDataArr[currentIndex], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false);
+                if (pageDataArr[currentIndex].excelExportOptions) {
+                    // 拆分当前报表数据,然后以AllInOneBook的方式导出
+                    const {sheetNames, newPageDatas} = _splitMasterDetailPageData(pageDataArr[currentIndex]);
+                    const subSignatureRelArr = [];
+                    subSignatureRelArr.push(signatureRelArr[currentIndex]);
+                    for (let ssrIdx = 1; ssrIdx < newPageDatas.length; ssrIdx++) {
+                        subSignatureRelArr.push([]);
+                    }
+                    await rptControlObj.downloadExcelReportInOneBook(newPageDatas, pageSize, subSignatureRelArr, sheetNames, rptName);
+                } else {
+                    const singlePage = true;
+                    let role_rel_list = signatureRelArr[currentIndex];
+                    // await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, ROLE_REL_LIST, null);
+                    const dtlSignCells = [];
+                    filterSignCells(pageDataArr[currentIndex], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false);
+                    await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, role_rel_list, null, getStageStatus() !== 3);
+                    restoreSignCells(pageDataArr[currentIndex], dtlSignCells, null, null, PAGE_SHOW.isTextSignature, false);
+                }
             }
         };
         const _splitDownload = async (currentIndex) => {
@@ -861,7 +902,7 @@ let rptControlObj = {
         }
     },
 
-    downloadExcelReportInOneBook: async function(pageDataArr, pageSize, signatureRelArr, rpt_names) {
+    downloadExcelReportInOneBook: async function(pageDataArr, pageSize, signatureRelArr, rpt_names, inferRptName = null) {
         let rptRoleRelArr = [];
         let ttlRoleAmt = 0;
         const reAssignSignatureName = function(pageData, roleRel, rpt_name_key) {
@@ -921,7 +962,7 @@ let rptControlObj = {
                 rptRoleRelArr = rptRoleRelArr.concat([pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS][0].signature_name]);
             }
         }
-        await excelExportUtil.exportExcelInOneBook(pageDataArr, pageSize, TENDER_NAME, rptRoleRelArr, null, getStageStatus() !== 3);
+        await excelExportUtil.exportExcelInOneBook(pageDataArr, pageSize, inferRptName || TENDER_NAME, rptRoleRelArr, null, getStageStatus() !== 3);
         for (let idx = 0; idx < pageDataArr.length; idx++) {
             restoreSignCells(pageDataArr[idx], ttlDtlSignCells[idx], null, null, PAGE_SHOW.isTextSignature, false);
         }

+ 2 - 0
app/reports/rpt_component/jpc_cross_tab.js

@@ -341,6 +341,7 @@ JpcCrossTabSrv.prototype.createNew = function() {
                 me.excelExportOptions = JSON.parse(optionStr.replace(/\n/g, ''));
                 // 找masterID指标及detailID指标
                 me.excelExportOptions.segs = {};
+                me.excelExportOptions.segsAmt = 0;
                 me.excelExportOptions.masterField = JE.F(me.excelExportOptions.sheetSplitMasterID, $CURRENT_RPT);
                 me.excelExportOptions.detailField = JE.F(me.excelExportOptions.sheetSplitDetailID, $CURRENT_RPT);
                 if (me.excelExportOptions.sheetNameID) me.excelExportOptions.sheetNameField = JE.F(me.excelExportOptions.sheetNameID, $CURRENT_RPT);
@@ -629,6 +630,7 @@ JpcCrossTabSrv.prototype.createNew = function() {
                 // 整理excel导出页码数据
                 if (!me.excelExportOptions.segs[`_${segIdx}`]) me.excelExportOptions.segs[`_${segIdx}`] = { pages: [], sheetName: `${segIdx + 1}` };
                 me.excelExportOptions.segs[`_${segIdx}`].pages.push(page);
+                if (me.excelExportOptions.segsAmt < (segIdx + 1)) me.excelExportOptions.segsAmt = segIdx + 1;
                 if (me.excelExportOptions.sheetNameField) {
                     const sheetName = JE.getFieldValue(me.excelExportOptions.sheetNameField, dataObj, segIdx, '');
                     me.excelExportOptions.segs[`_${segIdx}`].sheetName = sheetName;