Bladeren bron

多表导出Excel签名问题 + code sync

TonyKang 3 jaren geleden
bovenliggende
commit
af4e583083

+ 4 - 0
app/controller/report_controller.js

@@ -726,6 +726,8 @@ module.exports = app => {
                 });
             }
             const roleRelArr = (params.stage_status === 3) ? (await ctx.service.roleRptRel.getRoleRptRelByDetailIds(params.tender_id, params.rpt_ids, params.stage_id)) : [];
+            // console.log(`baseDir: ${baseDir}`);
+            // fsUtil.writeObjToFile(roleRelArr, 'D:/GitHome/temp/签名信息.js');
             const stgAudit = (params.stage_status === 3) ? (await ctx.service.stageAudit.getStageAudit(params.stage_id, params.stage_times)) : [];
             const stgAuditForOrg = (params.stage_status === 3) ? (await ctx.service.stageAudit.getStageAudit(params.stage_id, 1)) : [];
             const stageList = (params.stage_status === 3) ? (await ctx.service.stage.getValidStagesShort(params.tender_id)) : [];
@@ -789,6 +791,8 @@ module.exports = app => {
                     }
                 }
             }
+            // fsUtil.writeObjToFile(pageRstArr, 'D:/GitHome/temp/pageRstArrForExcelAfterReAssign.js');
+            // fsUtil.writeObjToFile(rptRoleRelArr, 'D:/GitHome/temp/签名信息_新.js');
             runnableRst.push(getExcelByPageData(pageRstArr, params.rptName, rptRoleRelArr));
             const uuidRst = await Promise.all(runnableRst);
             ctx.body = { data: uuidRst, waterMarkStr };

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

@@ -132,6 +132,15 @@ let rptArchiveObj = {
         }
     },
 
+    batchArchive: function() {
+        if (zTreeOprObj.checkedRptTplNodes && zTreeOprObj.checkedRptTplNodes.length > 0) {
+            indexDbOprObj.storeReportRequest(current_stage_id, zTreeOprObj.checkedRptTplNodes);
+        }
+    },
+    batchArchiveTest: function() {
+        indexDbOprObj._test();
+    },
+
     _requestArchiveReport: function () {
         let me = rptArchiveObj;
         if (me.currentNode && me.currentArchiveUuid) {

+ 193 - 0
app/public/report/js/rpt_indexDb.js

@@ -0,0 +1,193 @@
+/**
+ * Created by Tony on 2021/11/5.
+ * 实现本地indexDb的业务操作
+ */
+
+const indexDbOprObj = {
+    currentDb: null,
+    iniDb: function (dbName, version) {
+        let rst = window.indexedDB.open(dbName, version);
+        rst.onsuccess = function (event) {
+            indexDbOprObj.currentDb = event.target.result;;
+            console.log('数据库打开成功!');
+        };
+        rst.onupgradeneeded = function (event) {
+            let db = event.target.result;
+            indexDbOprObj.currentDb = db;
+            console.log('数据库升级及初始化!');
+            indexDbOprObj._iniTable(db);
+        }
+    },
+    _iniTable: function(db) {
+        if (db) {
+            //本地表,主要是用来储存报表结果对象,主要是为PDF多表导出用,当然,其他方式也是可以用的(如打印),看实际需要
+            if (!db.objectStoreNames.contains('tb_ReportPages')) {
+                db.createObjectStore('tb_ReportPages', { keyPath: 'id' });
+            }
+            if (!db.objectStoreNames.contains('tb_ReportRequests')) {
+                db.createObjectStore('tb_ReportRequests', { keyPath: 'id' });
+            }
+        }
+    },
+    batchAdd: function (tbName, datas, cb) {
+        let db =  indexDbOprObj.currentDb;
+        let ttlAmt = datas.length;
+        console.log(`已选报表数量:${ttlAmt}`);
+        let cnt = 0;
+        let request = db.transaction([tbName], 'readwrite').objectStore(tbName);
+        request.onsuccess = function (event) {
+            cnt++;
+            console.log(`已选加数量:${cnt}`);
+            if (cnt === ttlAmt && cb) {
+                cb(datas);
+            }
+        };
+        for (let data of datas) {
+            request.add(data);
+        }
+    },
+    _addDummy: function() {
+        let db =  indexDbOprObj.currentDb;
+        // let request = db.transaction(['tb_ReportRequests'], 'readwrite')
+        db.transaction(['tb_ReportRequests'], 'readwrite')
+            .objectStore('tb_ReportRequests')
+            .add({ id: '_2830_1725', name: '多人协同2', pageSize: 'A4', CFG: null, prj_ids: [123,456,789] });
+        // request.onsuccess = function (event) {
+        //     console.log('数据写入成功');
+        // };
+        //
+        // request.onerror = function (event) {
+        //     console.log('数据写入失败');
+        // }
+
+        db.transaction(['tb_ReportRequests'], 'readwrite')
+            .objectStore('tb_ReportRequests')
+            .add({ id: '_2830_1728', name: '多人协同3', pageSize: 'A3', CFG: null, prj_ids: [668] });
+    },
+    _updateDummy: function () {
+        let db =  indexDbOprObj.currentDb;
+        let request = db.transaction(['tb_ReportRequests'], 'readwrite')
+            .objectStore('tb_ReportRequests')
+            .put({ id: '_2830_1725', name: '多人协同2', pageSize: 'A4', CFG: 'CFG', prj_ids: [1,2,3] });
+
+        request.onsuccess = function (event) {
+            console.log('数据写入成功');
+        };
+
+        request.onerror = function (event) {
+            console.log('数据写入失败');
+        }
+    },
+    _getDummy: function () {
+        let db =  indexDbOprObj.currentDb;
+        let transaction = db.transaction(['tb_ReportRequests']);
+        let objectStore = transaction.objectStore('tb_ReportRequests');
+        let request = objectStore.get('_2830_1725');
+
+        request.onerror = function(event) {
+            console.log('事务失败');
+        };
+
+        request.onsuccess = function(event) {
+            if (request.result) {
+                console.log('Name: ' + request.result.name);
+                console.log('PageSize: ' + request.result.pageSize);
+                console.log('CFG: ' + request.result.CFG);
+                console.log('ProjectIds: ' + request.result.prj_ids);
+            } else {
+                console.log('未获得数据记录');
+            }
+        };
+    },
+    _getDummyAll: function (idRst, cb) {
+        let db =  indexDbOprObj.currentDb;
+        let objectStore = db.transaction('tb_ReportRequests').objectStore('tb_ReportRequests');
+
+        objectStore.openCursor().onsuccess = function (event) {
+            let cursor = event.target.result;
+
+            if (cursor) {
+                console.log('Id: ' + cursor.key);
+                console.log('Name: ' + cursor.value.name);
+                console.log('PageSize: ' + cursor.value.pageSize);
+                console.log('gather_select: ' + cursor.value.gather_select);
+                console.log('stage_select: ' + cursor.value.stage_select);
+                console.log('CFG: ');
+                console.log(cursor.value.CFG);
+                if (idRst) {
+                    idRst.push(cursor.key);
+                }
+                cursor.continue();
+            } else {
+                console.log('没有更多数据了!');
+                if (cb) {
+                    cb(idRst);
+                }
+            }
+        };
+    },
+    _removeDummy: function () {
+        let db =  indexDbOprObj.currentDb;
+        let request = db.transaction(['tb_ReportRequests'], 'readwrite')
+            .objectStore('tb_ReportRequests')
+            .delete('_2830_1725');
+
+        request.onsuccess = function (event) {
+            console.log('数据删除成功');
+        };
+
+        request.onerror = function (event) {
+            console.log('数据删除失败');
+        }
+    },
+    _test: function () {
+        // indexDbOprObj._addDummy();
+        // indexDbOprObj._getDummy();
+        let idRst = [];
+        indexDbOprObj._getDummyAll(idRst, (ids)=>{
+            console.log(ids);
+            // indexDbOprObj.removeAll(ids);
+        });
+        // indexDbOprObj._updateDummy();
+        // indexDbOprObj._removeDummy();
+    },
+    storeReportRequest: function (stage_id, rptNodes) {
+        if (rptNodes && rptNodes.length > 0) {
+            let datas = [];
+            for (let node of rptNodes) {
+                let keyStr = `_${stage_id}_${node.refId}`;
+                const gather_select = customSelects.gather_select.find(function (x) {
+                    return x.id === node.refId;
+                });
+                const stage_select = customSelects.stage_select.find(function (x) {
+                    return x.id === node.refId;
+                });
+                let data = {id: keyStr, name: node.name, gather_select, stage_select, pageSize: rptControlObj.getCurrentPageSize(), CFG: CUST_CFG};
+                datas.push(data);
+            }
+            indexDbOprObj.batchAdd('tb_ReportRequests', datas, (rstArr)=>{
+                console.log('batch add succeeded!');
+                console.log(rstArr);
+                //其他操作
+            });
+        }
+    },
+    storeReportPages: function (rptPages, stage_id, rptNode) {
+        //
+    },
+    removeAll: function(idArr) {
+        if (idArr && idArr.length > 0) {
+            let db =  indexDbOprObj.currentDb;
+            let request = db.transaction(['tb_ReportRequests'], 'readwrite').objectStore('tb_ReportRequests');
+            for (let id of idArr) {
+                request.delete(id);
+                request.onsuccess = function (event) {
+                    console.log(`数据('${id}')删除成功`);
+                };
+            }
+        }
+    },
+    getReportPages: function (rpt_id, stage_id) {
+        //
+    }
+};

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

@@ -31,6 +31,8 @@ let rptTplObj = {
 
             rptControlObj.loadPDFFonts();
 
+            indexDbOprObj.iniDb('tmpForPDF', 2);
+
             // dynamicLoadJs('/public/jspdf/SmartSimsun-normal.js');
             // dynamicLoadJs('/public/jspdf/SmartSimsun-bold.js', me.pdfFontSimsunCallBack);
         }

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

@@ -1089,25 +1089,28 @@ function writeDrawings(pageData, signKeyArr, signPathArr, isSinglePage, signShee
     // 优化调整,不再每页都设置一个,重复的签名只需要一个即可(极端case: 13xx多页的签名文档,导出有1.3G大)
     if (isSinglePage) {
         // console.log('singlePage! ');
-        rst.push(writeDrawing(pageData, null, signKeyArr));
+        rst.push(writeDrawing(pageData, null, signKeyArr, 0));
     } else {
         // console.log('pageData! ');
+        // console.log(signKeyArr);
         for (let i = 0; i < pageData.items.length; i++) {
-            if (signSheetIdxArr[i]) {
+            if (true || signSheetIdxArr[i]) {
+            // if (signSheetIdxArr[i]) {
                 // console.log('signKeyArr[' + i + ']');
                 // console.log(signKeyArr[i]);
-                rst.push(writeDrawing(pageData, pageData.items[i], signKeyArr));
+                rst.push(writeDrawing(pageData, pageData.items[i], signKeyArr, i));
             }
         }
     }
     // */
     return rst;
 }
-function writeDrawing(pageData, sheetData, subSignKeyArr) {
+function writeDrawing(pageData, sheetData, subSignKeyArr, sheetIdx) {
     const rst = [];
     const xPos = [];
     const yPos = [];
     const yMultiPos = [];
+    // console.log(`sheetIdx: ${sheetIdx}`);
 
     const private_setSheetDrawingCellData = function(signCell, theYPos, startPicIdx, offsetRow) {
         let cellControl;
@@ -1203,9 +1206,10 @@ function writeDrawing(pageData, sheetData, subSignKeyArr) {
     // console.log(subSignKeyArr);
     if (sheetData) {
         // console.log('sheetData');
-        let startPicIdx = 2;
+        let startPicIdx = 2 + sheetIdx * 1000;
         for (const sCell of sheetData[JV.PROP_SIGNATURE_CELLS]) {
             if (subSignKeyArr.indexOf(sCell.signature_name) >= 0) {
+                // console.log(`sCell.signature_name: ${sCell.signature_name} at index: ${startPicIdx}`);
                 private_setSheetDrawingCellData(sCell, yPos, startPicIdx, 0);
                 startPicIdx++;
             }
@@ -1246,6 +1250,7 @@ function writeDrawing(pageData, sheetData, subSignKeyArr) {
         }
     }
     rst.push('</xdr:wsDr>');
+    // console.log(rst);
     return rst;
 }
 function writeDrawingsRels(amt, startIdx) {
@@ -1422,7 +1427,13 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                 //     }
                 // }
                 // 这里把图片的路径作为key值判断
+                // if (true || signKeyArr.indexOf(signature.signature_name) < 0) {
+                // console.log(`signature: ${signature.signature_name}`);
                 if (signKeyArr.indexOf(signature.signature_name) < 0) {
+                    // console.log(`signature: ${signature.signature_name}`);
+                    if (signature.signature_name === '支表03 清单支付报表(凉山州)_施工单位制表人') {
+                        // console.log(chkRoles);
+                    }
                     if (signature.pic) {
                         const signPath = { signature_name: signature.signature_name,  path: null, pic: null };
                         signPathArr.push(signPath);
@@ -1443,8 +1454,10 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                                     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!
+                                    if (sPObj !== null && isSinglePage) { // 只有在isSinglePage为true时,才需要优化签名
+                                    // if (sPObj !== null) {
+                                        signature.signature_name = sPObj.signature_name; // 重点,如果有相同路径的,修改signature_name!
+                                        signSheetIdxArr[pageIdx] = true;
                                         rst = true;
                                     } else {
                                         const signPath = { signature_name: signature.signature_name, path: null, pic: null };
@@ -1459,6 +1472,9 @@ function _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, roleRel,
                             }
                         }
                     }
+                } else {
+                    // console.log(`duplicate signature: ${signature.signature_name}`);
+                    signSheetIdxArr[pageIdx] = true;
                 }
                 //*/
             }
@@ -1523,7 +1539,9 @@ module.exports = {
         // console.log(thisRoleRel);
 
         // const hasSignature = false; // 暂时不支持电子签名、草图导出excel
+        // fsUtil.writeObjToFile(pageData, 'D:/GitHome/temp/pageRstArrForExcelBeforeSignatureCheck.js');
         const hasSignature = _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, thisRoleRel, signSheetIdxArr, isSinglePage); // 因草图的关系,thisRoleRel是否为null就不是充要的条件
+        // fsUtil.writeObjToFile(pageData, 'D:/GitHome/temp/pageRstArrForExcelAfterSignatureCheck.js');
         // console.log('signKeyArr');
         // console.log(signKeyArr);
         // console.log('signPathArr');
@@ -1616,6 +1634,8 @@ module.exports = {
             // data = writeDrawings(pageData, signKeyArr, signPathArr, false, signSheetIdxArr); // 备注:这里根本不需要考虑是否single page
             // console.log('isSinglePage: ' + isSinglePage);
             // console.log(data);
+            // console.log('signSheetIdxArr: ');
+            // console.log(signSheetIdxArr);
             for (let psIdx = 0; psIdx < data.length; psIdx++) {
                 file = 'drawing' + (psIdx + 1) + '.xml';
                 // console.log('drawing1' + (psIdx + 1) + '.xml data');
@@ -1640,7 +1660,9 @@ module.exports = {
                 /*/
                 data = writeDrawingsRels(signKeyArr.length, relsImgAmt); // 一个drawingX.xml.rels文件与一个drawingX.xml对应
                 relsIdx++;
-                relsImgAmt += signKeyArr.length;
+                if (isSinglePage) {
+                    relsImgAmt += signKeyArr.length;
+                }
                 file = 'drawing' + relsIdx + '.xml.rels';
                 zip_drawings_rels.file(file, data.join(''), { compression: 'DEFLATE' });
                 // */
@@ -1853,8 +1875,9 @@ module.exports = {
             // 3. everything is ok, then call me
             // let roleRel = null; // 未来调用的时候,这个属性要从外面给!!!
             // roleRelArr
+            // fsUtil.writeObjToFile(newPageData, 'D:/GitHome/temp/合并前Excel数据.js');
             me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, custMergeBands, baseDir, roleRelArr, callback);
-            // fsUtil.writeObjToFile(newPageData, 'D:/GitHome/ConstructionOperation/tmp/combinedHeader.js');
+            // fsUtil.writeObjToFile(newPageData, 'D:/GitHome/temp/合并后Excel数据.js');
         } catch (e) {
             console.log(e);
         }

+ 5 - 0
app/view/report/index.ejs

@@ -75,6 +75,10 @@
                                 <div class="panel-body">
                                     <div class="btn-group" role="group">
                                         <button id="btnArchiveRpt" type="button" class="btn btn-outline-primary btn-sm" data-toggle="modal" data-target="#guidang" disabled><i class="fa fa-archive"></i> 归档报表</button>
+                                        <!--
+                                        <button id="btnBatchArchiveRpt" type="button" class="btn btn-outline-primary btn-sm" onclick="rptArchiveObj.batchArchive()"><i class="fa fa-archive"></i>批量归档</button>
+                                        <button id="btnBatchArchiveRpt" type="button" class="btn btn-outline-primary btn-sm" onclick="rptArchiveObj.batchArchiveTest()"><i class="fa fa-archive"></i>测试批量归档</button>
+                                        -->
                                         <div class="btn-group" role="group">
                                             <button id="btnArchiveList" type="button" class="btn btn-success btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" disabled>
                                                 已归档
@@ -309,6 +313,7 @@
 <script type="text/javascript" src="/public/report/js/rpt_print.js"></script>
 <script type="text/javascript" src="/public/report/js/rpt_signature.js"></script>
 <script type="text/javascript" src="/public/report/js/rpt_jspdf.js"></script>
+<script type="text/javascript" src="/public/report/js/rpt_indexDb.js"></script>
 
 <!--
 <script type="text/javascript" src="/public/report/js/rpt_custom.js"></script>