TonyKang пре 5 година
родитељ
комит
74ed8d36c4

+ 16 - 9
app/controller/report_controller.js

@@ -124,6 +124,7 @@ module.exports = app => {
                 const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id);
                 const stgAudit = await ctx.service.stageAudit.getStageAudit(params.stage_id, params.stage_times);
 
+                encodeSignatureDataUri(roleRel, this.app.baseDir);
                 ctx.body = { data: pageRst, signatureRelInfo: roleRel, stageAudit: stgAudit };
                 // ctx.body = { data: { msg: 'test the network' } };
                 ctx.status = 201;
@@ -142,8 +143,10 @@ module.exports = app => {
             // 原则说明:把所有报表模板集中获取,统一filter,只读一次数据!
             const params = JSON.parse(ctx.request.body.params);
             const pageRstArr = await getMultiRptsCommon(ctx, params, JV.OUTPUT_TYPE_NORMAL);
+            const roleRel = await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids);
+            encodeSignatureDataUri(roleRel, this.app.baseDir);
             // console.log(pageRstArr);
-            ctx.body = { data: pageRstArr };
+            ctx.body = { data: pageRstArr, signatureRelInfo: roleRel };
             ctx.status = 201;
         }
 
@@ -541,15 +544,19 @@ function setupCustomizeCfg(customizeCfg, rptTpl, defProperties) {
     }
 }
 
-function hasSignatureDate(pageRst) {
-    let rst = false;
-    if (pageRst && pageRst.items.length > 0) {
-        for (const page of pageRst.items) {
-            if (page[JV.PROP_SIGNATURE_DATE_CELLS] && page[JV.PROP_SIGNATURE_DATE_CELLS].length > 0) {
-                rst = true;
-                break;
+function encodeSignatureDataUri(roleRel, baseDir) {
+    for (const singleRoleRel of roleRel) {
+        const roleRelContent = JSON.parse(singleRoleRel.rel_content);
+        for (const role of roleRelContent) {
+            if (role.sign_path !== '') {
+                const filePath = baseDir + '/app' + role.sign_path;
+                const bData = fs.readFileSync(filePath);
+                const base64Str = bData.toString('base64');
+                const datauri = 'data:image/png;base64,' + base64Str;
+                role.sign_pic = datauri;
+                // fsUtil.writeObjToFile(datauri, 'D:/Temp/imageDataUri.txt');
             }
         }
+        singleRoleRel.rel_content = JSON.stringify(roleRelContent);
     }
-    return rst;
 }

+ 81 - 9
app/public/report/js/rpt_jspdf.js

@@ -30,10 +30,10 @@ let JpcJsPDFHelper = {
         //
         // doc.save('Test.pdf');
     },
-    outputAsPdf: function (pageData, paperSize, pdfName) {
+    outputAsPdf: function (pageData, paperSize, pdfName, signatureRelArr) {
         let me = this;
-        let offsetX= 10;
-        let offsetY=10;
+        let offsetX = 10;
+        let offsetY = 10;
         let newName = pdfName;
         let pageObj = pageData;
         let paperSizeIdx = JV.PAGES_SIZE_STR.indexOf(paperSize);
@@ -58,6 +58,7 @@ let JpcJsPDFHelper = {
         }
 
         let newPageMergeBand = private_getIniPageMergeBorder(pageObj[JV.BAND_PROP_MERGE_BAND]);
+        // let signatureCounter = {"allAmt": 0, "picAmt": 0};
         if (pageObj && pageObj.items.length > 0 ) {
             for(let i = 0; i < pageObj.items.length; i++) {
                 if (i > 0) {
@@ -79,14 +80,14 @@ let JpcJsPDFHelper = {
                     let cell = page.cells[j];
                     private_drawCell(doc, ctx, cell, fonts, styles, controls, newPageMergeBand);
                 }
-                // 计量有电子签名,要单独处理
-                for (let cell of page.signature_cells) {
-                    private_drawSignature(doc, ctx, cell, styles, controls, newPageMergeBand);
-                }
                 // 计量有电子签名日期,在处理上与cells一样
                 for (let cell of page.signature_date_cells) {
                     private_drawCell(doc, ctx, cell, fonts, styles, controls, newPageMergeBand);
                 }
+                // 计量有电子签名,要单独处理
+                for (let cell of page.signature_cells) {
+                    private_drawSignature(doc, ctx, cell, styles, controls, newPageMergeBand, signatureRelArr);
+                }
             }
         }
         doc.save(newName + '.pdf');
@@ -100,7 +101,7 @@ let JpcJsPDFHelper = {
             return rst;
         }
 
-        function private_drawSignature(doc, ctx, cell, styles, controls, mergeBand) {
+        function private_drawSignature(doc, ctx, cell, styles, controls, mergedBand, signatureRelArr) {
             ctx.beginPath();
             let style = styles[cell[JV.PROP_STYLE]];
             if (style) {
@@ -110,8 +111,79 @@ let JpcJsPDFHelper = {
                 private_drawLine(cell, doc, ctx, style, JV.PROP_BOTTOM, [JV.PROP_RIGHT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_BOTTOM], mergedBand, styles, isNeedMergeBand);
                 private_drawLine(cell, doc, ctx, style, JV.PROP_LEFT, [JV.PROP_LEFT, JV.PROP_BOTTOM],[JV.PROP_LEFT, JV.PROP_TOP], mergedBand, styles, isNeedMergeBand);
             }
-            // private_drawCellText(doc, ctx, cell, fonts, controls);
             ctx.closePath();
+            private_drawSignatureCellText(doc, ctx, cell, controls, signatureRelArr);
+        }
+
+        function private_drawSignatureCellText(doc, ctx, cell, controls, signatureRelArr) {
+            let control = null;
+            if (typeof cell[JV.PROP_CONTROL] === "string") {
+                control = controls[cell[JV.PROP_CONTROL]];
+            } else {
+                control = cell[JV.PROP_CONTROL];
+            }
+            if (cell.path) {
+                let finded = false;
+                for (const rtpSignRel of signatureRelArr) {
+                    if (!finded) {
+                        for (const signRel of rtpSignRel) {
+                            if (cell.signature_name === signRel.signature_name) {
+                                private_drawImage(doc, ctx, cell, control, signRel.sign_pic);
+                                finded = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+            } else if (cell.pic) {
+                private_drawImage(doc, ctx, cell, control, cell.pic);
+            }
+        }
+
+        function private_getProperSignatureArea(cell, control) {
+            // 约定默认长宽比例是2:1,图片分辨率是600*300
+            const rst = [0, 0, 0, 0]; // left, top, right, bottom
+            if (cell && cell[JV.PROP_AREA]) {
+                let width = cell[JV.PROP_AREA][JV.PROP_RIGHT] - cell[JV.PROP_AREA][JV.PROP_LEFT],
+                    height = cell[JV.PROP_AREA][JV.PROP_BOTTOM] - cell[JV.PROP_AREA][JV.PROP_TOP];
+                if (width > height * 2) {
+                    width = height * 2;
+                } else {
+                    height = width / 2;
+                }
+                switch (control[JV.CONTROL_PROPS[JV.CONTROL_PROP_IDX_HORIZON]]) {
+                    case 'left':
+                        rst[0] = cell[JV.PROP_AREA][JV.PROP_LEFT];
+                        rst[1] = cell[JV.PROP_AREA][JV.PROP_TOP];
+                        rst[2] = rst[0] + width;
+                        rst[3] = rst[1] + height;
+                        break;
+                    case 'right':
+                        rst[2] = cell[JV.PROP_AREA][JV.PROP_RIGHT];
+                        rst[3] = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
+                        rst[0] = rst[2] - width;
+                        rst[1] = rst[3] - height;
+                        break;
+                    default:
+                        //center
+                        rst[0] = (cell[JV.PROP_AREA][JV.PROP_LEFT] + cell[JV.PROP_AREA][JV.PROP_RIGHT] - width) / 2;
+                        rst[1] = cell[JV.PROP_AREA][JV.PROP_TOP];
+                        rst[2] = rst[0] + width;
+                        rst[3] = rst[1] + height;
+                        break;
+                }
+            }
+            rst[0] = rst[0] + offsetX;
+            rst[2] = rst[2] + offsetX;
+            rst[1] = rst[1] + offsetY;
+            rst[3] = rst[3] + offsetY;
+            return rst;
+        }
+
+        function private_drawImage(doc, ctx, cell, control, imageData) {
+            let area = private_getProperSignatureArea(cell, control);
+            doc.addImage(imageData, 'PNG', area[0] * PDF_SCALE, area[1] * PDF_SCALE,
+                (area[2] - area[0]) * PDF_SCALE, (area[3] - area[1]) * PDF_SCALE);
         }
 
         function private_drawCell(doc, ctx, cell, fonts, styles, controls, mergedBand) {

+ 7 - 2
app/public/report/js/rpt_main.js

@@ -548,14 +548,18 @@ let rptControlObj = {
             let refRptTplIds = [];
             let rpt_names = [];
             rptControlObj.getTplIdsCommon(refRptTplIds, rpt_names);
+            const signatureRelArr = [];
             if (refRptTplIds.length > 1) {
                 let params = rptControlObj.creatCommonExportParam(refRptTplIds);
                 CommonAjax.postXsrfEx("/tender/report_api/getMultiReports", params, 60000, true, getCookie('csrfToken'),
                     function(result){
                         let pageSize = rptControlObj.getCurrentPageSize();
+                        for (const signatureRel of result.signatureRelInfo) {
+                            signatureRelArr.push(JSON.parse(signatureRel.rel_content));
+                        }
                         for (let idx = 0; idx < result.data.length; idx++) {
                             let pageData = result.data[idx];
-                            JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[idx]);
+                            JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[idx], signatureRelArr);
                         }
                     },
                     function(failRst){
@@ -569,7 +573,8 @@ let rptControlObj = {
                 //这个分支是为了减少请求,用户已经点过的表,又没有勾选,那么就直接导出成PDF
                 let pageSize = rptControlObj.getCurrentPageSize();
                 let pageData = zTreeOprObj.currentRptPageRst;
-                JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[0]);
+                signatureRelArr.push(ROLE_REL_LIST);
+                JpcJsPDFHelper.outputAsPdf(pageData, pageSize, rpt_names[0], signatureRelArr);
             }
         }
     },

+ 11 - 4
app/service/role_rpt_rel.js

@@ -52,10 +52,17 @@ module.exports = app => {
                 value: tenderId,
                 operate: '=',
             });
-            this.sqlBuilder.setAndWhere('rpt_id', {
-                value: rptId,
-                operate: '=',
-            });
+            if (rptId instanceof Array) {
+                this.sqlBuilder.setAndWhere('rpt_id', {
+                    value: rptId,
+                    operate: 'in',
+                });
+            } else {
+                this.sqlBuilder.setAndWhere('rpt_id', {
+                    value: rptId,
+                    operate: '=',
+                });
+            }
             this.sqlBuilder.columns = ['id', 'tender_id', 'rpt_id', 'rel_content'];
             const [sql, sqlParam] = this.sqlBuilder.build(this.tableName);
             const list = await this.db.query(sql, sqlParam);

+ 1 - 1
app/service/stage.js

@@ -77,7 +77,7 @@ module.exports = app => {
          * @returns {Promise<void>}
          */
         async getValidStagesShort(tenderId) {
-            console.log('tenderId: ' + tenderId);
+            // console.log('tenderId: ' + tenderId);
             const sql = 'select * from zh_stage where tid = ? order by zh_stage.order';
             const sqlParam = [tenderId];
             return await this.db.query(sql, sqlParam);

+ 4 - 4
package-lock.json

@@ -6216,7 +6216,7 @@
       "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==",
       "optional": true,
       "requires": {
-        "nan": "2.12.1",
+        "nan": "2.14.0",
         "node-pre-gyp": "0.10.3"
       },
       "dependencies": {
@@ -9508,9 +9508,9 @@
       }
     },
     "nan": {
-      "version": "2.12.1",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz",
-      "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==",
+      "version": "2.14.0",
+      "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.14.0.tgz",
+      "integrity": "sha1-eBj3IgJ7JFmobwKV1DTR/CM2xSw=",
       "optional": true
     },
     "nanomatch": {

+ 1 - 1
package.json

@@ -19,8 +19,8 @@
     "egg-view-ejs": "^1.1.0",
     "gt3-sdk": "^2.0.0",
     "gulp": "^4.0.0",
-    "jszip": "^3.1.3",
     "js-xlsx": "^0.8.22",
+    "jszip": "^3.1.3",
     "koa-is-json": "^1.0.0",
     "lodash": "^4.17.11",
     "lz-string": "^1.4.4",