Browse Source

Merge branch 'dev' of http://192.168.1.41:3000/maixinrong/Calculation into dev

Conflicts:
	sql/update.sql
MaiXinRong 3 năm trước cách đây
mục cha
commit
750e6ff91a

+ 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);
         }

+ 31 - 8
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 (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);
         }

+ 2 - 0
app/service/change.js

@@ -748,6 +748,8 @@ module.exports = app => {
 
                     await this.ctx.service.tenderTag.saveTenderTag(changeData.tid, { bgl_time: new Date() }, this.transaction);
 
+                    await this.ctx.service.changeAuditList.updateToLedger(this.transaction, changeData.tid, changeData.cid);
+
                     // 添加短信通知-审批通过提醒功能
                     // const mobile_array = [];
                     const auditList = await this.ctx.service.changeAudit.getListGroupByTimes(changeData.cid, changeData.times);

+ 131 - 2
app/service/change_audit_list.js

@@ -448,7 +448,6 @@ module.exports = app => {
                                     tid,
                                 };
                                 delData[column] = d.id;
-                                console.log(delData);
                                 await transaction.delete(this.tableName, delData);
                             } else {
                                 const options = {
@@ -493,7 +492,6 @@ module.exports = app => {
                                 // 再找出上一个项目节节点并更新
                                 this.newBills = false;
                                 const parents = await this.ctx.service.changeLedger.getDataByKid(tid, select.ledger_pid);
-                                console.log('hello :', parents);
                                 d.xmj_code = parents.code;
                                 d.xmj_jldy = parents.name;
                             }
@@ -727,6 +725,137 @@ module.exports = app => {
                 }
             }
         }
+
+        async updateToLedger(transaction, tid, cid) {
+            // 找出本条变更属于新增部位的数据
+            const sql = 'SELECT a.* FROM ?? a LEFT JOIN ?? b ON a.id = b.gcl_id WHERE b.tid = ? AND b.cid = ? GROUP BY a.id';
+            const sqlParam = [this.ctx.service.changeLedger.tableName, this.tableName, tid, cid];
+            const result = await transaction.query(sql, sqlParam);
+            const sql2 = 'SELECT a.* FROM ?? a LEFT JOIN ?? b ON a.id = b.mx_id WHERE b.tid = ? AND b.cid = ?';
+            const sqlParam2 = [this.ctx.service.changePos.tableName, this.tableName, tid, cid];
+            const result2 = await transaction.query(sql2, sqlParam2);
+            if (result.length > 0 || result2.length > 0) {
+                const changeLedgerGclIdList = this._.map(result, 'id');
+                const changeLedgerIdList = this._.uniq(this._.map(result, 'ledger_pid'));// 父节点集合
+                const needUpdateLedgerList = [];// 找出需要更新的原台账清单的id
+                const needUpdateChangeLedgerList = [];// 找出需要更新的新台账清单的id
+                const tpDecimal = this.ctx.tender.info.decimal.tp;
+                // 要更新的ledger节点,数量及总数
+                for (const data of result2) {
+                    if (this._.indexOf(changeLedgerGclIdList, data.lid) === -1) {
+                        const info = this._.find(needUpdateLedgerList, { id: data.lid });
+                        if (info) {
+                            info.quantity = this.ctx.helper.add(info.quantity, data.quantity);
+                        } else {
+                            needUpdateLedgerList.push({ id: data.lid, quantity: data.quantity });
+                        }
+                    } else {
+                        const info = this._.find(needUpdateChangeLedgerList, { id: data.lid });
+                        if (info) {
+                            info.quantity = this.ctx.helper.add(info.quantity, data.quantity);
+                        } else {
+                            needUpdateChangeLedgerList.push({ id: data.lid, quantity: data.quantity });
+                        }
+                    }
+                }
+                // 更新到result上
+                if (needUpdateChangeLedgerList.length > 0) {
+                    for (const nucl of needUpdateChangeLedgerList) {
+                        const now = this._.find(result, { id: nucl.id });
+                        now.quantity = nucl.quantity;
+                        now.sgfh_qty = nucl.quantity;
+                        now.sgfh_tp = this.ctx.helper.mul(now.sgfh_qty, now.unit_price, tpDecimal);
+                        now.total_price = this.ctx.helper.mul(now.quantity, now.unit_price, tpDecimal);
+                    }
+                }
+                // 更新到ledger上
+                if (needUpdateLedgerList.length > 0) {
+                    for (const nul of needUpdateLedgerList) {
+                        const ledgerInfo = await this.ctx.service.ledger.getDataById(nul.id);
+                        ledgerInfo.quantity = this.ctx.helper.add(ledgerInfo.quantity, nul.quantity);
+                        ledgerInfo.sgfh_qty = this.ctx.helper.add(ledgerInfo.sgfh_qty, nul.quantity);
+                        ledgerInfo.sgfh_tp = this.ctx.helper.mul(ledgerInfo.sgfh_qty, ledgerInfo.unit_price, tpDecimal);
+                        ledgerInfo.total_price = this.ctx.helper.mul(ledgerInfo.quantity, ledgerInfo.unit_price, tpDecimal);
+                        await transaction.update(this.ctx.service.ledger.tableName, ledgerInfo);
+                    }
+                }
+                // 找出所有新增的父节点并插入到result中
+                for (const r of changeLedgerIdList) {
+                    await this._findParents(transaction, tid, r, result);
+                }
+                // 插入到计量单元表,并删除变更的计量单元数据, 插入清单表,并删除变更的清单表
+                await this._insertByChangeRevise(transaction, tid, result, result2);
+                // 更新标段总金额
+                const sumSql = 'SELECT Sum(total_price) As total_price, Sum(deal_tp) As deal_tp' +
+                    '  FROM ' + this.ctx.service.ledger.tableName + this.ctx.helper.whereSql({ tender_id: tid });
+                const sum = await transaction.queryOne(sumSql);
+                await transaction.update(this.ctx.service.tender.tableName, {
+                    id: tid,
+                    total_price: sum.total_price,
+                    deal_tp: sum.deal_tp,
+                });
+            }
+        }
+
+        async _findParents(transaction, tid, id, result) {
+            const info = await transaction.get(this.ctx.service.changeLedger.tableName, { tender_id: tid, ledger_id: id });
+            if (info && this._.findIndex(result, { ledger_id: info.id }) === -1) {
+                result.push(info);
+                await this._findParents(transaction, tid, info.ledger_pid, result);
+            } else {
+                return;
+            }
+        }
+
+        async _insertByChangeRevise(transaction, tid, ledgerList, posList) {
+            if (ledgerList.length > 0) {
+                const insertLedgerArr = [];
+                for (const l of ledgerList) {
+                    const insertL = [
+                        l.id, l.code, l.b_code, l.name, l.unit, l.source, l.remark, l.ledger_id,
+                        l.ledger_pid, l.level, l.order, l.full_path, l.is_leaf, l.quantity, l.total_price,
+                        l.unit_price, l.drawing_code, l.memo, l.dgn_qty1, l.dgn_qty2, l.deal_qty, l.deal_tp,
+                        l.sgfh_qty, l.sgfh_tp, l.sjcl_qty, l.sjcl_tp, l.qtcl_qty, l.qtcl_tp, l.node_type, l.crid,
+                        l.tender_id, l.is_tp, l.sgfh_expr, l.sjcl_expr, l.qtcl_expr, l.check_calc, l.gxby_status,
+                        l.dagl_status, l.dagl_url, l.gxby_limit, l.dagl_limit, l.ex_memo1, l.ex_memo2, l.ex_memo3,
+                    ];
+                    insertLedgerArr.push('(' + this.ctx.helper.getInArrStrSqlFilter(insertL) + ')');
+                    await transaction.delete(this.ctx.service.changeLedger.tableName, { id: l.id });
+                }
+                const bSql = 'Insert Into ' +
+                    this.ctx.service.ledger.tableName +
+                    '  (id, code, b_code, name, unit, source, remark, ledger_id, ledger_pid, level, `order`, full_path, is_leaf,' +
+                    '     quantity, total_price, unit_price, drawing_code, memo, dgn_qty1, dgn_qty2, deal_qty, deal_tp,' +
+                    '     sgfh_qty, sgfh_tp, sjcl_qty, sjcl_tp, qtcl_qty, qtcl_tp, node_type, crid, tender_id, is_tp,' +
+                    '     sgfh_expr, sjcl_expr, qtcl_expr, check_calc,' +
+                    '     gxby_status, dagl_status, dagl_url, gxby_limit,  dagl_limit,' +
+                    '     ex_memo1, ex_memo2, ex_memo3) VALUES ' + insertLedgerArr.join(',') + ';';
+                await transaction.query(bSql, []);
+            }
+            if (posList.length > 0) {
+                const insertPosArr = [];
+                for (const p of posList) {
+                    const insertp = [
+                        p.id, p.tid, p.lid, p.name, p.drawing_code, p.quantity, p.add_stage, p.add_times,
+                        p.add_user, p.sgfh_qty, p.sjcl_qty, p.qtcl_qty, p.crid, p.porder, p.position,
+                        p.sgfh_expr, p.sjcl_expr, p.qtcl_expr, p.real_qty,
+                        p.gxby_status, p.dagl_status, p.dagl_url, p.gxby_limit, p.dagl_limit,
+                        p.ex_memo1, p.ex_memo2, p.ex_memo3,
+                    ];
+                    insertPosArr.push('(' + this.ctx.helper.getInArrStrSqlFilter(insertp) + ')');
+                    await transaction.delete(this.ctx.service.changePos.tableName, { id: p.id });
+                }
+                const pSql =
+                    'Insert Into ' +
+                    this.ctx.service.pos.tableName +
+                    '  (id, tid, lid, name, drawing_code, quantity, add_stage, add_times, add_user,' +
+                    '     sgfh_qty, sjcl_qty, qtcl_qty, crid, porder, position, ' +
+                    '     sgfh_expr, sjcl_expr, qtcl_expr, real_qty,' +
+                    '     gxby_status, dagl_status, dagl_url, gxby_limit,  dagl_limit,' +
+                    '     ex_memo1, ex_memo2, ex_memo3)  VALUES ' + insertPosArr.join(',') + ';';
+                await transaction.query(pSql, []);
+            }
+        }
     }
 
     return ChangeAuditList;

+ 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>

+ 2 - 0
sql/update.sql

@@ -19,6 +19,8 @@ CREATE TABLE `zh_pay_attachment` (
 
 ALTER TABLE `zh_change_audit_list` ADD `mx_id` VARCHAR(50) NULL DEFAULT NULL COMMENT '计量单元id' AFTER `gcl_id`;
 
+ALTER TABLE `zh_change_audit_list` CHANGE `gcl_id` `gcl_id` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '台账对应id(非准确)';
+
 -- 估概预标准
 INSERT INTO `calculation`.`zh_permission` (`id`, `name`, `controller`, `action`, `pid`, `icon_class`, `create_time`, `isshow`) VALUES ('72', '估概预标准', 'budget', 'all', '44', '', '0', '1');