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

导出EXCEL智能分页 + UI微调

TonyKang пре 3 година
родитељ
комит
eff8075010
2 измењених фајлова са 78 додато и 20 уклоњено
  1. 77 19
      app/controller/report_controller.js
  2. 1 1
      app/view/report/index.ejs

+ 77 - 19
app/controller/report_controller.js

@@ -529,7 +529,7 @@ module.exports = app => {
 
             const roleRelArr = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids, params.stage_id)) : [];
             // 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);
+            const pageRstArr = await getMultiRptsCommon(ctx, params, JV.OUTPUT_TYPE_NORMAL, baseDir);
             // console.log('params.stage_status: ' + params.stage_status);
             // fsUtil.writeObjToFile(pageRstArr, 'D:/GitHome/temp/testBuiltPageResult.js');
             for (const pageRst of pageRstArr) {
@@ -543,11 +543,11 @@ module.exports = app => {
                 // 加水印(注意:还得看用户设置是否需要加水印)
                 fillWaterMark(pageRstArr);
                 if (params.needWaterMark) {
-                    waterMarkStr = await getWatermarkPicData(pageRstArr[0], this.app.baseDir);
+                    waterMarkStr = await getWatermarkPicData(pageRstArr[0], baseDir);
                 }
             }
 
-            await this.ctx.helper.recursiveMkdirSync(this.app.baseDir + '/app/public/download');
+            await this.ctx.helper.recursiveMkdirSync(baseDir + '/app/public/download');
 
             const runnableRst = [];
             /*
@@ -568,13 +568,9 @@ module.exports = app => {
                 runnableRst.push(getExcelByPageData(pageRstArr[idx], params.rpt_names[idx], roleRel));
             }
             /*/
-            for (let pageRst of pageRstArr) {
-                // _chkIfNeedBreakPage(pageRst);
-            }
-            const pageBrkAmt = 300;
-            const newRptNames = []; // 这个为导出PDF控制分页用
-            const newPageDataRst = _resetPageDataByBreaks(pageRstArr, pageBrkAmt, params.rpt_names, newRptNames);
-            for (let idx = 0; idx < newPageDataRst.length; idx++) {
+            // 1. merge签名相关信息
+            const pageBrkSize = 6291456; // 6M, 1024*1024*6
+            for (let idx = 0; idx < pageRstArr.length; idx++) {
                 let roleRel = null;
                 for (const roleR of roleRelArr) {
                     if (roleR.rpt_id === params.rpt_ids[idx]) {
@@ -583,10 +579,32 @@ module.exports = app => {
                     }
                 }
                 if (params.stage_status === 3) {
-                    mergeSignAudit(newPageDataRst[idx], roleRel, stgAudit);
-                    mergeSignDate(newPageDataRst[idx], params.stage_id, roleRel, stgAudit, stgAuditForOrg, stageList);
+                    mergeSignAudit(pageRstArr[idx], roleRel, stgAudit);
+                    mergeSignDate(pageRstArr[idx], params.stage_id, roleRel, stgAudit, stgAuditForOrg, stageList);
+                }
+
+                // 2. 判断草图大小是否需要分页
+                const picSize = await _chkRawPicSize(pageRstArr[idx], baseDir);
+                if (picSize > pageBrkSize) {
+                    // let pageBrkAmt = Math.ceil(picSize / pageBrkSize);
+                    let pageBrkAmt = Math.floor(pageRstArr[idx].items.length / Math.ceil(picSize / pageBrkSize));
+                    if (pageBrkAmt < 10) {
+                        // 不用管
+                    } else if (pageBrkAmt < 100) {
+                        pageBrkAmt = Math.floor(pageBrkAmt / 10) * 10;
+                    } else if (pageBrkAmt < 1000) {
+                        pageBrkAmt = Math.floor(pageBrkAmt / 100) * 100;
+                    } else {
+                        // 暂时不管
+                    }
+                    const newRptNames = []; // 这个为导出控制分页用
+                    const newPageDataRst = _resetPageDataByBreaks([pageRstArr[idx]], pageBrkAmt, [params.rpt_names[idx]], newRptNames);
+                    for (let dtlIdx = 0; dtlIdx < newPageDataRst.length; dtlIdx++) {
+                        runnableRst.push(getExcelByPageData(newPageDataRst[dtlIdx], newRptNames[dtlIdx], roleRel));
+                    }
+                } else {
+                    runnableRst.push(getExcelByPageData(pageRstArr[idx], params.rpt_names[idx], null));
                 }
-                runnableRst.push(getExcelByPageData(newPageDataRst[idx], newRptNames[idx], roleRel));
             }
             // */
             // fsUtil.writeObjToFile(pageRstArr, 'D:/GitHome/temp/计量导出pageArr.js');
@@ -610,7 +628,32 @@ module.exports = app => {
             }
             const pageRst = JSON.parse(fs.readFileSync('D:/GitHome/temp/计量excel原始数据_A3BZ6_5384_112表(清单).js', 'utf-8'));
             const runnableRst = [];
-            runnableRst.push(getExcelByPageData(pageRst, '工程计量表(计量单元-清单)', null));
+
+            const pageBrkSize = 6291456; // 6M, 1024*1024*6
+            // const pageBrkSize = 1048576; // 1M, 1024*1024*1
+            const picSize = await _chkRawPicSize(pageRst, baseDir);
+            if (picSize > pageBrkSize) {
+                let pageBrkAmt = Math.floor(pageRst.items.length / Math.ceil(picSize / pageBrkSize));
+                console.log('pageBrkAmt:' + pageBrkAmt);
+                if (pageBrkAmt < 10) {
+                    // 不用管
+                } else if (pageBrkAmt < 100) {
+                    pageBrkAmt = Math.floor(pageBrkAmt / 10) * 10;
+                } else if (pageBrkAmt < 1000) {
+                    pageBrkAmt = Math.floor(pageBrkAmt / 100) * 100;
+                } else {
+                    // 暂时不管
+                }
+                const newRptNames = []; // 这个为导出控制分页用
+                const newPageDataRst = _resetPageDataByBreaks([pageRst], pageBrkAmt, ['工程计量表(计量单元-清单)'], newRptNames);
+                for (let dtlIdx = 0; dtlIdx < newPageDataRst.length; dtlIdx++) {
+                    runnableRst.push(getExcelByPageData(newPageDataRst[dtlIdx], newRptNames[dtlIdx], null));
+                }
+            } else {
+                runnableRst.push(getExcelByPageData(pageRst, '工程计量表(计量单元-清单)', null));
+            }
+
+
             const uuidRst = await Promise.all(runnableRst);
             ctx.body = { data: uuidRst, waterMarkStr: null };
             ctx.status = 201;
@@ -1424,21 +1467,36 @@ function _getSignDateDftName() {
     return '    年  月  日';
 }
 
-function _chkIfNeedBreakPage(pageData) {
-    let rst = -1, hasPic = false, picSize = 0;
+async function _chkRawPicSize(pageData, baseDir) {
+    let rst = 0;
     const picKeys = [];
-    // fs.statSync(`${filesPath}${file}`).size
     for (let pi = 0; pi < pageData.items.length; pi++) {
         // 每页判断
         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 && picPath.indexOf('/sign') < 0 && picKeys.indexOf(picPath) < 0) {
+            if (picPath && picKeys.indexOf(picPath) < 0) {
+                // 签名图片也要计算在内,反正不重复
                 picKeys.push(picPath);
-                hasPic = true;
             }
             // signature_cells PROP_SIGNATURE_CELLS
         }
     }
+    for (const pKey of picKeys) {
+        const filePath = `${baseDir}/app${pKey}`;
+        const isExist = await isFileExisted(filePath);
+        if (isExist) {
+            const obj = fs.statSync(filePath);
+            if (obj) {
+                rst += obj.size;
+            } else {
+                console.log('no statSync resutl: ' + filePath);
+            }
+            // rst += fs.statSync(filePath).size;
+        } else {
+            console.log(`${pKey} not exists!`);
+        }
+    }
     return rst;
 }
 

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

@@ -56,7 +56,7 @@
                             <div class="panel">
                                 <div class="panel-body" id="export_div">
                                     <div class="btn-group" role="group" aria-label="Button group with nested dropdown">
-                                        <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.checkAndGetExcel()" <% if (pageShow !== null && parseInt(pageShow.closeExportExcel) === 1) { %> disabled <% } %> ><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-secondary">0</span></button>
+                                        <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.checkAndGetExcel()" <% if (pageShow !== null && parseInt(pageShow.closeExportExcel) === 1) { %> disabled <% } %> ><i class="fa fa-file-excel-o"></i> Excel <span class="badge badge-primary">0</span></button>
                                         <button type="button" class="btn btn-outline-primary btn-sm" id="show_excel_output_cfg" data-toggle="modal" data-target="#export_excel" style="display:none"></button>
                                         <button type="button" class="btn btn-outline-primary btn-sm" onclick="rptControlObj.getPDFPre()" <% if (pageShow !== null && parseInt(pageShow.closeExportPdf) === 1) { %> disabled <% } %> ><i class="fa fa-file-pdf-o"></i> PDF <span class="badge badge-primary">0</span></button>
                                     </div>