Kaynağa Gözat

签章功能导出excel处理(多表导出到同一文件)

Tony Kang 3 yıl önce
ebeveyn
işleme
05385e86b9

+ 2 - 0
app/controller/report_controller.js

@@ -965,6 +965,7 @@ async function getAllPagesCommon(ctx, rptTpl, params, option, outputType, baseDi
         }
         // fsUtil.writeObjToFile(pageRst, 'D:/GitHome/temp/计量testBuiltPageResult.jsp');
         // console.log(pageRst);
+        pageRst.id = params.rpt_tpl_id;
         return pageRst;
     } catch (ex) {
         console.log('报表数据异常, tender id: ' + params.tender_id);
@@ -1090,6 +1091,7 @@ async function getMultiRptsCommon(ctx, params, outputType, baseDir) {
             } else {
                 pageRst = printCom.outputAsPreviewPage(rptTpl, defProperties);
             }
+            pageRst.id = rptTpl.id;
             rptPageRstArray.push(pageRst);
             // 注意:这里需要把备份数据assign回去!!!
             // if (tplIdx < rptTpls.length - 1) {

+ 14 - 23
app/public/report/js/rpt_jsexcel.js

@@ -1415,50 +1415,41 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
         const curSignIdx = signKeyArr.length - 1;
         signSheetIdxArr[pageIdx] = false;
         if (page[JV.PROP_SIGNATURE_CELLS] && page[JV.PROP_SIGNATURE_CELLS].length > 0) {
-            for (const signature of page[JV.PROP_SIGNATURE_CELLS]) {
+            for (const signatureCell of page[JV.PROP_SIGNATURE_CELLS]) {
                 // 这里把图片的路径作为key值判断
-                // if (true || signKeyArr.indexOf(signature.signature_name) < 0) {
-                // console.log(`signature: ${signature.signature_name}`);
-                if (signKeyArr.indexOf(signature.signature_name) < 0) {
-                    // console.log(`signature: ${signature.signature_name}`);
-                    if (signature.pic) {
-                        const signPath = { signature_name: signature.signature_name,  path: null, pic: null };
-                        signPathArr.push(signPath);
-                        signPath.pic = signature.pic; // 历史报表
-                        signKeyArr.push(signature.signature_name);
-                        rst = true;
-                        signSheetIdxArr[pageIdx] = true;
-                    } else {
-                        for (const role of chkRoles) {
-                            if (signature.signature_name === role.signature_name) {
-                                // console.log('signature.signature_name: ' + signature.signature_name);
+                if (signKeyArr.indexOf(signatureCell.signature_name) < 0) {
+                    // 还得判断用户是否有选择签名输出
+                    for (const role of chkRoles) {
+                        if (signatureCell.signature_name === role.signature_name) {
+                            if (!(role.signature_name.indexOf(JV.SIGNATURE_NAME_DUMMY) < 0 && role.sign_output.indexOf('normal_sign') < 0)) {
+                                // 如果签名但用户并没有选择显示签名,则不输出!
                                 if (role.sign_pic) {
-                                    const signPath = { signature_name: signature.signature_name, path: null, pic: null };
+                                    const signPath = { signature_name: signatureCell.signature_name, path: null, pic: null };
                                     signPathArr.push(signPath);
                                     signPath.pic = role.sign_pic;
-                                    signKeyArr.push(signature.signature_name);
+                                    signKeyArr.push(signatureCell.signature_name);
                                     rst = true;
                                     signSheetIdxArr[pageIdx] = true;
                                 } else if (role.sign_path) {
                                     let sPObj = _getDupPicPath(role.sign_path);
                                     if (sPObj !== null && isSinglePage) { // 只有在isSinglePage为true时,才需要优化签名
-                                        signature.signature_name = sPObj.signature_name; // 重点,如果有相同路径的,修改signature_name!
+                                        signatureCell.signature_name = sPObj.signature_name; // 重点,如果有相同路径的,修改signature_name!
                                         rst = true;
                                     } else {
-                                        const signPath = { signature_name: signature.signature_name, path: null, pic: null };
+                                        const signPath = { signature_name: signatureCell.signature_name, path: null, pic: null };
                                         signPathArr.push(signPath);
                                         signPath.path = role.sign_path;
-                                        signKeyArr.push(signature.signature_name);
+                                        signKeyArr.push(signatureCell.signature_name);
                                         rst = true;
                                         signSheetIdxArr[pageIdx] = true;
                                     }
                                 }
-                                break;
                             }
+                            break;
                         }
                     }
                 } else {
-                    // console.log(`duplicate signature: ${signature.signature_name}`);
+                    // console.log(`duplicate signature: ${signatureCell.signature_name}`);
                     // signSheetIdxArr[pageIdx] = true;
                 }
             }

+ 3 - 1
app/public/report/js/rpt_jspdf.js

@@ -173,7 +173,9 @@ let JpcJsPDFHelper = {
                 // 导出PDF时,根本不需要判断cell.path是不是null or undefined
                 for (const signRel of signatureRelArr) {
                     if (cell.signature_name === signRel.signature_name && signRel.sign_pic !== null && signRel.sign_pic !== undefined) {
-                        private_drawImage(doc, ctx, cell, control, signRel.sign_pic);
+                        if (!(signRel.signature_name.indexOf(JV.SIGNATURE_NAME_DUMMY) < 0 && signRel.sign_output.indexOf('normal_sign') < 0)) {
+                            private_drawImage(doc, ctx, cell, control, signRel.sign_pic);
+                        }
                         break;
                     }
                 }

+ 78 - 53
app/public/report/js/rpt_main.js

@@ -722,13 +722,15 @@ let rptControlObj = {
         }
     },
 
-    downloadExcelReport: async function(pageDataArr, pageSize, rpt_names) {
+    downloadExcelReport: async function(pageDataArr, pageSize, rpt_names, signatureRelArr) {
         const private_download = async function(currentIndex) {
             if (currentIndex < pageDataArr.length) {
                 //这里的数据应该在调用前己处理
                 const rptName = rpt_names[currentIndex];
                 const singlePage = true;
-                await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, ROLE_REL_LIST, null);
+                let role_rel_list = signatureRelArr[currentIndex];
+                // await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, ROLE_REL_LIST, null);
+                await excelExportUtil.exportExcel(pageDataArr[currentIndex], pageSize, rptName, singlePage, null, null, role_rel_list, null);
             }
         };
         for (let idx = 0; idx < pageDataArr.length; idx++) {
@@ -736,8 +738,63 @@ let rptControlObj = {
         }
     },
 
-    downloadExcelReportInOneBook: async function(pageDataArr, pageSize, signatureRelArr, signatureRelInfo, refRptTplIds, rpt_names) {
-        //
+    downloadExcelReportInOneBook: async function(pageDataArr, pageSize, signatureRelArr, rpt_names) {
+        let rptRoleRelArr = [];
+        let ttlRoleAmt = 0;
+        const reAssignSignatureName = function(pageData, roleRel, rpt_name_key) {
+            const keyMap = {};
+            for (const pageItem of pageData.items) {
+                for (const signCell of pageItem[JV.PROP_SIGNATURE_CELLS]) {
+                    if (!keyMap.hasOwnProperty(signCell.signature_name)) {
+                        keyMap[signCell.signature_name] = rpt_name_key + '_' + signCell.signature_name;
+                    }
+                }
+                //水印也要reAssign
+                for (const watermarkCell of pageItem[JV.PROP_WATERMARK_CELLS]) {
+                    if (!keyMap.hasOwnProperty(watermarkCell.signature_name)) {
+                        keyMap[watermarkCell.signature_name] = rpt_name_key + '_' + watermarkCell.signature_name;
+                    }
+                }
+            }
+            for (const pageItem of pageData.items) {
+                for (const signCell of pageItem[JV.PROP_SIGNATURE_CELLS]) {
+                    if (keyMap.hasOwnProperty(signCell.signature_name)) {
+                        signCell.signature_name = keyMap[signCell.signature_name];
+                    }
+                }
+                for (const watermarkCell of pageItem[JV.PROP_WATERMARK_CELLS]) {
+                    if (keyMap.hasOwnProperty(watermarkCell.signature_name)) {
+                        watermarkCell.signature_name = keyMap[watermarkCell.signature_name];
+                    }
+                }
+            }
+            for (const roleSign of roleRel) {
+                if (keyMap.hasOwnProperty(roleSign.signature_name)) {
+                    roleSign.signature_name = keyMap[roleSign.signature_name];
+                }
+            }
+        };
+        for (let idx = 0; idx < pageDataArr.length; idx++) {
+            let roleRel = signatureRelArr[idx];
+            ttlRoleAmt += roleRel.length;
+            pageDataArr[idx][JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME] = rpt_names[idx];
+            
+            // 这里要做些电子签名的signature_name转换,以防重名
+            if (roleRel.length > 0) {
+                reAssignSignatureName(pageDataArr[idx], roleRel, rpt_names[idx]);
+                rptRoleRelArr = rptRoleRelArr.concat(roleRel);
+            }
+
+            let hasWaterMark = false;
+            if (pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS] && pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS].length > 0) {
+                hasWaterMark = true;
+            }
+            if (ttlRoleAmt < 1 && hasWaterMark) {
+                reAssignSignatureName(pageDataArr[idx], [], rpt_names[idx]);
+                rptRoleRelArr = rptRoleRelArr.concat([pageDataArr[idx].items[0][JV.PROP_WATERMARK_CELLS][0].signature_name]);
+            }
+        }
+        excelExportUtil.exportExcelInOneBook(pageDataArr, pageSize, TENDER_NAME, rptRoleRelArr, null);
     },
     
     getExcel_New: async function (isOneBook) {
@@ -773,22 +830,21 @@ let rptControlObj = {
                         let pageSize = rptControlObj.getCurrentPageSize();
                         let pageDataArr = result.data;
                         let signatureRelInfo = result.signatureRelInfo;
-                        for (const signatureRel of signatureRelInfo) {
-                            const tmpRel = [];
-                            tmpRel.push(JSON.parse(signatureRel.rel_content));
+                        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);
                         }
                         if (current_stage_status === 3) {
                             // 统一安排merge(除草图外)
-                            for (let pageObj of pageDataArr) {
-                                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;
-                                    }
-                                }
+                            for (let idx = 0; idx < pageDataArr.length; idx++) {
+                                const pageObj = pageDataArr[idx];
+                                let singleSignatureRelArr = signatureRelArr[idx];
                                 rptSignatureHelper.mergeSignDate(pageObj, singleSignatureRelArr, false);
                                 // rptSignatureHelper.mergeSignature(pageObj, signatureRelArr); // 这里merge的意义不大
                                 rptSignatureHelper.mergeSignAudit(pageObj, singleSignatureRelArr, STAGE_AUDIT);
@@ -796,10 +852,9 @@ let rptControlObj = {
                         }
 
                         if (isOneBook) {
-                            me.downloadExcelReportInOneBook(pageDataArr, pageSize, signatureRelArr, signatureRelInfo, refRptTplIds, rpt_names);
+                            me.downloadExcelReportInOneBook(pageDataArr, pageSize, signatureRelArr, rpt_names);
                         } else {
-                            // 本地处理
-                            me.downloadExcelReport(pageDataArr, pageSize, rpt_names);
+                            me.downloadExcelReport(pageDataArr, pageSize, rpt_names, signatureRelArr);
                         }
                     },
                     function(failRst){
@@ -818,23 +873,12 @@ let rptControlObj = {
         }
     },
 
-    getExcel_SingleSelected: async function() {
-        if (zTreeOprObj.currentRptPageRst) {
-            // 新处理(前端生成excel报表)
-            const pageSize = rptControlObj.getCurrentPageSize();
-            const rptName = zTreeOprObj.currentNode.name;
-            const singlePage = true;
-            excelExportUtil.exportExcel(zTreeOprObj.currentRptPageRst, pageSize, rptName, singlePage, null, null, ROLE_REL_LIST, null);
-        }
-    },
     checkAndGetExcel: function () {
         if (zTreeOprObj.treeObj) {
             let chkNodes = zTreeOprObj.treeObj.getCheckedNodes(true);
             if (chkNodes.length > 0) {
                 $("#show_excel_output_cfg").trigger("click");
             } else {
-                // rptControlObj.getAllIndividualExcelBook();
-                // rptControlObj.getExcel_SingleSelected();
                 rptControlObj.getExcel_New(false);
             }
         }
@@ -842,9 +886,11 @@ 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);
         }
     },
     getPdfFontCallbackLight: function(fontProperty) {
@@ -923,27 +969,6 @@ let rptControlObj = {
                             await rptSignatureHelper.resetDummySignature(pageData, null); //
                         }
                         downloadPDFReport(result.data, pageSize, rpt_names, signatureRelArr, result.signatureRelInfo, refRptTplIds, STAGE_AUDIT);
-                        /*
-                        for (let idx = 0; idx < result.data.length; idx++) {
-                            let pageData = result.data[idx];
-                            // if (current_stage_status === 3) {
-                            //     rptSignatureHelper.mergeSignDate(pageData);
-                            //     rptSignatureHelper.mergeSignature(pageData);
-                            //     rptSignatureHelper.mergeSignAudit(pageRst, ROLE_REL_LIST, STAGE_AUDIT);
-                            // }
-                            // 备注:因多表的原因,无需merge电子签名,在下面处理
-                            let singleSignatureRelArr = [];
-                            for (let rIdx = 0; rIdx < result.signatureRelInfo.length; rIdx++) {
-                                if (result.signatureRelInfo[rIdx].rpt_id === refRptTplIds[idx]) {
-                                    // singleSignatureRelArr.push(signatureRelArr[rIdx]);
-                                    singleSignatureRelArr = signatureRelArr[rIdx]; // 有些报表可能没有签名
-                                    break;
-                                }
-                            }
-                            // JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[idx], signatureRelArr);
-                            JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[idx], singleSignatureRelArr, STAGE_AUDIT); // 精确控制签名
-                        }
-                        //*/
                     },
                     function(failRst){
                         // closeWaitingView();