Parcourir la source

优化导出Excel签名图片重复占用空间

TonyKang il y a 4 ans
Parent
commit
2279ba7819
1 fichiers modifiés avec 120 ajouts et 9 suppressions
  1. 120 9
      app/reports/util/rpt_excel_util.js

+ 120 - 9
app/reports/util/rpt_excel_util.js

@@ -1062,6 +1062,7 @@ function writeImage(path, pic, baseDir) {
 }
 function writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signSheetIdxArr) {
     const rst = [];
+    /*
     // console.log('isSinglePage: ' + isSinglePage);
     if (isSinglePage) {
         // console.log('singlePage! ');
@@ -1076,6 +1077,22 @@ function writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signShee
             }
         }
     }
+    /*/
+    // 优化调整,不再每页都设置一个,重复的签名只需要一个即可(极端case: 13xx多页的签名文档,导出有1.3G大)
+    if (isSinglePage) {
+        // console.log('singlePage! ');
+        rst.push(writeDrawing(pageData, null, signKeyArr));
+    } 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));
+            }
+        }
+    }
+    // */
     return rst;
 }
 function writeDrawing(pageData, sheetData, subSignKeyArr) {
@@ -1312,20 +1329,31 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
     } else {
         if (roleRel) chkRoles.push(roleRel);
     }
+    const _getDupPicPath = function(path) {
+        let rst = null;
+        for (const sp of signPathArr) {
+            if (sp.path === path) {
+                rst = sp;
+                break;
+            }
+        }
+        return rst;
+    };
     // console.log(chkRoles);
     // console.log(signKeyArr);
     // for (const page of pageData.items) {
     for (let pageIdx = 0; pageIdx < pageData.items.length; pageIdx++) {
         const page = pageData.items[pageIdx];
-        if (isSinglePage) {
-            if (pageIdx === 0) {
-                signKeyArr.push([]);
-                signPathArr.push([]);
-            }
-        } else {
-            signKeyArr.push([]);
-            signPathArr.push([]);
-        }
+        // if (isSinglePage) {
+        //     if (pageIdx === 0) {
+        //         signKeyArr.push([]);
+        //         signPathArr.push([]);
+        //     }
+        // } else {
+        //     signKeyArr.push([]);
+        //     signPathArr.push([]);
+        // }
+        // 优化调整,不再每页都设置一个,重复的签名只需要一个即可(极端case: 13xx多页的签名文档,导出有1.3G大)
         const curSignIdx = signKeyArr.length - 1;
         signSheetIdxArr[pageIdx] = false;
         // console.log('page index: ' + pageIdx);
@@ -1340,6 +1368,7 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                 //     rst = true;
                 //     signSheetIdxArr[pageIdx] = true;
                 // }
+                /*
                 if (signKeyArr[curSignIdx].indexOf(signature.signature_name) < 0) {
                     if (signature.pic) {
                         const signPath = { path: null, pic: null };
@@ -1372,11 +1401,64 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                         }
                     }
                 }
+                /*/
+                // let tgKey = signature.signature_name;
+                // for (const role of chkRoles) {
+                //     if (signature.signature_name === role.signature_name) {
+                //         if (role.sign_pic) {
+                //             //
+                //         } else if (role.sign_path) {
+                //             tgKey = role.sign_path;
+                //         }
+                //         break;
+                //     }
+                // }
+                // 这里把图片的路径作为key值判断
+                if (signKeyArr.indexOf(signature.signature_name) < 0) {
+                    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 (role.sign_pic) {
+                                    const signPath = { signature_name: signature.signature_name, path: null, pic: null };
+                                    signPathArr.push(signPath);
+                                    signPath.pic = role.sign_pic;
+                                    signKeyArr.push(signature.signature_name);
+                                    rst = true;
+                                    signSheetIdxArr[pageIdx] = true;
+                                } else if (role.sign_path) {
+                                    let sPObj = _getDupPicPath(role.sign_path);
+                                    if (sPObj !== null) {
+                                        signature.signature_name = sPObj.signature_name; //重点,如果有相同路径的,修改signature_name!
+                                        rst = true;
+                                    } else {
+                                        const signPath = { signature_name: signature.signature_name, path: null, pic: null };
+                                        signPathArr.push(signPath);
+                                        signPath.path = role.sign_path;
+                                        signKeyArr.push(signature.signature_name);
+                                        rst = true;
+                                        signSheetIdxArr[pageIdx] = true;
+                                    }
+                                }
+                                break;
+                            }
+                        }
+                    }
+                }
+                //*/
             }
         }
         if (page[JV.PROP_WATERMARK_CELLS] && page[JV.PROP_WATERMARK_CELLS].length > 0) {
             // 水印,单独处理
             const waterMarkCell = page[JV.PROP_WATERMARK_CELLS][0];
+            /*
             if (signKeyArr[curSignIdx].indexOf(waterMarkCell.signature_name) < 0) {
                 // console.log('waterMarkCell');
                 // console.log(waterMarkCell);
@@ -1388,6 +1470,17 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                 rst = true;
                 signSheetIdxArr[pageIdx] = true;
             }
+            /*/
+            if (signKeyArr.indexOf(waterMarkCell.signature_name) < 0) {
+                const signPath = { path: null, pic: null };
+                signPathArr.push(signPath);
+                signPath.pic = waterMarkCell.pic;
+                signPath.path = waterMarkCell.path;
+                signKeyArr.push(waterMarkCell.signature_name);
+                rst = true;
+                signSheetIdxArr[pageIdx] = true;
+            }
+            //*/
         }
     }
     return rst;
@@ -1489,6 +1582,7 @@ module.exports = {
             let picIdx = 0;
             // console.log(signKeyArr);
             // console.log(signPathArr);
+            /*
             for (let signIdx = 0; signIdx < signPathArr.length; signIdx++) {
                 if (signKeyArr[signIdx].length > 0) {
                     for (let pathIdx = 0; pathIdx < signPathArr[signIdx].length; pathIdx++) {
@@ -1499,6 +1593,15 @@ module.exports = {
                     }
                 }
             }
+            /*/
+            // 优化调整,不再每页都设置一个,重复的签名只需要一个即可(极端case: 13xx多页的签名文档,导出有1.3G大)
+            for (let pathIdx = 0; pathIdx < signPathArr.length; pathIdx++) {
+                picIdx++;
+                data = writeImage(signPathArr[pathIdx].path, signPathArr[pathIdx].pic, baseDir);
+                file = 'image' + picIdx + '.png';
+                zip_media.file(file, data, { compression: 'DEFLATE' });
+            }
+            //*/
             // 5.2
             const zip_drawings = zip_xl.folder('drawings');
             data = writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signSheetIdxArr);
@@ -1516,6 +1619,7 @@ module.exports = {
             let relsIdx = 0;
             let relsImgAmt = 0;
             for (let ssIdx = 0; ssIdx < signKeyArr.length; ssIdx++) {
+                /*
                 if (signKeyArr[ssIdx].length > 0) {
                     data = writeDrawingsRels(signKeyArr[ssIdx].length, relsImgAmt); // 一个drawingX.xml.rels文件与一个drawingX.xml对应
                     relsIdx++;
@@ -1525,6 +1629,13 @@ module.exports = {
                     file = 'drawing' + relsIdx + '.xml.rels';
                     zip_drawings_rels.file(file, data.join(''), { compression: 'DEFLATE' });
                 }
+                /*/
+                data = writeDrawingsRels(signKeyArr.length, relsImgAmt); // 一个drawingX.xml.rels文件与一个drawingX.xml对应
+                relsIdx++;
+                relsImgAmt += signKeyArr.length;
+                file = 'drawing' + relsIdx + '.xml.rels';
+                zip_drawings_rels.file(file, data.join(''), { compression: 'DEFLATE' });
+                // */
             }
         }
         // console.log('step 5');