|  | @@ -12,6 +12,10 @@ function checkTzMeasureType () {
 | 
	
		
			
				|  |  |      return tender.measure_type === measureType.tz.value;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +function transExpr(expr) {
 | 
	
		
			
				|  |  | +    return expr.replace('=', '').replace('%', '/100');
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 从cookie中读取缓存的列显示设置,没有则取默认
 | 
	
		
			
				|  |  |   * @returns {*[]}
 | 
	
	
		
			
				|  | @@ -444,6 +448,9 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |          changesObj.loadChanges({bills: data});
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |      ledgerSpreadSetting.dgnUpFields = ['deal_dgn_qty1', 'deal_dgn_qty2', 'c_dgn_qty1', 'c_dgn_qty2'];
 | 
	
		
			
				|  |  | +    ledgerSpreadSetting.getColor = function (sheet, data, col, defaultColor) {
 | 
	
		
			
				|  |  | +        return data && data.end_contract_qty > data.quantity ? '#f8d7da' : defaultColor;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |      SpreadJsObj.initSheet(slSpread.getActiveSheet(), ledgerSpreadSetting);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      stageTree.loadDatas(ledgerData);
 | 
	
	
		
			
				|  | @@ -472,9 +479,32 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |          const node = SpreadJsObj.getSelectObject(slSpread.getActiveSheet());
 | 
	
		
			
				|  |  |          changesObj.loadChanges({bills: node, pos: data});
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  | +    posSpreadSetting.getColor = function (sheet, data, col, defaultColor) {
 | 
	
		
			
				|  |  | +        return data && data.end_contract_qty > data.quantity ? '#f8d7da' : defaultColor;
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  |      SpreadJsObj.initSheet(spSpread.getActiveSheet(), posSpreadSetting);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      const stageTreeSpreadObj = {
 | 
	
		
			
				|  |  | +        loadExprToInput(sheet) {
 | 
	
		
			
				|  |  | +            const sel = sheet.getSelections()[0];
 | 
	
		
			
				|  |  | +            const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
 | 
	
		
			
				|  |  | +            if (col.type === 'Number') {
 | 
	
		
			
				|  |  | +                const data = SpreadJsObj.getSelectObject(sheet);
 | 
	
		
			
				|  |  | +                if (!data) {
 | 
	
		
			
				|  |  | +                    $('#bills-expr').val('').attr('readOnly', true);
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                const nodePos = stagePos.getLedgerPos(data.id);
 | 
	
		
			
				|  |  | +                if (nodePos && nodePos.length > 0) {
 | 
	
		
			
				|  |  | +                    $('#bills-expr').val('').attr('readOnly', true);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    $('#bills-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
 | 
	
		
			
				|  |  | +                        .attr('readOnly', readOnly || cell.locked());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                $('#bills-expr').val('').attr('readOnly', true);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  |          refreshTreeNodes: function (sheet, nodes) {
 | 
	
		
			
				|  |  |              const tree = sheet.zh_tree;
 | 
	
		
			
				|  |  |              if (!tree) { return }
 | 
	
	
		
			
				|  | @@ -491,17 +521,32 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  const node = sortData[info.row], updateData = {};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  const orgValue = node[col.field];
 | 
	
		
			
				|  |  | -                const newValue =  col.type === 'Number' ? parseFloat(info.editingText) : info.editingText;
 | 
	
		
			
				|  |  | -                if (orgValue == newValue || ((!orgValue || orgValue === '') && (newValue === ''))) {
 | 
	
		
			
				|  |  | +                let newValue = info.editingText;
 | 
	
		
			
				|  |  | +                if (orgValue == newValue || ((!orgValue || orgValue === '') && (!newValue || newValue === ''))) {
 | 
	
		
			
				|  |  |                      return;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +                if (col.type === 'Number' && newValue && newValue !== '') {
 | 
	
		
			
				|  |  | +                    const num = _.toNumber(newValue);
 | 
	
		
			
				|  |  | +                    if (num) {
 | 
	
		
			
				|  |  | +                        newValue = num;
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        try {
 | 
	
		
			
				|  |  | +                            newValue = math.evaluate(transExpr(newValue));
 | 
	
		
			
				|  |  | +                        } catch(err) {
 | 
	
		
			
				|  |  | +                            toastr.error('输入的表达式非法');
 | 
	
		
			
				|  |  | +                            SpreadJsObj.reLoadRowData(info.sheet, info.row);
 | 
	
		
			
				|  |  | +                            return;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  if (col.field.indexOf('_dgn_') > 0) {
 | 
	
		
			
				|  |  |                      if (node.b_code && node.b_code !== '') {
 | 
	
		
			
				|  |  |                          toastr.error('仅项目节可输入设计数量');
 | 
	
		
			
				|  |  |                          SpreadJsObj.reLoadRowData(info.sheet, info.row);
 | 
	
		
			
				|  |  |                          return;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                } else if (col.field !== 'postil') {
 | 
	
		
			
				|  |  | +                } else if (col.field !== 'postil' && col.field !== 'memo') {
 | 
	
		
			
				|  |  |                      if (node.children && node.children.length > 0) {
 | 
	
		
			
				|  |  |                          toastr.error('清单父项不可计量');
 | 
	
		
			
				|  |  |                          SpreadJsObj.reLoadRowData(info.sheet, info.row);
 | 
	
	
		
			
				|  | @@ -516,7 +561,12 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                if (col.field.indexOf('_dgn_') > 0) {
 | 
	
		
			
				|  |  | +                if (col.field === 'memo') {
 | 
	
		
			
				|  |  | +                    updateData.main = {
 | 
	
		
			
				|  |  | +                        id: node.id
 | 
	
		
			
				|  |  | +                    };
 | 
	
		
			
				|  |  | +                    updateData.main[col.field] = newValue;
 | 
	
		
			
				|  |  | +                } else if (col.field.indexOf('_dgn_') > 0) {
 | 
	
		
			
				|  |  |                      updateData.dgn = {
 | 
	
		
			
				|  |  |                          id: node.id
 | 
	
		
			
				|  |  |                      };
 | 
	
	
		
			
				|  | @@ -542,6 +592,7 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  posSearch.search();
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              SpreadJsObj.saveTopAndSelect(info.sheet, ckBillsSpread);
 | 
	
		
			
				|  |  | +            stageTreeSpreadObj.loadExprToInput(info.sheet);
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  |          deletePress(sheet) {
 | 
	
		
			
				|  |  |              if (sheet.zh_setting && sheet.zh_dataType === 'tree') {
 | 
	
	
		
			
				|  | @@ -558,12 +609,12 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  if (validCols.length === 0) { return; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  const sortData = sheet.zh_tree.nodes;
 | 
	
		
			
				|  |  | -                const datas = [], dgnDatas = [];
 | 
	
		
			
				|  |  | +                const datas = [], dgnDatas = [], mainDatas = [];
 | 
	
		
			
				|  |  |                  for (let iRow = sel.row; iRow < sel.row + sel.rowCount; iRow++) {
 | 
	
		
			
				|  |  |                      const node = sortData[iRow];
 | 
	
		
			
				|  |  |                      if (node) {
 | 
	
		
			
				|  |  | -                        const data = { lid: node.id }, dgnData = { id: node.id };
 | 
	
		
			
				|  |  | -                        let filter = true, filterDgn = true;
 | 
	
		
			
				|  |  | +                        const data = { lid: node.id }, dgnData = { id: node.id }, mainData = { id: node.id };
 | 
	
		
			
				|  |  | +                        let filter = true, filterDgn = true, filterMain = true;
 | 
	
		
			
				|  |  |                          for (const iCol of validCols) {
 | 
	
		
			
				|  |  |                              const colSetting = sheet.zh_setting.cols[iCol];
 | 
	
		
			
				|  |  |                              if (sheet.zh_setting.dgnUpFields.indexOf(colSetting.field) !== -1) {
 | 
	
	
		
			
				|  | @@ -579,6 +630,9 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                                      dgnData[colSetting.field] = 0;
 | 
	
		
			
				|  |  |                                      filterDgn = false;
 | 
	
		
			
				|  |  |                                  }
 | 
	
		
			
				|  |  | +                            } else if (colSetting.field === 'memo') {
 | 
	
		
			
				|  |  | +                                mainData[colSetting.field] = null;
 | 
	
		
			
				|  |  | +                                filterMain = false;
 | 
	
		
			
				|  |  |                              } else {
 | 
	
		
			
				|  |  |                                  data[colSetting.field] = null;
 | 
	
		
			
				|  |  |                                  filter = false;
 | 
	
	
		
			
				|  | @@ -586,12 +640,14 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          if (!filter) datas.push(data);
 | 
	
		
			
				|  |  |                          if (!filterDgn) dgnDatas.push(dgnData);
 | 
	
		
			
				|  |  | +                        if (!filterMain) mainDatas.push(mainData);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                if (datas.length > 0 || dgnDatas.length > 0) {
 | 
	
		
			
				|  |  | +                if (datas.length > 0 || dgnDatas.length > 0 || mainDatas.length > 0) {
 | 
	
		
			
				|  |  |                      const bills = {};
 | 
	
		
			
				|  |  |                      if (datas.length > 0) bills.stage = datas;
 | 
	
		
			
				|  |  |                      if (dgnDatas.length > 0) bills.dgn = dgnDatas;
 | 
	
		
			
				|  |  | +                    if (mainDatas.length > 0) bills.main = mainDatas;
 | 
	
		
			
				|  |  |                      postData(window.location.href + '/update', {bills: bills}, function (result) {
 | 
	
		
			
				|  |  |                          const nodes = stageTree.loadPostStageData(result);
 | 
	
		
			
				|  |  |                          stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
 | 
	
	
		
			
				|  | @@ -607,7 +663,8 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  const stageField = ['contract_qty', 'contract_tp', 'qc_qty', 'postil'];
 | 
	
		
			
				|  |  |                  for (let iCol = range.col; iCol < range.col + range.colCount; iCol++) {
 | 
	
		
			
				|  |  |                      const col = info.sheet.zh_setting.cols[iCol];
 | 
	
		
			
				|  |  | -                    if ((stageField.indexOf(col.field) === -1) && setting.dgnUpFields.indexOf(col.field) === -1) {
 | 
	
		
			
				|  |  | +                    if ((stageField.indexOf(col.field) === -1) && setting.dgnUpFields.indexOf(col.field) === -1
 | 
	
		
			
				|  |  | +                        && col.field !== 'memo') {
 | 
	
		
			
				|  |  |                          toastr.error('不可修改此数据');
 | 
	
		
			
				|  |  |                          info.cancel = true;
 | 
	
		
			
				|  |  |                          return;
 | 
	
	
		
			
				|  | @@ -618,14 +675,15 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |          clipboardPasted(e, info) {
 | 
	
		
			
				|  |  |              if (info.sheet.zh_setting && info.sheet.zh_tree) {
 | 
	
		
			
				|  |  |                  const sheet = info.sheet, setting = info.sheet.zh_setting;
 | 
	
		
			
				|  |  | -                const filterNodes = [], datas = [], dgnDatas = [];
 | 
	
		
			
				|  |  | +                const filterNodes = [], datas = [], dgnDatas = [], mainDatas = [];
 | 
	
		
			
				|  |  | +                let bHint = false;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  for (let iRow = 0; iRow < info.cellRange.rowCount; iRow++) {
 | 
	
		
			
				|  |  |                      const curRow = iRow + info.cellRange.row;
 | 
	
		
			
				|  |  |                      const node = sheet.zh_tree.getItemsByIndex(curRow);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    const data = {lid: node.id}, dgnData = {id: node.id};
 | 
	
		
			
				|  |  | -                    let filter = true, filterDgn = true;
 | 
	
		
			
				|  |  | +                    const data = {lid: node.id}, dgnData = {id: node.id}, mainData = {id: node.id};
 | 
	
		
			
				|  |  | +                    let filter = true, filterDgn = true, filterMain = true;
 | 
	
		
			
				|  |  |                      for (let iCol = 0; iCol < info.cellRange.colCount; iCol++) {
 | 
	
		
			
				|  |  |                          const curCol = info.cellRange.col + iCol;
 | 
	
		
			
				|  |  |                          const col = info.sheet.zh_setting.cols[curCol];
 | 
	
	
		
			
				|  | @@ -638,25 +696,61 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                              if (nodePos && nodePos.length > 0) continue;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +                        const text = sheet.getText(curRow, curCol);
 | 
	
		
			
				|  |  |                          if (setting.dgnUpFields.indexOf(col.field) !== -1) {
 | 
	
		
			
				|  |  | -                            dgnData[col.field] = _.toNumber(sheet.getText(curRow, curCol));
 | 
	
		
			
				|  |  | -                            filterDgn = false;
 | 
	
		
			
				|  |  | +                            const num = _.toNumber(text);
 | 
	
		
			
				|  |  | +                            if (num) {
 | 
	
		
			
				|  |  | +                                dgnData[col.field] = num;
 | 
	
		
			
				|  |  | +                                filterDgn = false;
 | 
	
		
			
				|  |  | +                            } else {
 | 
	
		
			
				|  |  | +                                try {
 | 
	
		
			
				|  |  | +                                    dgnData[col.field] = math.evaluate(transExpr(text));
 | 
	
		
			
				|  |  | +                                    filterDgn = false;
 | 
	
		
			
				|  |  | +                                } catch(err) {
 | 
	
		
			
				|  |  | +                                    if (!bHint) {
 | 
	
		
			
				|  |  | +                                        toastr.warning('粘贴了非法表达式,已过滤');
 | 
	
		
			
				|  |  | +                                        bHint = true;
 | 
	
		
			
				|  |  | +                                    }
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        } else if (col.field === 'memo') {
 | 
	
		
			
				|  |  | +                            mainData.memo = text;
 | 
	
		
			
				|  |  | +                            filterMain = false;
 | 
	
		
			
				|  |  |                          } else {
 | 
	
		
			
				|  |  | -                            data[col.field] = col.type === 'Number' ? _.toNumber(sheet.getText(curRow, curCol)) : sheet.getText(curRow, curCol);
 | 
	
		
			
				|  |  | -                            filter = false;
 | 
	
		
			
				|  |  | +                            if (col.type === 'Number') {
 | 
	
		
			
				|  |  | +                                const num = _.toNumber(text);
 | 
	
		
			
				|  |  | +                                if (num) {
 | 
	
		
			
				|  |  | +                                    data[col.field] = num;
 | 
	
		
			
				|  |  | +                                    filter = false;
 | 
	
		
			
				|  |  | +                                } else {
 | 
	
		
			
				|  |  | +                                    try {
 | 
	
		
			
				|  |  | +                                        data[col.field] = math.evaluate(transExpr(text));
 | 
	
		
			
				|  |  | +                                        filter = false;
 | 
	
		
			
				|  |  | +                                    } catch(err) {
 | 
	
		
			
				|  |  | +                                        if (!bHint) {
 | 
	
		
			
				|  |  | +                                            toastr.warning('粘贴了非法表达式,已过滤');
 | 
	
		
			
				|  |  | +                                            bHint = true;
 | 
	
		
			
				|  |  | +                                        }
 | 
	
		
			
				|  |  | +                                    }
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  | +                            } else {
 | 
	
		
			
				|  |  | +                                data[col.field] = text;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | -                    if (filter && filterDgn) {
 | 
	
		
			
				|  |  | +                    if (filter && filterDgn && filterMain) {
 | 
	
		
			
				|  |  |                          filterNodes.push(node);
 | 
	
		
			
				|  |  |                      } else {
 | 
	
		
			
				|  |  |                          if (!filter) datas.push(data);
 | 
	
		
			
				|  |  |                          if (!filterDgn) dgnDatas.push(dgnData);
 | 
	
		
			
				|  |  | +                        if (!filterMain) mainDatas.push(mainData);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | -                if (datas.length > 0 || dgnDatas.length > 0) {
 | 
	
		
			
				|  |  | +                if (datas.length > 0 || dgnDatas.length > 0 || mainDatas.length > 0) {
 | 
	
		
			
				|  |  |                      const updateData = {};
 | 
	
		
			
				|  |  |                      if (datas.length > 0) updateData.stage = datas;
 | 
	
		
			
				|  |  |                      if (dgnDatas.length > 0) updateData.dgn = dgnDatas;
 | 
	
		
			
				|  |  | +                    if (mainDatas.length > 0) updateData.main = mainDatas;
 | 
	
		
			
				|  |  |                      postData(window.location.href + '/update', {bills: updateData}, function (data) {
 | 
	
		
			
				|  |  |                          const nodes = stageTree.loadPostStageData(data);
 | 
	
		
			
				|  |  |                          stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes.concat(filterNodes));
 | 
	
	
		
			
				|  | @@ -831,8 +925,65 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |              },
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | +    if (!readOnly) {
 | 
	
		
			
				|  |  | +        $('#bills-expr').bind('change mouseleave', function () {
 | 
	
		
			
				|  |  | +            const expr = $(this);
 | 
	
		
			
				|  |  | +            const sheet = slSpread.getActiveSheet();
 | 
	
		
			
				|  |  | +            const select = SpreadJsObj.getSelectObject(sheet);
 | 
	
		
			
				|  |  | +            const field = expr.attr('field'), orgValue = expr.attr('org'), updateData = {};
 | 
	
		
			
				|  |  | +            let newValue = expr.val();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const num = _.toNumber(newValue);
 | 
	
		
			
				|  |  | +            if (num) {
 | 
	
		
			
				|  |  | +                newValue = num;
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                try {
 | 
	
		
			
				|  |  | +                    newValue = math.evaluate(transExpr(newValue));
 | 
	
		
			
				|  |  | +                } catch(err) {
 | 
	
		
			
				|  |  | +                    toastr.error('输入的表达式非法');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            if (orgValue === newValue || (!orgValue && newValue == '')) { return; }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (field.indexOf('_dgn_') > 0) {
 | 
	
		
			
				|  |  | +                updateData.dgn = {
 | 
	
		
			
				|  |  | +                    id: select.id
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                updateData.dgn[field] = newValue;
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                updateData.stage = {
 | 
	
		
			
				|  |  | +                    lid: select.id
 | 
	
		
			
				|  |  | +                };
 | 
	
		
			
				|  |  | +                updateData.stage[field] = newValue;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 更新至服务器
 | 
	
		
			
				|  |  | +            postData(window.location.pathname + '/update', {bills: updateData}, function (result) {
 | 
	
		
			
				|  |  | +                const nodes = stageTree.loadPostStageData(result);
 | 
	
		
			
				|  |  | +                expr.val(select[field]);
 | 
	
		
			
				|  |  | +                stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), nodes);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    stageTreeSpreadObj.loadExprToInput(slSpread.getActiveSheet());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      const stagePosSpreadObj = {
 | 
	
		
			
				|  |  | +        loadExprToInput(sheet) {
 | 
	
		
			
				|  |  | +            const sel = sheet.getSelections()[0];
 | 
	
		
			
				|  |  | +            const col = sheet.zh_setting.cols[sel.col], cell = sheet.getCell(sel.row, sel.col);
 | 
	
		
			
				|  |  | +            if (col.type === 'Number') {
 | 
	
		
			
				|  |  | +                const data = SpreadJsObj.getSelectObject(sheet);
 | 
	
		
			
				|  |  | +                if (data) {
 | 
	
		
			
				|  |  | +                    $('#pos-expr').val(data[col.field]).attr('field', col.field).attr('org', data[col.field])
 | 
	
		
			
				|  |  | +                        .attr('row', sel.row).attr('readOnly', readOnly || cell.locked());
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    $('#pos-expr').val('').attr('readOnly', true);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                $('#pos-expr').val('').attr('readOnly', true);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  |          /**
 | 
	
		
			
				|  |  |           * 加载部位明细 根据当前台账选择节点
 | 
	
		
			
				|  |  |           */
 | 
	
	
		
			
				|  | @@ -907,7 +1058,22 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  } else {
 | 
	
		
			
				|  |  |                      data.updateType = 'update';
 | 
	
		
			
				|  |  |                      data.updateData = {pid: posData.id, lid: posData.lid};
 | 
	
		
			
				|  |  | -                    data.updateData[col.field] = col.type === 'Number' ? parseFloat(info.editingText) : info.editingText;
 | 
	
		
			
				|  |  | +                    if (col.type === 'Number') {
 | 
	
		
			
				|  |  | +                        const num = _.toNumber(info.editingText);
 | 
	
		
			
				|  |  | +                        if (num) {
 | 
	
		
			
				|  |  | +                            data.updateData[col.field] = num;
 | 
	
		
			
				|  |  | +                        } else {
 | 
	
		
			
				|  |  | +                            try {
 | 
	
		
			
				|  |  | +                                data.updateData[col.field] = math.evaluate(transExpr(info.editingText));
 | 
	
		
			
				|  |  | +                            } catch(err) {
 | 
	
		
			
				|  |  | +                                toastr.error('输入的表达式非法');
 | 
	
		
			
				|  |  | +                                SpreadJsObj.reLoadRowData(info.sheet, info.row);
 | 
	
		
			
				|  |  | +                                return;
 | 
	
		
			
				|  |  | +                            }
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    } else {
 | 
	
		
			
				|  |  | +                        data.updateData[col.field] = info.editingText;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |                  // 提交数据到服务器
 | 
	
		
			
				|  |  |                  postData(window.location.pathname + '/update', {pos: data}, function (result) {
 | 
	
	
		
			
				|  | @@ -976,8 +1142,20 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                              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]);
 | 
	
		
			
				|  |  | +                            if (col.type === 'Number') {
 | 
	
		
			
				|  |  | +                                const num = _.toNumber(newData[colSetting.field]);
 | 
	
		
			
				|  |  | +                                if (num) {
 | 
	
		
			
				|  |  | +                                    newData[colSetting.field] = num;
 | 
	
		
			
				|  |  | +                                } else {
 | 
	
		
			
				|  |  | +                                    try {
 | 
	
		
			
				|  |  | +                                        newData[colSetting.field] = math.evaluate(transExpr(newData[colSetting.field]));
 | 
	
		
			
				|  |  | +                                    } catch(err) {
 | 
	
		
			
				|  |  | +                                        toastr.error('输入的表达式非法');
 | 
	
		
			
				|  |  | +                                        self.loadCurPosData();
 | 
	
		
			
				|  |  | +                                        return;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                    }
 | 
	
		
			
				|  |  | +                                }
 | 
	
		
			
				|  |  |                              }
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          data.updateData.push(newData);
 | 
	
	
		
			
				|  | @@ -993,8 +1171,19 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                                  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]);
 | 
	
		
			
				|  |  | +                                if (col.type === 'Number') {
 | 
	
		
			
				|  |  | +                                    const num = _.toNumber(newData[colSetting.field]);
 | 
	
		
			
				|  |  | +                                    if (num) {
 | 
	
		
			
				|  |  | +                                        newData[colSetting.field] = num;
 | 
	
		
			
				|  |  | +                                    } else {
 | 
	
		
			
				|  |  | +                                        try {
 | 
	
		
			
				|  |  | +                                            newData[colSetting.field] = math.evaluate(transExpr(newData[colSetting.field]));
 | 
	
		
			
				|  |  | +                                        } catch(err) {
 | 
	
		
			
				|  |  | +                                            toastr.error('输入的表达式非法');
 | 
	
		
			
				|  |  | +                                            self.loadCurPosData();
 | 
	
		
			
				|  |  | +                                            return;
 | 
	
		
			
				|  |  | +                                        }
 | 
	
		
			
				|  |  | +                                    }
 | 
	
		
			
				|  |  |                                  }
 | 
	
		
			
				|  |  |                              }
 | 
	
		
			
				|  |  |                              data.updateData.push(newData);
 | 
	
	
		
			
				|  | @@ -1084,6 +1273,9 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          },
 | 
	
		
			
				|  |  | +        selectionChanged: function (e, info) {
 | 
	
		
			
				|  |  | +            stagePosSpreadObj.loadExprToInput(info.sheet);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |      // 加载上下窗口resizer
 | 
	
		
			
				|  |  |      $.divResizer({
 | 
	
	
		
			
				|  | @@ -1110,7 +1302,42 @@ $(document).ready(() => {
 | 
	
		
			
				|  |  |      spSpread.bind(spreadNS.Events.ClipboardPasting, stagePosSpreadObj.clipboardPasting);
 | 
	
		
			
				|  |  |      spSpread.bind(spreadNS.Events.ClipboardPasted, stagePosSpreadObj.clipboardPasted);
 | 
	
		
			
				|  |  |      spSpread.bind(spreadNS.Events.EditStarting, stagePosSpreadObj.editStarting);
 | 
	
		
			
				|  |  | +    spSpread.bind(spreadNS.Events.SelectionChanged, stagePosSpreadObj.selectionChanged);
 | 
	
		
			
				|  |  |      SpreadJsObj.addDeleteBind(spSpread, stagePosSpreadObj.deletePress);
 | 
	
		
			
				|  |  | +    if (!readOnly) {
 | 
	
		
			
				|  |  | +        $('#pos-expr').bind('change mouseleave', function () {
 | 
	
		
			
				|  |  | +            const expr = $(this);
 | 
	
		
			
				|  |  | +            const posSheet = spSpread.getActiveSheet();
 | 
	
		
			
				|  |  | +            const select = SpreadJsObj.getSelectObject(posSheet);
 | 
	
		
			
				|  |  | +            const field = expr.attr('field'), orgValue = expr.attr('org'), newValue = expr.val(), row = expr.attr('row');
 | 
	
		
			
				|  |  | +            if (orgValue === newValue || (!orgValue && newValue == '')) { return; }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            const data = {pid: select.id, lid: select.lid};
 | 
	
		
			
				|  |  | +            const num = _.toNumber(newValue);
 | 
	
		
			
				|  |  | +            if (num) {
 | 
	
		
			
				|  |  | +                data[field] = num;
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                try {
 | 
	
		
			
				|  |  | +                    data[field] = math.evaluate(transExpr(newValue));
 | 
	
		
			
				|  |  | +                } catch (err) {
 | 
	
		
			
				|  |  | +                    toastr.error('输入的表达式非法');
 | 
	
		
			
				|  |  | +                    return;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 提交数据到服务器
 | 
	
		
			
				|  |  | +            postData(window.location.pathname + '/update', {pos: {updateType: 'update', updateData: data}}, function (result) {
 | 
	
		
			
				|  |  | +                if (result.pos) {
 | 
	
		
			
				|  |  | +                    stagePos.updateDatas(result.pos.pos);
 | 
	
		
			
				|  |  | +                    stagePos.loadCurStageData(result.pos.curStageData);
 | 
	
		
			
				|  |  | +                    expr.val(select[field]);
 | 
	
		
			
				|  |  | +                    SpreadJsObj.reLoadRowData(posSheet, _.toNumber(row));
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                const refreshData = stageTree.loadPostStageData(result.ledger);
 | 
	
		
			
				|  |  | +                stageTreeSpreadObj.refreshTreeNodes(slSpread.getActiveSheet(), refreshData);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      if (!checkTzMeasureType()) {
 | 
	
		
			
				|  |  |          $.contextMenu({
 | 
	
		
			
				|  |  |              selector: '#stage-pos',
 |