|  | @@ -35,46 +35,86 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |      SpreadJsObj.loadSheetData(ledgerSpread.getActiveSheet(), 'tree', ledgerTree);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      const treeOperationObj = {
 | 
	
		
			
				|  |  | +        refreshOperationValid: function (sheet, selections) {
 | 
	
		
			
				|  |  | +            const setObjEnable = function (obj, enable) {
 | 
	
		
			
				|  |  | +                if (enable) {
 | 
	
		
			
				|  |  | +                    obj.removeClass('disabled');
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    obj.addClass('disabled');
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const row = selections[0].row;
 | 
	
		
			
				|  |  | +            const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  | +            if (!tree) { return; }
 | 
	
		
			
				|  |  | +            const node = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            setObjEnable($('#delete'), node);
 | 
	
		
			
				|  |  | +            setObjEnable($('#up-move'), node && node.order > 1);
 | 
	
		
			
				|  |  | +            setObjEnable($('#down-move'), node && !tree.isLastSibling(node));
 | 
	
		
			
				|  |  | +            setObjEnable($('#up-level'), tree.getParent(node));
 | 
	
		
			
				|  |  | +            setObjEnable($('#down-level'), node && node.order > 1);
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 新增节点
 | 
	
		
			
				|  |  | +         * @param spread
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          addNode: function (spread) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const row = sheet.getSelections()[0].row;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  |              if (!tree) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            const node = spread.zh_tree.nodes[row];
 | 
	
		
			
				|  |  | +            const node = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  |              if (!node) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              SpreadJsObj.massOperationSheet(sheet, function () {
 | 
	
		
			
				|  |  | -                tree.addNode('add-node', node, function (newNodes) {
 | 
	
		
			
				|  |  | -                    newNodes.sort(function (a, b) {
 | 
	
		
			
				|  |  | -                        const aIndex = tree.nodes.indexOf(a);
 | 
	
		
			
				|  |  | -                        const bIndex = tree.nodes.indexOf(b);
 | 
	
		
			
				|  |  | -                        return aIndex - bIndex;
 | 
	
		
			
				|  |  | -                    });
 | 
	
		
			
				|  |  | -                    for (const node of newNodes) {
 | 
	
		
			
				|  |  | -                        const index = tree.nodes.indexOf(node);
 | 
	
		
			
				|  |  | -                        sheet.addRows(index, 1);
 | 
	
		
			
				|  |  | +                tree.baseOperation('base-operation', node, 'add', function (result) {
 | 
	
		
			
				|  |  | +                    const newNodes = result.create;
 | 
	
		
			
				|  |  | +                    if (newNodes) {
 | 
	
		
			
				|  |  | +                        newNodes.sort(function (a, b) {
 | 
	
		
			
				|  |  | +                            const aIndex = tree.nodes.indexOf(a);
 | 
	
		
			
				|  |  | +                            const bIndex = tree.nodes.indexOf(b);
 | 
	
		
			
				|  |  | +                            return aIndex - bIndex;
 | 
	
		
			
				|  |  | +                        });
 | 
	
		
			
				|  |  | +                        for (const node of newNodes) {
 | 
	
		
			
				|  |  | +                            const index = tree.nodes.indexOf(node);
 | 
	
		
			
				|  |  | +                            sheet.addRows(index, 1);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    self.refreshOperationValid(sheet, sheet.getSelections());
 | 
	
		
			
				|  |  |                  });
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 删除选中节点
 | 
	
		
			
				|  |  | +         * @param spread
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          deleteNode: function (spread) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const row = sheet.getSelections()[0].row;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  |              if (!tree) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            const node = spread.zh_tree.nodes[row];
 | 
	
		
			
				|  |  | +            const node = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  |              if (!node) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              const count = ledgerTree.getPosterity(node).length;
 | 
	
		
			
				|  |  | -            tree.deleteNode('delete-node', node, function () {
 | 
	
		
			
				|  |  | +            tree.baseOperation('base-operation', node, 'delete', function (result) {
 | 
	
		
			
				|  |  |                  sheet.deleteRows(row, count + 1);
 | 
	
		
			
				|  |  | +                self.refreshOperationValid(sheet, sheet.getSelections());
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 上移选中节点
 | 
	
		
			
				|  |  | +         * @param spread
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          upMove: function (spread) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const sel = sheet.getSelections()[0];
 | 
	
		
			
				|  |  |              const row = sel.row;
 | 
	
	
		
			
				|  | @@ -85,15 +125,22 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |              const node = tree.nodes[row];
 | 
	
		
			
				|  |  |              if (!node) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            tree.upMoveNode('up-move', node, function (datas) {
 | 
	
		
			
				|  |  | -                for (const data of datas) {
 | 
	
		
			
				|  |  | +            tree.baseOperation('base-operation', node, 'up-move', function (result) {
 | 
	
		
			
				|  |  | +                for (const data of result.update) {
 | 
	
		
			
				|  |  |                      SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(data), tree.getPosterity(data).length + 1);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  sheet.setSelection(tree.nodes.indexOf(node), sel.col, sel.rowCount, sel.colCount);
 | 
	
		
			
				|  |  | +                self.refreshOperationValid(sheet, sheet.getSelections());
 | 
	
		
			
				|  |  |                  //sheet.moveTo(row, -1, tree.nodes.indexOf(node), -1, tree.getPosterity(node).length + 1, -1, GC.Spread.Sheets.CopyToOptions.value);
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 下移选中节点
 | 
	
		
			
				|  |  | +         * @param spread
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          downMove: function (spread) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const sel = sheet.getSelections()[0];
 | 
	
		
			
				|  |  |              const row = sel.row;
 | 
	
	
		
			
				|  | @@ -104,14 +151,21 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |              const node = tree.nodes[row];
 | 
	
		
			
				|  |  |              if (!node) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            tree.downMoveNode('down-move', node, function (datas) {
 | 
	
		
			
				|  |  | -                for (const data of datas) {
 | 
	
		
			
				|  |  | +            tree.baseOperation('base-operation', node, 'down-move', function (result) {
 | 
	
		
			
				|  |  | +                for (const data of result.update) {
 | 
	
		
			
				|  |  |                      SpreadJsObj.reLoadRowData(sheet, tree.nodes.indexOf(data), tree.getPosterity(data).length + 1);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  sheet.setSelection(tree.nodes.indexOf(node), sel.col, sel.rowCount, sel.colCount);
 | 
	
		
			
				|  |  | +                self.refreshOperationValid(sheet, sheet.getSelections());
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 升级选中节点
 | 
	
		
			
				|  |  | +         * @param spread
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          upLevel: function (spread) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const row = sheet.getSelections()[0].row;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -121,11 +175,18 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |              const node = tree.nodes[row];
 | 
	
		
			
				|  |  |              if (!node) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            tree.upLevelNode('up-level', node, function () {
 | 
	
		
			
				|  |  | +            tree.baseOperation('base-operation', node, 'up-level', function (result) {
 | 
	
		
			
				|  |  |                  sheet.repaint();
 | 
	
		
			
				|  |  | +                self.refreshOperationValid(sheet, sheet.getSelections());
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 降级选中节点
 | 
	
		
			
				|  |  | +         * @param spread
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          downLevel: function (spread) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const row = sheet.getSelections()[0].row;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -135,12 +196,17 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |              const node = tree.nodes[row];
 | 
	
		
			
				|  |  |              if (!node) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            tree.downLevelNode('down-level', node, function () {
 | 
	
		
			
				|  |  | +            tree.baseOperation('base-operation', node, 'down-level', function (result) {
 | 
	
		
			
				|  |  |                  sheet.repaint();
 | 
	
		
			
				|  |  | +                self.refreshOperationValid(sheet, sheet.getSelections());
 | 
	
		
			
				|  |  |              });
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    ledgerSpread.bind(GC.Spread.Sheets.Events.SelectionChanged, function (e, info) {
 | 
	
		
			
				|  |  | +        treeOperationObj.refreshOperationValid(info.sheet, info.newSelections);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // 绑定 删除等 顶部按钮
 | 
	
		
			
				|  |  |      $('#delete').click(function () {
 | 
	
		
			
				|  |  |          treeOperationObj.deleteNode(ledgerSpread);
 | 
	
	
		
			
				|  | @@ -157,6 +223,7 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |      $('#down-level').click(function () {
 | 
	
		
			
				|  |  |          treeOperationObj.downLevel(ledgerSpread);
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +    treeOperationObj.refreshOperationValid(ledgerSpread.getActiveSheet(), ledgerSpread.getActiveSheet().getSelections());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // 右键菜单
 | 
	
		
			
				|  |  |      $.contextMenu({
 |