Browse Source

总分包 v0.3

MaiXinRong 4 years ago
parent
commit
7eb0e500a5

+ 24 - 0
app/base/base_bills_service.js

@@ -18,6 +18,7 @@ const qtyFields = ['sgfh_qty', 'sjcl_qty', 'qtcl_qty', 'quantity', 'deal_qty'];
 const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
 const tpFields = ['sgfh_tp', 'sjcl_tp', 'qtcl_tp', 'total_price', 'deal_tp'];
 const measureType = require('../const/tender').measureType;
 const measureType = require('../const/tender').measureType;
 const billsUtils = require('../lib/bills_utils');
 const billsUtils = require('../lib/bills_utils');
+const SumLoad = require('../lib/sum_load');
 
 
 class BaseBillsSerivce extends TreeService {
 class BaseBillsSerivce extends TreeService {
 
 
@@ -689,6 +690,29 @@ class BaseBillsSerivce extends TreeService {
             pos: pastePosData,
             pos: pastePosData,
         };
         };
     }
     }
+
+    async sumLoad(lid, tenders) {
+        const maxId = await this._getMaxLid(this.ctx.tender.id);
+        const select = await this.getDataById(lid);
+        const sumLoad = new SumLoad(this.ctx);
+        const loadTree = await sumLoad.loadGatherGcl(select, maxId, tenders, {
+
+        });
+        const result = loadTree.getUpdateData();
+
+        const conn = await this.db.beginTransaction();
+        try {
+            this._cacheMaxLid(this.ctx.tender.id, loadTree.keyNodeId);
+            await conn.update(this.tableName, result.update);
+            await conn.insert(this.tableName, result.create);
+            await conn.commit();
+            return result;
+        } catch (err) {
+            console.log(err);
+            await conn.rollback();
+            throw (err.stack ? '导入工程量数据出错': err);
+        }
+    }
 }
 }
 
 
 module.exports = BaseBillsSerivce;
 module.exports = BaseBillsSerivce;

+ 5 - 0
app/base/base_tree_service.js

@@ -314,6 +314,11 @@ class TreeService extends Service {
         return data;
         return data;
     }
     }
 
 
+    async getImportInfo(mid) {
+        const maxId = await this._getMaxLid(mid);
+        return { maxId };
+    }
+
     /**
     /**
      * 获取最大节点id
      * 获取最大节点id
      *
      *

+ 96 - 60
app/controller/tender_controller.js

@@ -21,6 +21,7 @@ const billsPosConvert = require('../lib/bills_pos_convert');
 const path = require('path');
 const path = require('path');
 const sendToWormhole = require('stream-wormhole');
 const sendToWormhole = require('stream-wormhole');
 const scheduleConst = require('../const/schedule');
 const scheduleConst = require('../const/schedule');
+const SumLoad = require('../lib/sum_load');
 
 
 module.exports = app => {
 module.exports = app => {
 
 
@@ -291,66 +292,6 @@ module.exports = app => {
             }
             }
         }
         }
 
 
-        async listLoad(ctx) {
-            try {
-                const data = JSON.parse(ctx.request.body.data);
-                if (!data.tid && !data.lid && !data.type) throw '数据错误';
-                const responseData = {
-                    err: 0,
-                    msg: '',
-                    data: { ledgerAuditConst: auditConst.ledger, stageAuditConst: auditConst.stage },
-                };
-                responseData.data.category = await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
-                // 获取用户权限
-                const accountInfo = await this.ctx.service.projectAccount.getDataById(this.ctx.session.sessionUser.accountId);
-                const userPermission = accountInfo !== undefined && accountInfo.permission !== '' ? JSON.parse(accountInfo.permission) : null;
-                const tenderList = await this.ctx.service.tender.getList('', userPermission);
-                for (const t of tenderList) {
-                    if (t.ledger_status === auditConst.ledger.status.checked) {
-                        t.lastStage = await this.ctx.service.stage.getLastestStage(t.id, false);
-                    }
-                }
-                if (data.type === 'ledger') {
-                    responseData.data.tenders = tenderList.filter(x => {
-                        return x.ledger_status === auditConst.ledger.status.checked;
-                    });
-                    const history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
-                    if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
-                } else if (data.type === 'stage') {
-                    responseData.data.tenders = tenderList.filter(x => {
-                        return x.ledger_status === auditConst.ledger.status.checked && !!x.lastStage;
-                    });
-                    let history = await this.ctx.service.sumLoadHistory.getStageHistory(data.tid, data.lid);
-                    if (history) {
-                        responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'stage' };
-                    } else {
-                        history = await this.ctx.service.sumLoadHistory.getReviseHistory(data.tid, data.lid);
-                        if (history) {
-                            responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'revise' };
-                        } else {
-                            history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
-                            if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
-                        }
-                    }
-                } else if (data.type === 'revise') {
-                    responseData.data.tenders = tenderList.filter(x => {
-                        return x.ledger_status === auditConst.ledger.status.checked;
-                    });
-                    let history = await this.ctx.service.sumLoadHistory.getReviseHistory(data.tid, data.lid);
-                    if (history) {
-                        responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'revise' };
-                    } else {
-                        history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
-                        if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
-                    }
-                }
-                ctx.body = responseData;
-            } catch(err) {
-                this.log(err);
-                this.ajaxErrorBody(err, '获取标段列表错误');
-            }
-        }
-
         /**
         /**
          * 新增标段(Ajax)
          * 新增标段(Ajax)
          *
          *
@@ -1092,6 +1033,101 @@ module.exports = app => {
                 ctx.body = this.ajaxErrorBody(err, '书签数据错误');
                 ctx.body = this.ajaxErrorBody(err, '书签数据错误');
             }
             }
         }
         }
+
+        async listLoad(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+                if (!data.tid || !data.lid || !data.type) throw '数据错误';
+                const responseData = {
+                    err: 0,
+                    msg: '',
+                    data: { ledgerAuditConst: auditConst.ledger, stageAuditConst: auditConst.stage },
+                };
+                responseData.data.category = await this.ctx.service.category.getAllCategory(this.ctx.session.sessionProject.id);
+                // 获取用户权限
+                const accountInfo = await this.ctx.service.projectAccount.getDataById(this.ctx.session.sessionUser.accountId);
+                const userPermission = accountInfo !== undefined && accountInfo.permission !== '' ? JSON.parse(accountInfo.permission) : null;
+                const tenderList = await this.ctx.service.tender.getList('', userPermission);
+                for (const t of tenderList) {
+                    if (t.ledger_status === auditConst.ledger.status.checked) {
+                        t.lastStage = await this.ctx.service.stage.getLastestStage(t.id, false);
+                    }
+                }
+                if (data.type === 'ledger') {
+                    responseData.data.tenders = tenderList.filter(x => {
+                        return x.ledger_status === auditConst.ledger.status.checked;
+                    });
+                    const history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
+                    if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
+                } else if (data.type === 'stage') {
+                    responseData.data.tenders = tenderList.filter(x => {
+                        return x.ledger_status === auditConst.ledger.status.checked && !!x.lastStage;
+                    });
+                    let history = await this.ctx.service.sumLoadHistory.getStageHistory(data.tid, data.lid);
+                    if (history) {
+                        responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'stage' };
+                    } else {
+                        history = await this.ctx.service.sumLoadHistory.getReviseHistory(data.tid, data.lid);
+                        if (history) {
+                            responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'revise' };
+                        } else {
+                            history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
+                            if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
+                        }
+                    }
+                } else if (data.type === 'revise') {
+                    responseData.data.tenders = tenderList.filter(x => {
+                        return x.ledger_status === auditConst.ledger.status.checked;
+                    });
+                    let history = await this.ctx.service.sumLoadHistory.getReviseHistory(data.tid, data.lid);
+                    if (history) {
+                        responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'revise' };
+                    } else {
+                        history = await this.ctx.service.sumLoadHistory.getLedgerHistory(data.tid, data.lid);
+                        if (history) responseData.data.history = { tenders: history.tender, load_time: history.load_time, type: 'ledger' };
+                    }
+                }
+                ctx.body = responseData;
+            } catch(err) {
+                this.log(err);
+                this.ajaxErrorBody(err, '获取标段列表错误');
+            }
+        }
+
+        async _sumLoadRevise() {
+
+        }
+
+        async _sumLoadStage() {
+
+        }
+
+        async sumLoad(ctx) {
+            try {
+                const data = JSON.parse(ctx.request.body.data);
+
+                if (!data.lid || !data.type || !data.tenders) throw '数据错误';
+
+                switch (data.type) {
+                    case 'ledger':
+                        const refreshData = await this.ctx.service.ledger.sumLoad(data.lid, data.tenders);
+                        ctx.body = {err: 0, msg: '', data: refreshData};
+                        break;
+                    case 'revise':
+                        ctx.body = await this._sumLoadRevise(data.tid, data.lid, data.tenders);
+                        break;
+                    case 'stage':
+                        ctx.body = await this._sumLoadStage(data.tid, data.lid, data.tenders);
+                        break;
+                    default:
+                        throw '数据错误';
+                }
+            } catch (err) {
+                console.log(err);
+                this.log(err);
+                this.ajaxErrorBody(err, '导入数据失败');
+            }
+        }
     }
     }
 
 
     return TenderController;
     return TenderController;

+ 2 - 5
app/lib/analysis_excel.js

@@ -804,12 +804,9 @@ class AnalysisGclExcelTree {
                 const row = sheet.rows[iRow];
                 const row = sheet.rows[iRow];
                 if (this.colsDef && !this.loadEnd) {
                 if (this.colsDef && !this.loadEnd) {
                     const result = this.loadRowData(row);
                     const result = this.loadRowData(row);
-                    // 读取失败则写入错误数据 todo 返回前端告知用户?
+                    // 读取失败则写入错误数据
                     if (!result) {
                     if (!result) {
-                        this.errorData.push({
-                            serialNo: iRow,
-                            data: row,
-                        });
+                        this.errorData.push({ serialNo: iRow, data: row });
                     }
                     }
                 } else {
                 } else {
                     this.checkColHeader(row);
                     this.checkColHeader(row);

+ 18 - 16
app/lib/rpt_data_analysis.js

@@ -699,7 +699,7 @@ const join = {
             }
             }
         }
         }
         for (const s of sub) {
         for (const s of sub) {
-            let r = result.find(function(x) {
+            let subR = result.filter(function(x) {
                 for (const k of options.keyFields) {
                 for (const k of options.keyFields) {
                     switch (k.type) {
                     switch (k.type) {
                         case 'string':
                         case 'string':
@@ -712,22 +712,24 @@ const join = {
                 }
                 }
                 return true;
                 return true;
             });
             });
-            if (r && r._join_tag === 'main') {
-                r._join_tag = 'both';
-            }
-            if (!r) {
-                r = { _join_tag: 'sub' };
-                for (const k of options.keyFields) {
-                    r[k.main] = s[k.sub];
+            for (const r of subR) {
+                if (r && r._join_tag === 'main') {
+                    r._join_tag = 'both';
                 }
                 }
-                result.push(r);
-            }
-            for (const i of options.importFields) {
-                // r[i.main] = s[i.sub];
-                if (i.type === 'sum') {
-                    r[i.main] = ctx.helper.add(r[i.main], s[i.sub]);
-                } else {
-                    r[i.main] = s[i.sub];
+                if (!r) {
+                    r = { _join_tag: 'sub' };
+                    for (const k of options.keyFields) {
+                        r[k.main] = s[k.sub];
+                    }
+                    result.push(r);
+                }
+                for (const i of options.importFields) {
+                    // r[i.main] = s[i.sub];
+                    if (i.type === 'sum') {
+                        r[i.main] = ctx.helper.add(r[i.main], s[i.sub]);
+                    } else {
+                        r[i.main] = s[i.sub];
+                    }
                 }
                 }
             }
             }
         }
         }

+ 145 - 0
app/lib/sum_load.js

@@ -0,0 +1,145 @@
+'use strict';
+
+/**
+ *
+ *
+ * @author Mai
+ * @date
+ * @version
+ */
+const Ledger = require('../lib/ledger');
+
+class loadGclBaseTree {
+    /**
+     * 构造函数
+     * @param {Array} tempData - 清单模板数据
+     */
+    constructor (ctx, setting) {
+        this.ctx = ctx;
+        this.parent = setting.parent;
+        this.defaultData = setting.defaultData;
+        // 常量
+        this.splitChar = '-';
+        // 索引
+        // 以code为索引
+        this.codeNodes = {};
+        this.items = [];
+
+        // 缓存
+        this.keyNodeId = setting.maxId ? setting.maxId + 1 : 1;
+    }
+
+    /**
+     * 根据 编号 查找 父项项目节
+     * @param {String} code - 子项编号
+     * @returns {*}
+     */
+    findNode(node, parent) {
+        parent = parent || this.parent;
+        if (!parent.children) return null;
+
+        for (const child of parent.children) {
+            if (child.b_code === node.b_code && child.name === node.name && child.unit === node.unit) return child;
+        }
+    }
+
+    /**
+     * 添加 树节点 并完善该节点的树结构
+     * @param {Object} node - 添加节点
+     * @param {Object} parent - 父项
+     * @returns {*}
+     */
+    addNode(source, parent) {
+        parent = parent ? parent : this.parent;
+        if (!parent.children) parent.children = [];
+
+        let node = this.findNode(source, parent);
+        if (!node) {
+            node = {
+                id: this.ctx.app.uuid.v4(),
+                tender_id: this.ctx.tender.id,
+                ledger_id: this.keyNodeId,
+                ledger_pid: parent.ledger_id,
+                level: parent.level +1,
+                full_path: parent.full_path + '-' + this.keyNodeId,
+                order: parent.children.length + 1,
+                children: [],
+                b_code: source.b_code,
+                name: source.name,
+                unit: source.unit,
+            };
+            this.keyNodeId += 1;
+            parent.children.push(node);
+            this.items.push(node);
+        }
+        return node;
+    }
+
+    gather(source, parent) {}
+    getUpdateData() {}
+}
+
+class loadLedgerGclTree extends loadGclBaseTree {
+    gather(source, parent) {
+        const node = this.addNode(source, parent);
+        node.sgfh_qty = this.ctx.helper.add(node.sgfh_qty, source.sgfh_qty);
+        node.qtcl_qty = this.ctx.helper.add(node.qtcl_qty, source.qtcl_qty);
+        node.sjcl_qty = this.ctx.helper.add(node.sjcl_qty, source.sjcl_qty);
+        node.quantity = this.ctx.helper.add(node.quantity, source.quantity);
+        return node;
+    }
+
+    getUpdateData() {
+        const update = {id: this.parent.id, is_leaf: false};
+        const create = [];
+        for (const i of this.items) {
+            create.push({
+                id: i.id, tender_id: i.tender_id, ledger_id: i.ledger_id, ledger_pid: i.ledger_pid,
+                level: i.level, order: i.order, full_path: i.full_path, is_leaf: !i.children || i.children.length === 0,
+                b_code: i.b_code, name: i.name, unit: i.unit,
+                sgfh_qty: i.sgfh_qty, sjcl_qty: i.sjcl_qty, qtcl_qty: i.qtcl_qty, quantity: i.quantity,
+            })
+        }
+        return {update, create};
+    }
+}
+
+class sumLoad {
+    constructor (ctx) {
+        this.ctx = ctx;
+    }
+
+    recusiveLoadGatherGcl(node, parent) {
+        const cur = node.b_code ? this.loadTree.gather(node, parent) : parent;
+        if (!node.children || node.children.length === 0) return;
+        for (const child of node.children) {
+            this.recusiveLoadGatherGcl(child, cur);
+        }
+    }
+
+    async loadGatherGcl(select, maxId, tenders, defaultData) {
+        this.loadTree = new loadLedgerGclTree(this.ctx, {
+            parent: select, maxId, type: 'ledger', defaultData,
+        });
+        for (const tender of tenders) {
+            const billsData = await this.ctx.service.ledger.getData(tender.tid);
+            const billsTree = new Ledger.billsTree(this.ctx, {
+                id: 'ledger_id',
+                pid: 'ledger_pid',
+                order: 'order',
+                level: 'level',
+                rootId: -1,
+                keys: ['id', 'tender_id', 'ledger_id'],
+                stageId: 'id',
+            });
+            billsTree.loadDatas(billsData);
+            for (const top of billsTree.children) {
+                if ([1].indexOf(top.node_type) < 0) continue;
+                this.recusiveLoadGatherGcl(top, null);
+            }
+        }
+        return this.loadTree;
+    }
+}
+
+module.exports = sumLoad;

+ 20 - 10
app/public/js/ledger.js

@@ -57,7 +57,6 @@ const checkOption = {
 
 
 $(document).ready(function() {
 $(document).ready(function() {
     let stdXmj, stdGcl, dealBills, searchLedger;
     let stdXmj, stdGcl, dealBills, searchLedger;
-    const tenderSelect = TenderSelect({type: 'stage'});
     autoFlashHeight();
     autoFlashHeight();
     // 初始化台账
     // 初始化台账
     const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
     const ledgerSpread = SpreadJsObj.createNewSpread($('#ledger-spread')[0]);
@@ -1513,6 +1512,26 @@ $(document).ready(function() {
         billsContextMenuOptions.items.sprBatch = '----';
         billsContextMenuOptions.items.sprBatch = '----';
     }
     }
     if (!readOnly) {
     if (!readOnly) {
+        const tenderSelect = TenderSelect({
+            type: 'ledger',
+            afterLoad: function (result) {
+                const ledgerSheet = ledgerSpread.getActiveSheet();
+                const sel = ledgerSheet.getSelections();
+
+                const refreshNode = ledgerTree.loadPostData(result);
+                treeOperationObj.refreshTree(ledgerSheet, refreshNode);
+                if (refreshNode.create[0]) {
+                    if (sel && sel[0]) {
+                        ledgerSheet.setSelection(refreshNode.create[0].index, sel[0].col, sel[0].rowCount, sel[0].colCount);
+                        SpreadJsObj.reloadRowsBackColor(ledgerSheet, [sel[0].row, refreshNode.create[0].index]);
+                    } else {
+                        ledgerSheet.setSelection(refreshNode.create[0].index, 0, 1, 1);
+                        SpreadJsObj.reloadRowsBackColor(ledgerSheet, [refreshNode.create[0].index]);
+                    }
+                }
+                treeOperationObj.refreshOperationValid(ledgerSheet);
+            }
+        });
         billsContextMenuOptions.items.importExcel = {
         billsContextMenuOptions.items.importExcel = {
             name: '导入分项清单Excel',
             name: '导入分项清单Excel',
             icon: 'fa-file-excel-o',
             icon: 'fa-file-excel-o',
@@ -1549,9 +1568,6 @@ $(document).ready(function() {
                     // }
                     // }
                     //u_type: importExcel.uploadType.file,
                     //u_type: importExcel.uploadType.file,
                 });
                 });
-            },
-            visible: function (key, opt) {
-                return !readOnly;
             }
             }
         };
         };
         billsContextMenuOptions.items.importGclBills2Xmj = {
         billsContextMenuOptions.items.importGclBills2Xmj = {
@@ -1590,9 +1606,6 @@ $(document).ready(function() {
                         }, null);
                         }, null);
                     }
                     }
                 });
                 });
-            },
-            visible: function (key, opt) {
-                return !readOnly;
             }
             }
         };
         };
         billsContextMenuOptions.items.importGclBills2Xmj = {
         billsContextMenuOptions.items.importGclBills2Xmj = {
@@ -1606,9 +1619,6 @@ $(document).ready(function() {
             },
             },
             callback: function (key, opt) {
             callback: function (key, opt) {
                 tenderSelect.showSelect(SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet()));
                 tenderSelect.showSelect(SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet()));
-            },
-            visible: function (key, opt) {
-                return !readOnly;
             }
             }
         };
         };
         billsContextMenuOptions.items.sprImport = '----';
         billsContextMenuOptions.items.sprImport = '----';

+ 12 - 0
app/public/js/revise.js

@@ -50,6 +50,7 @@ const checkOption = {
 
 
 $(document).ready(() => {
 $(document).ready(() => {
     let stdXmj, stdGcl, searchLedger;
     let stdXmj, stdGcl, searchLedger;
+    const tenderSelect = TenderSelect({type: 'revise'});
     autoFlashHeight();
     autoFlashHeight();
     // 初始化spread
     // 初始化spread
     const billsSpread = SpreadJsObj.createNewSpread($('#bills-spread')[0]);
     const billsSpread = SpreadJsObj.createNewSpread($('#bills-spread')[0]);
@@ -1257,6 +1258,17 @@ $(document).ready(() => {
                 });
                 });
             }
             }
         };
         };
+        billsContextMenuOptions.items.importGclBills2Xmj = {
+            name: '更新(其他标段)工程量清单至项目节',
+            icon: 'fa-file-excel-o',
+            disabled: function (key, opt) {
+                const node = SpreadJsObj.getSelectObject(billsSheet);
+                return readOnly || !node || (!_.isNil(node.b_code) && node.b_code !== '');
+            },
+            callback: function (key, opt) {
+                tenderSelect.showSelect(SpreadJsObj.getSelectObject(billsSheet));
+            }
+        };
     }
     }
     billsContextMenuOptions.items.sprTag = '----';
     billsContextMenuOptions.items.sprTag = '----';
     billsContextMenuOptions.items.showLast = {
     billsContextMenuOptions.items.showLast = {

+ 19 - 5
app/public/js/shares/tender_select.js

@@ -76,6 +76,14 @@ const TenderSelect = function (setting) {
             const col = info.sheet.zh_setting.cols[info.col];
             const col = info.sheet.zh_setting.cols[info.col];
             data[col.field] = info.sheet.getValue(info.row, info.col);
             data[col.field] = info.sheet.getValue(info.row, info.col);
         },
         },
+        loadHistory: function () {
+            postData('/list/load', {type: tsObj.setting.type, tid: tsObj.select.tender_id, lid: tsObj.select.id}, data => {
+                tsObj.trArray = data.history ? data.history.tenders : [];
+                tsObj.tenderSourceTree = Tender2Tree.convert(data.category, data.tenders, data.ledgerAuditConst, data.stageAuditConst);
+                SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree);
+                SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray);
+            });
+        },
         initTenderSelect: function () {
         initTenderSelect: function () {
             if (this.tenderSpread) return;
             if (this.tenderSpread) return;
 
 
@@ -127,22 +135,28 @@ const TenderSelect = function (setting) {
             if (this.setting.type === 'stage') {
             if (this.setting.type === 'stage') {
                 this.resultSpread.bind(spreadNS.Events.EditEnded, tsObj.trEditEnded);
                 this.resultSpread.bind(spreadNS.Events.EditEnded, tsObj.trEditEnded);
             }
             }
-            postData('/list/load', {type: tsObj.setting.type, tid: tsObj.select.tender_id, lid: tsObj.select.id}, data => {
-                tsObj.trArray = data.history ? data.history.tenders : [];
-                tsObj.tenderSourceTree = Tender2Tree.convert(data.category, data.tenders, data.ledgerAuditConst, data.stageAuditConst);
-                SpreadJsObj.loadSheetData(tsObj.tenderSheet, SpreadJsObj.DataType.Tree, tsObj.tenderSourceTree);
-                SpreadJsObj.loadSheetData(tsObj.resultSheet, SpreadJsObj.DataType.Data, tsObj.trArray);
+
+            $('#tender-select-ok').click(() => {
+                const updateData = {lid: tsObj.select.id, type: tsObj.setting.type, tenders: tsObj.trArray};
+                postData(window.location.pathname + '/sumLoad', updateData, result => {
+                    tsObj.setting.afterLoad(result);
+                    $('#tender-select').modal('hide');
+                });
             });
             });
+
+            this.loadHistory();
         }
         }
     };
     };
 
 
     $('#tender-select').on('shown.bs.modal', () => {
     $('#tender-select').on('shown.bs.modal', () => {
         tsObj.initTenderSelect();
         tsObj.initTenderSelect();
+        tsObj.loadHistory();
     });
     });
 
 
     const showSelect = function (node) {
     const showSelect = function (node) {
         tsObj.select = node;
         tsObj.select = node;
         $('#ts-hint').hide();
         $('#ts-hint').hide();
+        tsObj.trArray = [];
         $('#tender-select').modal('show');
         $('#tender-select').modal('show');
     };
     };
 
 

+ 17 - 1
app/public/js/stage.js

@@ -181,6 +181,7 @@ function getHintMsg () {
 
 
 
 
 $(document).ready(() => {
 $(document).ready(() => {
+    const tenderSelect = TenderSelect({type: 'stage'});
     const exportExcelSetting = {
     const exportExcelSetting = {
         cols: [
         cols: [
             {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'},
             {title: '项目节编号', colSpan: '1', rowSpan: '2', field: 'code', hAlign: 0, width: 145, formatter: '@', cellType: 'tree'},
@@ -1516,7 +1517,22 @@ $(document).ready(() => {
                     const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
                     const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
                     return !node;
                     return !node;
                 }
                 }
-            }
+            },
+            importSpr: '---',
+            importStageGcl: {
+                name: '导入(其他标段)工程量清单计量数据',
+                icon: 'fa-file-excel-o',
+                disabled: function (key, opt) {
+                    const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
+                    return readOnly || !node || (!_.isNil(node.b_code) && node.b_code !== '');
+                },
+                callback: function (key, opt) {
+                    tenderSelect.showSelect(SpreadJsObj.getSelectObject(slSpread.getActiveSheet()));
+                },
+                visible: function (key, opt) {
+                    return !readOnly;
+                }
+            },
         }
         }
     });
     });
 
 

+ 5 - 0
app/router.js

@@ -498,6 +498,11 @@ module.exports = app => {
     app.post('/tender/:id/ledger/tag', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.billsTag');
     app.post('/tender/:id/ledger/tag', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.billsTag');
     app.post('/tender/:id/measure/stage/:order/tag', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'tenderController.billsTag');
     app.post('/tender/:id/measure/stage/:order/tag', sessionAuth, tenderCheck, uncheckTenderCheck, stageCheck, 'tenderController.billsTag');
 
 
+    // 总分包
+    app.post('/tender/:id/ledger/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.sumLoad');
+    app.post('/tender/:id/measure/stage/:order/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, 'tenderController.sumLoad');
+    app.post('/tender/:id/revise/info/sumLoad', sessionAuth, tenderCheck, uncheckTenderCheck, 'reviseController.loadInfoData');
+
     // 扫码登录
     // 扫码登录
     app.get('/wxAuth', 'loginController.wxAuth');
     app.get('/wxAuth', 'loginController.wxAuth');
     app.get('/wxproject', 'loginController.wxProject');
     app.get('/wxproject', 'loginController.wxProject');