Procházet zdrojové kódy

台账分解,右键菜单整体调整

MaiXinRong před 5 roky
rodič
revize
00e0089249

+ 327 - 296
app/public/js/ledger.js

@@ -951,322 +951,353 @@ $(document).ready(function() {
                 treeOperationObj.refreshTree(sheet, refreshNode);
             });
         });
+    }
 
-        let batchInsertObj;
-        $.contextMenu.types.batchInsert = function (item, opt, root) {
-            const self = this;
-            if ($.isFunction(item.icon)) {
-                item._icon = item.icon.call(this, this, $t, key, item);
+    let batchInsertObj;
+    $.contextMenu.types.batchInsert = function (item, opt, root) {
+        const self = this;
+        if ($.isFunction(item.icon)) {
+            item._icon = item.icon.call(this, this, $t, key, item);
+        } else {
+            if (typeof(item.icon) === 'string' && item.icon.substring(0, 3) === 'fa-') {
+                // to enable font awesome
+                item._icon = root.classNames.icon + ' ' + root.classNames.icon + '--fa fa ' + item.icon;
             } else {
-                if (typeof(item.icon) === 'string' && item.icon.substring(0, 3) === 'fa-') {
-                    // to enable font awesome
-                    item._icon = root.classNames.icon + ' ' + root.classNames.icon + '--fa fa ' + item.icon;
-                } else {
-                    item._icon = root.classNames.icon + ' ' + root.classNames.icon + '-' + item.icon;
-                }
+                item._icon = root.classNames.icon + ' ' + root.classNames.icon + '-' + item.icon;
             }
-            this.addClass(item._icon);
-            const $obj = $('<div>' + item.name + '<input class="text-right ml-1 mr-1" type="tel" max="20" min="1" value="' + item.value + '" style="width: 30px; height: 18px; padding-right: 4px;">行</div>')
-                .appendTo(this);
-            const $input = $obj.find('input');
-            const event = () => {
-                if (self.hasClass('context-menu-disabled')) return;
-                item.batchInsert($input[0], root);
-            };
-            $obj.on('click', event).keypress(function (e) {if (e.keyCode === 13) { event(); }});
-            $input.click((e) => {e.stopPropagation();})
-                .keyup((e) => {if (e.keyCode === 13) item.batchInsert($input[0], root);})
-                .on('input', function () {this.value = this.value.replace(/[^\d]/g, '');});
+        }
+        this.addClass(item._icon);
+        const $obj = $('<div>' + item.name + '<input class="text-right ml-1 mr-1" type="tel" max="20" min="1" value="' + item.value + '" style="width: 30px; height: 18px; padding-right: 4px;">行</div>')
+            .appendTo(this);
+        const $input = $obj.find('input');
+        const event = () => {
+            if (self.hasClass('context-menu-disabled')) return;
+            item.batchInsert($input[0], root);
         };
-        // 右键菜单
-        $.contextMenu({
-            selector: '#ledger-spread',
-            build: function ($trigger, e) {
-                const target = SpreadJsObj.safeRightClickSelection($trigger, e, ledgerSpread);
-                return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
+        $obj.on('click', event).keypress(function (e) {if (e.keyCode === 13) { event(); }});
+        $input.click((e) => {e.stopPropagation();})
+            .keyup((e) => {if (e.keyCode === 13) item.batchInsert($input[0], root);})
+            .on('input', function () {this.value = this.value.replace(/[^\d]/g, '');});
+    };
+    // 右键菜单
+    const billsContextMenuOptions = {
+        selector: '#ledger-spread',
+        build: function ($trigger, e) {
+            const target = SpreadJsObj.safeRightClickSelection($trigger, e, ledgerSpread);
+            return target.hitTestType === spreadNS.SheetArea.viewport || target.hitTestType === spreadNS.SheetArea.rowHeader;
+        },
+        items: {},
+    };
+    if (!readOnly) {
+        billsContextMenuOptions.items.create = {
+            name: '新增',
+            icon: 'fa-sign-in',
+            callback: function (key, opt) {
+                treeOperationObj.addNode(ledgerSpread.getActiveSheet());
             },
-            items: {
-                'create': {
-                    name: '新增',
-                    icon: 'fa-sign-in',
-                    callback: function (key, opt) {
-                        treeOperationObj.addNode(ledgerSpread.getActiveSheet());
-                    },
-                    disabled: function (key, opt) {
-                        const sheet = ledgerSpread.getActiveSheet();
-                        const selection = sheet.getSelections();
-                        const sel = selection ? selection[0] : sheet.getSelections()[0];
-                        const row = sel ? sel.row : -1;
-                        const tree = sheet.zh_tree;
-                        if (!tree) return true;
-                        const first = sheet.zh_tree.nodes[row];
-                        let last = first, sameParent = true;
-                        if (sel.rowCount > 1) {
-                            for (let r = 1; r < sel.rowCount; r++) {
-                                const rNode = tree.nodes[sel.row + r];
-                                if (rNode.level > first.level) continue;
-                                if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
-                                    sameParent = false;
-                                    break;
-                                }
-                                last = rNode;
-                            }
+            disabled: function (key, opt) {
+                const sheet = ledgerSpread.getActiveSheet();
+                const selection = sheet.getSelections();
+                const sel = selection ? selection[0] : sheet.getSelections()[0];
+                const row = sel ? sel.row : -1;
+                const tree = sheet.zh_tree;
+                if (!tree) return true;
+                const first = sheet.zh_tree.nodes[row];
+                let last = first, sameParent = true;
+                if (sel.rowCount > 1) {
+                    for (let r = 1; r < sel.rowCount; r++) {
+                        const rNode = tree.nodes[sel.row + r];
+                        if (rNode.level > first.level) continue;
+                        if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
+                            sameParent = false;
+                            break;
                         }
-                        const valid = !sheet.zh_setting.readOnly;
-                        return !(valid && first && first.level > 1);
+                        last = rNode;
                     }
-                },
-                'delete': {
-                    name: '删除',
-                    icon: 'fa-remove',
-                    callback: function (key, opt) {
-                        treeOperationObj.deleteNode(ledgerSpread.getActiveSheet());
-                    },
-                    disabled: function (key, opt) {
-                        const sheet = ledgerSpread.getActiveSheet();
-                        const selection = sheet.getSelections();
-                        const sel = selection ? selection[0] : sheet.getSelections()[0];
-                        const row = sel ? sel.row : -1;
-                        const tree = sheet.zh_tree;
-                        if (!tree) return true;
-                        const first = sheet.zh_tree.nodes[row];
-                        let last = first, sameParent = true;
-                        if (sel.rowCount > 1) {
-                            for (let r = 1; r < sel.rowCount; r++) {
-                                const rNode = tree.nodes[sel.row + r];
-                                if (rNode.level > first.level) continue;
-                                if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
-                                    sameParent = false;
-                                    break;
-                                }
-                                last = rNode;
-                            }
+                }
+                const valid = !sheet.zh_setting.readOnly;
+                return !(valid && first && first.level > 1);
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.delete = {
+            name: '删除',
+            icon: 'fa-remove',
+            callback: function (key, opt) {
+                treeOperationObj.deleteNode(ledgerSpread.getActiveSheet());
+            },
+            disabled: function (key, opt) {
+                const sheet = ledgerSpread.getActiveSheet();
+                const selection = sheet.getSelections();
+                const sel = selection ? selection[0] : sheet.getSelections()[0];
+                const row = sel ? sel.row : -1;
+                const tree = sheet.zh_tree;
+                if (!tree) return true;
+                const first = sheet.zh_tree.nodes[row];
+                let last = first, sameParent = true;
+                if (sel.rowCount > 1) {
+                    for (let r = 1; r < sel.rowCount; r++) {
+                        const rNode = tree.nodes[sel.row + r];
+                        if (rNode.level > first.level) continue;
+                        if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
+                            sameParent = false;
+                            break;
                         }
-                        const valid = !sheet.zh_setting.readOnly;
-                        return !(valid && first && sameParent && !(first.level === 1 && first.node_type));
+                        last = rNode;
                     }
-                },
-                'sprBase': '-----------',
-                'copyBlock': {
-                    name: '复制整块',
-                    icon: 'fa-files-o',
-                    callback: function (key, opt) {
-                        /*ledgerSpread.commandManager().execute({
-                            cmd:"copy",
-                            sheetName:ledgerSpread.getActiveSheet().name()
-                        });*/
-                        treeOperationObj.block = [];
-                        const copyBlockList = [];
-                        const sheet = ledgerSpread.getActiveSheet();
-                        const sel = sheet.getSelections()[0];
-                        let iRow = sel.row;
-                        const pid = sheet.zh_tree.nodes[iRow].ledger_pid;
-                        while (iRow < sel.row + sel.rowCount) {
-                            const node = sheet.zh_tree.nodes[iRow];
-                            if (node.ledger_pid !== pid) {
-                                toastr.error('仅可同时选中同层节点');
-                                return;
-                            }
-                            copyBlockList.push(node.ledger_id);
-                            iRow += sheet.zh_tree.getPosterity(node).length + 1;
+                }
+                const valid = !sheet.zh_setting.readOnly;
+                return !(valid && first && sameParent && !(first.level === 1 && first.node_type));
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.sprBase = '-----------';
+    }
+    billsContextMenuOptions.items.copyBlock = {
+        name: '复制整块',
+        icon: 'fa-files-o',
+        callback: function (key, opt) {
+            /*ledgerSpread.commandManager().execute({
+                cmd:"copy",
+                sheetName:ledgerSpread.getActiveSheet().name()
+            });*/
+            treeOperationObj.block = [];
+            const copyBlockList = [];
+            const sheet = ledgerSpread.getActiveSheet();
+            const sel = sheet.getSelections()[0];
+            let iRow = sel.row;
+            const pid = sheet.zh_tree.nodes[iRow].ledger_pid;
+            while (iRow < sel.row + sel.rowCount) {
+                const node = sheet.zh_tree.nodes[iRow];
+                if (node.ledger_pid !== pid) {
+                    toastr.error('仅可同时选中同层节点');
+                    return;
+                }
+                copyBlockList.push(node.ledger_id);
+                iRow += sheet.zh_tree.getPosterity(node).length + 1;
+            }
+            const tenderId = _.toInteger(getTenderId());
+            setLocalCache(copyBlockTag, JSON.stringify({tid: tenderId, block: copyBlockList}));
+            //treeOperationObj.block = copyBlockList;
+        },
+        visible: function (key, opt) {
+            const sheet = ledgerSpread.getActiveSheet();
+            const selection = sheet.getSelections();
+            const row = selection[0].row;
+            const select = ledgerTree.nodes[row];
+            return select;
+        }
+    };
+    if (!readOnly) {
+        billsContextMenuOptions.items.pasteBlock = {
+            name: '粘贴整块',
+            icon: 'fa-clipboard',
+            disabled: function (key, opt) {
+                //const block = treeOperationObj.block || [];
+                const copyInfo = JSON.parse(getLocalCache(copyBlockTag));
+                return !(copyInfo && copyInfo.tid && copyInfo.tid > 0 && copyInfo.block && copyInfo.block.length > 0);
+            },
+            callback: function (key, opt) {
+                //const block = treeOperationObj.block || [];
+                const copyInfo = JSON.parse(getLocalCache(copyBlockTag));
+                if (copyInfo.block.length > 0) {
+                    treeOperationObj.pasteBlock(ledgerSpread, copyInfo);
+                } else {
+                    document.execCommand('paste');
+                }
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.sprBlock = '-----------';
+    }
+    if (!readOnly) {
+        billsContextMenuOptions.items.sortChildren = {
+            name: '顺序重排子项编号',
+            icon: 'fa-sort-numeric-asc',
+            disabled: function (key, opt) {
+                const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                return !node || !node.code || !node.children || node.children === 0;
+            },
+            callback: function (key, opt) {
+                treeOperationObj.sortCode(ledgerSpread.getActiveSheet());
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.sprSort = '-----------';
+    }
+    if (!readOnly) {
+        billsContextMenuOptions.items.batchInsert = {
+            name: '批量插入',
+            type: 'batchInsert',
+            value: '2',
+            icon: 'fa-sign-in',
+            batchInsert: function (obj, root) {
+                if (_.toNumber(obj.value) > _.toNumber(obj.max)) {
+                    obj.value = obj.max;
+                    toastr.warning('批量插入不可多于' + obj.max);
+                } else if(_.toNumber(obj.value) < _.toNumber(obj.min)) {
+                    obj.value = obj.min;
+                    toastr.warning('批量插入不可少于' + obj.min);
+                } else {
+                    treeOperationObj.addNode(ledgerSpread.getActiveSheet(), parseInt(obj.value));
+                    root.$menu.trigger('contextmenu:hide');
+                }
+            },
+            disabled: function (key, opt) {
+                const sheet = ledgerSpread.getActiveSheet();
+                const selection = sheet.getSelections();
+                const sel = selection ? selection[0] : sheet.getSelections()[0];
+                const row = sel ? sel.row : -1;
+                const tree = sheet.zh_tree;
+                if (!tree) return true;
+                const first = sheet.zh_tree.nodes[row];
+                let last = first, sameParent = true;
+                if (sel.rowCount > 1) {
+                    for (let r = 1; r < sel.rowCount; r++) {
+                        const rNode = tree.nodes[sel.row + r];
+                        if (rNode.level > first.level) continue;
+                        if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
+                            sameParent = false;
+                            break;
                         }
-                        const tenderId = _.toInteger(getTenderId());
-                        setLocalCache(copyBlockTag, JSON.stringify({tid: tenderId, block: copyBlockList}));
-                        //treeOperationObj.block = copyBlockList;
-                    },
-                    visible: function (key, opt) {
-                        const sheet = ledgerSpread.getActiveSheet();
-                        const selection = sheet.getSelections();
-                        const row = selection[0].row;
-                        const select = ledgerTree.nodes[row];
-                        return select;
+                        last = rNode;
                     }
-                },
-                'pasteBlock': {
-                    name: '粘贴整块',
-                    icon: 'fa-clipboard',
-                    disabled: function (key, opt) {
-                        //const block = treeOperationObj.block || [];
-                        const copyInfo = JSON.parse(getLocalCache(copyBlockTag));
-                        return !(copyInfo && copyInfo.tid && copyInfo.tid > 0 && copyInfo.block && copyInfo.block.length > 0);
-                    },
-                    callback: function (key, opt) {
-                        //const block = treeOperationObj.block || [];
-                        const copyInfo = JSON.parse(getLocalCache(copyBlockTag));
-                        if (copyInfo.block.length > 0) {
-                            treeOperationObj.pasteBlock(ledgerSpread, copyInfo);
-                        } else {
-                            document.execCommand('paste');
-                        }
+                }
+                const valid = !sheet.zh_setting.readOnly;
+                return !(valid && first && first.level > 1);
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.batchInsertBillsPos = {
+            name: '批量插入清单-计量单元',
+            icon: 'fa-sign-in',
+            disabled: function (key, opt) {
+                if (!checkTzMeasureType()) return true;
+                const sheet = ledgerSpread.getActiveSheet();
+                const selection = sheet.getSelections();
+                const row = selection[0].row;
+                const select = ledgerTree.nodes[row];
+                if (select) {
+                    if (select.code && select.code !== '') {
+                        return !ledgerTree.isLeafXmj(select);
+                    } else {
+                        const parent = ledgerTree.getParent(select);
+                        return !(parent && ledgerTree.isLeafXmj(parent));
                     }
-                },
-                'sprBlock': '-----------',
-                'sortChildren': {
-                    name: '顺序重排子项编号',
-                    icon: 'fa-sort-numeric-asc',
-                    disabled: function (key, opt) {
-                        const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
-                        return !node || !node.code || !node.children || node.children === 0;
+                } else {
+                    return false;
+                }
+            },
+            callback: function (key, opt) {
+                if (!batchInsertObj) {
+                    batchInsertObj = new BatchInsertBillsPosObj($('#batch'));
+                } else {
+                    batchInsertObj.initView();
+                }
+                $('#batch').modal('show');
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.sprBatch = '-----------';
+    }
+    if (!readOnly) {
+        billsContextMenuOptions.items.importExcel = {
+            name: '导入分项清单Excel',
+            icon: 'fa-file-excel-o',
+            disabled: function (key, opt) {
+                return readOnly;
+            },
+            callback: function (key, opt) {
+                importExcel.doImport({
+                    template: {
+                        hint: '0号台账',
+                        url: '/template/导入分项清单EXCEL格式.xls',
                     },
-                    callback: function (key, opt) {
-                        treeOperationObj.sortCode(ledgerSpread.getActiveSheet());
+                    callback: function (sheet) {
+                        postDataCompress(window.location.pathname + '/upload-excel/tz', sheet, function (result) {
+                            ledgerTree.loadDatas(result.bills);
+                            treeCalc.calculateAll(ledgerTree);
+                            SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
+                            pos.loadDatas(result.pos);
+                            posOperationObj.loadCurPosData();
+                        }, null);
                     }
-                },
-                'sprSort': '-----------',
-                'batchInsert': {
-                    name: '批量插入',
-                    type: 'batchInsert',
-                    value: '2',
-                    icon: 'fa-sign-in',
-                    batchInsert: function (obj, root) {
-                        if (_.toNumber(obj.value) > _.toNumber(obj.max)) {
-                            obj.value = obj.max;
-                            toastr.warning('批量插入不可多于' + obj.max);
-                        } else if(_.toNumber(obj.value) < _.toNumber(obj.min)) {
-                            obj.value = obj.min;
-                            toastr.warning('批量插入不可少于' + obj.min);
-                        } else {
-                            treeOperationObj.addNode(ledgerSpread.getActiveSheet(), parseInt(obj.value));
-                            root.$menu.trigger('contextmenu:hide');
-                        }
+                });
+                //$('#upload-ledger').modal('show');
+            },
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.importGclBills2Xmj = {
+            name: '导入工程量清单至项目节',
+            icon: 'fa-file-excel-o',
+            disabled: function (key, opt) {
+                const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                return readOnly
+                    || (node.children && node.children.length > 0)
+                    || (!_.isNil(node.b_code) && node.b_code !== '');
+            },
+            callback: function (key, opt) {
+                const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
+                importExcel.doImport({
+                    template: {
+                        hint: '工程量清单',
+                        url: '/template/导入工程量清单EXCEL格式.xls',
                     },
-                    disabled: function (key, opt) {
-                        const sheet = ledgerSpread.getActiveSheet();
-                        const selection = sheet.getSelections();
-                        const sel = selection ? selection[0] : sheet.getSelections()[0];
-                        const row = sel ? sel.row : -1;
-                        const tree = sheet.zh_tree;
-                        if (!tree) return true;
-                        const first = sheet.zh_tree.nodes[row];
-                        let last = first, sameParent = true;
-                        if (sel.rowCount > 1) {
-                            for (let r = 1; r < sel.rowCount; r++) {
-                                const rNode = tree.nodes[sel.row + r];
-                                if (rNode.level > first.level) continue;
-                                if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
-                                    sameParent = false;
-                                    break;
+                    callback: function (sheet) {
+                        postDataCompress(window.location.pathname + '/upload-excel/gcl2xmj', {id: node.id, sheet: sheet}, 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);
+                                } else {
+                                    ledgerSheet.setSelection(refreshNode.create[0].index, 0, 1, 1);
                                 }
-                                last = rNode;
                             }
-                        }
-                        const valid = !sheet.zh_setting.readOnly;
-                        return !(valid && first && first.level > 1);
+                            treeOperationObj.refreshOperationValid(ledgerSheet);
+                        }, null);
                     }
-                },
-                'batchInsertBillsPos': {
-                    name: '批量插入清单-计量单元',
-                    icon: 'fa-sign-in',
-                    disabled: function (key, opt) {
-                        if (!checkTzMeasureType()) return true;
-                        const sheet = ledgerSpread.getActiveSheet();
-                        const selection = sheet.getSelections();
-                        const row = selection[0].row;
-                        const select = ledgerTree.nodes[row];
-                        if (select) {
-                            if (select.code && select.code !== '') {
-                                return !ledgerTree.isLeafXmj(select);
-                            } else {
-                                const parent = ledgerTree.getParent(select);
-                                return !(parent && ledgerTree.isLeafXmj(parent));
-                            }
-                        } else {
-                            return false;
-                        }
-                    },
-                    callback: function (key, opt) {
-                        if (!batchInsertObj) {
-                            batchInsertObj = new BatchInsertBillsPosObj($('#batch'));
-                        } else {
-                            batchInsertObj.initView();
-                        }
-                        $('#batch').modal('show');
-                    }
-                },
-                'sprBatch': '-----------',
-                'importExcel': {
-                    name: '导入分项清单Excel',
-                    icon: 'fa-file-excel-o',
-                    disabled: function (key, opt) {
-                        return readOnly;
-                    },
-                    callback: function (key, opt) {
-                        importExcel.doImport({
-                            template: {
-                                hint: '0号台账',
-                                url: '/template/导入分项清单EXCEL格式.xls',
-                            },
-                            callback: function (sheet) {
-                                postDataCompress(window.location.pathname + '/upload-excel/tz', sheet, function (result) {
-                                    ledgerTree.loadDatas(result.bills);
-                                    treeCalc.calculateAll(ledgerTree);
-                                    SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
-                                    pos.loadDatas(result.pos);
-                                    posOperationObj.loadCurPosData();
-                                }, null);
-                            }
-                        });
-                        //$('#upload-ledger').modal('show');
-                    }
-                },
-                'importGclBills2Xmj': {
-                    name: '导入工程量清单至项目节',
-                    icon: 'fa-file-excel-o',
-                    disabled: function (key, opt) {
-                        const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
-                        return readOnly
-                            || (node.children && node.children.length > 0)
-                            || (!_.isNil(node.b_code) && node.b_code !== '');
-                    },
-                    callback: function (key, opt) {
-                        const node = SpreadJsObj.getSelectObject(ledgerSpread.getActiveSheet());
-                        importExcel.doImport({
-                            template: {
-                                hint: '工程量清单',
-                                url: '/template/导入工程量清单EXCEL格式.xls',
-                            },
-                            callback: function (sheet) {
-                                postDataCompress(window.location.pathname + '/upload-excel/gcl2xmj', {id: node.id, sheet: sheet}, 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);
-                                        } else {
-                                            ledgerSheet.setSelection(refreshNode.create[0].index, 0, 1, 1);
-                                        }
-                                    }
-                                    treeOperationObj.refreshOperationValid(ledgerSheet);
-                                }, null);
-                            }
-                        });
-                    }
-                },
-                'sprImport': '-----------',
-                'exportExcel': {
-                    name: '导出表格数据',
-                    icon: 'fa-file-excel-o',
-                    callback: function (key, opt) {
-                        const fileName = $('.text-truncate').attr('data-original-title') + '.xlsx';
-                        SpreadExcelObj.exportSpread2XlsxWithHeader(ledgerSpread, fileName);
-                    },
-                    visible: function (key, opt) {
-                        try {
-                            return is_debug;
-                        } catch (err) {
-                            return false;
-                        }
-                    }
-                }
+                });
             },
-        });
-    } else {
-        $('#ledger-spread').on('contextmenu', () => {return false;});
-        //SpreadJsObj.forbiddenSpreadContextMenu('#ledger-spread', ledgerSpread);
+            visible: function (key, opt) {
+                return !readOnly;
+            }
+        };
+        billsContextMenuOptions.items.sprImport = '-----------';
     }
+    billsContextMenuOptions.items.exportExcel = {
+        name: '导出表格数据',
+        icon: 'fa-file-excel-o',
+        callback: function (key, opt) {
+            const fileName = $('.text-truncate').attr('data-original-title') + '.xlsx';
+            SpreadExcelObj.exportSpread2XlsxWithHeader(ledgerSpread, fileName);
+        },
+        visible: function (key, opt) {
+            try {
+                return is_debug;
+            } catch (err) {
+                return false;
+            }
+        }
+    };
+    $.contextMenu(billsContextMenuOptions);
 
     const posSearch = $.posSearch({selector: '#pos-search', searchSpread: posSpread});
     // 台账模式加载计量单元数据

+ 3 - 1
app/public/js/shares/export_excel.js

@@ -21,12 +21,13 @@ const SpreadExcelObj = (function() {
     };
 
     const exportSpread2XlsxWithHeader = function (spread, file) {
+        spread.getActiveSheet().options.isProtected = false;
         const excelIo = new GC.Spread.Excel.IO();
         const sJson = JSON.stringify(spread.toJSON({columnHeadersAsFrozenRows: true, rowHeadersAsFrozenColumns: true}));
         excelIo.save(sJson, function(blob) {
             saveAs(blob, file);
-            document.body.removeChild(div);
         });
+        spread.getActiveSheet().options.isProtected = true;
     };
 
     const exportSimpleXlsxSheet = function (setting, data, file) {
@@ -34,6 +35,7 @@ const SpreadExcelObj = (function() {
 
         const spread = SpreadJsObj.createNewSpread(div);
         const sheet = spread.getActiveSheet();
+        sheet.options.isProtected = false;
         sheet.setColumnCount(setting.cols.length);
         sheet.setRowCount(setting.headRows + data.length);
 

+ 1 - 1
app/view/tender/tender_sub_menu.ejs

@@ -24,7 +24,7 @@
         <div class="nav-box">
             <h3><i class="fa fa-calendar-check-o"></i> 计量支付</h3>
             <ul class="nav-list list-unstyled sub-list">
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/stage"><span>期列表</span></a></li>
+                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/stage"><span>各期计量</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/compare') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/compare"><span>多期比较</span></a></li>
             </ul>
         </div>

+ 1 - 1
app/view/tender/tender_sub_mini_menu.ejs

@@ -24,7 +24,7 @@
         <div class="nav-box">
             <h3><i class="fa fa-calendar-check-o"></i> 计量支付</h3>
             <ul class="nav-list list-unstyled sub-list">
-                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/stage"><span>期列表</span></a></li>
+                <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/stage') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/stage"><span>各期计量</span></a></li>
                 <li <% if (ctx.url === '/tender/' + ctx.tender.id + '/measure/compare') { %>class="active"<% } %>><a href="/tender/<%- ctx.tender.id %>/measure/compare"><span>多期比较</span></a></li>
             </ul>
         </div>