浏览代码

导出excel水印+草图+签名、 前端页面设置控制

TonyKang 4 年之前
父节点
当前提交
4f7d9c5629

+ 2 - 2
app/controller/report_controller.js

@@ -436,7 +436,7 @@ module.exports = app => {
             // const roleRel = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id)) : [];
             const pageRstArr = await getMultiRptsCommon(ctx, params, JV.OUTPUT_TYPE_NORMAL, this.app.baseDir);
             // console.log('params.stage_status: ' + params.stage_status);
-            fsUtil.writeObjToFile(pageRstArr, 'D:/GitHome/temp/testBuiltPageResult.js');
+            // fsUtil.writeObjToFile(pageRstArr, 'D:/GitHome/temp/testBuiltPageResult.js');
             for (const pageRst of pageRstArr) {
                 for (const page of pageRst.items) {
                     page[JV.PROP_WATERMARK_CELLS] = [];
@@ -1089,7 +1089,7 @@ function fillWaterMark(pageRstArray) {
         const top = Math.round(area[JV.PROP_TOP] + h / 2 - orgWaterMarkHeight / 2);
         const bottom = top + orgWaterMarkHeight;
         return {
-            signature_name: JV.SIGNATURE_NAME_DUMMY,
+            signature_name: JV.SIGNATURE_NAME_DUMMY_WATER_MARK,
             path: '/public/images/not_Approve.png',
             sign_path: '/public/images/not_Approve.png',
             pic: null,

+ 5 - 1
app/reports/rpt_component/helper/jpc_helper_discrete.js

@@ -96,7 +96,11 @@ const JpcDiscreteHelper = {
                                         const signatureItem = { signature_name: JV.SIGNATURE_NAME_DUMMY, path: item[JV.PROP_VALUE], pic: null }; // 这里的pic数据在指标中里已经处理过了
                                         signatureItem[JV.PROP_CONTROL] = item[[JV.PROP_CONTROL]];
                                         signatureItem[JV.PROP_STYLE] = item[[JV.PROP_STYLE]];
-                                        signatureItem[JV.PROP_AREA] = item[JV.PROP_AREA];
+                                        signatureItem[JV.PROP_AREA] = {};
+                                        signatureItem[JV.PROP_AREA][JV.PROP_LEFT] = item[JV.PROP_AREA][JV.PROP_LEFT];
+                                        signatureItem[JV.PROP_AREA][JV.PROP_RIGHT] = item[JV.PROP_AREA][JV.PROP_RIGHT];
+                                        signatureItem[JV.PROP_AREA][JV.PROP_TOP] = item[JV.PROP_AREA][JV.PROP_TOP];
+                                        signatureItem[JV.PROP_AREA][JV.PROP_BOTTOM] = item[JV.PROP_AREA][JV.PROP_BOTTOM];
                                         signatureRst.push(signatureItem);
                                         item[JV.PROP_VALUE] = '';
                                     }

+ 8 - 4
app/reports/rpt_component/jpc_flow_tab.js

@@ -538,8 +538,10 @@ JpcFlowTabSrv.prototype.createNew = function() {
                 maxRowRec = JpcFlowTabHelper.getMaxRowsPerPage(bands, rptTpl, me.isEx);
                 me.setupAutoHeightData(bands, segIdx, rptTpl, dataObj, $CURRENT_RPT, defProperties, outputType);
                 let adHocAutoHeightAmt = 0;
-                for (let loop = 0; loop < me.auto_height_info[segIdx].length; loop++) {
-                    adHocAutoHeightAmt += (me.auto_height_info[segIdx][loop] - 1);
+                if (me.auto_height_info.length > 0) {
+                    for (let loop = 0; loop < me.auto_height_info[segIdx].length; loop++) {
+                        adHocAutoHeightAmt += (me.auto_height_info[segIdx][loop] - 1);
+                    }
                 }
                 me.pageStatusLst.push(pageStatus.slice(0));
                 pageIdx++;
@@ -819,8 +821,10 @@ JpcFlowTabSrv.prototype.createNew = function() {
             const tab = rptTpl[JV.NODE_FLOW_INFO][JV.NODE_FLOW_CONTENT];
             const flowContentBand = bands[tab[JV.PROP_BAND_NAME]];
             let adHocAutoHeightAmt = 0;
-            for (let loop = 0; loop < me.auto_height_info[segIdx].length; loop++) {
-                adHocAutoHeightAmt += (me.auto_height_info[segIdx][loop] - 1);
+            if (me.auto_height_info.length > 0) {
+                for (let loop = 0; loop < me.auto_height_info[segIdx].length; loop++) {
+                    adHocAutoHeightAmt += (me.auto_height_info[segIdx][loop] - 1);
+                }
             }
             const rowAmt = Math.max(maxRowRec, me.segments[segIdx].length + adHocAutoHeightAmt); // 如不满一页,则需要填充满一页
             const actH = JpcFlowTabHelper.getActualContentAreaHeight(bands, rptTpl, me.segments, rowAmt, page, me.isEx);

+ 1 - 0
app/reports/rpt_component/jpc_value_define.js

@@ -227,6 +227,7 @@ module.exports = {
     RUN_TYPE_BEFORE_GROUP_TEXT_OUT: 'before_group_text_output',
 
     SIGNATURE_NAME_DUMMY: 'dummy_pic',
+    SIGNATURE_NAME_DUMMY_WATER_MARK: 'dummy_pic_warter_mark',
 
     PAGE_STATUS: ['EveryPage', 'FirstPage', 'LastPage', 'SegmentStart', 'SegmentEnd', 'Group', 'CrossRowEnd', 'CrossColEnd'],
 

+ 71 - 57
app/reports/util/rpt_excel_util.js

@@ -1059,10 +1059,14 @@ function writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signShee
     const rst = [];
     // console.log('isSinglePage: ' + isSinglePage);
     if (isSinglePage) {
+        // console.log('singlePage! ');
         rst.push(writeDrawing(pageData, null, signKeyArr[0]));
     } else {
+        // console.log('pageData! ');
         for (let i = 0; i < pageData.items.length; i++) {
             if (signSheetIdxArr[i]) {
+                // console.log('signKeyArr[' + i + ']');
+                // console.log(signKeyArr[i]);
                 rst.push(writeDrawing(pageData, pageData.items[i], signKeyArr[i]));
             }
         }
@@ -1165,7 +1169,10 @@ function writeDrawing(pageData, sheetData, subSignKeyArr) {
     preAnalyzePos(pageData, sheetData, xPos, yPos, yMultiPos);
     rst.push('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>');
     rst.push('<xdr:wsDr xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">');
+    // console.log('subSignKeyArr');
+    // console.log(subSignKeyArr);
     if (sheetData) {
+        // console.log('sheetData');
         let startPicIdx = 2;
         for (const sCell of sheetData[JV.PROP_SIGNATURE_CELLS]) {
             if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
@@ -1180,6 +1187,8 @@ function writeDrawing(pageData, sheetData, subSignKeyArr) {
             }
         }
     } else {
+        // console.log('pageData.items[0][JV.PROP_SIGNATURE_CELLS]');
+        // console.log(pageData.items[1][JV.PROP_SIGNATURE_CELLS]);
         // total data in one sheet
         let rowOffset = 0;
         for (let i = 0; i < pageData.items.length; i++) {
@@ -1190,6 +1199,11 @@ function writeDrawing(pageData, sheetData, subSignKeyArr) {
                 if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
                     private_setSheetDrawingCellData(sCell, tmpPos, startPicIdx, rowOffset);
                     startPicIdx++;
+                // } else {
+                //     console.log('index < 0 subSignKeyArr: ');
+                //     console.log(subSignKeyArr);
+                //     console.log('sCell.signature_name');
+                //     console.log(sCell.signature_name);
                 }
             }
             for (const sCell of shtItemData[JV.PROP_WATERMARK_CELLS]) {
@@ -1283,7 +1297,7 @@ function createDummySignatureCell(pageData) {
     }
 }
 
-function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel, signSheetIdxArr) {
+function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel, signSheetIdxArr, isSinglePage) {
     // 备注:电子签名是以图形的方式处理,一页可以有多个签名,多页的签名基本是引用同样的图片,在这里先处理一下,后期统一引用。
     //      另:以后的图片(在电子签名(signature_cells)以外的图片)会单独处理(如计算草图、水印等)
     let rst = false;
@@ -1298,8 +1312,16 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
     // for (const page of pageData.items) {
     for (let pageIdx = 0; pageIdx < pageData.items.length; pageIdx++) {
         const page = pageData.items[pageIdx];
-        signKeyArr.push([]);
-        signPathArr.push([]);
+        if (isSinglePage) {
+            if (pageIdx === 0) {
+                signKeyArr.push([]);
+                signPathArr.push([]);
+            }
+        } else {
+            signKeyArr.push([]);
+            signPathArr.push([]);
+        }
+        const curSignIdx = signKeyArr.length - 1;
         signSheetIdxArr[pageIdx] = false;
         // console.log('page index: ' + pageIdx);
         // console.log(page[JV.PROP_SIGNATURE_CELLS]);
@@ -1313,12 +1335,12 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                 //     rst = true;
                 //     signSheetIdxArr[pageIdx] = true;
                 // }
-                if (signKeyArr[pageIdx].indexOf(signature.signature_name) < 0) {
+                if (signKeyArr[curSignIdx].indexOf(signature.signature_name) < 0) {
                     if (signature.pic) {
                         const signPath = { path: null, pic: null };
-                        signPathArr[pageIdx].push(signPath);
+                        signPathArr[curSignIdx].push(signPath);
                         signPath.pic = signature.pic; // 历史报表
-                        signKeyArr[pageIdx].push(signature.signature_name);
+                        signKeyArr[curSignIdx].push(signature.signature_name);
                         rst = true;
                         signSheetIdxArr[pageIdx] = true;
                     } else {
@@ -1327,16 +1349,16 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                                 // console.log('signature.signature_name: ' + signature.signature_name);
                                 if (role.sign_pic) {
                                     const signPath = { path: null, pic: null };
-                                    signPathArr[pageIdx].push(signPath);
+                                    signPathArr[curSignIdx].push(signPath);
                                     signPath.pic = role.sign_pic;
-                                    signKeyArr[pageIdx].push(signature.signature_name);
+                                    signKeyArr[curSignIdx].push(signature.signature_name);
                                     rst = true;
                                     signSheetIdxArr[pageIdx] = true;
                                 } else if (role.sign_path) {
                                     const signPath = { path: null, pic: null };
-                                    signPathArr[pageIdx].push(signPath);
+                                    signPathArr[curSignIdx].push(signPath);
                                     signPath.path = role.sign_path;
-                                    signKeyArr[pageIdx].push(signature.signature_name);
+                                    signKeyArr[curSignIdx].push(signature.signature_name);
                                     rst = true;
                                     signSheetIdxArr[pageIdx] = true;
                                 }
@@ -1350,15 +1372,17 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
         if (page[JV.PROP_WATERMARK_CELLS] && page[JV.PROP_WATERMARK_CELLS].length > 0) {
             // 水印,单独处理
             const waterMarkCell = page[JV.PROP_WATERMARK_CELLS][0];
-            // console.log('waterMarkCell');
-            // console.log(waterMarkCell);
-            const signPath = { path: null, pic: null };
-            signPathArr[pageIdx].push(signPath);
-            signPath.pic = waterMarkCell.pic;
-            signPath.path = waterMarkCell.path;
-            signKeyArr[pageIdx].push(waterMarkCell.signature_name);
-            rst = true;
-            signSheetIdxArr[pageIdx] = true;
+            if (signKeyArr[curSignIdx].indexOf(waterMarkCell.signature_name) < 0) {
+                // console.log('waterMarkCell');
+                // console.log(waterMarkCell);
+                const signPath = { path: null, pic: null };
+                signPathArr[curSignIdx].push(signPath);
+                signPath.pic = waterMarkCell.pic;
+                signPath.path = waterMarkCell.path;
+                signKeyArr[curSignIdx].push(waterMarkCell.signature_name);
+                rst = true;
+                signSheetIdxArr[pageIdx] = true;
+            }
         }
     }
     return rst;
@@ -1393,7 +1417,7 @@ module.exports = {
         // console.log(thisRoleRel);
 
         // const hasSignature = false; // 暂时不支持电子签名、草图导出excel
-        const hasSignature = _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, thisRoleRel, signSheetIdxArr); // 因草图的关系,thisRoleRel是否为null就不是充要的条件
+        const hasSignature = _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, thisRoleRel, signSheetIdxArr, isSinglePage); // 因草图的关系,thisRoleRel是否为null就不是充要的条件
         // console.log('signKeyArr');
         // console.log(signKeyArr);
         // console.log('signPathArr');
@@ -1473,6 +1497,7 @@ module.exports = {
             // 5.2
             const zip_drawings = zip_xl.folder('drawings');
             data = writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signSheetIdxArr);
+            // data = writeDrawings(pageData, signKeyArr, signPathArr, false, signSheetIdxArr); // 备注:这里根本不需要考虑是否single page
             // console.log('isSinglePage: ' + isSinglePage);
             // console.log(data);
             for (let psIdx = 0; psIdx < data.length; psIdx++) {
@@ -1603,9 +1628,25 @@ module.exports = {
                 // 加分页符(分页符要在外部处理好)-------------------
                 _setupPgBrks(pageDataArray[i]);
                 // 加分页符结束-------------------
+                let maxY = 0;
+                let minY = 100000;
+                const checkAndResetCellYPos = function(cells) {
+                    if (cells && cells.length > 0) {
+                        for (const cell of cells) {
+                            if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
+                                maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
+                            }
+                            if (minY > cell[JV.PROP_AREA][JV.PROP_TOP]) {
+                                minY = cell[JV.PROP_AREA][JV.PROP_TOP];
+                            }
+                            cell[JV.PROP_AREA][JV.PROP_BOTTOM] += offsetY;
+                            cell[JV.PROP_AREA][JV.PROP_TOP] += offsetY;
+                        }
+                    }
+                };
                 for (let j = 0; j < pageDataArray[i].items.length; j++) {
-                    let maxY = 0;
-                    let minY = 100000;
+                    maxY = 0;
+                    minY = 100000;
                     if (pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS]) {
                         let pos = pageDataArray[i].items[j][JV.PAGE_SPECIAL_MERGE_POS][JV.PROP_TOP][0] + offsetY;
                         mergeBand[JV.PROP_TOP].push(pos);
@@ -1621,43 +1662,16 @@ module.exports = {
                         mergeBand[JV.PROP_BOTTOM].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM] + offsetY);
                     }
                     // 1.2.1 重新设置普通cells的Top Bottom坐标
-                    for (const cell of pageDataArray[i].items[j][JV.PROP_CELLS]) {
-                    // for (let k = 0; k < pageDataArray[i].items[j][JV.PROP_CELLS].length; k++) {
-                        if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
-                            maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
-                        }
-                        if (minY > cell[JV.PROP_AREA][JV.PROP_TOP]) {
-                            minY = cell[JV.PROP_AREA][JV.PROP_TOP];
-                        }
-                        cell[JV.PROP_AREA][JV.PROP_BOTTOM] += offsetY;
-                        cell[JV.PROP_AREA][JV.PROP_TOP] += offsetY;
-                    }
+                    checkAndResetCellYPos(pageDataArray[i].items[j][JV.PROP_CELLS]);
                     // 1.2.2 重新设置电子签名cells的Top Bottom坐标
-                    for (const cell of pageDataArray[i].items[j][JV.PROP_SIGNATURE_CELLS]) {
-                        if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
-                            maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
-                        }
-                        if (minY > cell[JV.PROP_AREA][JV.PROP_TOP]) {
-                            minY = cell[JV.PROP_AREA][JV.PROP_TOP];
-                        }
-                        // console.log('before');
-                        // console.log(cell);
-                        cell[JV.PROP_AREA][JV.PROP_BOTTOM] += offsetY;
-                        cell[JV.PROP_AREA][JV.PROP_TOP] += offsetY;
-                        // console.log('after');
-                        // console.log(cell);
-                    }
+                    checkAndResetCellYPos(pageDataArray[i].items[j][JV.PROP_SIGNATURE_CELLS]);
                     // 1.2.3 重新设置电子签名日期cells的Top Bottom坐标
-                    for (const cell of pageDataArray[i].items[j][JV.PROP_SIGNATURE_DATE_CELLS]) {
-                        if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
-                            maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
-                        }
-                        if (minY > cell[JV.PROP_AREA][JV.PROP_TOP]) {
-                            minY = cell[JV.PROP_AREA][JV.PROP_TOP];
-                        }
-                        cell[JV.PROP_AREA][JV.PROP_BOTTOM] += offsetY;
-                        cell[JV.PROP_AREA][JV.PROP_TOP] += offsetY;
-                    }
+                    checkAndResetCellYPos(pageDataArray[i].items[j][JV.PROP_SIGNATURE_DATE_CELLS]);
+                    // 1.2.4 重置电子签名审核意见cells的Top Bottom坐标
+                    checkAndResetCellYPos(pageDataArray[i].items[j][JV.PROP_SIGNATURE_AUDIT_CELLS]);
+                    // 1.2.5 重置水印的Top Bottom坐标
+                    checkAndResetCellYPos(pageDataArray[i].items[j][JV.PROP_WATERMARK_CELLS]);
+
                     const bottomGap = Math.round((pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1] - parseFloat(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]) / 2.54) * DPI) - maxY;
                     offsetY += (maxY - minY);
                     if (bottomGap > 10) {