|  | @@ -75,7 +75,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |      const posCol = {
 | 
	
		
			
				|  |  |          readOnly: {
 | 
	
		
			
				|  |  |              isChangeAdd: function (data) {
 | 
	
		
			
				|  |  | -                return !readOnly && !data.formc;
 | 
	
		
			
				|  |  | +                return !readOnly && !data.formc && (data.settle_status && data.settle_status === settleStatus.finish);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      };
 | 
	
	
		
			
				|  | @@ -96,6 +96,12 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              },
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |      ];
 | 
	
		
			
				|  |  | +    billsSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) {
 | 
	
		
			
				|  |  | +        if (data && data.settle_status && data.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +            return spreadColor.stage.settle;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return defaultColor;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |      billsSpreadSetting.localCache = {
 | 
	
		
			
				|  |  |          key: 'changes-ledger-spread',
 | 
	
		
			
				|  |  |          colWidth: true,
 | 
	
	
		
			
				|  | @@ -121,6 +127,12 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              },
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |      ];
 | 
	
		
			
				|  |  | +    posSpreadSetting.getColor = function (sheet, data, row, col, defaultColor) {
 | 
	
		
			
				|  |  | +        if (data && data.settle_status && data.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +            return spreadColor.stage.settle;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return defaultColor;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |      posSpreadSetting.localCache = {
 | 
	
		
			
				|  |  |          key: 'changes-pos-spread',
 | 
	
		
			
				|  |  |              colWidth: true,
 | 
	
	
		
			
				|  | @@ -313,7 +325,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  invalidAll();
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            let last = first, sameParent = true, nodeUsed = first.used;
 | 
	
		
			
				|  |  | +            let last = first, sameParent = true, nodeUsed = first.used, settleFinish = first.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |              if (sel.rowCount > 1 && first) {
 | 
	
		
			
				|  |  |                  for (let r = 1; r < sel.rowCount; r++) {
 | 
	
		
			
				|  |  |                      const rNode = tree.nodes[sel.row + r];
 | 
	
	
		
			
				|  | @@ -326,6 +338,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          break;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      nodeUsed = nodeUsed || rNode.used;
 | 
	
		
			
				|  |  | +                    settleFinish = settleFinish || rNode.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |                      if (rNode.level > first.level) continue;
 | 
	
		
			
				|  |  |                      if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
 | 
	
		
			
				|  |  |                          sameParent = false;
 | 
	
	
		
			
				|  | @@ -345,16 +358,16 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              const valid = !sheet.zh_setting.readOnly;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            setObjEnable($('a[name=base-opr][type=add]'), valid && first && first.level > 1);
 | 
	
		
			
				|  |  | -            setObjEnable($('a[name=base-opr][type=delete]'), valid && first && sameParent && first.level > 1 && !nodeUsed && first.formc);
 | 
	
		
			
				|  |  | +            setObjEnable($('a[name=base-opr][type=add]'), valid && first && first.level > 1 && first.settle_status !== settleStatus.finish);
 | 
	
		
			
				|  |  | +            setObjEnable($('a[name=base-opr][type=delete]'), valid && first && sameParent && first.level > 1 && !nodeUsed && first.formc && !settleFinish);
 | 
	
		
			
				|  |  |              setObjEnable($('a[name=base-opr][type=up-move]'), valid && first && sameParent && first.level > 1 && preNode && first.formc);
 | 
	
		
			
				|  |  |              setObjEnable($('a[name=base-opr][type=down-move]'), valid && first && sameParent && first.level > 1 && !tree.isLastSibling(last) && first.formc);
 | 
	
		
			
				|  |  |              const posRange = last ? pos.getLedgerPos(last.id) : [];
 | 
	
		
			
				|  |  |              setObjEnable($('a[name=base-opr][type=up-level]'), valid && first && sameParent && tree.getParent(first) && !nodeUsed
 | 
	
		
			
				|  |  | -                && first.level > 2 && ((!posRange || posRange.length === 0) || tree.isLastSibling(last)) && upPower && first.formc);
 | 
	
		
			
				|  |  | +                && first.level > 2 && ((!posRange || posRange.length === 0) || last.settle_status !== settleStatus.finish || tree.isLastSibling(last)) && upPower && first.formc);
 | 
	
		
			
				|  |  |              const preNodePosRange = preNode ? pos.getLedgerPos(preNode.id) : [];
 | 
	
		
			
				|  |  |              setObjEnable($('a[name=base-opr][type=down-level]'), valid && first && sameParent
 | 
	
		
			
				|  |  | -                && first.level > 1 && preNode && (preNode.children.length > 0 || (preNode.children.length === 0 && preNode.formc && (!preNodePosRange || preNodePosRange.length === 0))) && !preNode.used && first.formc);
 | 
	
		
			
				|  |  | +                && first.level > 1 && preNode && (preNode.children.length > 0 || (preNode.children.length === 0 && preNode.formc && (!preNodePosRange || preNodePosRange.length === 0))) && !preNode.used && first.formc && preNode.settle_status !== settleStatus.finish);
 | 
	
		
			
				|  |  |              setObjEnable($('#cut'), valid);
 | 
	
		
			
				|  |  |              setObjEnable($('#paste'), valid);
 | 
	
		
			
				|  |  |          },
 | 
	
	
		
			
				|  | @@ -446,32 +459,62 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          toastr.warning('选中的节点已计量,不可删除');
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    if (child.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        toastr.warning('选中的节点已结算,不可删除');
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              } else if (type === 'up-level') {
 | 
	
		
			
				|  |  |                  const parent = tree.getParent(node);
 | 
	
		
			
				|  |  |                  const children = parent ? parent.children : tree.children;
 | 
	
		
			
				|  |  |                  const index = children.indexOf(node);
 | 
	
		
			
				|  |  | -                for (let i = index; i < children.length; i++) {
 | 
	
		
			
				|  |  | -                    const child = children[index];
 | 
	
		
			
				|  |  | -                    if (tree.checkNodeUsed(child, pos)) {
 | 
	
		
			
				|  |  | -                        if (i >= index + count) {
 | 
	
		
			
				|  |  | -                            toastr.warning('其后节点已计量,选中的节点不可升级');
 | 
	
		
			
				|  |  | -                        } else {
 | 
	
		
			
				|  |  | -                            toastr.warning('选中的节点已计量,不可升级');
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                        return;
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | +                const lastSelect = children[index + count - 1];
 | 
	
		
			
				|  |  | +                if (tree.checkNodeUsed(lastSelect, pos) && (!lastSelect.children || lastSelect.children.length === 0) && (children.length > index + count)) {
 | 
	
		
			
				|  |  | +                    toastr.warning('选中的节点已计量,不可升级');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (lastSelect.settle_status === settleStatus.finish && (children.length > index + count)) {
 | 
	
		
			
				|  |  | +                    toastr.warning('选中的节点已结算,不可升级');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                // for (let i = index; i < children.length; i++) {
 | 
	
		
			
				|  |  | +                //     const child = children[index];
 | 
	
		
			
				|  |  | +                //     if (tree.checkNodeUsed(child, pos)) {
 | 
	
		
			
				|  |  | +                //         if (i >= index + count) {
 | 
	
		
			
				|  |  | +                //             toastr.warning('其后节点已计量,选中的节点不可升级');
 | 
	
		
			
				|  |  | +                //         } else {
 | 
	
		
			
				|  |  | +                //             toastr.warning('选中的节点已计量,不可升级');
 | 
	
		
			
				|  |  | +                //         }
 | 
	
		
			
				|  |  | +                //         return;
 | 
	
		
			
				|  |  | +                //     }
 | 
	
		
			
				|  |  | +                // }
 | 
	
		
			
				|  |  |              } else if (type === 'down-level') {
 | 
	
		
			
				|  |  |                  const parent = tree.getParent(node);
 | 
	
		
			
				|  |  |                  const children = parent ? parent.children : tree.children;
 | 
	
		
			
				|  |  |                  const index = children.indexOf(node);
 | 
	
		
			
				|  |  | -                for (let i = 0; i < count; i++) {
 | 
	
		
			
				|  |  | +                if (index > 0 && children[index-1].used) {
 | 
	
		
			
				|  |  | +                    toastr.warning('其前节点已计量,选中的节点不可降级');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                if (index > 0 && children[index-1].settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                    toastr.warning('其前节点已结算,选中的节点不可降级');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                for (let i = index; i < count; i++) {
 | 
	
		
			
				|  |  |                      const child = children[i+index];
 | 
	
		
			
				|  |  |                      if (tree.checkNodeUsed(child, pos)) {
 | 
	
		
			
				|  |  |                          toastr.warning('选中的节点已计量,不可降级');
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    if (tree.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        toastr.warning('选中的节点已结算,不可降级');
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else if (type === 'add') {
 | 
	
		
			
				|  |  | +                if (node.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                    toastr.warning('选中的节点已结算,不可新增子项');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -654,6 +697,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  gcl: {type: 'warning', msg: '工程量清单,不可粘贴项目节数量'},
 | 
	
		
			
				|  |  |                  posXmj: {type: 'warning', msg: '清单含有计量单元,不可粘贴项目节编号'},
 | 
	
		
			
				|  |  |                  // sameParent: {type: 'warning', msg: '仅可粘贴同层节点'},
 | 
	
		
			
				|  |  | +                settle: {type: 'warning', msg: '已结算节点,不可修改数量、单价、金额'},
 | 
	
		
			
				|  |  |              };
 | 
	
		
			
				|  |  |              const datas = [], filterNodes = [];
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -708,6 +752,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          toastMessageUniq (hint.usedUp);
 | 
	
		
			
				|  |  |                          continue;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    if (colSetting.type === 'Number' && node.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        toastMessageUniq(hint.settle);
 | 
	
		
			
				|  |  | +                        continue;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                      if (colSetting.type === 'Number') {
 | 
	
		
			
				|  |  |                          const num = _.toNumber(value);
 | 
	
		
			
				|  |  |                          if (num) {
 | 
	
	
		
			
				|  | @@ -873,6 +921,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      const col = sheet.zh_setting.cols[iCol];
 | 
	
		
			
				|  |  |                      const style = sheet.getStyle(iRow, iCol);
 | 
	
		
			
				|  |  |                      if (style.locked || (['dgn_qty1', 'dgn_qty2'].indexOf(col.field) >= 0 && node.b_code)) continue;
 | 
	
		
			
				|  |  | +                    if (col.type === 'Number' && node.settle_status === settleStatus.finish) continue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      if (['dgn_qty1', 'dgn_qty2'].indexOf(col.field) < 0 && sheet.zh_tree.checkNodeUsed(node, pos)) {
 | 
	
		
			
				|  |  |                          toastr.warning('"' + (node.code || '') + (node.b_code || '') + ' ' + node.name +'"已计量,请勿修改');
 | 
	
	
		
			
				|  | @@ -900,6 +949,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              const self = this;
 | 
	
		
			
				|  |  |              const sheet = spread.getActiveSheet();
 | 
	
		
			
				|  |  |              const [tree, node] = this.getDefaultSelectInfo(spread.getActiveSheet());
 | 
	
		
			
				|  |  | +            if (node.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                toastr.warning('选中的节点已结算,不可粘贴整块');
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              postData(window.location.pathname + '/update', {
 | 
	
		
			
				|  |  |                  postType: 'paste-block',
 | 
	
	
		
			
				|  | @@ -944,7 +997,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      info.cancel = posRange && posRange.length > 0;
 | 
	
		
			
				|  |  |                      break;
 | 
	
		
			
				|  |  |                  case 'unit_price':
 | 
	
		
			
				|  |  | -                    info.cancel = (node.children && node.children.length > 0) || node.used;
 | 
	
		
			
				|  |  | +                    info.cancel = (node.children && node.children.length > 0) || node.used || node.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |                      break;
 | 
	
		
			
				|  |  |                  case 'sgfh_qty':
 | 
	
		
			
				|  |  |                  case 'sgfh_tp':
 | 
	
	
		
			
				|  | @@ -954,11 +1007,11 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  case 'qtcl_tp':
 | 
	
		
			
				|  |  |                  case 'deal_qty':
 | 
	
		
			
				|  |  |                  case 'deal_tp':
 | 
	
		
			
				|  |  | -                    info.cancel = (node.children && node.children.length > 0);
 | 
	
		
			
				|  |  | +                    info.cancel = (node.children && node.children.length > 0) || node.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |                      break;
 | 
	
		
			
				|  |  |                  case 'dgn_qty1':
 | 
	
		
			
				|  |  |                  case 'dgn_qty2':
 | 
	
		
			
				|  |  | -                    info.cancel = !_.isEmpty(node.b_code);
 | 
	
		
			
				|  |  | +                    info.cancel = !_.isEmpty(node.b_code || node.settle_status === settleStatus.finish);
 | 
	
		
			
				|  |  |                      break;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          },
 | 
	
	
		
			
				|  | @@ -1168,7 +1221,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  if (!tree) return true;
 | 
	
		
			
				|  |  |                  const first = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  |                  const valid = !sheet.zh_setting.readOnly;
 | 
	
		
			
				|  |  | -                return !(valid && first && first.level > 1);
 | 
	
		
			
				|  |  | +                return !(valid && first && first.level > 1 && first.settle_status !== settleStatus.finish);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          billsContextMenuOptions.items.delete = {
 | 
	
	
		
			
				|  | @@ -1185,7 +1238,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  |                  if (!tree) return true;
 | 
	
		
			
				|  |  |                  const first = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  | -                let last = first, sameParent = true, nodeUsed = first.used;
 | 
	
		
			
				|  |  | +                let last = first, sameParent = true, nodeUsed = first.used, settleFinish = first.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |                  if (sel.rowCount > 1 && first) {
 | 
	
		
			
				|  |  |                      for (let r = 1; r < sel.rowCount; r++) {
 | 
	
		
			
				|  |  |                          const rNode = tree.nodes[sel.row + r];
 | 
	
	
		
			
				|  | @@ -1197,6 +1250,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                              return true;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          nodeUsed = nodeUsed || rNode.used;
 | 
	
		
			
				|  |  | +                        settleFinish = settleFinish || rNode.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |                          if (rNode.level > first.level) continue;
 | 
	
		
			
				|  |  |                          if ((rNode.level < first.level) || (rNode.level === first.level && rNode.pid !== first.pid)) {
 | 
	
		
			
				|  |  |                              sameParent = false;
 | 
	
	
		
			
				|  | @@ -1206,7 +1260,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  const valid = !sheet.zh_setting.readOnly;
 | 
	
		
			
				|  |  | -                return !(valid && first && sameParent && !(first.level === 1 && first.node_type) && !nodeUsed && first.formc);
 | 
	
		
			
				|  |  | +                return !(valid && first && sameParent && !(first.level === 1 && first.node_type) && !nodeUsed && first.formc && !settleFinish);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          billsContextMenuOptions.items.sprBase = '----';
 | 
	
	
		
			
				|  | @@ -1348,7 +1402,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  if (!tree) return true;
 | 
	
		
			
				|  |  |                  const first = sheet.zh_tree.nodes[row];
 | 
	
		
			
				|  |  |                  const valid = !sheet.zh_setting.readOnly;
 | 
	
		
			
				|  |  | -                return !(valid && first && first.level > 1);
 | 
	
		
			
				|  |  | +                return !(valid && first && first.level > 1 && first.settle_status !== settleStatus.finish);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          };
 | 
	
		
			
				|  |  |          billsContextMenuOptions.items.batchInsertBillsPos = {
 | 
	
	
		
			
				|  | @@ -1362,10 +1416,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  const select = SpreadJsObj.getSelectObject(billsSheet);
 | 
	
		
			
				|  |  |                  if (select) {
 | 
	
		
			
				|  |  |                      if (select.code && select.code !== '') {
 | 
	
		
			
				|  |  | -                        return !billsTree.isLeafXmj(select);
 | 
	
		
			
				|  |  | +                        return !billsTree.isLeafXmj(select) || select.settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  |                      } else {
 | 
	
		
			
				|  |  |                          const parent = billsTree.getParent(select);
 | 
	
		
			
				|  |  | -                        return !(parent && billsTree.isLeafXmj(parent));
 | 
	
		
			
				|  |  | +                        return !(parent && billsTree.isLeafXmj(parent)) || !(parent && parent.settle_status === settleStatus.finish);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      return false;
 | 
	
	
		
			
				|  | @@ -1447,7 +1501,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          ? (data[exprInfo.expr] ? data[exprInfo.expr] : data[col.field])
 | 
	
		
			
				|  |  |                          : data[col.field];
 | 
	
		
			
				|  |  |                      $('#pos-expr').val(value).attr('field', col.field).attr('org', data[col.field])
 | 
	
		
			
				|  |  | -                        .attr('readOnly', readOnly || (!data.formc && cell.locked())).attr('data-row', sel.row);
 | 
	
		
			
				|  |  | +                        .attr('readOnly', readOnly || (!data.formc && cell.locked()) || data.settle_status === settleStatus.finish).attr('data-row', sel.row);
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      $('#pos-expr').val('').attr('readOnly', true);
 | 
	
		
			
				|  |  |                      $('#pos-expr').removeAttr('data-row');
 | 
	
	
		
			
				|  | @@ -1467,7 +1521,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              if (node) {
 | 
	
		
			
				|  |  |                  const posData = pos.getLedgerPos(node.id) || [];
 | 
	
		
			
				|  |  |                  SpreadJsObj.loadSheetData(posSheet, 'data', posData);
 | 
	
		
			
				|  |  | -                posSheet.zh_setting.readOnly = readOnly || (node.used && posData.length === 0);
 | 
	
		
			
				|  |  | +                posSheet.zh_setting.readOnly = readOnly || (node.used && posData.length === 0) || (node.settle_status && node.settle_status === settleStatus.finish);
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  |                  SpreadJsObj.loadSheetData(posSheet, 'data', []);
 | 
	
		
			
				|  |  |                  posSheet.zh_setting.readOnly = true;
 | 
	
	
		
			
				|  | @@ -1502,6 +1556,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                              toastr.error('"' + posData.name + '"已计量,请勿删除');
 | 
	
		
			
				|  |  |                              return;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  | +                        if (posData.settle_status) {
 | 
	
		
			
				|  |  | +                            toastr.error('"' + posData.name + '"已结算,请勿删除');
 | 
	
		
			
				|  |  | +                            return;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                          data.postData.push(sheet.zh_data[iRow + row].id);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
	
		
			
				|  | @@ -1525,7 +1583,12 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  data.postData.push(nextUpdate);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +            } else if (type === 'add') {
 | 
	
		
			
				|  |  | +                const billsNode = SpreadJsObj.getSelectObject(billsSheet);
 | 
	
		
			
				|  |  | +                if (billsNode.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                    toastr.warning('清单已结算,不可新增计量单元');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              if (data.postData.length > 0) {
 | 
	
		
			
				|  |  |                  postData(window.location.pathname + '/update', data, function (result) {
 | 
	
	
		
			
				|  | @@ -1560,6 +1623,9 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      info.sheet.getCell(info.row, info.col).text(node[exprInfo.expr]);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            if (col.type === 'Number' && node.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                info.cancel = true;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          /**
 | 
	
		
			
				|  |  |           * 编辑单元格响应事件
 | 
	
	
		
			
				|  | @@ -1605,12 +1671,22 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          const sortData = info.sheet.zh_data;
 | 
	
		
			
				|  |  |                          const order = (!sortData || sortData.length === 0) ? 1 : Math.max(sortData[sortData.length - 1].porder + 1, sortData.length + 1);
 | 
	
		
			
				|  |  |                          data.postData = { name: newText, lid: node.id, porder: order};
 | 
	
		
			
				|  |  | +                        if (node.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                            toastr.error('已结算清单不可插入计量单元');
 | 
	
		
			
				|  |  | +                            SpreadJsObj.reLoadRowData(info.sheet, info.row);
 | 
	
		
			
				|  |  | +                            return;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  |                      } else {
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      data.posPostType = 'update';
 | 
	
		
			
				|  |  |                      data.postData = {id: posData.id, name: newText};
 | 
	
		
			
				|  |  | +                    if (col.type === 'Number' && posData.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        toastr.error('计量单元已结算,不可修改');
 | 
	
		
			
				|  |  | +                        SpreadJsObj.reLoadRowData(info.sheet, info.row);
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              } else if (!posData) {
 | 
	
		
			
				|  |  |                  toastr.warning('新增计量单元请先输入名称');
 | 
	
	
		
			
				|  | @@ -1728,6 +1804,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          toastr.error('"' + posData.name + '"已计量,请勿删除');
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    if (posData.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        toastr.error(`"${posData.name}"已计量,请勿删除`);
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                      data.postData.push(sortData[iRow + row].id);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -1762,6 +1842,11 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  posSpreadObj.loadCurPosData();
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            if (node.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                toastr.error('清单已结算,请勿修改计量单元数据');
 | 
	
		
			
				|  |  | +                posSpread.loadCurPosData();
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              if (!info.sheet.zh_setting) {
 | 
	
		
			
				|  |  |                  posSpreadObj.loadCurPosData();
 | 
	
		
			
				|  |  |                  return;
 | 
	
	
		
			
				|  | @@ -1769,6 +1854,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              const data = [];
 | 
	
		
			
				|  |  |              const sortData = info.sheet.zh_data || [];
 | 
	
		
			
				|  |  | +            const hint = {
 | 
	
		
			
				|  |  | +                expr: {type: 'warning', msg: '粘贴了表达式非法,已过滤'},
 | 
	
		
			
				|  |  | +                settle: {type: 'warning', msg: '计量单元已结算,不可修改台账数据,已过滤'},
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  |              if (sortData.length === 0 || info.cellRange.row + info.cellRange.rowCount > sortData.length) {
 | 
	
		
			
				|  |  |                  if (info.cellRange.col !== 0) {
 | 
	
		
			
				|  |  |                      toastr.warning('新增计量单元请先输入名称');
 | 
	
	
		
			
				|  | @@ -1788,6 +1877,11 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      if (!colSetting) continue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      posData[colSetting.field] = trimInvalidChar(info.sheet.getText(curRow, curCol));
 | 
	
		
			
				|  |  | +                    if (posData.id && colSetting.type === 'Number' && sortData[curRow].settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        bPaste = false;
 | 
	
		
			
				|  |  | +                        toastMessageUniq(hint.settle);
 | 
	
		
			
				|  |  | +                        continue;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                      if (colSetting.type === 'Number') {
 | 
	
		
			
				|  |  |                          const num = _.toNumber(posData[colSetting.field]);
 | 
	
		
			
				|  |  |                          if (num) {
 | 
	
	
		
			
				|  | @@ -1915,7 +2009,15 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      disabled: function (key, opt) {
 | 
	
		
			
				|  |  |                          if (posSheet.zh_data) {
 | 
	
		
			
				|  |  |                              const selection = posSheet.getSelections();
 | 
	
		
			
				|  |  | -                            return (posSheet.zh_data.length < selection[0].row + selection[0].rowCount) || (posSheet.zh_data[selection[0].row] && !posSheet.zh_data[selection[0].row].formc);
 | 
	
		
			
				|  |  | +                            const sel = selection ? selection[0] : sheet.getSelections()[0];
 | 
	
		
			
				|  |  | +                            const row = sel ? sel.row : -1;
 | 
	
		
			
				|  |  | +                            const rowCount = sel.rowCount;
 | 
	
		
			
				|  |  | +                            let settleFinish = false;
 | 
	
		
			
				|  |  | +                            for (let i = row; i < row + rowCount; i++) {
 | 
	
		
			
				|  |  | +                                if (!posSheet.zh_data[i]) continue;
 | 
	
		
			
				|  |  | +                                settleFinish = settleFinish || posSheet.zh_data[i].settle_status === settleStatus.finish;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                            return (posSheet.zh_data.length < selection[0].row + selection[0].rowCount) || (posSheet.zh_data[selection[0].row] && !posSheet.zh_data[selection[0].row].formc) || settleFinish;
 | 
	
		
			
				|  |  |                          } else {
 | 
	
		
			
				|  |  |                              return true;
 | 
	
		
			
				|  |  |                          }
 | 
	
	
		
			
				|  | @@ -1980,6 +2082,10 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          toastr.warning('非最底层项目下,不应添加节点');
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                    if (mainNode.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                        toastr.warning('已结算节点下,不应添加签约清单');
 | 
	
		
			
				|  |  | +                        return;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                      postData(window.location.pathname + '/update', {
 | 
	
		
			
				|  |  |                          postType: 'add-deal',
 | 
	
	
		
			
				|  | @@ -2386,6 +2492,19 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  toastr.warning('非最底层项目下,不应添加节点');
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            if (mainNode.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                toastr.warning('已结算节点下,不可添加工程量清单');
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            const stdNodes = stdTree.getAllParents(stdNode);
 | 
	
		
			
				|  |  | +            for (const node of stdNodes) {
 | 
	
		
			
				|  |  | +                const parent = mainTree.datas.find(x => { return x.code === node.code && x.name === node.name; });
 | 
	
		
			
				|  |  | +                if (parent && parent.settle_status === settleStatus.finish) {
 | 
	
		
			
				|  |  | +                    toastr.warning('项目节父项已结算,不可添加节点');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          postData(window.location.pathname + '/update', {
 |