Explorar o código

fix: 导出Excel多sheet方式调整

Tony Kang hai 1 día
pai
achega
6e19754f8f

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

@@ -346,6 +346,16 @@ JpcCrossTabSrv.prototype.createNew = function() {
                 me.excelExportOptions.detailField = JE.F(me.excelExportOptions.sheetSplitDetailID, $CURRENT_RPT);
                 if (me.excelExportOptions.sheetNameID) me.excelExportOptions.sheetNameField = JE.F(me.excelExportOptions.sheetNameID, $CURRENT_RPT);
             }
+            if (optionStr.includes('fileSplitMasterID') && optionStr.includes('fileSplitDetailID')) {
+                // 导出Excel时的操作选项(类似上面,但需要导出成单独的Excel文件)
+                me.excelFileExportOptions = JSON.parse(optionStr.replace(/\n/g, ''));
+                me.excelFileExportOptions.segs = {};
+                me.excelFileExportOptions.segsAmt = 0;
+                me.excelFileExportOptions.masterField = JE.F(me.excelFileExportOptions.fileSplitMasterID, $CURRENT_RPT);
+                me.excelFileExportOptions.detailField = JE.F(me.excelFileExportOptions.fileSplitDetailID, $CURRENT_RPT);
+                if (me.excelFileExportOptions.fileNameID) me.excelFileExportOptions.fileNameField = JE.F(me.excelFileExportOptions.fileNameID, $CURRENT_RPT);
+                //
+            }
         }
 
         // 2. calculate the page info one by one
@@ -636,6 +646,11 @@ JpcCrossTabSrv.prototype.createNew = function() {
                     me.excelExportOptions.segs[`_${segIdx}`].sheetName = sheetName;
                 }
             }
+            if (me.excelFileExportOptions) {
+                const sVal = me.excelFileExportOptions.orgMasterFieldValues[segIdx];
+                // 整理excel导出文件数据
+                if (me.excelFileExportOptions.segs[sVal]) me.excelFileExportOptions.segs[sVal].pages.push(page);
+            }
             const segPageIdx = 0; // 暂时设置为0
             // 1 calculate the band position
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1]);

+ 48 - 2
app/reports/rpt_component/jpc_ex.js

@@ -354,6 +354,7 @@ JpcExSrv.prototype.createNew = function() {
     JpcResult.outputAsSimpleJSONPageArray = function($CTX_HELPER, rptTpl, dataObj, startPage, endPage, defProperties, customizeCfg, $CUSTOM_DEFINE) {
         const me = this;
         const rst = {};
+        let subTab = null;
         if ((startPage > 0) && (startPage <= endPage) && (endPage <= me.totalPages)) {
             rst[JV.NODE_CONTROL_COLLECTION] = private_buildDftControls(rptTpl, (defProperties === null) ? null : defProperties.ctrls);
             // console.log('controls: ');
@@ -368,6 +369,50 @@ JpcExSrv.prototype.createNew = function() {
             rst.items = [];
             let bands = JpcBand.createNew(rptTpl, defProperties);
             try {
+                if (me.crossTab && (me.crossTab.excelExportOptions || me.crossTab.excelFileExportOptions)) {
+                    subTab = me.crossTab;
+                } else if (me.flowTab && (me.flowTab.excelExportOptions || me.flowTab.excelFileExportOptions)) {
+                    subTab = me.flowTab;
+                }
+                if (subTab) {
+                    // 按主从数据导出Sheet或文件需要预处理(收集主数据)
+                    if (subTab.excelExportOptions) {
+                        const masterVals = $JE.getFieldValueArray(subTab.excelExportOptions.masterField, dataObj);
+                        if (masterVals.length > 0) {
+                            subTab.excelExportOptions.masterFieldValues = masterVals;
+                            if (subTab.excelExportOptions.sheetNameID) {
+                                subTab.excelExportOptions.sheetNameField = $JE.F(subTab.excelExportOptions.sheetNameID, me);
+                                const sheetNameVals = $JE.getFieldValueArray(subTab.excelExportOptions.sheetNameField, dataObj);
+                                subTab.excelExportOptions.sheetNameFieldValues = sheetNameVals;
+                            }
+                        }
+                    }
+                    if (subTab.excelFileExportOptions) {
+                        const masterVals = $JE.getFieldValueArray(subTab.excelFileExportOptions.masterField, dataObj);
+                        if (masterVals.length > 0) {
+                            // 1. 与拆分成sheet不同,这里的master数据还得过滤
+                            const dupVals = [];
+                            for (const mstV of masterVals) {
+                                if (!dupVals.includes(mstV)) dupVals.push(mstV);
+                            }
+                            subTab.excelFileExportOptions.orgMasterFieldValues = masterVals;
+                            subTab.excelFileExportOptions.masterFieldValues = dupVals;
+                            if (subTab.excelFileExportOptions.fileNameID) {
+                                subTab.excelFileExportOptions.fileNameField = $JE.F(subTab.excelFileExportOptions.fileNameID, me);
+                                const fileNameVals = $JE.getFieldValueArray(subTab.excelFileExportOptions.fileNameField, dataObj);
+                                subTab.excelFileExportOptions.fileNameFieldValues = fileNameVals;
+                            }
+                            for (let mstVIdx = 0; mstVIdx < dupVals.length; mstVIdx++) {
+                                const orgVIdx = masterVals.indexOf(dupVals[mstVIdx]);
+                                let fName = `${mstVIdx + 1}`;
+                                if (subTab.excelFileExportOptions.fileNameFieldValues && orgVIdx >= 0 && subTab.excelFileExportOptions.fileNameFieldValues.length > orgVIdx) {
+                                    fName = subTab.excelFileExportOptions.fileNameFieldValues[orgVIdx];
+                                }
+                                subTab.excelFileExportOptions.segs[`${dupVals[mstVIdx]}`] = { pages: [], fileName: fName };
+                            }
+                        }
+                    }
+                }
                 for (let page = startPage; page <= endPage; page++) {
                     me.runTimePageData.currentPage = page;
                     me.executeFormulas($CTX_HELPER, JV.RUN_TYPE_BEFORE_OUTPUT, rptTpl, dataObj, me, $CUSTOM_DEFINE, defProperties);
@@ -389,9 +434,10 @@ JpcExSrv.prototype.createNew = function() {
                 bands = null;
             }
         }
-        if (me.crossTab && me.crossTab.excelExportOptions) {
+        if (subTab) {
             // 加料
-            rst.excelExportOptions = me.crossTab.excelExportOptions;
+            if (subTab.excelExportOptions) rst.excelExportOptions = subTab.excelExportOptions;
+            if (subTab.excelFileExportOptions) rst.excelFileExportOptions = subTab.excelFileExportOptions;
         }
         return rst;
     };

+ 40 - 0
app/reports/rpt_component/jpc_flow_tab.js

@@ -539,6 +539,31 @@ JpcFlowTabSrv.prototype.createNew = function() {
         let pageIdx = 0;
         let currentRecAmt = 0;
         me.paging_option = option || JV.PAGING_OPTION_NORMAL;
+
+        if (rptTpl[JV.NODE_CUSTOM_DEFINE] && rptTpl[JV.NODE_CUSTOM_DEFINE][JV.NODE_CUS_OPTION]) {
+            const optionStr = rptTpl[JV.NODE_CUSTOM_DEFINE][JV.NODE_CUS_OPTION] || '';
+            if (optionStr.includes('sheetSplitMasterID') && optionStr.includes('sheetSplitDetailID')) {
+                // 导出Excel时的操作选项(比如:TASK:5565 根据主从关系分多个sheet导出),但在这里只是把option对象装出来,后续使用
+                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);
+            }
+            if (optionStr.includes('fileSplitMasterID') && optionStr.includes('fileSplitDetailID')) {
+                // 导出Excel时的操作选项(类似上面,但需要导出成单独的Excel文件)
+                me.excelFileExportOptions = JSON.parse(optionStr.replace(/\n/g, ''));
+                me.excelFileExportOptions.segs = {};
+                me.excelFileExportOptions.segsAmt = 0;
+                me.excelFileExportOptions.masterField = JE.F(me.excelFileExportOptions.fileSplitMasterID, $CURRENT_RPT);
+                me.excelFileExportOptions.detailField = JE.F(me.excelFileExportOptions.fileSplitDetailID, $CURRENT_RPT);
+                if (me.excelFileExportOptions.fileNameID) me.excelFileExportOptions.fileNameField = JE.F(me.excelFileExportOptions.fileNameID, $CURRENT_RPT);
+                //
+            }
+        }
+
         const CURRENT_FLOW_INFO = (me.isEx) ? JV.NODE_FLOW_INFO_EX : JV.NODE_FLOW_INFO;
         JpcFieldHelper.findAndPutDataFieldIdx(rptTpl, rptTpl[CURRENT_FLOW_INFO][JV.NODE_FLOW_CONTENT][JV.PROP_FLOW_FIELDS], null, me.disp_fields_idx, me.isEx);
         if (followTabEx) {
@@ -960,6 +985,21 @@ JpcFlowTabSrv.prototype.createNew = function() {
         } else {
             const segIdx = JpcCommonHelper.getSegIdxByPageIdx(page, me.page_seg_map);
             const segPageIdx = JpcCommonHelper.getSegPageIdxByPage(page, me.page_seg_map);
+            if (me.excelExportOptions) {
+                // 整理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;
+                }
+            }
+            if (me.excelFileExportOptions) {
+                const sVal = me.excelFileExportOptions.orgMasterFieldValues[segIdx];
+                // 整理excel导出文件数据
+                if (me.excelFileExportOptions.segs[sVal]) me.excelFileExportOptions.segs[sVal].pages.push(page);
+            }
             // 1 calculate the band position
             JpcBandHelper.setBandArea(bands, rptTpl, me.pageStatusLst[page - 1], !me.isEx, me.isEx);
             // 2. start to output detail-part