Tony Kang 1 روز پیش
والد
کامیت
333c933ae4

+ 3 - 1
app/controller/report_controller.js

@@ -1477,7 +1477,7 @@ module.exports = app => {
         async _commonGetAudit(ctx, params, stgAudit, stageFlow) {
             const COMMON_INVALID_STATUS_FOR_ORG = [1, 6]; // 对原报来说,待上报、重新上报状态就不能默认为审核通过
             switch (params.stage_id) {
-                case -150:
+                case -150: // 安全计量
                     const safeAudit = await ctx.service.safeStageAudit.getAuditors(params.business_id, params.stage_times, 'asc', true);
                     safeAudit.forEach(audit => {
                         stgAudit.push({ aid: audit.audit_id, status: audit.audit_status, opinion: audit.opinion, end_time: audit.audit_time, order: audit.audit_order });
@@ -1666,8 +1666,10 @@ module.exports = app => {
             }
 
             const pageRst = await ctx.service.jpcReport.getAllPagesCommon(ctx, rptTpl, params, JV.PAGING_OPTION_NORMAL, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir, copyCustomSelect);
+            const orientation = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION].toLowerCase();
             for (const page of pageRst.items) {
                 page[JV.PROP_WATERMARK_CELLS] = [];
+                page.orientation = orientation;
             }
             let waterMarkStr = null;
             if (params.stage_status !== 3 && params.closeWatermark === 0) {

BIN
app/public/images/pdf1.png


BIN
app/public/images/pdf2.png


+ 25 - 7
app/public/report/js/rpt_jspdf.js

@@ -36,7 +36,24 @@ const JpcJsPDFHelper = {
         let doc = this._createPdf(pageData, paperSize, signatureRelArr, signAuditArr, keepOrgValue, ppStatus);
         doc.save(pdfName + '.pdf');
     },
-    _createPdf: function (pageData, paperSize, signatureRelArr, signAuditArr, keepOrgValue = false, ppStatus = -1) {
+    outputAsAllPdf: function (pageDataArr, paperSize, pdfName, signatureRelArr, signatureRelInfo, refRptTplIds, signAuditArr, keepOrgValue = false, ppStatus = -1) {
+        if (pageDataArr && pageDataArr.length > 0) {
+            let doc = null;
+            for (const pageData of pageDataArr) {
+                let singleSignatureRelArr = [];
+                for (let rIdx = 0; rIdx < signatureRelInfo.length; rIdx++) {
+                    let rptId = refRptTplIds[rIdx];
+                    if (signatureRelInfo[rIdx].rpt_id === rptId) {
+                        singleSignatureRelArr = signatureRelArr[rIdx]; // 有些报表可能没有签名
+                        break;
+                    }
+                }
+                doc = this._createPdf(pageData, paperSize, singleSignatureRelArr, signAuditArr, keepOrgValue, ppStatus, doc);
+            }
+            doc.save(pdfName + '.pdf');
+        }
+    },
+    _createPdf: function (pageData, paperSize, signatureRelArr, signAuditArr, keepOrgValue = false, ppStatus = -1, orgDoc = null) {
         let me = this;
         let offsetX = 0;
         let offsetY = 0;
@@ -58,8 +75,7 @@ const JpcJsPDFHelper = {
         } else {
             orientation = 'portrait';
         }
-        // let doc = me.initialize(orientation, 'pt', paperSize.toLowerCase());
-        let doc = me.initialize(orientation, 'pt', actPageSize.toLowerCase());
+        let doc = orgDoc ? orgDoc : me.initialize(orientation, 'pt', actPageSize.toLowerCase());
         doc.setFont("SmartSimsun", "normal"); //目前只考虑宋体
 
         function private_getIniPageMergeBorder(mergedBand) {
@@ -89,15 +105,17 @@ const JpcJsPDFHelper = {
         }
         // let signatureCounter = {"allAmt": 0, "picAmt": 0};
         if (pageObj && pageObj.items.length > 0 ) {
+            // 考虑到多表同时导出PDF,会有不同的orientation,在这里每次都要调整orientation
+            // orientation = pageObj.orientation;
             for (let i = 0; i < pageObj.items.length; i++) {
-                if (i > 0) {
-                    doc.addPage(actPageSize.toLowerCase(), orientation);
-                }
-                let ctx = doc.canvas.getContext("2d");
                 let page = pageObj.items[i],
                     fonts = pageObj[JV.NODE_FONT_COLLECTION],
                     styles = pageObj[JV.NODE_STYLE_COLLECTION],
                     controls = pageObj[JV.NODE_CONTROL_COLLECTION];
+                if (i > 0 || orgDoc) {
+                    doc.addPage(actPageSize.toLowerCase(), page.orientation);
+                }
+                let ctx = doc.canvas.getContext("2d");
 
                 if (page[JV.PROP_PAGE_MERGE_BORDER]) {
                     newPageMergeBand[JV.PROP_LEFT] = page[JV.PROP_PAGE_MERGE_BORDER][JV.PROP_LEFT];

+ 177 - 269
app/public/report/js/rpt_main.js

@@ -817,98 +817,6 @@ let rptControlObj = {
         rst.closeArchiveSignature = getCloseArchiveSignature();
         return rst;
     },
-    getAllInOneBook: async function () {
-        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let me = rptControlObj;
-            let refRptTplIds = [], rpt_sheet_names = [], splitArchives = [];
-            rptControlObj.getTplIdsCommon(refRptTplIds, rpt_sheet_names, splitArchives);
-            let params = rptControlObj.creatCommonExportParam(refRptTplIds);
-            params.closeWatermark = getCloseWatermarkForExcel();
-            if (current_stage_id > 0) {
-                await rptCustomObj.getCustomSelect(params);
-            }
-            params.rpt_names = rpt_sheet_names;
-            params.rptName = TENDER_NAME;
-            params.option = getExcelOutputOption();
-            params.splitArchives = splitArchives;
-            let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true);
-            if (chkNodes.length > 0) {
-                delete params.orientation; // 打印时有勾选的话,不需要提供方向
-            }
-            $.bootstrapLoading.start();
-            CommonAjax.postXsrfEx("/tender/report_api/createExcelFilesInOneBook", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), function(result){
-                $.bootstrapLoading.end();
-                if (result) {
-                    let uuIdUrls = [];
-                    let uuIdUrl =  "/getFileByUUID/" + result.data[0].uuid + "/" + stringUtil.replaceAll(result.data[0].reportName, "#", "_") + "/xlsx";
-                    uuIdUrls.push(uuIdUrl);
-                    downloadReport(uuIdUrls);
-                } else {
-                    //
-                }
-                },
-                function(failRst){
-                    // closeWaitingView();
-                    $.bootstrapLoading.end();
-                    console.log(failRst);
-                },
-                function(exceptionRst){
-                    // closeWaitingView();
-                    $.bootstrapLoading.end();
-                    console.log(exceptionRst);
-                }
-            );
-        }
-    },
-    getAllIndividualExcelBook: async function () {
-        let me = rptControlObj;
-        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
-            let refRptTplIds = [];
-            let rpt_names = [], splitArchives = [];
-            rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names, splitArchives);
-            let params = rptControlObj.creatCommonExportParam(refRptTplIds);
-            params.closeWatermark = getCloseWatermarkForExcel();
-            if (current_stage_id > 0) {
-                await rptCustomObj.getCustomSelect(params);
-            }
-            params.isOneSheet = true;
-            params.rpt_names = rpt_names;
-            params.rptName = 'All';
-            params.splitArchives = splitArchives;
-            // 测试连续输出
-            params.option = getExcelOutputOption();
-            let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true);
-            if (chkNodes.length > 0) {
-                delete params.orientation; // 打印时有勾选的话,不需要提供方向
-            }
-            $.bootstrapLoading.start();
-            CommonAjax.postXsrfEx("/tender/report_api/createExcelFiles", params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'), function(result){
-                $.bootstrapLoading.end();
-                if (result) {
-                    let uuIdUrls = [];
-                    for (let uuIdObj of result.data) {
-                        let uuIdUrl =  "/getFileByUUID/" + uuIdObj.uuid + "/" + stringUtil.replaceAll(uuIdObj.reportName, "#", "_") + "/xlsx";
-                        uuIdUrls.push(uuIdUrl);
-                    }
-                    downloadReport(uuIdUrls);
-                } else {
-                    //
-                }
-            },
-            function(failRst){
-                // closeWaitingView();
-                $.bootstrapLoading.end();
-                console.log(failRst);
-            },
-            function(exceptionRst){
-                // closeWaitingView();
-                $.bootstrapLoading.end();
-                console.log(exceptionRst);
-            }
-            );
-        }
-    },
-
     downloadExcelReport: async function(pageDataArr, pageSize, rpt_names, signatureRelArr) {
         const MAX_BRK_PAGE = 300;
         const __sleep = (n) => {
@@ -1020,112 +928,7 @@ let rptControlObj = {
     },
 
     getExcel_New: async function (isOneBook) {
-        let me = rptControlObj;
-        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0 && PAGE_SHOW['closeExportExcel'] !== 1) {
-            let refRptTplIds = [];
-            let rpt_names = [], splitArchives = [];
-            rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names, splitArchives);
-            const signatureRelArr = [];
-            if (refRptTplIds.length === 0) {
-                if (zTreeOprObj.currentNode) {
-                    //在复杂情况下会影响到原有数据(文本签名 + 签章),为减少麻烦,还是当勾选处理
-                    refRptTplIds.push(zTreeOprObj.currentNode.refId);
-                    rpt_names.push(zTreeOprObj.currentNode.name);
-                }
-            }
-            if (refRptTplIds.length > 0) {
-                let params = rptControlObj.creatCommonExportParam(refRptTplIds);
-                if (STAGE_ID === -150) {
-                    params.tid = params.tender_id;
-                    params.safe_stage_id = BGL_OBJ.BUSINESS_ID;
-                }
-                params.option = getExcelOutputOption();
-                params.splitArchives = splitArchives;
-
-                // params.getPicFlag = true; //专门针对草图项,只有此项为true,才需要把草图信息带过来,预览及打印动态加载草图 // 纠结:但这样还是解决不了效率问题,得另外想交互方式
-                if (current_stage_id > 0) {
-                    await rptCustomObj.getCustomSelect(params);
-                }
-                delete params.orientation; // 打印时有勾选的话,不需要提供方向
-                $.bootstrapLoading.start();
-                if ((COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') && CUST_CFG.closeWarterMark === false) {
-                    params.needWaterMark = true;
-                } else {
-                    params.needWaterMark = false;
-                }
-                params.outputType = 'Excel';
-                let url = '/tender/report_api/getMultiReports';
-                if (STAGE_ID === -600) {
-                    params.sp_id = BUSINESS_ID;
-                    url =  '/contract/report_api/getMultiReports';
-                }
-                if (STAGE_ID === -700) {
-                    params.tid = params.tender_id;
-                    params.phase_pay_id = BUSINESS_ID;
-                    url =  `/tender/${params.tid}/phase/report_api/getMultiReports`;
-                }
-                CommonAjax.postXsrfEx(url, params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'),
-                    function(result){
-                        $.bootstrapLoading.end();
-                        if (params.needWaterMark) COMMON_WATER_MARK_PIC_DATA = result.waterMarkStr;
-                        STAGE_AUDIT = result.stageAudit || [];
-                        STAGE_FLOW = result.stageFlow || [];
-                        LEDGER_LIST = result.ledger || [];
-                        let pageSize = rptControlObj.getCurrentPageSize();
-                        let pageDataArr = result.data;
-                        let signatureRelInfo = result.signatureRelInfo;
-                        for (let pageObj of pageDataArr) {
-                            let tmpRel = [];
-                            for (const signatureRel of signatureRelInfo) {
-                                if (signatureRel.rpt_id === pageObj.id) {
-                                    tmpRel = JSON.parse(signatureRel.rel_content);
-                                    break;
-                                }
-                            }
-                            signatureRelArr.push(tmpRel);
-                        }
-                        // 统一安排merge(除草图外)
-                        for (let idx = 0; idx < pageDataArr.length; idx++) {
-                            const pageObj = pageDataArr[idx];
-                            if (CUST_CFG.closeWarterMark) {
-                                pageObj.items.forEach(page => {
-                                    page.watermark_cells = [];
-                                });
-                            }
-                            let singleSignatureRelArr = signatureRelArr[idx];
-                            if (signatureRelInfo && signatureRelInfo.length > 0) {
-                                resetStampSignature(pageObj, singleSignatureRelArr, getStageStatus() !== 3, STAGE_AUDIT, LEDGER_LIST);
-                                rptSignatureHelper.mergeSignDate(pageObj, singleSignatureRelArr, false, getStageStatus() !== 3);
-                                // rptSignatureHelper.mergeSignature(pageObj, singleSignatureRelArr); // 这里merge的意义不大
-                                rptSignatureHelper.mergeSignAudit(pageObj, singleSignatureRelArr, STAGE_AUDIT, getStageStatus() !== 3);
-                                if (PAGE_SHOW.isTextSignature) {
-                                    resetTextSignature(pageObj, singleSignatureRelArr, getStageStatus() !== 3);
-                                }
-                            }
-                        }
-                        // if (getStageStatus() === 3) {
-                        // }
-
-                        if (isOneBook) {
-                            me.downloadExcelReportInOneBook(pageDataArr, pageSize, signatureRelArr, rpt_names);
-                        } else {
-                            me.downloadExcelReport(pageDataArr, pageSize, rpt_names, signatureRelArr);
-                        }
-                    },
-                    function(failRst){
-                        $.bootstrapLoading.end();
-                        console.log(failRst);
-                    },
-                    function(exceptionRst){
-                        $.bootstrapLoading.end();
-                        console.log(exceptionRst);
-                    }
-                );
-            } else {
-                // 这个分支本来是为了减少请求,用户已经点过的表,又没有勾选,那么就直接导出EXCEL
-                // 但:发现在复杂情况下会影响到原有数据(文本签名 + 签章),为减少麻烦,在前面处理,保证不会走到这分支!
-            }
-        }
+        this.getOutputCommon('Excel', isOneBook);
     },
 
     checkAndGetExcel: function () {
@@ -1141,13 +944,21 @@ let rptControlObj = {
     getExcel: function () {
         let me = rptControlObj;
         if ($("#excelExportType_AllInOneBook")[0].checked) {
-            // me.getAllInOneBook();
+            // me.getAllInOneBook(); // 已成历史,删除
             rptControlObj.getExcel_New(true);
         } else if ($("#excelExportType_IndividualBook")[0].checked) {
-            // me.getAllIndividualExcelBook();
+            // me.getAllIndividualExcelBook(); // 已成历史,删除
             rptControlObj.getExcel_New(false);
         }
     },
+    getPdf: function() {
+        let me = rptControlObj;
+        if ($("#pdfExportType_AllInOneFile")[0].checked) {
+            rptControlObj.getPDFPre(true);
+        } else if ($("#pdfExportType_IndividualFile")[0].checked) {
+            rptControlObj.getPDFPre(false);
+        }
+    },
     getPdfFontCallbackLight: function(fontProperty) {
         rptTplObj.pdfFont['SmartSimsun'].push(fontProperty);
         if (rptTplObj.pdfFont['SmartSimsun'].length === 2) {
@@ -1179,22 +990,31 @@ let rptControlObj = {
             dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', me.getPdfFontCallbackLight);
         }
     },
-    getPDFPre: function () {
+    checkAndGetPdf: function () {
+        if (zTreeOprObj.treeObj) {
+            let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true);
+            if (chkNodes.length > 0) {
+                $("#show_pdf_output_cfg").trigger("click");
+            } else {
+                rptControlObj.getPDFPre(false);
+            }
+        }
+    },
+    getPDFPre: function (isOneFile = false) {
         let me = rptControlObj;
         if (me.isLoading) {
             $.bootstrapLoading.start();
             console.log('fonts are loading...');
-            setTimeout(me.getPDFPre, 3000); //延时3秒
+            setTimeout(me.getPDFPre(isOneFile), 3000); //延时3秒
         } else {
             $.bootstrapLoading.end(); //根据测试,需要先做一次清理,防止在极端情况下出现阻塞
             if (rptTplObj.pdfFont['SmartSimsun'].length === 2) {
-                me.getPDFEx();
+                me.getPDFEx(isOneFile);
             } else {
                 $.bootstrapLoading.start();
                 // dynamicLoadJs('/public/jspdf/SmartSimsun-normal.js',"normal", me.getPdfFontCallback);
                 // dynamicLoadJs('/public/jspdf/SmartSimsun-normal2.js',"normal", me.getPdfFontCallback);
                 // dynamicLoadJs('/public/jspdf/SmartSimsun-bold.js',"bold", me.getPdfFontCallback);
-
                 // dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal.js', 'normal', me.getPdfFontCallback);
                 dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-normal2.js', 'normal', me.getPdfFontCallback);
                 dynamicLoadJs('https://d2.smartcost.com.cn/cach/SmartSimsun-bold.js', 'bold', me.getPdfFontCallback);
@@ -1221,34 +1041,46 @@ let rptControlObj = {
             }
         );
     },
-    getPDFEx: async function () {
-        let me = rptControlObj;
-        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0 && PAGE_SHOW['closeExportPdf'] !== 1) {
-            let refRptTplIds = [];
-            let rpt_names = [], splitArchives = [];
+    getPDFEx: async function (isOneFile = false) {
+        this.getOutputCommon('PDF', isOneFile);
+    },
+    getOutputCommon: async function(outputType, isWholeOne = false) {
+        // 把导出Excel/PDF初步统一起来
+        const pageShowPrp = (outputType === 'Excel') ? 'closeExportExcel' : 'closeExportPdf';
+        const me = rptControlObj;
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0 && PAGE_SHOW[pageShowPrp] !== 1) {
+            const refRptTplIds = [];
+            const rpt_names = [], splitArchives = [];
             rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names, splitArchives);
             const signatureRelArr = [];
+            if (refRptTplIds.length === 0) {
+                if (zTreeOprObj.currentNode) {
+                    //在复杂情况下会影响到原有数据(文本签名 + 签章),为减少麻烦,还是当勾选处理
+                    refRptTplIds.push(zTreeOprObj.currentNode.refId);
+                    rpt_names.push(zTreeOprObj.currentNode.name);
+                }
+            }
+            //
             if (refRptTplIds.length > 0) {
                 let params = rptControlObj.creatCommonExportParam(refRptTplIds);
                 if (STAGE_ID === -150) {
                     params.tid = params.tender_id;
                     params.safe_stage_id = BGL_OBJ.BUSINESS_ID;
                 }
+                if (outputType === 'Excel') params.option = getExcelOutputOption();
                 params.splitArchives = splitArchives;
-                // params.getPicFlag = true; //专门针对草图项,只有此项为true,才需要把草图信息带过来,预览及打印动态加载草图 // 纠结:但这样还是解决不了效率问题,得另外想交互方式
                 if (current_stage_id > 0) {
                     await rptCustomObj.getCustomSelect(params);
                 }
                 delete params.orientation; // 打印时有勾选的话,不需要提供方向
                 $.bootstrapLoading.start();
-                if (COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') {
+                if ((COMMON_WATER_MARK_PIC_DATA === null || COMMON_WATER_MARK_PIC_DATA === '') && CUST_CFG.closeWarterMark === false) {
                     params.needWaterMark = true;
                 } else {
                     params.needWaterMark = false;
                 }
-                params.outputType = 'PDF';
+                params.outputType = outputType;
                 let url = '/tender/report_api/getMultiReports';
-                // if (STAGE_ID === -600) url =  '/contract/report_api/getMultiReports';
                 if (STAGE_ID === -600) {
                     params.sp_id = BUSINESS_ID;
                     url =  '/contract/report_api/getMultiReports';
@@ -1260,7 +1092,6 @@ let rptControlObj = {
                 }
                 CommonAjax.postXsrfEx(url, params, WAIT_TIME_EXPORT, true, getCookie('csrfToken_j'),
                     async function(result){
-                        // closeWaitingView();
                         $.bootstrapLoading.end();
                         if (params.needWaterMark) COMMON_WATER_MARK_PIC_DATA = result.waterMarkStr;
                         STAGE_AUDIT = result.stageAudit || [];
@@ -1279,36 +1110,102 @@ let rptControlObj = {
                             }
                             signatureRelArr.push(tmpRel);
                         }
-                        for (let idx = 0; idx < result.data.length; idx++) {
-                            const pageData = result.data[idx];
+                        // 统一安排merge(除草图外)
+                        for (let idx = 0; idx < pageDataArr.length; idx++) {
+                            const pageObj = pageDataArr[idx];
+                            if (CUST_CFG.closeWarterMark) {
+                                pageObj.items.forEach(page => {
+                                    page.watermark_cells = [];
+                                });
+                            }
                             let singleSignatureRelArr = signatureRelArr[idx];
-                            resetStampSignature(pageData, singleSignatureRelArr, getStageStatus() !== 3, STAGE_AUDIT, LEDGER_LIST);
-                            await rptSignatureHelper.resetDummySignature(pageData, null); //
+                            if (signatureRelInfo && signatureRelInfo.length > 0) {
+                                resetStampSignature(pageObj, singleSignatureRelArr, getStageStatus() !== 3, STAGE_AUDIT, LEDGER_LIST);
+                                rptSignatureHelper.mergeSignDate(pageObj, singleSignatureRelArr, false, getStageStatus() !== 3); // Excel
+                                rptSignatureHelper.mergeSignAudit(pageObj, singleSignatureRelArr, STAGE_AUDIT, getStageStatus() !== 3); // Excel
+                                await rptSignatureHelper.resetDummySignature(pageObj, null); // PDF
+                                if (PAGE_SHOW.isTextSignature) {
+                                    resetTextSignature(pageObj, singleSignatureRelArr, getStageStatus() !== 3);
+                                }
+                            }																				  
+																																
+                            await rptSignatureHelper.resetDummySignature(pageObj, null); //
+																																	   
                             if (PAGE_SHOW.isTextSignature) {
-                                resetTextSignature(pageData, singleSignatureRelArr, getStageStatus() !== 3);
+                                resetTextSignature(pageObj, singleSignatureRelArr, getStageStatus() !== 3);
+								 
                             }
                         }
-                        downloadPDFReport(result.data, pageSize, rpt_names, signatureRelArr, result.signatureRelInfo, refRptTplIds, STAGE_AUDIT);
+                        if (outputType === 'Excel') {
+                            if (isWholeOne) {
+                                me.downloadExcelReportInOneBook(pageDataArr, pageSize, signatureRelArr, rpt_names);
+                            } else {
+                                me.downloadExcelReport(pageDataArr, pageSize, rpt_names, signatureRelArr);
+                            }
+                        } else if (outputType === 'PDF') {
+                            if (isWholeOne) {
+                                let allRptName = '';
+                                // 重新整理报表名称:有期就  {标段名称}-{模块}-{期数},无期就{标段名称}-{模块}
+                                switch (current_stage_id) {
+                                    case -150:
+                                        allRptName = `${TENDER_NAME}-安全计量`;
+                                        break;
+                                    case -300:
+                                        // 变更令
+                                        allRptName = `${TENDER_NAME}-变更令`;
+                                        break;
+                                    case -301:
+                                        // 变更方案
+                                        allRptName = `${TENDER_NAME}-变更方案`;
+                                        break;
+                                    case -302:
+                                        // 变更立项
+                                        allRptName = `${TENDER_NAME}-变更立项`;
+                                        break;
+                                    case -303:
+                                        // 变更申请
+                                        allRptName = `${TENDER_NAME}-变更申请`;
+                                        break;
+                                    case -400:
+                                        // 预付款
+                                        allRptName = `${TENDER_NAME}-预付款`;
+                                        break;
+                                    case -500:
+                                        // 材差
+                                        allRptName = `${TENDER_NAME}-材差`;
+                                        break;
+                                    case -600:
+                                        // 合同
+                                        allRptName = `${TENDER_NAME}-合同`;
+                                        break;
+                                    case -700:
+                                        // 计量管理
+                                        allRptName = `${TENDER_NAME}-计量管理`;
+                                        break;
+                                    default:
+                                        // 计量期
+                                        if (current_stage_order > 0) {
+                                            allRptName = `${TENDER_NAME}-计量期-${current_stage_order}`;
+                                        } else {
+                                            allRptName = `${TENDER_NAME}-计量期`;
+                                        }
+                                        
+                                        break;
+                                }
+                                rpt_names[0] = allRptName;
+                            }
+                            downloadPDFReport(pageDataArr, pageSize, rpt_names, signatureRelArr, result.signatureRelInfo, refRptTplIds, STAGE_AUDIT, isWholeOne);
+                        }
                     },
                     function(failRst){
-                        // closeWaitingView();
                         $.bootstrapLoading.end();
                         console.log(failRst);
                     },
                     function(exceptionRst){
-                        // closeWaitingView();
                         $.bootstrapLoading.end();
                         console.log(exceptionRst);
                     }
                 );
-            } else {
-                //这个分支是为了减少请求,用户已经点过的表,又没有勾选,那么就直接导出成PDF
-                let pageSize = rptControlObj.getCurrentPageSize();
-                let pageData = zTreeOprObj.currentRptPageRst;
-                signatureRelArr.push(ROLE_REL_LIST);
-                // closeWaitingView();
-                $.bootstrapLoading.end();
-                JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[0], signatureRelArr, STAGE_AUDIT, false, zTreeOprObj._chkPrePayStatus());
             }
         }
     },
@@ -1420,52 +1317,63 @@ let rptControlObj = {
     }
 };
 
-function downloadPDFReport(pageDataArr, pageSize, rpt_names, signatureRelArr, signatureRelInfo, refRptTplIds, STAGE_AUDIT) {
+function downloadPDFReport(pageDataArr, pageSize, rpt_names, signatureRelArr, signatureRelInfo, refRptTplIds, STAGE_AUDIT, isOneFile = false) {
     const ttlDtlSignCells = [];
     rptControlObj.currentDownloadIdx = 0;
-    const private_download = function(newPageDataArr, new_rpt_names) {
-        if (rptControlObj.currentDownloadIdx < newPageDataArr.length) {
-            let singleSignatureRelArr = [];
-            for (let rIdx = 0; rIdx < signatureRelInfo.length; rIdx++) {
-                let rptId = refRptTplIds[rptControlObj.currentDownloadIdx];
-                if (signatureRelInfo[rIdx].rpt_id === rptId) {
-                    singleSignatureRelArr = signatureRelArr[rIdx]; // 有些报表可能没有签名
-                    break;
+    const _downloadAll = () => {
+        const rptName = rpt_names[0];
+        JpcJsPDFHelper.outputAsAllPdf(pageDataArr, pageSize, rptName, signatureRelArr, signatureRelInfo, refRptTplIds, STAGE_AUDIT, false, zTreeOprObj._chkPrePayStatus()); // 精确控制签名
+        for (let pdIdx = 0; pdIdx < pageDataArr.length; pdIdx++) {
+            restoreSignCells(pageDataArr[pdIdx], ttlDtlSignCells[pdIdx], null, null, PAGE_SHOW.isTextSignature, false);
+        }
+    };
+    const private_download = (newPageDataArr, new_rpt_names) => {
+        if (isOneFile) {
+            _downloadAll();
+        } else {
+            if (rptControlObj.currentDownloadIdx < newPageDataArr.length) {
+                let singleSignatureRelArr = [];
+                for (let rIdx = 0; rIdx < signatureRelInfo.length; rIdx++) {
+                    let rptId = refRptTplIds[rptControlObj.currentDownloadIdx];
+                    if (signatureRelInfo[rIdx].rpt_id === rptId) {
+                        singleSignatureRelArr = signatureRelArr[rIdx]; // 有些报表可能没有签名
+                        break;
+                    }
                 }
-            }
-            let pageData = newPageDataArr[rptControlObj.currentDownloadIdx];
-            let rptName = new_rpt_names[rptControlObj.currentDownloadIdx];
-            rptControlObj.currentDownloadIdx++;
+                let pageData = newPageDataArr[rptControlObj.currentDownloadIdx];
+                let rptName = new_rpt_names[rptControlObj.currentDownloadIdx];
+                rptControlObj.currentDownloadIdx++;
 
-            JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rptName, singleSignatureRelArr, STAGE_AUDIT, false, zTreeOprObj._chkPrePayStatus()); // 精确控制签名
-            if (pageData.splitArcPages) {
-                // 新方式的splitArcPages数据有所不同(主要是为了考虑流水式表处理方便),splitArcPages记录的是每一段的起始页
-                // 比如: [1,3,4,6],这里表示总共分4段,第一段起始页是1,总页数是第二段的起始页-第一段的起始页(即:3-1)
-                //        最后一段的总页数是:ttlPages - 本段的起始页 + 1
-                /*
-                let rptNameIdx = 0;
-                const ttlPages = pageData.items.length;
-                const orgItems = [].concat(pageData.items);
-                for (let pIdx = 0; pIdx < pageData.splitArcPages.length; pIdx++) {
-                    const startPage = pageData.splitArcPages[pIdx];
-                    let endPage = ttlPages;
-                    if (pIdx < pageData.splitArcPages.length - 1) {
-                        endPage = pageData.splitArcPages[pIdx + 1] - 1;
-                    }
-                    const indPages = [];
-                    for (let spIdx = startPage; spIdx <= endPage; spIdx++) {
-                        indPages.push(orgItems[spIdx - 1]);
+                JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rptName, singleSignatureRelArr, STAGE_AUDIT, false, zTreeOprObj._chkPrePayStatus()); // 精确控制签名
+                if (pageData.splitArcPages) {
+                    // 新方式的splitArcPages数据有所不同(主要是为了考虑流水式表处理方便),splitArcPages记录的是每一段的起始页
+                    // 比如: [1,3,4,6],这里表示总共分4段,第一段起始页是1,总页数是第二段的起始页-第一段的起始页(即:3-1)
+                    //        最后一段的总页数是:ttlPages - 本段的起始页 + 1
+                    /*
+                    let rptNameIdx = 0;
+                    const ttlPages = pageData.items.length;
+                    const orgItems = [].concat(pageData.items);
+                    for (let pIdx = 0; pIdx < pageData.splitArcPages.length; pIdx++) {
+                        const startPage = pageData.splitArcPages[pIdx];
+                        let endPage = ttlPages;
+                        if (pIdx < pageData.splitArcPages.length - 1) {
+                            endPage = pageData.splitArcPages[pIdx + 1] - 1;
+                        }
+                        const indPages = [];
+                        for (let spIdx = startPage; spIdx <= endPage; spIdx++) {
+                            indPages.push(orgItems[spIdx - 1]);
+                        }
+                        pageData.items = indPages;
+                        JpcJsPDFHelper.outputAsPdf(pageData, pageSize, `${rptName}_${rptNameIdx}`, singleSignatureRelArr, STAGE_AUDIT);
+                        rptNameIdx++;
                     }
-                    pageData.items = indPages;
-                    JpcJsPDFHelper.outputAsPdf(pageData, pageSize, `${rptName}_${rptNameIdx}`, singleSignatureRelArr, STAGE_AUDIT);
-                    rptNameIdx++;
+                    pageData.items = orgItems;
+                    //*/
+                    // 已验证拆分ok
                 }
-                pageData.items = orgItems;
-                //*/
-                // 已验证拆分ok
+                restoreSignCells(newPageDataArr[rptControlObj.currentDownloadIdx - 1], ttlDtlSignCells[rptControlObj.currentDownloadIdx - 1], null, null, PAGE_SHOW.isTextSignature, false);
+                if (rptControlObj.currentDownloadIdx < newPageDataArr.length) setTimeout(private_download(newPageDataArr, new_rpt_names), 2000);
             }
-            restoreSignCells(newPageDataArr[rptControlObj.currentDownloadIdx - 1], ttlDtlSignCells[rptControlObj.currentDownloadIdx - 1], null, null, PAGE_SHOW.isTextSignature, false);
-            if (rptControlObj.currentDownloadIdx < newPageDataArr.length) setTimeout(private_download(newPageDataArr, new_rpt_names), 2000);
         }
     };
     // 导出PDF真实优化代码

+ 5 - 0
app/service/jpc_report.js

@@ -195,6 +195,11 @@ module.exports = app => {
                         pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
                     }
                     pageRst.id = rptTpl.id;
+                    // pageRst.orientation = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION].toLowerCase();
+                    const orientation = rptTpl[JV.NODE_MAIN_INFO][JV.NODE_PAGE_INFO][JV.PROP_ORIENTATION].toLowerCase();
+                    for (const page of pageRst.items) {
+                        page.orientation = orientation;
+                    }
                     if (tplData.splitArcPages) {
                         pageRst.splitArcPages = tplData.splitArcPages;
                         pageRst.splitArcPagesInfo = tplData.splitArcPagesInfo;

+ 3 - 1
app/view/report/index.ejs

@@ -173,7 +173,9 @@
                                     <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                                         <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.checkAndGetExcel()" <% if (pageShow !== null && parseInt(pageShow.closeExportExcel) === 1) { %> disabled <% } %> ><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-primary">0</span></button>
                                         <button type="button" class="btn btn-outline-primary btn-sm" id="show_excel_output_cfg" data-toggle="modal" data-target="#export_excel" style="display:none"></button>
-                                        <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDFPre()" <% if (pageShow !== null && parseInt(pageShow.closeExportPdf) === 1) { %> disabled <% } %> ><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-primary">0</span></button>
+                                        <!-- <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDFPre()" <% if (pageShow !== null && parseInt(pageShow.closeExportPdf) === 1) { %> disabled <% } %> ><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-primary">0</span></button> -->
+                                        <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.checkAndGetPdf()" <% if (pageShow !== null && parseInt(pageShow.closeExportPdf) === 1) { %> disabled <% } %> ><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-primary">0</span></button>
+                                        <button type="button" class="btn btn-outline-primary btn-sm" id="show_pdf_output_cfg" data-toggle="modal" data-target="#export_pdf" style="display:none"></button>
                                         <!-- <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getTestPDFPre()"><i class="fa fa-file-pdf-o"></i> T_PDF <span class="badge badge-primary">0</span></button> -->
                                     </div>
                                 </div>

+ 46 - 0
app/view/report/rpt_all_popup.ejs

@@ -191,6 +191,52 @@
         </div>
     </div>
 </div>
+<div class="modal fade" id="export_pdf" data-backdrop="static">
+    <div class="modal-dialog" role="document">
+        <div class="modal-content">
+            <div class="modal-header">
+                <h5 class="modal-title">批量导出PDF</h5>
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <span aria-hidden="true">&times;</span>
+                </button>
+            </div>
+            <div class="modal-body">
+                <div class="row">
+                    <div class="col-6">
+                        <div class="card">
+                            <img class="card-img-top" src="/public/images/pdf2.png">
+                            <div class="card-body px-3">
+                                <div class="form-check">
+                                    <input class="form-check-input" type="radio" name="pdfExportTypeRadio" id="pdfExportType_AllInOneFile" value="option1" checked>
+                                    <label class="form-check-label" for="pdfExportType_AllInOneFile">
+                                        多个表导出一个PDF文件
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-6">
+                        <div class="card">
+                            <img class="card-img-top" src="/public/images/pdf1.png">
+                            <div class="card-body px-3">
+                                <div class="form-check">
+                                    <input class="form-check-input" type="radio" name="pdfExportTypeRadio" id="pdfExportType_IndividualFile" value="option2" checked>
+                                    <label class="form-check-label" for="pdfExportType_IndividualFile">
+                                        每个表导出一个PDF文件
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <a onclick="rptControlObj.getPdf()" class="btn btn-primary btn-sm" data-dismiss="modal">确定导出</a>
+                <button type="button" class="btn btn-secondary btn-sm" data-dismiss="modal">取消</button>
+            </div>
+        </div>
+    </div>
+</div>
 <div class="modal fade" id="eSignature" data-backdrop="static">
     <div class="modal-dialog modal-lg" role="document">
         <div class="modal-content">