瀏覽代碼

账单式草图预览问题

TonyKang 5 年之前
父節點
當前提交
b93d3bec30

+ 32 - 0
app/controller/report_controller.js

@@ -127,6 +127,7 @@ module.exports = app => {
                 // console.log('after role stage!');
                 // console.log(roleRel);
                 await encodeSignatureDataUri(roleRel, this.app.baseDir);
+                await encodeDummySignatureDataUri(pageRst, this.app.baseDir);
                 // console.log('encodeSignatureDataUri!');
                 ctx.body = { data: pageRst, signatureRelInfo: roleRel, stageAudit: stgAudit };
                 // ctx.body = { data: { msg: 'test the network' } };
@@ -150,6 +151,9 @@ module.exports = app => {
             const roleRel = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids)) : [];
             // const roleRel = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_tpl_id)) : [];
             await encodeSignatureDataUri(roleRel, this.app.baseDir);
+            for (const pageRst of pageRstArr) {
+                await encodeDummySignatureDataUri(pageRst, this.app.baseDir);
+            }
             // console.log(pageRstArr);
             ctx.body = { data: pageRstArr, signatureRelInfo: roleRel };
             ctx.status = 201;
@@ -685,3 +689,31 @@ async function encodeSignatureDataUri(roleRel, baseDir) {
         }
     }
 }
+
+async function encodeDummySignatureDataUri(pageRst, baseDir) {
+    if (pageRst) {
+        for (const page of pageRst.items) {
+            for (const signature of page.signature_cells) {
+                if (signature.signature_name === JV.SIGNATURE_NAME_DUMMY) {
+                    if (signature.path !== '') {
+                        const filePath = baseDir + '/app' + signature.path;
+                        try {
+                            const res = await isFileExisted(filePath);
+                            if (res) {
+                                const bData = fs.readFileSync(filePath);
+                                const base64Str = bData.toString('base64');
+                                const datauri = 'data:image/png;base64,' + base64Str;
+                                signature.pic = datauri;
+                                signature.path = '';
+                            } else {
+                                console.log('文件不存在:' + filePath);
+                            }
+                        } catch (err) {
+                            console.error(err);
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 2 - 0
app/public/js/rpt_value_define.js

@@ -208,6 +208,8 @@ const JV = {
     RUN_TYPE_BEFORE_PAGING: "before_paging",
     RUN_TYPE_BEFORE_OUTPUT: "before_output",
 
+    SIGNATURE_NAME_DUMMY: 'dummy_pic',
+
     PAGE_STATUS: ["EveryPage","FirstPage", "LastPage", "SegmentStart", "SegmentEnd", "Group", "CrossRowEnd", "CrossColEnd"],
 
     CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap", "VerticalForExcel", "ShrinkFirst", "CloseOutput"],

+ 13 - 2
app/public/report/js/jpc_output.js

@@ -363,7 +363,12 @@ let JpcCanvasOutput = {
                 const img = new Image();
                 img.src = cell.pic;
                 img.onload = function() {
-                    private_drawImage(cell, control, img);
+                    if (cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
+                        private_drawImage(cell, control, img, [1, 1, 1, 1]);
+                    } else {
+                        private_drawImage(cell, control, img);
+                    }
+                    // private_drawImage(cell, control, img);
                 };
             }
         }
@@ -406,8 +411,14 @@ let JpcCanvasOutput = {
             rst[3] = rst[3] + JpcCanvasOutput.offsetY;
             return rst;
         }
-        function private_drawImage(cell, control, imageData) {
+        function private_drawImage(cell, control, imageData, offsetArea) {
             let area = private_getProperSignatureArea(cell, control);
+            if (offsetArea) {
+                area[0] = area[0] + offsetArea[0]; // Left
+                area[1] = area[1] + offsetArea[1]; // Top
+                area[2] = area[2] - offsetArea[2]; // Right
+                area[3] = area[3] - offsetArea[3]; // Bottom
+            }
             ctx.drawImage(imageData, area[0] * JpcCanvasOutput.scaleFactor, area[1] * JpcCanvasOutput.scaleFactor,
                 (area[2] - area[0]) * JpcCanvasOutput.scaleFactor, (area[3] - area[1]) * JpcCanvasOutput.scaleFactor);
         }

+ 2 - 0
app/public/report/js/jpc_output_value_define.js

@@ -33,6 +33,8 @@ let JV = {
     IDX_RIGHT: 2,
     IDX_BOTTOM: 3,
 
+    SIGNATURE_NAME_DUMMY: 'dummy_pic',
+
     CONTROL_PROPS: ["Shrink", "ShowZero", "Horizon", "Vertical", "Wrap", "VerticalForExcel", "ShrinkFirst", "CloseOutput"],
     CONTROL_PROP_IDX_SHRINK: 0,
     CONTROL_PROP_IDX_SHOW_ZERO: 1,

+ 12 - 2
app/public/report/js/rpt_jspdf.js

@@ -123,7 +123,11 @@ let JpcJsPDFHelper = {
                 control = cell[JV.PROP_CONTROL];
             }
             if (cell.pic) {
-                private_drawImage(doc, ctx, cell, control, cell.pic);
+                if (cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
+                    private_drawImage(doc, ctx, cell, control, cell.pic, [1, 1, 1, 1]);
+                } else {
+                    private_drawImage(doc, ctx, cell, control, cell.pic);
+                }
             } else if (cell.path) {
                 let finded = false;
                 for (const rtpSignRel of signatureRelArr) {
@@ -180,8 +184,14 @@ let JpcJsPDFHelper = {
             return rst;
         }
 
-        function private_drawImage(doc, ctx, cell, control, imageData) {
+        function private_drawImage(doc, ctx, cell, control, imageData, offsetArea) {
             let area = private_getProperSignatureArea(cell, control);
+            if (offsetArea) {
+                area[0] = area[0] + offsetArea[0]; // Left
+                area[1] = area[1] + offsetArea[1]; // Top
+                area[2] = area[2] - offsetArea[2]; // Right
+                area[3] = area[3] - offsetArea[3]; // Bottom
+            }
             doc.addImage(imageData, 'PNG', area[0] * PDF_SCALE, area[1] * PDF_SCALE,
                 (area[2] - area[0]) * PDF_SCALE, (area[3] - area[1]) * PDF_SCALE);
         }

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

@@ -241,6 +241,12 @@ function buildImage(destRst, cell, control, offsetX, offsetY, adjustY, isHtoV, H
         href = 'xlink:href="' + cell.path +'"';
     }
     const area = getProperSignatureArea(cell, control, offsetX, offsetY);
+    if (cell.signature_name === JV.SIGNATURE_NAME_DUMMY) {
+        area[0] = area[0] + 1; // Left
+        area[1] = area[1] + 1; // Top
+        area[2] = area[2] - 1; // Right
+        area[3] = area[3] - 1; // Bottom
+    }
     destRst.push('<image x="' + area[0] + '" y="' + area[1] + '" width="' + (area[2] - area[0]) + '" height="' + (area[3] - area[1]) + '" ');
     destRst.push(href + HtoVStr + ' />');
 }

+ 17 - 1
app/reports/rpt_component/jpc_bill_tab.js

@@ -125,10 +125,12 @@ JpcBillTabSrv.prototype.createNew = function() {
                 let flexiblePrecisionRefObj = null;
                 let flexibleRefField;
                 let precision_ref_data;
+                let isPic = false;
                 for (let i = 0; i < tab_fields.length; i++) {
                     const tab_field = tab_fields[i];
                     let data_field = null;
                     const map_data_field = JE.F(tab_field[JV.PROP_FIELD_ID], $CURRENT_RPT);
+                    isPic = (map_data_field.isPic !== undefined && map_data_field.isPic);
                     if (me.disp_fields_idx.length > i && me.disp_fields_idx[i] !== JV.BLANK_FIELD_INDEX && (typeof me.disp_fields_idx[i] !== 'object')) {
                         data_field = data_details[me.disp_fields_idx[i]];
                     } else {
@@ -153,7 +155,21 @@ JpcBillTabSrv.prototype.createNew = function() {
                         const val = JpcFieldHelper.getValue(data_field, page - 1);
                         const cellItem = JpcCommonOutputHelper.createCommonOutput(tab_field, val, controls);
                         cellItem[JV.PROP_AREA] = JpcAreaHelper.outputArea(tab_field[JV.PROP_AREA], band, unitFactor, 1, 0, 1, 0, 1, 0, false, false);
-                        rst.push(cellItem);
+
+                        if (isPic && cellItem[JV.PROP_VALUE] !== undefined && cellItem[JV.PROP_VALUE] !== null && cellItem[JV.PROP_VALUE] !== '') {
+                            if (Array.isArray(me.signatureRst)) {
+                                if (cellItem[JV.PROP_VALUE][0] !== '/') {
+                                    cellItem[JV.PROP_VALUE] = '/' + cellItem[JV.PROP_VALUE];
+                                }
+                                const signatureItem = { signature_name: JV.SIGNATURE_NAME_DUMMY, path: cellItem[JV.PROP_VALUE], pic: null }; // 这里的pic数据在指标中里已经处理过了
+                                signatureItem[JV.PROP_CONTROL] = cellItem[[JV.PROP_CONTROL]];
+                                signatureItem[JV.PROP_STYLE] = cellItem[[JV.PROP_STYLE]];
+                                signatureItem[JV.PROP_AREA] = cellItem[JV.PROP_AREA];
+                                me.signatureRst.push(signatureItem);
+                            }
+                        } else {
+                            rst.push(cellItem);
+                        }
                     }
                 }
                 if (tab[JV.PROP_TEXT]) {

+ 44 - 15
app/reports/util/rpt_excel_util.js

@@ -960,7 +960,7 @@ function writeImage(path, pic, baseDir) {
 }
 function writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signSheetIdxArr) {
     const rst = [];
-    console.log('isSinglePage: ' + isSinglePage);
+    // console.log('isSinglePage: ' + isSinglePage);
     if (isSinglePage) {
         rst.push(writeDrawing(pageData, null, signKeyArr[0]));
     } else {
@@ -1121,15 +1121,35 @@ function mergeProperties(orgObj, newObj) {
         }
     }
 }
+
+function resetDummuySignature(pageData, roleRel) {
+    // 备注:计算草图等其他图形需要额外做些处理
+    let dummySignIdx = 0;
+    for (let pageIdx = 0; pageIdx < pageData.items.length; pageIdx++) {
+        const page = pageData.items[pageIdx];
+        if (page[JV.PROP_SIGNATURE_CELLS] && page[JV.PROP_SIGNATURE_CELLS].length > 0) {
+            for (const signature of page[JV.PROP_SIGNATURE_CELLS]) {
+                if (signature.signature_name.indexOf(JV.SIGNATURE_NAME_DUMMY) >= 0) {
+                    // 表示这是一个其他类型的非原生电子签名图,只是借用signature的处理机制,每个图都是唯一的,所以需要重新给个唯一的新signature_name
+                    signature.signature_name = signature.signature_name + '_' + pageIdx + '_' + dummySignIdx;
+                    dummySignIdx++;
+                    const roleRelItem = { type: '用户', sign_path: signature.path, signature_name: signature.signature_name };
+                    roleRel.push(roleRelItem);
+                }
+            }
+        }
+    }
+}
+
 function checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel, signSheetIdxArr) {
     // 备注:电子签名是以图形的方式处理,一页可以有多个签名,多页的签名基本是引用同样的图片,在这里先处理一下,后期统一引用。
-    //      另:以后的图片(在电子签名(signature_cells)以外的图片)会单独处理(如计算图等)
+    //      另:以后的图片(在电子签名(signature_cells)以外的图片)会单独处理(如计算图等)
     let rst = false;
     let chkRoles = [];
     if (roleRel instanceof Array) {
         chkRoles = roleRel;
     } else {
-        chkRoles.push(roleRel);
+        if (roleRel) chkRoles.push(roleRel);
     }
     // console.log(chkRoles);
     // console.log(signKeyArr);
@@ -1139,16 +1159,18 @@ function checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel, s
         signKeyArr.push([]);
         signPathArr.push([]);
         signSheetIdxArr[pageIdx] = false;
+        // console.log('page index: ' + pageIdx);
+        // console.log(page[JV.PROP_SIGNATURE_CELLS]);
         if (page[JV.PROP_SIGNATURE_CELLS] && page[JV.PROP_SIGNATURE_CELLS].length > 0) {
-            // console.log('page index: ' + pageIdx);
-            // console.log(page[JV.PROP_SIGNATURE_CELLS]);
-            let dummySignIdx = 0;
+            // let dummySignIdx = 0;
             for (const signature of page[JV.PROP_SIGNATURE_CELLS]) {
-                if (signature.signature_name === JV.SIGNATURE_NAME_DUMMY) {
-                    // 表示这是一个其他类型的非原生电子签名图,只是借用signature的处理机制,每个图都是唯一的,所以需要重新给个唯一的新signature_name
-                    signature.signature_name = signature.signature_name + '_' + pageIdx + '_' + dummySignIdx;
-                    dummySignIdx++;
-                }
+                // if (signature.signature_name.indexOf(JV.SIGNATURE_NAME_DUMMY) >= 0) {
+                //     // 表示这是一个其他类型的非原生电子签名图,只是借用signature的处理机制,每个图都是唯一的,所以需要重新给个唯一的新signature_name
+                //     signature.signature_name = signature.signature_name + '_' + pageIdx + '_' + dummySignIdx;
+                //     dummySignIdx++;
+                //     rst = true;
+                //     signSheetIdxArr[pageIdx] = true;
+                // }
                 if (signKeyArr[pageIdx].indexOf(signature.signature_name) < 0) {
                     if (signature.pic) {
                         const signPath = { path: null, pic: null };
@@ -1207,10 +1229,17 @@ module.exports = {
         const signSheetIdxArr = []; // 确定哪些sheet有签名(在多表导出的时候,有些表可能没有签名,但其他的表有签名)
         // console.log('in exportExcel!');
         // console.log(roleRel);
-        const hasSignature = (roleRel !== null) ? checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel, signSheetIdxArr) : false;
-        // console.log('signSheetIdxArr');
-        // console.log(signSheetIdxArr);
-        // const hasSignature = false;
+        // const hasSignature = (roleRel !== null) ? checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel, signSheetIdxArr) : false;
+        let thisRoleRel = [];
+        if (roleRel !== null && roleRel !== undefined) {
+            thisRoleRel = roleRel;
+        }
+        resetDummuySignature(pageData, thisRoleRel); // 把草图转换一下roleRel
+        // console.log(thisRoleRel);
+        // const hasSignature = checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, thisRoleRel, signSheetIdxArr); // 因草图的关系,thisRoleRel是否为null就不是充要的条件
+        // console.log('signKeyArr');
+        // console.log(signKeyArr);
+        const hasSignature = false;
         // console.log('hasSignature: ' + hasSignature);
         if (isSinglePage) {
             sheets.push({ sheetName: '全部页' });