|  | @@ -101,7 +101,7 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |              setObjEnable($('#up-move'), valid && node && node.order > 1);
 | 
	
		
			
				|  |  |              setObjEnable($('#down-move'), valid && node && !tree.isLastSibling(node));
 | 
	
		
			
				|  |  |              if (checkTzMeasureType()) {
 | 
	
		
			
				|  |  | -                const posRange = pos.getMasterRange(node.id);
 | 
	
		
			
				|  |  | +                const posRange = node ? pos.getMasterRange(node.id) : [];
 | 
	
		
			
				|  |  |                  setObjEnable($('#up-level'), valid && node && tree.getParent(node) && (!posRange || posRange.length === 0));
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  setObjEnable($('#up-level'), valid && node && tree.getParent(node));
 | 
	
	
		
			
				|  | @@ -350,7 +350,7 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |                          nodes.push(node);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                info.sheet.zh_tree.update('/ledger/update', datas, function (result) {
 | 
	
		
			
				|  |  | +                info.sheet.zh_tree.update(preUrl + '/ledger/update', datas, function (result) {
 | 
	
		
			
				|  |  |                      const rows = [];
 | 
	
		
			
				|  |  |                      for (const data of result) {
 | 
	
		
			
				|  |  |                          rows.push(sortData.indexOf(data));
 | 
	
	
		
			
				|  | @@ -586,6 +586,9 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      // 绑定部位明细编辑事件
 | 
	
		
			
				|  |  |      const posOperationObj = {
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 加载部位明细 根据当前台账选择节点
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  |          loadCurPosData: function () {
 | 
	
		
			
				|  |  |              const node = treeOperationObj.getSelectNode(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  |              if (node) {
 | 
	
	
		
			
				|  | @@ -608,7 +611,11 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |                      return;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  const node = treeOperationObj.getSelectNode(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  | -                if (info.editingText !== '' && node.children && node.children > 0) {
 | 
	
		
			
				|  |  | +                if (!node) {
 | 
	
		
			
				|  |  | +                    toast('数据错误, 请刷新页面后再试', 'warning')
 | 
	
		
			
				|  |  | +                    info.cancel = true;
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                } else if (info.editingText !== '' && node.children && node.children > 0) {
 | 
	
		
			
				|  |  |                      toast('父节点不可插入部位明细', 'error');
 | 
	
		
			
				|  |  |                      info.cancel = true;
 | 
	
		
			
				|  |  |                      return;
 | 
	
	
		
			
				|  | @@ -656,13 +663,166 @@ $(document).ready(function() {
 | 
	
		
			
				|  |  |                  });
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 删除按钮响应事件
 | 
	
		
			
				|  |  | +         * @param sheet
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        deletePress: function (sheet) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  | +            if (sheet.zh_setting) {
 | 
	
		
			
				|  |  | +                const sortData = sheet.zh_data;
 | 
	
		
			
				|  |  | +                const datas = [], posSelects = [];
 | 
	
		
			
				|  |  | +                const sel = sheet.getSelections()[0];
 | 
	
		
			
				|  |  | +                for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) {
 | 
	
		
			
				|  |  | +                    const node = sortData[iRow];
 | 
	
		
			
				|  |  | +                    if (node) {
 | 
	
		
			
				|  |  | +                        const data = {id: node.id};
 | 
	
		
			
				|  |  | +                        for (let iCol = sel.col; iCol < sel.col + sel.colCount; iCol++) {
 | 
	
		
			
				|  |  | +                            const colSetting = sheet.zh_setting.cols[iCol];
 | 
	
		
			
				|  |  | +                            if (colSetting.field === 'name') {
 | 
	
		
			
				|  |  | +                                toast('部位名称不能为空', 'error');
 | 
	
		
			
				|  |  | +                                return;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                            data[colSetting.field] = null;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        datas.push(data);
 | 
	
		
			
				|  |  | +                        posSelects.push(node);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                sheet.zh_tree.update(preUrl + '/pos/update', datas, function (result) {
 | 
	
		
			
				|  |  | +                    pos.updateDatas(result);
 | 
	
		
			
				|  |  | +                    // todo 只加载改变项
 | 
	
		
			
				|  |  | +                    self.loadCurPosData();
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 删除 部位明细
 | 
	
		
			
				|  |  | +         * @param sheet
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        deletePos: function (sheet) {
 | 
	
		
			
				|  |  | +            const selection = sheet.getSelections();
 | 
	
		
			
				|  |  | +            const data = {
 | 
	
		
			
				|  |  | +                updateType: 'delete',
 | 
	
		
			
				|  |  | +                updateData: [],
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            const row = selection[0].row, count = selection[0].rowCount;
 | 
	
		
			
				|  |  | +            const sortData = sheet.zh_data;
 | 
	
		
			
				|  |  | +            for (let iRow = 0; iRow < count; iRow++) {
 | 
	
		
			
				|  |  | +                data.updateData.push(sortData[iRow + row].id);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            postData(preUrl + '/pos/update', data, function (result) {
 | 
	
		
			
				|  |  | +                pos.updateDatas(result.pos);
 | 
	
		
			
				|  |  | +                sheet.deleteRows(row, count);
 | 
	
		
			
				|  |  | +                ledgerTree.loadPostData(result.ledger, function (loadResult) {
 | 
	
		
			
				|  |  | +                    treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        /**
 | 
	
		
			
				|  |  | +         * 粘贴单元格响应事件
 | 
	
		
			
				|  |  | +         * @param e
 | 
	
		
			
				|  |  | +         * @param info
 | 
	
		
			
				|  |  | +         */
 | 
	
		
			
				|  |  | +        clipboardPasted: function (e, info) {
 | 
	
		
			
				|  |  | +            const self = this;
 | 
	
		
			
				|  |  | +            const node = treeOperationObj.getSelectNode(ledgerSpread.getActiveSheet());
 | 
	
		
			
				|  |  | +            if (node.code && (node.code !== '')) {
 | 
	
		
			
				|  |  | +                toast('项目节不可含有清单明细', 'error');
 | 
	
		
			
				|  |  | +                self.loadCurPosData();
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (node.children && (node.children.length > 0)) {
 | 
	
		
			
				|  |  | +                toast('仅清单子项可以含有部位明细', 'error');
 | 
	
		
			
				|  |  | +                self.loadCurPosData();
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (info.sheet.zh_setting) {
 | 
	
		
			
				|  |  | +                const data = { updateType: '', updateData: [], };
 | 
	
		
			
				|  |  | +                const sortData = info.sheet.zh_data;
 | 
	
		
			
				|  |  | +                if (sortData && (info.cellRange.row >= sortData.length)) {
 | 
	
		
			
				|  |  | +                    data.updateType = 'add';
 | 
	
		
			
				|  |  | +                    if (info.cellRange.col !== 0) {
 | 
	
		
			
				|  |  | +                        toast('新增部位请先输入名称', 'warning');
 | 
	
		
			
				|  |  | +                        self.loadCurPosData();
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                    for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
 | 
	
		
			
				|  |  | +                        const curRow = info.cellRange.row + iRow;
 | 
	
		
			
				|  |  | +                        const newData = {};
 | 
	
		
			
				|  |  | +                        for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
 | 
	
		
			
				|  |  | +                            const curCol = info.cellRange.col + iCol;
 | 
	
		
			
				|  |  | +                            const colSetting = info.sheet.zh_setting.cols[curCol];
 | 
	
		
			
				|  |  | +                            data[colSetting.field] = info.sheet.getText(curRow, curCol);
 | 
	
		
			
				|  |  | +                            if (colSetting.type === 'Number') {
 | 
	
		
			
				|  |  | +                                data[colSetting.field] = _.toNumber(data[colSetting.field]);
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        data.updateData.push(newData);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    data.updateType = 'update';
 | 
	
		
			
				|  |  | +                    for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
 | 
	
		
			
				|  |  | +                        const curRow = info.cellRange.row + iRow;
 | 
	
		
			
				|  |  | +                        const curPos = sortData[curRow];
 | 
	
		
			
				|  |  | +                        if (curPos) {
 | 
	
		
			
				|  |  | +                            const newData = {id: curPos.id};
 | 
	
		
			
				|  |  | +                            for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
 | 
	
		
			
				|  |  | +                                const curCol = info.cellRange.col + iCol;
 | 
	
		
			
				|  |  | +                                const colSetting = info.sheet.zh_setting.cols[curCol];
 | 
	
		
			
				|  |  | +                                newData[colSetting.field] = info.sheet.getText(curRow, curCol);
 | 
	
		
			
				|  |  | +                                if (colSetting.type === 'Number') {
 | 
	
		
			
				|  |  | +                                    newData[colSetting.field] = _.toNumber(newData[colSetting.field]);
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                            data.updateData.push(newData);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                postData(preUrl + '/pos/update', data, function (result) {
 | 
	
		
			
				|  |  | +                    pos.updateDatas(result.pos);
 | 
	
		
			
				|  |  | +                    ledgerTree.loadPostData(result.ledger, function (loadResult) {
 | 
	
		
			
				|  |  | +                        treeOperationObj.refreshTree(ledgerSpread.getActiveSheet(), loadResult);
 | 
	
		
			
				|  |  | +                    });
 | 
	
		
			
				|  |  | +                    posOperationObj.loadCurPosData();
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |      posOperationObj.loadCurPosData();
 | 
	
		
			
				|  |  |      if (!posSpreadSetting.readOnly) {
 | 
	
		
			
				|  |  | -        SpreadJsObj.addDeleteBind(posSpread, treeOperationObj.deletePress);
 | 
	
		
			
				|  |  | +        SpreadJsObj.addDeleteBind(posSpread, posOperationObj.deletePress);
 | 
	
		
			
				|  |  |          posSpread.bind(GC.Spread.Sheets.Events.EditEnding, posOperationObj.editEnding);
 | 
	
		
			
				|  |  | -        posSpread.bind(GC.Spread.Sheets.Events.CellClick, function (e, info) {
 | 
	
		
			
				|  |  | -            console.log(info.sheet.getCell(info.row, info.col));
 | 
	
		
			
				|  |  | +        posSpread.bind(GC.Spread.Sheets.Events.ClipboardPasted, posOperationObj.clipboardPasted);
 | 
	
		
			
				|  |  | +        // posSpread.bind(GC.Spread.Sheets.Events.CellClick, function (e, info) {
 | 
	
		
			
				|  |  | +        //     console.log(info.sheet.getCell(info.row, info.col));
 | 
	
		
			
				|  |  | +        // });
 | 
	
		
			
				|  |  | +        // 右键菜单
 | 
	
		
			
				|  |  | +        $.contextMenu({
 | 
	
		
			
				|  |  | +            selector: '#pos-spread',
 | 
	
		
			
				|  |  | +            build: function ($trigger, e) {
 | 
	
		
			
				|  |  | +                const target = SpreadJsObj.safeRightClickSelection($trigger, e, posSpread);
 | 
	
		
			
				|  |  | +                return target.hitTestType === GC.Spread.Sheets.SheetArea.viewport || target.hitTestType === GC.Spread.Sheets.SheetArea.rowHeader;
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            items: {
 | 
	
		
			
				|  |  | +                'delete': {
 | 
	
		
			
				|  |  | +                    name: '删除',
 | 
	
		
			
				|  |  | +                    icon: 'fa-remove',
 | 
	
		
			
				|  |  | +                    disabled: function (key, opt) {
 | 
	
		
			
				|  |  | +                        const sheet = posSpread.getActiveSheet();
 | 
	
		
			
				|  |  | +                        if (sheet.zh_data) {
 | 
	
		
			
				|  |  | +                            const selection = sheet.getSelections();
 | 
	
		
			
				|  |  | +                            return sheet.zh_data.length < selection[0].row + selection[0].rowCount;
 | 
	
		
			
				|  |  | +                        } else {
 | 
	
		
			
				|  |  | +                            return true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    },
 | 
	
		
			
				|  |  | +                    callback: function (key, opt) {
 | 
	
		
			
				|  |  | +                        posOperationObj.deletePos(posSpread.getActiveSheet());
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                },
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |