Browse Source

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

Tony Kang 2 years ago
parent
commit
d829ab6a42

+ 1 - 1
app/controller/ledger_controller.js

@@ -68,7 +68,7 @@ module.exports = app => {
                 : false;
                 : false;
             return ((tender.ledger_status === auditConst.status.uncheck || tender.ledger_status === auditConst.status.checkNo) && isUser) ||
             return ((tender.ledger_status === auditConst.status.uncheck || tender.ledger_status === auditConst.status.checkNo) && isUser) ||
                 (tender.ledger_status === auditConst.status.checking && isAuditor) ||
                 (tender.ledger_status === auditConst.status.checking && isAuditor) ||
-                (tender.ledger_status === auditConst.status.checked && isAuditor && upPermission);
+                (tender.ledger_status === auditConst.status.checked && upPermission);
         }
         }
 
 
         _getLedgerColumn(sjsRela) {
         _getLedgerColumn(sjsRela) {

+ 17 - 0
app/lib/ledger.js

@@ -257,6 +257,23 @@ class baseTree {
     getDefaultDatas(filter) {
     getDefaultDatas(filter) {
         return this.getDatasWithout(['expanded', 'visible', 'children', 'index'], filter);
         return this.getDatasWithout(['expanded', 'visible', 'children', 'index'], filter);
     }
     }
+    /**
+     * 获取默认数据 剔除一些树结构需要的缓存数据
+     * @returns {Array}
+     */
+    getDefaultDatasByLevel(level) {
+        return this.getDatasWithout(['expanded', 'visible', 'children', 'index'], function(node) {
+            switch(level) {
+                case "2":
+                case "3":
+                case "4":
+                case "5":
+                    return node.level < parseInt(level);
+                case "last":
+                    return true;
+            }
+        });
+    }
 
 
     _mapTreeNode () {
     _mapTreeNode () {
         let map = {}, maxLevel = 0;
         let map = {}, maxLevel = 0;

+ 20 - 16
app/lib/rm/budget.js

@@ -17,28 +17,32 @@ class reportMemoryBudget {
         this.getBudget = false;
         this.getBudget = false;
     }
     }
 
 
-    async budgetGai(bid) {
+    async budgetGai(bid, showLevel = false) {
+        await this.ctx.service.tender.checkTender(tid);
         const gai = await this.ctx.service.budgetGai.getAllDataByCondition({ where: { bid } });
         const gai = await this.ctx.service.budgetGai.getAllDataByCondition({ where: { bid } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         tree.loadDatas(gai);
         tree.loadDatas(gai);
         tree.calculateAll();
         tree.calculateAll();
-        return tree.getDefaultDatas();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
     }
     }
-    async budgetYu(bid) {
+    async budgetYu(bid, showLevel = false) {
+        await this.ctx.service.tender.checkTender(tid);
         const yu = await this.ctx.service.budgetYu.getAllDataByCondition({ where: { bid } });
         const yu = await this.ctx.service.budgetYu.getAllDataByCondition({ where: { bid } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         tree.loadDatas(yu);
         tree.loadDatas(yu);
         tree.calculateAll();
         tree.calculateAll();
-        return tree.getDefaultDatas();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
     }
     }
-    async budgetGu(bid) {
+    async budgetGu(bid, showLevel = false) {
+        await this.ctx.service.tender.checkTender(tid);
         const gu = await this.ctx.service.budgetGu.getAllDataByCondition({ where: { bid } });
         const gu = await this.ctx.service.budgetGu.getAllDataByCondition({ where: { bid } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: ['total_price'] });
         tree.loadDatas(gu);
         tree.loadDatas(gu);
         tree.calculateAll();
         tree.calculateAll();
-        return tree.getDefaultDatas();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
     }
     }
-    async budgetFinal(bid) {
+    async budgetFinal(bid, showLevel = false) {
+        await this.ctx.service.tender.checkTender(tid);
         const budget = this.ctx.budget && this.ctx.budget.id === bid
         const budget = this.ctx.budget && this.ctx.budget.id === bid
             ? this.ctx.budget
             ? this.ctx.budget
             : await this.ctx.service.budget.getDataById(bid);
             : await this.ctx.service.budget.getDataById(bid);
@@ -46,7 +50,7 @@ class reportMemoryBudget {
         const final = await this.ctx.service.budgetFinal.getAllDataByCondition({ where: { final_id: budget.final_id } });
         const final = await this.ctx.service.budgetFinal.getAllDataByCondition({ where: { final_id: budget.final_id } });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: [] });
         const tree = new ledger.billsTree(this.ctx, { id: 'tree_id', pid: 'tree_pid', order: 'order', level: 'level', rootId: -1, calcFields: [] });
         tree.loadDatas(final);
         tree.loadDatas(final);
-        return tree.getDefaultDatas();
+        return showLevel ? tree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : tree.getDefaultDatas();
     }
     }
 
 
     async _getTenderBudget(tid) {
     async _getTenderBudget(tid) {
@@ -60,24 +64,24 @@ class reportMemoryBudget {
         this.getBudget = true;
         this.getBudget = true;
     }
     }
 
 
-    async tenderGai(tid) {
+    async tenderGai(tid, filter = false) {
         await this._getTenderBudget(tid);
         await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetGai(this.budget.id) : [];
+        return this.budget ? await this.budgetGai(this.budget.id, filter) : [];
     }
     }
 
 
-    async tenderYu(tid) {
+    async tenderYu(tid, filter = false) {
         await this._getTenderBudget(tid);
         await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetYu(this.budget.id) : [];
+        return this.budget ? await this.budgetYu(this.budget.id, filter) : [];
     }
     }
 
 
-    async tenderGu(tid) {
+    async tenderGu(tid, filter = false) {
         await this._getTenderBudget(tid);
         await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetGu(this.budget.id) : [];
+        return this.budget ? await this.budgetGu(this.budget.id, filter) : [];
     }
     }
 
 
-    async tenderFinal(tid) {
+    async tenderFinal(tid, filter = false) {
         await this._getTenderBudget(tid);
         await this._getTenderBudget(tid);
-        return this.budget ? await this.budgetFinal(this.budget.id) : [];
+        return this.budget ? await this.budgetFinal(this.budget.id, filter) : [];
     }
     }
 }
 }
 
 

+ 3 - 11
app/lib/rm/material.js

@@ -229,7 +229,8 @@ class ReportMemoryMaterial {
         return material ? await this.ctx.service.materialList.getMaterialData(tender_id, material.id) : [];
         return material ? await this.ctx.service.materialList.getMaterialData(tender_id, material.id) : [];
     }
     }
 
 
-    async getMaterialBills(tender_id, material_order, fields) {
+    async getMaterialBills(tender_id, material_order, fields, showLevel) {
+        await this.ctx.service.tender.checkTender(tid);
         const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
         const material = await this.ctx.service.material.getDataByCondition({tid: tender_id, order: material_order});
         if (!material) return [];
         if (!material) return [];
 
 
@@ -246,16 +247,7 @@ class ReportMemoryMaterial {
             billsTree.loadDatas(billsData);
             billsTree.loadDatas(billsData);
             billsTree.calculateAll();
             billsTree.calculateAll();
 
 
-            return billsTree.getDatas([
-                'id', 'tender_id', 'ledger_id', 'ledger_pid', 'level', 'order', 'full_path', 'is_leaf',
-                'code', 'b_code', 'name', 'unit', 'unit_price',
-                'deal_qty', 'deal_tp',
-                'sgfh_qty', 'sgfh_tp', 'sjcl_qty', 'sjcl_tp', 'qtcl_qty', 'qtcl_tp', 'quantity', 'total_price',
-                'dgn_qty1', 'dgn_qty2',
-                'drawing_code', 'memo', 'node_type', 'is_tp',
-                'contract_qty', 'contract_tp', 'qc_qty', 'qc_tp', 'gather_qty', 'gather_tp', 'postil',
-                'sgfh_expr', 'sjcl_expr', 'qtcl_expr', 'contract_expr',
-            ]);
+            return showLevel ? billsTree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : billsTree.getDefaultDatas();
         } catch(err) {
         } catch(err) {
             this.ctx.helper.log(err);
             this.ctx.helper.log(err);
             return [];
             return [];

+ 17 - 16
app/public/js/ledger.js

@@ -2731,23 +2731,12 @@ $(document).ready(function() {
                         posOperationObj.loadCurPosData();
                         posOperationObj.loadCurPosData();
                     });
                     });
                 });
                 });
+            }
+            const dealBillsPermission = $('[href="#upload-deal"]').length > 0;
+            if (!readOnly || dealBillsPermission) {
                 this.spread.bind(spreadNS.Events.EditEnded, this.OprObj.editEnded);
                 this.spread.bind(spreadNS.Events.EditEnded, this.OprObj.editEnded);
                 this.spread.bind(spreadNS.Events.ClipboardPasting, this.OprObj.clipboardPasting);
                 this.spread.bind(spreadNS.Events.ClipboardPasting, this.OprObj.clipboardPasting);
                 SpreadJsObj.addDeleteBind(this.spread, this.OprObj.deletePress);
                 SpreadJsObj.addDeleteBind(this.spread, this.OprObj.deletePress);
-            }
-            $('#upload-deal-bills').click(function () {
-                    const file = $('#deal-bills-file')[0];
-                    const formData = new FormData();
-                    formData.append('file', file.files[0]);
-                    postDataWithFile(self.url+'/upload-excel', formData, function (data) {
-                        self.data = data;
-                        SpreadJsObj.loadSheetData(self.spread.getActiveSheet(), 'data', data);
-                        $('#upload-deal').modal('hide');
-                    }, function () {
-                        $('#upload-deal').modal('hide');
-                    });
-                });
-            if (!readOnly) {
                 $.contextMenu({
                 $.contextMenu({
                     selector: selector,
                     selector: selector,
                     build: function ($trigger, e) {
                     build: function ($trigger, e) {
@@ -2797,7 +2786,7 @@ $(document).ready(function() {
                             icon: 'fa-magic',
                             icon: 'fa-magic',
                             disabled: function (key, opt) {
                             disabled: function (key, opt) {
                                 const sheet = self.spread.getActiveSheet();
                                 const sheet = self.spread.getActiveSheet();
-                                return sheet.getRowCount() === 0;
+                                return sheet.getRowCount() === 0 || readOnly;
                             },
                             },
                             callback: function (key, opt) {
                             callback: function (key, opt) {
                                 const datas = [], sourceData = self.spread.getActiveSheet().zh_data;
                                 const datas = [], sourceData = self.spread.getActiveSheet().zh_data;
@@ -2820,11 +2809,23 @@ $(document).ready(function() {
                                 } else {
                                 } else {
                                     toastr.warning('没有可应用的清单。');
                                     toastr.warning('没有可应用的清单。');
                                 }
                                 }
-                            }
+                            },
                         }
                         }
                     }
                     }
                 });
                 });
             }
             }
+            $('#upload-deal-bills').click(function () {
+                    const file = $('#deal-bills-file')[0];
+                    const formData = new FormData();
+                    formData.append('file', file.files[0]);
+                    postDataWithFile(self.url+'/upload-excel', formData, function (data) {
+                        self.data = data;
+                        SpreadJsObj.loadSheetData(self.spread.getActiveSheet(), 'data', data);
+                        $('#upload-deal').modal('hide');
+                    }, function () {
+                        $('#upload-deal').modal('hide');
+                    });
+                });
             this.initDealBillsSearch();
             this.initDealBillsSearch();
         }
         }
         search(keyword) {
         search(keyword) {

+ 13 - 3
app/public/js/material_checklist.js

@@ -173,7 +173,6 @@ $(document).ready(() => {
         const removeData = [];
         const removeData = [];
         for (const mc of materialChecklistData) {
         for (const mc of materialChecklistData) {
             const gcl = _.find(gclGatherData, { b_code: mc.b_code, name: mc.name, unit: mc.unit, unit_price: mc.unit_price });
             const gcl = _.find(gclGatherData, { b_code: mc.b_code, name: mc.name, unit: mc.unit, unit_price: mc.unit_price });
-            console.log(gcl);
             // 判断是否已不存在工料清单,台账修改过后删除之
             // 判断是否已不存在工料清单,台账修改过后删除之
             if (!gcl) {
             if (!gcl) {
                 removeData.push(mc.id);
                 removeData.push(mc.id);
@@ -1118,11 +1117,14 @@ $(document).ready(() => {
                     tree = _.filter(jsonData, function (item) {
                     tree = _.filter(jsonData, function (item) {
                         return item.b_code !== null;
                         return item.b_code !== null;
                     });
                     });
+                    let lastIndex = 0;// 防止导入相同的清单导致导入的含量数量增多
                     for (const [i,t] of tree.entries()) {
                     for (const [i,t] of tree.entries()) {
-                        const jIndex1 = _.findIndex(jsonData, { b_code: t.b_code, name: t.name, unit: t.unit, unit_price: t.unit_price });
+                        const jIndex1 = _.findIndex(jsonData, { b_code: t.b_code, name: t.name, unit: t.unit, unit_price: t.unit_price }, lastIndex);
+                        lastIndex = jIndex1;
                         if (i + 1 < tree.length) {
                         if (i + 1 < tree.length) {
-                            const jIndex2 = _.findIndex(jsonData, { b_code: tree[i+1].b_code, name: tree[i+1].name, unit: tree[i+1].unit, unit_price: tree[i+1].unit_price });
+                            const jIndex2 = _.findIndex(jsonData, { b_code: tree[i+1].b_code, name: tree[i+1].name, unit: tree[i+1].unit, unit_price: tree[i+1].unit_price }, lastIndex);
                             t.children = jsonData.slice(jIndex1 + 1, jIndex2);
                             t.children = jsonData.slice(jIndex1 + 1, jIndex2);
+                            lastIndex = jIndex2;
                         } else {
                         } else {
                             t.children = jsonData.slice(jIndex1 + 1);
                             t.children = jsonData.slice(jIndex1 + 1);
                         }
                         }
@@ -1179,6 +1181,7 @@ $(document).ready(() => {
                 if (needPushTree.length === 0) {
                 if (needPushTree.length === 0) {
                     throw '不存在需要导入的工料清单含量';
                     throw '不存在需要导入的工料清单含量';
                 }
                 }
+                console.log(needPushTree);
                 // 先上传需要生成的清单及工料
                 // 先上传需要生成的清单及工料
                 if (pushChecklist.length > 0 || pushBillsData.length > 0) {
                 if (pushChecklist.length > 0 || pushBillsData.length > 0) {
                     postData(window.location.pathname + '/save', { type:'exportCB', addChecklist: pushChecklist, addBillsList: pushBillsData }, async function (result) {
                     postData(window.location.pathname + '/save', { type:'exportCB', addChecklist: pushChecklist, addBillsList: pushBillsData }, async function (result) {
@@ -1296,6 +1299,13 @@ $(document).ready(() => {
                         mbList.push({ id: mbInfo.id, quantity: mb.quantity ? mb.quantity : 0 });
                         mbList.push({ id: mbInfo.id, quantity: mb.quantity ? mb.quantity : 0 });
                     }
                     }
                 }
                 }
+                if (mbList.length === 0 && i+1 === tree.length) {
+                    stopProgress($('#list-progress'));
+                    toastr.success('导入成功');
+                    setTimeout(function () { $('#okedit').modal('hide') }, 2000);
+                    showSjsData();
+                    return;
+                }
                 if (mbList.length === 0) {
                 if (mbList.length === 0) {
                     continue;
                     continue;
                 }
                 }

+ 50 - 18
app/public/js/shares/batch_import.js

@@ -22,23 +22,41 @@ const BatchImportStageGcl = function (setting) {
 
 
                 const items = getItems(data);
                 const items = getItems(data);
                 const cellType = new spreadNS.CellTypes.ComboBox().itemHeight(10).editorValueType(spreadNS.CellTypes.EditorValueType.value).items(items);
                 const cellType = new spreadNS.CellTypes.ComboBox().itemHeight(10).editorValueType(spreadNS.CellTypes.EditorValueType.value).items(items);
-                biObj.sheet.getCell(i, 2).cellType(cellType);
+                biObj.sheet.getCell(i, 3).cellType(cellType);
             }
             }
         },
         },
-        trEditEnded: function (e, info) {
+        EditEnded: function (e, info) {
             const data = SpreadJsObj.getSelectObject(info.sheet);
             const data = SpreadJsObj.getSelectObject(info.sheet);
             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);
         },
         },
+        ButtonClicked: function (e, info) {
+            if (!info.sheet.zh_setting) return;
+
+            const col = info.sheet.zh_setting.cols[info.col];
+            if (col.field !== 'selected') return;
+
+            const node = SpreadJsObj.getSelectObject(info.sheet);
+            const newValue = !node.selected;
+            const parent = node.lid ? node : info.sheet.zh_tree.getParent(node);
+            parent.selected = newValue;
+            if (parent.children && parent.children.length > 0) {
+                for (const child of parent.children) {
+                    child.selected = newValue;
+                }
+            }
+            SpreadJsObj.reLoadRowData(info.sheet, info.sheet.zh_tree.getNodeIndex(parent), parent.children.length + 1);
+        },
         reloadBatchTree() {
         reloadBatchTree() {
             this.batchTree.clearDatas();
             this.batchTree.clearDatas();
             for (const h of this.history) {
             for (const h of this.history) {
                 if (!h.ledger_node) continue;
                 if (!h.ledger_node) continue;
 
 
-                const ledgerData = { lid: h.lid, ledger_id: h.ledger_node.ledger_id, code: h.ledger_node.code, name: h.ledger_node.name, ledger_node: h.ledger_node };
+                const ledgerData = { lid: h.lid, ledger_id: h.ledger_node.ledger_id, code: h.ledger_node.code, name: h.ledger_node.name, ledger_node: h.ledger_node, selected: h.tenders.length > 0 };
                 const batchNode = this.batchTree.addNode(ledgerData, null);
                 const batchNode = this.batchTree.addNode(ledgerData, null);
                 for (const t of h.tenders) {
                 for (const t of h.tenders) {
                     const tenderData = JSON.parse(JSON.stringify(t));
                     const tenderData = JSON.parse(JSON.stringify(t));
+                    tenderData.selected = true;
                     const tender = this.tenderSourceTree.nodes.find(y => { return y.tid === t.tid });
                     const tender = this.tenderSourceTree.nodes.find(y => { return y.tid === t.tid });
                     tenderData.stageCount = tender.stageCount;
                     tenderData.stageCount = tender.stageCount;
                     this.batchTree.addNode(tenderData, batchNode);
                     this.batchTree.addNode(tenderData, batchNode);
@@ -74,11 +92,10 @@ const BatchImportStageGcl = function (setting) {
             this.sheet = this.spread.getActiveSheet();
             this.sheet = this.spread.getActiveSheet();
             SpreadJsObj.initSheet(this.sheet, {
             SpreadJsObj.initSheet(this.sheet, {
                 cols: [
                 cols: [
-                    // {title: '选择', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'},
+                    {title: '选择', field: 'selected', hAlign: 1, width: 40, formatter: '@', cellType: 'checkbox'},
                     {title: '编号', field: 'code', hAlign: 0, width: 180, formatter: '@', cellType: 'tree'},
                     {title: '编号', field: 'code', hAlign: 0, width: 180, formatter: '@', cellType: 'tree'},
                     {title: '名称/引用标段', field: 'name', hAlign: 0, width: 180, formatter: '@'},
                     {title: '名称/引用标段', field: 'name', hAlign: 0, width: 180, formatter: '@'},
                     {title: '可选期', field: 'stage', hAlign: 1, width: 60, formatter: '@'},
                     {title: '可选期', field: 'stage', hAlign: 1, width: 60, formatter: '@'},
-                    // {title: '覆盖数据', field: 'is_cover', hAlign: 1, width: 60, cellType: 'checkbox'},
                     {title: '状态', field: 'status', hAlign: 1, width: 60, formatter: '@'},
                     {title: '状态', field: 'status', hAlign: 1, width: 60, formatter: '@'},
                     {title: '错误信息', field: 'error', hAlign: 1, width: 60, formatter: '@'},
                     {title: '错误信息', field: 'error', hAlign: 1, width: 60, formatter: '@'},
                 ],
                 ],
@@ -90,7 +107,8 @@ const BatchImportStageGcl = function (setting) {
                 font: '12px 微软雅黑',
                 font: '12px 微软雅黑',
                 selectedBackColor: '#fffacd',
                 selectedBackColor: '#fffacd',
             });
             });
-            this.spread.bind(spreadNS.Events.EditEnded, biObj.trEditEnded);
+            this.spread.bind(spreadNS.Events.EditEnded, biObj.EditEnded);
+            this.spread.bind(spreadNS.Events.ButtonClicked, biObj.ButtonClicked);
 
 
             this.batchTree = createNewPathTree('gather', {
             this.batchTree = createNewPathTree('gather', {
                 id: 'id',
                 id: 'id',
@@ -100,6 +118,7 @@ const BatchImportStageGcl = function (setting) {
                 rootId: -1,
                 rootId: -1,
                 fullPath: 'full_path',
                 fullPath: 'full_path',
             });
             });
+            this.loadHistory();
         },
         },
         checkErrors: function () {
         checkErrors: function () {
             const hasError = this.batchTree.children.findIndex(x => { return x.error > 0; }) >= 0;
             const hasError = this.batchTree.children.findIndex(x => { return x.error > 0; }) >= 0;
@@ -120,24 +139,37 @@ const BatchImportStageGcl = function (setting) {
             node.errors = result.sumLoadHis.errors;
             node.errors = result.sumLoadHis.errors;
             node.error = node.errors ? node.errors.length : 0;
             node.error = node.errors ? node.errors.length : 0;
         },
         },
+        beforeBatchImport: function () {
+            this.batchTree.children.forEach(x => {
+                x.status = x.selected ? '等待中' : '';
+                x.error = 0;
+                x.errors = [];
+            });
+            SpreadJsObj.reloadColData(this.sheet, 4, 2);
+        },
         batchImport: async function () {
         batchImport: async function () {
             $('#bi-start')[0].disabled = true;
             $('#bi-start')[0].disabled = true;
             biObj.batching = true;
             biObj.batching = true;
+            this.beforeBatchImport();
             const cover = $('#bi-cover')[0].checked;
             const cover = $('#bi-cover')[0].checked;
             for (const node of this.batchTree.children) {
             for (const node of this.batchTree.children) {
-                if (!node.children || node.children.length === 0) continue;
+                if (!node.selected) continue;
+
                 const row = this.batchTree.getNodeIndex(node);
                 const row = this.batchTree.getNodeIndex(node);
-                try {
-                    node.status = '开始导入';
-                    SpreadJsObj.reLoadRowData(biObj.sheet, row);
-                    await biObj.importStageGcl(node, cover);
-                    node.status = '导入完成';
-                    SpreadJsObj.reLoadRowData(biObj.sheet, row);
-                } catch(err) {
-                    console.log(err);
-                    node.status = '导入失败';
-                    SpreadJsObj.reLoadRowData(biObj.sheet, row);
+                if (!node.children || node.children.length === 0) {
+                    node.status = '无数据';
+                } else {
+                    try {
+                        node.status = '开始导入';
+                        SpreadJsObj.reLoadRowData(biObj.sheet, row);
+                        await biObj.importStageGcl(node, cover);
+                        node.status = '导入完成';
+                    } catch(err) {
+                        console.log(err);
+                        node.status = '导入失败';
+                    }
                 }
                 }
+                SpreadJsObj.reLoadRowData(biObj.sheet, row);
             }
             }
             biObj.batching = false;
             biObj.batching = false;
             $('#bi-start')[0].disabled = false;
             $('#bi-start')[0].disabled = false;
@@ -191,7 +223,7 @@ const BatchImportStageGcl = function (setting) {
 
 
     $('#batch-import').on('shown.bs.modal', () => {
     $('#batch-import').on('shown.bs.modal', () => {
         biObj.initBatchImport();
         biObj.initBatchImport();
-        biObj.loadHistory();
+        // biObj.loadHistory();
     });
     });
 
 
     $('#bi-start').click(function () {
     $('#bi-start').click(function () {

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

@@ -368,7 +368,7 @@ $(document).ready(() => {
                     {title: '变更令号', field: 'p_code', width: 100, formatter: '@', readOnly: true, hAlign: 0, },
                     {title: '变更令号', field: 'p_code', width: 100, formatter: '@', readOnly: true, hAlign: 0, },
                     {title: '名称', field: 'name', width: 120, formatter: '@', readOnly: true, hAlign: 0,},
                     {title: '名称', field: 'name', width: 120, formatter: '@', readOnly: true, hAlign: 0,},
                     {title: '变更部位', field: 'b_bwmx', width: 100, formatter: '@', readOnly: true, hAlign: 0,},
                     {title: '变更部位', field: 'b_bwmx', width: 100, formatter: '@', readOnly: true, hAlign: 0,},
-                    //{title: '总数量', field: 'b_amount', width: 60, readOnly: true, hAlign: 2, },
+                    {title: '批复数量', field: 'b_amount', width: 60, readOnly: true, hAlign: 2, },
                     {title: '可变更数量', field: 'vamount', width: 60, readOnly: true, hAlign: 2, type: 'Number', getValue: function (data) {return data.vamount ? data.vamount + '' : '0';}},
                     {title: '可变更数量', field: 'vamount', width: 60, readOnly: true, hAlign: 2, type: 'Number', getValue: function (data) {return data.vamount ? data.vamount + '' : '0';}},
                     {title: '本期计量', field: 'uamount', width: 60, hAlign: 2, type: 'Number', },
                     {title: '本期计量', field: 'uamount', width: 60, hAlign: 2, type: 'Number', },
                 ],
                 ],

+ 7 - 7
app/service/change_ledger.js

@@ -145,14 +145,14 @@ module.exports = app => {
                 const sqlParam = [this.setting.kid, this.ctx.service.ledger.tableName, mid];
                 const sqlParam = [this.setting.kid, this.ctx.service.ledger.tableName, mid];
                 const queryResult = await this.db.queryOne(sql, sqlParam);
                 const queryResult = await this.db.queryOne(sql, sqlParam);
                 maxId = queryResult.max_id || 0;
                 maxId = queryResult.max_id || 0;
-                if (this.newBills) {
-                    const sql2 = 'SELECT Max(??) As max_id FROM ?? Where ' + this.setting.mid + ' = ?';
-                    const sqlParam2 = [this.setting.kid, this.tableName, mid];
-                    const queryResult2 = await this.db.queryOne(sql2, sqlParam2);
-                    if (maxId < queryResult2.max_id || 0) {
-                        maxId = queryResult2.max_id || 0;
-                    }
+                // if (this.newBills) {
+                const sql2 = 'SELECT Max(??) As max_id FROM ?? Where ' + this.setting.mid + ' = ?';
+                const sqlParam2 = [this.setting.kid, this.tableName, mid];
+                const queryResult2 = await this.db.queryOne(sql2, sqlParam2);
+                if (maxId < queryResult2.max_id || 0) {
+                    maxId = queryResult2.max_id || 0;
                 }
                 }
+                // }
                 const oldCacheKey = 'change_ledger_maxLid:' + mid;
                 const oldCacheKey = 'change_ledger_maxLid:' + mid;
                 this.cache.del(oldCacheKey);
                 this.cache.del(oldCacheKey);
                 this.cache.set(cacheKey, maxId, 'EX', this.ctx.app.config.cacheTime);
                 this.cache.set(cacheKey, maxId, 'EX', this.ctx.app.config.cacheTime);

+ 37 - 0
app/service/report.js

@@ -130,6 +130,10 @@ module.exports = app => {
                             runnableRst.push(service.reportMemory.getStageBillsData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableRst.push(service.reportMemory.getStageBillsData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
                             break;
                             break;
+                        case 'mem_stage_bills_filter':
+                            runnableRst.push(service.reportMemory.getStageBillsData(params.tender_id, params.stage_id, memFieldKeys[filter], true));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_stage_pos':
                         case 'mem_stage_pos':
                             runnableRst.push(service.reportMemory.getStagePosData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableRst.push(service.reportMemory.getStagePosData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
@@ -142,6 +146,10 @@ module.exports = app => {
                             runnableRst.push(service.reportMemory.getStageBillsCompareData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableRst.push(service.reportMemory.getStageBillsCompareData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
                             break;
                             break;
+                        case 'mem_stage_bills_compare_filter':
+                            runnableRst.push(service.reportMemory.getStageBillsCompareData(params.tender_id, params.stage_id, memFieldKeys[filter], true));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_stage_pay':
                         case 'mem_stage_pay':
                             runnableRst.push(service.reportMemory.getStagePayData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableRst.push(service.reportMemory.getStagePayData(params.tender_id, params.stage_id, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
@@ -213,6 +221,10 @@ module.exports = app => {
                             runnableRst.push(materialSource.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableRst.push(materialSource.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
                             break;
                             break;
+                        case 'mem_material_bills_filter':
+                            runnableRst.push(materialSource.getMaterialBills(params.tender_id, params.material_order, memFieldKeys[filter], true));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_material_pos':
                         case 'mem_material_pos':
                             runnableRst.push(materialSource.getMaterialPos(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableRst.push(materialSource.getMaterialPos(params.tender_id, params.material_order, memFieldKeys[filter]));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
@@ -226,6 +238,11 @@ module.exports = app => {
                                 customDefine.stage_select, customSelect ? customSelect.stage_select : null));
                                 customDefine.stage_select, customSelect ? customSelect.stage_select : null));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
                             break;
                             break;
+                        case 'mem_stage_sum_bills_filter':
+                            runnableRst.push(service.rptStageSumMemory.getStageSumBills(params.tender_id, memFieldKeys[filter],
+                                customDefine.stage_select, customSelect ? customSelect.stage_select : null, true));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_stage_sum_pay':
                         case 'mem_stage_sum_pay':
                             runnableRst.push(service.rptStageSumMemory.getStageSumPay(params.tender_id, memFieldKeys[filter],
                             runnableRst.push(service.rptStageSumMemory.getStageSumPay(params.tender_id, memFieldKeys[filter],
                                 customDefine.stage_select, customSelect ? customSelect.stage_select : null));
                                 customDefine.stage_select, customSelect ? customSelect.stage_select : null));
@@ -296,6 +313,22 @@ module.exports = app => {
                             runnableRst.push(params.budget_id ? budgetSource.budgetFinal(params.budget_id) : budgetSource.tenderFinal(params.tender_id));
                             runnableRst.push(params.budget_id ? budgetSource.budgetFinal(params.budget_id) : budgetSource.tenderFinal(params.tender_id));
                             runnableKey.push(filter);
                             runnableKey.push(filter);
                             break;
                             break;
+                        case 'mem_budget_gu_filter':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetGu(params.budget_id, true) : budgetSource.tenderGu(params.tender_id, true));
+                            runnableKey.push(filter);
+                            break;
+                        case 'mem_budget_gai_filter':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetGai(params.budget_id, true) : budgetSource.tenderGai(params.tender_id, true));
+                            runnableKey.push(filter);
+                            break;
+                        case 'mem_budget_yu_filter':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetYu(params.budget_id, true) : budgetSource.tenderYu(params.tender_id, true));
+                            runnableKey.push(filter);
+                            break;
+                        case 'mem_budget_final_filter':
+                            runnableRst.push(params.budget_id ? budgetSource.budgetFinal(params.budget_id, true) : budgetSource.tenderFinal(params.tender_id, true));
+                            runnableKey.push(filter);
+                            break;
                         case 'mem_pm_deal_pay':
                         case 'mem_pm_deal_pay':
                             runnableRst.push(service.reportMemory.getPmDeal());
                             runnableRst.push(service.reportMemory.getPmDeal());
                             runnableKey.push(filter);
                             runnableKey.push(filter);
@@ -378,6 +411,10 @@ module.exports = app => {
                         rst[filter] = await service.rptGatherMemory.getGatherStageBills(memFieldKeys[filter],
                         rst[filter] = await service.rptGatherMemory.getGatherStageBills(memFieldKeys[filter],
                             customDefine.gather_select, customSelect ? customSelect.gather_select : null);
                             customDefine.gather_select, customSelect ? customSelect.gather_select : null);
                         break;
                         break;
+                    case 'mem_gather_stage_bills_filter':
+                        rst[filter] = await service.rptGatherMemory.getGatherStageBills(memFieldKeys[filter],
+                            customDefine.gather_select, customSelect ? customSelect.gather_select : null, true);
+                        break;
                     case 'mem_gather_stage_pos':
                     case 'mem_gather_stage_pos':
                         rst[filter] = await service.rptGatherMemory.getGatherStagePos(memFieldKeys[filter],
                         rst[filter] = await service.rptGatherMemory.getGatherStagePos(memFieldKeys[filter],
                             customDefine.gather_select, customSelect ? customSelect.gather_select : null);
                             customDefine.gather_select, customSelect ? customSelect.gather_select : null);

+ 4 - 4
app/service/report_memory.js

@@ -468,7 +468,7 @@ module.exports = app => {
             return await this._loadStageBillsZone(tender, `${year}-01 - ${year}-12`);
             return await this._loadStageBillsZone(tender, `${year}-01 - ${year}-12`);
         }
         }
 
 
-        async getStageBillsData(tid, sid, fields) {
+        async getStageBillsData(tid, sid, fields, showLevel) {
             try {
             try {
                 await this.ctx.service.tender.checkTender(tid);
                 await this.ctx.service.tender.checkTender(tid);
                 if (sid) {
                 if (sid) {
@@ -531,7 +531,7 @@ module.exports = app => {
                     this._calcLeafXmjRela(billsTree);
                     this._calcLeafXmjRela(billsTree);
                 }
                 }
 
 
-                return billsTree.getDefaultDatas();
+                return showLevel ? billsTree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : billsTree.getDefaultDatas();
             } catch(err) {
             } catch(err) {
                 this.ctx.log(err);
                 this.ctx.log(err);
                 return [];
                 return [];
@@ -623,7 +623,7 @@ module.exports = app => {
             this.stageValidRole = result;
             this.stageValidRole = result;
         };
         };
 
 
-        async getStageBillsCompareData(tid, sid, fields) {
+        async getStageBillsCompareData(tid, sid, fields, showLevel) {
             try {
             try {
                 await this.ctx.service.tender.checkTender(tid);
                 await this.ctx.service.tender.checkTender(tid);
                 await this.ctx.service.stage.checkStage(sid);
                 await this.ctx.service.stage.checkStage(sid);
@@ -708,7 +708,7 @@ module.exports = app => {
                     this._calcLeafXmjRela(billsTree);
                     this._calcLeafXmjRela(billsTree);
                 }
                 }
 
 
-                return billsTree.getDefaultDatas();
+                return showLevel ? billsTree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : billsTree.getDefaultDatas();
             } catch (err) {
             } catch (err) {
                 return [];
                 return [];
             }
             }

+ 5 - 2
app/service/rpt_gather_memory.js

@@ -714,9 +714,12 @@ module.exports = app => {
             gatherUtils.completeGatherData(this.resultPos.datas, completeDatas);
             gatherUtils.completeGatherData(this.resultPos.datas, completeDatas);
         }
         }
 
 
-        async getGatherStageBills(memFieldKeys, gsDefine, gsCustom) {
+        async getGatherStageBills(memFieldKeys, gsDefine, gsCustom, showLevel) {
+            await this.ctx.service.tender.checkTender(tid);
             await this._doGatherStageData(memFieldKeys, gsDefine, gsCustom);
             await this._doGatherStageData(memFieldKeys, gsDefine, gsCustom);
-            return this.resultTree ? this.resultTree.getDefaultDatas() : [];
+            return this.resultTree
+                ? (showLevel ? this.resultTree.getDefaultDatasByLevel(showLevel) : this.resultTree.getDefaultDatas())
+                : [];
         }
         }
         async getGatherStagePos(memFieldKeys, gsDefine, gsCustom) {
         async getGatherStagePos(memFieldKeys, gsDefine, gsCustom) {
             await this._doGatherStageData(memFieldKeys, gsDefine, gsCustom);
             await this._doGatherStageData(memFieldKeys, gsDefine, gsCustom);

+ 2 - 2
app/service/rpt_stage_sum_memory.js

@@ -154,7 +154,7 @@ module.exports = app => {
             super(ctx);
             super(ctx);
         }
         }
 
 
-        async getStageSumBills(tid, memFieldKeys, gsDefine, gsCustom) {
+        async getStageSumBills(tid, memFieldKeys, gsDefine, gsCustom, showLevel) {
             const self = this;
             const self = this;
             if (!gsDefine || !gsDefine.enable) return [];
             if (!gsDefine || !gsDefine.enable) return [];
             if (!gsCustom || !gsCustom.stages || gsCustom.stages.length === 0) return [];
             if (!gsCustom || !gsCustom.stages || gsCustom.stages.length === 0) return [];
@@ -205,7 +205,7 @@ module.exports = app => {
             });
             });
             billsTree.loadDatas(billsData);
             billsTree.loadDatas(billsData);
             billsTree.calculateAll();
             billsTree.calculateAll();
-            return billsTree.getDefaultDatas();
+            return showLevel ? billsTree.getDefaultDatasByLevel(this.ctx.tender.rpt_show_level) : billsTree.getDefaultDatas();
         }
         }
 
 
         /**
         /**

+ 11 - 8
app/service/stage.js

@@ -140,15 +140,18 @@ module.exports = app => {
             } else if (!!isTenderTourist || force) {
             } else if (!!isTenderTourist || force) {
                 stage.filePermission = this.tender && this.tender.touristPermission ? this.tender.touristPermission.file : false;
                 stage.filePermission = this.tender && this.tender.touristPermission ? this.tender.touristPermission.file : false;
             } else {
             } else {
-                if (shareIds.indexOf(accountId) !== -1 || (permission !== null && permission.tender !== undefined && permission.tender.indexOf('2') !== -1)) {// 分享人
-                    if (stage.status === status.uncheck) {
-                        throw '您无权查看该数据';
-                    }
-                    stage.filePermission = false;
-                } else {
-                    throw '您无权查看该数据';
-                }
+                stage.filePermission = false;
             }
             }
+            // } else {
+            //     if (shareIds.indexOf(accountId) !== -1 || (permission !== null && permission.tender !== undefined && permission.tender.indexOf('2') !== -1)) {// 分享人
+            //         if (stage.status === status.uncheck) {
+            //             throw '您无权查看该数据';
+            //         }
+            //         stage.filePermission = false;
+            //     } else {
+            //         throw '您无权查看该数据';
+            //     }
+            // }
 
 
             let time = stage.readOnly ? stage.cache_time_r : stage.cache_time_l;
             let time = stage.readOnly ? stage.cache_time_r : stage.cache_time_l;
             if (!time) time = stage.in_time ? stage.in_time : new Date();
             if (!time) time = stage.in_time ? stage.in_time : new Date();