|  | @@ -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});
 | 
	
		
			
				|  |  |      // 台账模式加载计量单元数据
 |