Преглед изворни кода

TASK #4049 开启文本签名选项及处理

TonyKang пре 3 година
родитељ
комит
a4a5ede198

+ 72 - 1
app/controller/report_controller.js

@@ -401,6 +401,7 @@ module.exports = app => {
             const stgAuditForOrg = await ctx.service.stageAudit.getStageAudit(params.stage_id, 1);
             // console.log('after role stage!');
             // console.log(roleRel);
+            mergeTextSignature(params.isTextSignature, params.stage_status, pageRst, roleRel[0]);
             await encodeSignatureDataUri(roleRel, this.app.baseDir);
             if (params.getPicFlag) {
                 await encodeDummySignatureDataUri(pageRst, this.app.baseDir); // 注意草图数据量问题!
@@ -509,6 +510,8 @@ module.exports = app => {
             });
             // console.log('roleRel: ');
             // console.log(roleRel);
+            mergeTextSignature(params.isTextSignature, params.stage_status, pageRstArr, roleRel, params.rpt_ids);
+
             await encodeSignatureDataUri(roleRel, this.app.baseDir);
             if (params.getPicFlag) {
                 for (const pageRst of pageRstArr) {
@@ -575,6 +578,8 @@ module.exports = app => {
                 }
             }
 
+            mergeTextSignature(params.isTextSignature, params.stage_status, pageRstArr, roleRelArr, params.rpt_ids);
+
             await this.ctx.helper.recursiveMkdirSync(baseDir + '/app/public/download');
 
             const runnableRst = [];
@@ -760,6 +765,7 @@ module.exports = app => {
                     waterMarkStr = await getWatermarkPicData(pageRstArr[0], this.app.baseDir);
                 }
             }
+            mergeTextSignature(params.isTextSignature, params.stage_status, pageRstArr, roleRelArr, params.rpt_ids);
             await this.ctx.helper.recursiveMkdirSync(this.app.baseDir + '/app/public/download');
             const runnableRst = [];
             let rptRoleRelArr = [];
@@ -1427,6 +1433,71 @@ async function createExportRequestJob(ctx) {
     }
 }
 
+function mergeTextSignature(isTxtSignature, status, pageData, singleRoleRel, rpt_ids) {
+    // 依据需求,有些用户不需要签名图片,那么从源头上把签名从signature_cells转移到cells下,省得后续 预览、打印、导出PDF、导出EXCEL每个地方都改动
+    const _mergeSingle = function(_page, _roleRelList, isDeleteSignCell) {
+        // console.log(_roleRelList);
+        let roleRelContent = [];
+        if (_roleRelList && _roleRelList.rel_content !== null && _roleRelList.rel_content !== undefined && _roleRelList.rel_content !== '') {
+            roleRelContent = JSON.parse(_roleRelList.rel_content);
+        };
+        for (const page of _page.items) {
+            if (page.signature_cells) {
+                const deleteSCellsIdx = [];
+                for (let scIdx = 0; scIdx < page.signature_cells.length; scIdx++) {
+                    const sCell = page.signature_cells[scIdx];
+                    sCell.Value = ''; // 这里要先清除原有信息
+                    if (sCell.signature_name !== JV.SIGNATURE_NAME_DUMMY) {
+                        // console.log(sCell);
+                        sCell.path = '';
+                        sCell.pic = '';
+                    }
+                    for (const role_rel of roleRelContent) {
+                        if (sCell.signature_name === role_rel.signature_name) {
+                            if (status === 3) {
+                                sCell.Value = role_rel.user_name; // 只有审核通过了才需要文本签名内容,但不管如何,都不影响迁移
+                            }
+                            const newCell = {
+                                font: 'Footer',
+                                control: sCell.control,
+                                style: sCell.style,
+                                Value: sCell.Value,
+                                area: { Left: sCell.area.Left, Right: sCell.area.Right, Top: sCell.area.Top, Bottom: sCell.area.Bottom },
+                            };
+                            page.cells.push(newCell); // 迁移
+                            deleteSCellsIdx.push(scIdx);
+                            break;
+                        }
+                    }
+                }
+                // 删除 page.signature_cells 签名(草图不能删);
+                if (isDeleteSignCell) {
+                    for (let dIdx = deleteSCellsIdx.length - 1; dIdx >= 0; dIdx--) {
+                        page.signature_cells.splice(deleteSCellsIdx[dIdx], 1);
+                    }
+                }
+            }
+        }
+    };
+    if (isTxtSignature) {
+        if (pageData instanceof Array) {
+            pageData.forEach((dtlPage, index) => {
+                let dftRolRel = [];
+                const rpt_id = rpt_ids[index];
+                for (let roleRel of singleRoleRel) {
+                    if (roleRel.rpt_id === rpt_id) {
+                        dftRolRel = roleRel;
+                    }
+                }
+                // console.log(rptTpls[rtIdx].id)
+                _mergeSingle(dtlPage, dftRolRel, true);
+            });
+        } else {
+            _mergeSingle(pageData, singleRoleRel, false);
+        }
+    }
+}
+
 function mergeSignAudit(pageData, currRoleRelList, currAuditList) {
     for (const page of pageData.items) {
         if (page.signature_audit_cells) {
@@ -1543,7 +1614,7 @@ async function _chkRawPicSize(pageData, baseDir) {
         for (let ci = 0; ci < pageData.items[pi][JV.PROP_SIGNATURE_CELLS].length; ci++) {
             const picPath = pageData.items[pi][JV.PROP_SIGNATURE_CELLS][ci].path;
             // if (picPath && picPath.indexOf('/sign') < 0 && picKeys.indexOf(picPath) < 0) {
-            if (picPath && picKeys.indexOf(picPath) < 0) {
+            if (picPath && picPath !== '' && picKeys.indexOf(picPath) < 0) {
                 // 签名图片也要计算在内,反正不重复
                 picKeys.push(picPath);
             }

+ 5 - 1
app/public/report/js/jpc_output.js

@@ -535,7 +535,11 @@ let JpcCanvasOutput = {
             if (page.signature_cells && page.signature_cells.length > 0) {
                 for (let k = 0; k < page.signature_cells.length; k++) {
                     let cell = page.signature_cells[k];
-                    private_drawSignatureCell(cell, fonts, styles, controls, newPageMergeBand);
+                    if (PAGE_SHOW['isTextSignature'] === 0 || cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
+                        // 如果是非文本签名或草图,才显示图片(文本签名已经在后台单独处理,在cells数组内增加一个合适的cell)
+                        private_drawSignatureCell(cell, fonts, styles, controls, newPageMergeBand);
+                    }
+                    // private_drawSignatureCell(cell, fonts, styles, controls, newPageMergeBand);
                 }
             }
             //水印

+ 25 - 0
app/public/report/js/rpt_archive.js

@@ -548,7 +548,32 @@ let rptArchiveObj = {
         // 归档当前报表
         if (currentRptPageRst !== null) {
             try {
+                let signCells = [];
+                if (PAGE_SHOW.isTextSignature) {
+                    // 如果是显示文本签名,需要把相关签名移除(草图不动),等创建完后再加回来
+                    // 批量归档的数据后台会处理(已经移除相关签名)
+                    currentRptPageRst.items.forEach((pageItem, pageIdx) => {
+                        const dtlSignCells = [];
+                        signCells.push(dtlSignCells);
+                        for (let sCellIdx = pageItem.signature_cells.length - 1; sCellIdx >= 0; sCellIdx--) {
+                            let sCell = pageItem.signature_cells[sCellIdx];
+                            if (sCell.signature_name !== 'dummy_pic') {
+                                dtlSignCells.push(sCell);
+                                pageItem.signature_cells.splice(sCellIdx, 1);
+                            }
+                        }
+                    });
+                }
                 let doc = JpcJsPDFHelper._createPdf(currentRptPageRst, rptControlObj.getCurrentPageSize(), ROLE_REL_LIST, STAGE_AUDIT);
+                if (PAGE_SHOW.isTextSignature) {
+                    currentRptPageRst.items.forEach((pageItem, pageIdx) => {
+                        signCells[pageIdx].forEach((signCell) => {
+                            pageItem.signature_cells.push(signCell);
+                        });
+                        signCells[pageIdx] = null;
+                    });
+                    signCells = null;
+                }
                 let pageEncryptInfo = rptArchiveObj._getPageSignatureInfo(currentRptPageRst, currentNode.refId);
                 // console.log(pageEncryptInfo);
                 let formData = new FormData();

+ 6 - 0
app/public/report/js/rpt_main.js

@@ -276,6 +276,7 @@ let zTreeOprObj = {
             params.stage_times = getStageTimes();
             params.material_order = getMaterialOrder();
             params.closeWatermark = getCloseWatermark();
+            params.isTextSignature = getTxtSignature();
             params.custCfg = CUST_CFG;
 
             rptArchiveObj.toggleBtn(false);
@@ -335,6 +336,7 @@ let zTreeOprObj = {
             params.stage_times = getStageTimes();
             params.material_order = getMaterialOrder();
             params.closeWatermark = getCloseWatermark();
+            params.isTextSignature = getTxtSignature();
             // me.requestNormalReport(params);
             localStorage[CUST_NAME + '_custCfg'] = JSON.stringify(CUST_CFG);
 
@@ -595,6 +597,7 @@ let rptControlObj = {
         rst.material_order = getMaterialOrder();
         rst.custCfg = CUST_CFG;
         rst.closeWatermark = getCloseWatermark();
+        rst.isTextSignature = getTxtSignature();
 
         return rst;
     },
@@ -1135,6 +1138,9 @@ function getStageTimes() {
 function getCloseWatermark() {
     return PAGE_SHOW['closeWatermark'];
 }
+function getTxtSignature() {
+    return PAGE_SHOW['isTextSignature'];
+}
 function getCloseWatermarkForExcel() {
     if (PAGE_SHOW['closeWatermark'] === 1 || CUST_CFG.closeWarterMark) {
         return 1;

+ 2 - 2
app/public/report/js/rpt_signature.js

@@ -272,9 +272,9 @@ let rptSignatureHelper = {
     checkAndShowCrossTendersESignature: function () {
         let btnDom = $('#btn_cross_tender')[0];
         if (zTreeOprObj.currentNode) {
-            btnDom.style.display = '';
+            if (btnDom) btnDom.style.display = '';
         } else {
-            btnDom.style.display = 'none';
+            if (btnDom) btnDom.style.display = 'none';
         }
     },
     pushDomElementByUser: function (elementsStrArr, userName, userRole) {

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

@@ -321,7 +321,7 @@
 
 <script type="text/javascript">
     let TOP_TREE_NODES = <%- rpt_tpl_data %>;
-    const PAGE_SHOW = {closeWatermark: 0, closeExportPdf: 0, closeExportExcel: 0, showArchive: 0, closeShowAllCustomized: 0};
+    const PAGE_SHOW = {closeWatermark: 0, closeExportPdf: 0, closeExportExcel: 0, showArchive: 0, closeShowAllCustomized: 0, isTextSignature: 0};
     <% if (pageShow !== null) { %>
         <% if (parseInt(pageShow.closeWatermark) === 1) { %>
             PAGE_SHOW['closeWatermark'] = 1;
@@ -338,6 +338,9 @@
         <% if (parseInt(pageShow.closeShowAllCustomized) === 1) { %>
         PAGE_SHOW['closeShowAllCustomized'] = 1;
         <% } %>
+        <% if (parseInt(pageShow.isTextSignature) === 1) { %>
+        PAGE_SHOW['isTextSignature'] = 1;
+        <% } %>
     <% } %>
 
 //    PAGE_SHOW['closeWatermark'] = 0; //测试用,check in 前要屏蔽